Linux: software Raid1 awaria jednego z dysków

Nasz układ partycji
Partycja /dev/sda1 i /dev/sdb1 należy do partycji RAID /dev/md0
Partycja /dev/sda5 i /dev/sdb5 należy do partycji RAID /dev/md1 (SWAP)

Wyświetlamy dyski i partycje

[sourcecode language=”bash”]user@linux:/# fdisk -l[/sourcecode]

Disk /dev/sda: 1000.2 GB, 1000203804160 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00052344

Device Boot Start End Blocks Id System
/dev/sda1 * 1 1212771 974109276 83 Linux raid autodetect
/dev/sda2 121272 121601 2650725 5 Extended
/dev/sda5 121272 121601 2650693+ 92 Linux raid autodetect

Disk /dev/sda: 1000.2 GB, 1000203804160 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x30fd65ea

Device Boot Start End Blocks Id System
/dev/sdb1 * 1 1212771 974109276 fd Linux raid autodetect
/dev/sdb2 121272 121601 2650725 5 Extended
/dev/sdb5 121272 121601 2650693+ fd Linux raid autodetect

Disk /dev/md0: 997.4 GB, 997487804416 bytes
2 heads, 4 sectors/track, 243527296 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000

Device Boot Start End Blocks Id System

Disk /dev/md1: 2714 MB, 2714238976 bytes
2 heads, 4 sectors/track, 662656 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000

Disk /dev/md1 doesn’t contain a valid partition table

Jeżeli RAID1 działa prawidłowo powinniśmy uzyskać taką odpowiedź:

[sourcecode language=”bash”]user@linux:/# cat /proc/mdstat[/sourcecode]

Personalities : [raid1]
md0 : active raid1 sda1[0] sdb1[1]
24418688 blocks [2/2] [UU]
md1 : active raid1 sda5[0] sdb5[1]
24418688 blocks [2/2] [UU]

unused devces:

UU – oznacza, że oba dyski są zsynchronizowane

Załóżmy teraz, że partycja /dev/sdb1 uległa awarii lub się rozsynchronizowała

[sourcecode language=”bash”]user@linux:/# cat /proc/mdstat[/sourcecode]

Personalities : [raid1]
md0 : active raid1 sda1[0] sdb1[1](F)
24418688 blocks [2/2] [U_]
md1 : active raid1 sda5[0] sdb5[1]
24418688 blocks [2/2] [UU]

unused devces:

F – Fail (uszkodzona)
[U_] – druga partycja nie jest zsynchronizowana

Usuwamy uszkodzoną partycję /dev/sdb1 z md0
[sourcecode language=”bash”]user@linux:/# mdadm –manage /dev/md0 –remove /dev/sdb1[/sourcecode]

mdadm: hot removed /dev/sdb1

Sprawdzamy rezultat:
[sourcecode language=”bash”]user@linux:/# cat /proc/mdstat[/sourcecode]

Personalities : [raid1]
md0 : active raid1 sda1[0]
24418688 blocks [2/2] [U_]
md1 : active raid1 sda5[0] sdb5[1]
24418688 blocks [2/2] [UU]

unused devces:

Teraz oznaczamy partycję /dev/sdb5 jako uszkodzoną.

[sourcecode language=”bash”]user@linux:/# mdadm –manage /dev/md1 –fail /dev/sdb5[/sourcecode]

Sprawdzamy rezultat komendy

[sourcecode language=”bash”]user@linux:/# cat /proc/mdstat[/sourcecode]

Personalities : [raid1]
md0 : active raid1 sda1[0]
24418688 blocks [2/2] [U_]
md1 : active raid1 sda5[0] sdb5[1](F)
24418688 blocks [2/2] [U_]

unused devces:

Usuwamy uszkodzoną partycję /dev/sdb5 z md1
[sourcecode language=”bash”]user@linux:/# mdadm –manage /dev/md1 –remove /dev/sdb5[/sourcecode]

mdadm: hot removed /dev/sdb5

Sprawdzamy rezultat komendy
[sourcecode language=”bash”]user@linux:/# cat /proc/mdstat[/sourcecode]

Personalities : [raid1]
md0 : active raid1 sda1[0]
24418688 blocks [2/2] [U_]
md1 : active raid1 sda5[0]
24418688 blocks [2/2] [U_]

unused devces:

Zamykamy system
[sourcecode language=”bash”]user@linux:# shutdown -h now[/sourcecode]

Testujemy dysk, naprawiamy lub wymieniamy na nowy

Instalujemy S.M.A.R.T
W jego pamięci będą zapisane szczegółowe informacje o ewentualnych usterkach.
[sourcecode language=”bash”]user@linux:# apt-get install smartmontools[/sourcecode]

Jeżeli jest jakiś problem z instalacją to najpierw aktualizujemy informacje o pakietach.
[sourcecode language=”bash”]user@linux:# apt-get update[/sourcecode]

Włączamy S.M.A.R.T dla dysku:
[sourcecode language=”bash”]user@linux:# smartctl -s on /dev/sdb [/sourcecode]

Komenda, która w przypadku sprawnego dysku powinna dać PASSED:
[sourcecode language=”bash”]user@linux:# smartctl -H /dev/sdb [/sourcecode]

Komenda dająca obszerny raport (parametry urządzenia, testy, usterki):
[sourcecode language=”bash”]user@linux:# smartctl -a /dev/sdb [/sourcecode]

Dla sprawnego dysku otrzymujemy:

S.M.A.R.T Error Log Version: 1
No Errors Logged

Dla dysku, który ma błędy:

S.M.A.R.T Error Log Version: 1
ATA Error count: 14 (…)

Jeżeli dysk /dev/sdb jest sprawny i tylko się rozsynchronizował to usuwam partycje:
[sourcecode language=”bash”]user@linux:# fdisk /dev/sdb [/sourcecode]
d (delete), 1 (sdb1), w (write), d (delete), 5 (sdb5), w (write)

Dla dysku /dev/sdb tworzymy taki sam układ partycji jak jest na dysku /dev/sda
UWAGA: Nie pomyl się! Kopiujemy tablicę partycji dysku /dev/sda do dysku /dev/sdb.
sfdisk -d ŹRÓDŁO | sfdisk CEL
[sourcecode language=”bash”]user@linux:# sfdisk -d /dev/sda | sfdisk /dev/sdb [/sourcecode]

Checking that no-one is using this disk right now …
OK

Disk /dev/sda: 121601 cylinders, 255 heads, 63 sectors/track
Old situation:
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

Device Boot Start End #cyls #blocks Id System
/dev/sda1 0 – 0 0 0 Empty
/dev/sda2 0 – 0 0 0 Empty
/dev/sda3 0 – 0 0 0 Empty
/dev/sda4 0 – 0 0 0 Empty
New situation:
Units = sectors of 512 bytes, counting from 0

Device Boot Start End #sectors Id System
/dev/sda1 * 63 1948218614 1948218552 fd Linux raid autodetect
/dev/sda2 1948218615 1953520064 5301450 5 Extended
/dev/sda3 0 – 0 0 Empty
/dev/sda4 0 – 0 0 Empty
/dev/sda5 1948218678 1953520064 5301387 fd Linux raid autodetect
Successfully wrote the new partition table

Re-reading the partition table …

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)

Sprawdzamy czy oba dyski mają takie same partycje:
[sourcecode language=”bash”]user@linux:# fdisk -l [/sourcecode]

Jeżeli partycje nie mają ustawione „fd Linux raid auto” musimy to zmienić.

Oznaczenie partycji jako autoraid:
[sourcecode language=”bash”]user@linux:# fdisk /dev/sdb [/sourcecode]

A następnie w wierszu poleceń wybieramy z klawiatury:
t (file system), 1 (partycja sdb1), w (zapisz), t (file system), 5 (partycja sdb5), w (zapisz)

Dodajemy sdb do RAID:
/dev/sdb1 do /dev/md0
/dev/sdb5 do /dev/md1

Synchronizujemy /dev/sdb1 z /dev/sdb1 poprzez dodanie /dev/sdb1 do /dev/md0
[sourcecode language=”bash”]user@linux:# mdadm –manage /dev/md0 –add /dev/sdb1 [/sourcecode]
mdadm: re-added /dev/sdb1

Synchronizujemy /dev/sdb5 z /dev/sda5 poprzez dodanie /dev/sdb5 do /dev/md1
[sourcecode language=”bash”]user@linux:# mdadm –manage /dev/md1 –add /dev/sdb5 [/sourcecode]
mdadm: re-added /dev/sdb5

Sprawdzamy czy partycja się synchronizuje
[sourcecode language=”bash”]user@linux:# cat /proc/mdstat [/sourcecode]

Personalities : [raid1]
md1 : active raid1 sda5[2] sdb5[1]
2650624 blocks [2/1] [_U]
[==============>……] recovery = 70.4% (1869504/2650624) finish=0.2min speed=51096K/sec

md0 : active raid1 sdb1[1]
974109184 blocks [2/1] [_U]

unused devices:

Teraz obie tablice zostaną zsynchronizowane. Może to trochę potrwać.

Końcowy efekt, który powinniśmy otrzymać po synchronizacji dysków.
[sourcecode language=”bash”]user@linux:# cat /proc/mdstat [/sourcecode]

Personalities : [raid1]
md1 : active raid1 sda5[0] sdb5[1]
2650624 blocks [2/2] [UU]

md0 : active raid1 sdb1[1]
974109184 blocks [2/1] [UU]

unused devices: