Raid 1 w Ubuntu 12.04 – stan i naprawa

Jeżeli korzystamy z softwarowego raid poziomu 1 w Ubuntu, powinniśmy co jakich czas sprawdzać jaki jest jego stan. Możemy to uczynić poniższym poleceniem:

root@server:# cat /proc/mdstat

po jego wydaniu z konsoli powinniśmy otrzymać coś podobnego:

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sda1[0] sdb1[1]
      3905524 blocks super 1.2 [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
      1943747448 blocks super 1.2 [2/2] [UU]

unused devices: <none>

powyższe oznacza, że obie macierze md0 i md1 są aktywne i oba dyski w każdej macierzy są zsynchronizowane:

Szczegóły dla każdej macierzy możemy uzyskać wydając z konsoli poniższe polecenie:

root@server:# mdadm --detail /dev/md0

w jego wyniku otrzymamy coś zbliżonego do poniższego:

/dev/md0:
        Version : 1.2
  Creation Time : Wed May 25 23:50:25 2012
     Raid Level : raid1
     Array Size : 3904500 (3.72 GiB 4.00 GB)
  Used Dev Size : 3904500 (3.72 GiB 4.00 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Wed Jan  2 20:26:37 2013
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : server:1  (local to host server)
           UUID : f068f485:77ceddce:238a697e:2b43391d
         Events : 178

    Number   Major   Minor   RaidDevice State
       0       8       18        0      active sync   /dev/sda1
       1       8        2        1      active sync   /dev/sdb1

lub dla macierzy md1:

root@server:# mdadm --detail /dev/md1

wynik będzie podobny jak wcześniej.

Jeśli po wydaniu polecenia cat /proc/mdstat otrzymany komunikat jest podobny do poniższego:

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sda1[0]
      3904500 blocks super 1.2 [2/1] [U_]

md1 : active raid1 sda2[0]
      728665976 blocks super 1.2 [2/1] [U_]

unused devices: <none>

oznacza to, że obie macierze są uszkodzone i musimy je naprawić. Przyczyną prawdopodobnie jest uszkodzenie jednego z dysków lub w najlepszym wypadku brak synchronizacji w macierzach – w tym przypadku wykonujemy tylko punkt drugi.

W pierwszej kolejności wymieniamy uszkodzony dysk na sprawny i tworzymy na nim dokładnie takie partycje jakie są na dysku sprawnym.Można to zrobić programem fdisk:

root@server:# fdisk /dev/sdb

W drugim kroku, po utworzeniu partycji dodajemy do macierzy kolejno, każdą nowo utworzoną partycję:

root@server: mdadm /dev/md1 -a /dev/sdb2
root@server: mdadm /dev/md0 -a /dev/sdb1

Po wydaniu powyższych poleceń macierz będzie się odbudowywała. Status możemy w każdej chwili sprawdzić wydając poniższe polecenie:

root@server:# cat /proc/mdstat

po jego wydaniu powinniśmy otrzymać wynik podobny do poniższego:

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[0] sdb2[1]
      728665976 blocks super 1.2 [2/1] [U_]
      [===========>.........]  recovery = 58.8% (429044480/728665976) finish=66.8min speed=74722K/sec

md0 : active raid1 sda1[0] sdb1[1]
      3904500 blocks super 1.2 [2/1] [U_]
        resync=DELAYED

unused devices: <none>

z powyższego widać, że macierz md1 jest odbudowywana, stan zaawansowania to 58,8%, a pozostały czas do zakończenia procesu to 66,8min. Druga macierz md0 czeka w kolejce do synchronizacji, która się rozpocznie po zakończeniu pierwszego procesu.

Jeżeli chce śledzić proces odbudowy macierzy możemy użyć poniższego polecenia wydanego z konsoli:

root@server:# watch cat /proc/mdstat

Jeżeli musimy uruchomić serwer, a właśnie trwa sprawdzanie macierzy wystarczy wydać poniższe polecenie żeby zatrzymać test (poniżej dla raid md0).

root@server:# echo idle > /sys/block/md0/md/sync_action

Na zakończenie warto jeszcze zadbać o uruchomienie systemu w przypadku uszkodzenia podstawowego dysku, z którego startuje system. W tym celu wystarczy zainstalować GRUB’a na drugim, nowo dodanym dysku:

root@server:# grub-install /dev/sdb

oraz w pliku /etc/initramfs-tools/conf.d/mdadm ustawić:

BOOT_DEGRADED=true

i zaktualizować initramfs:

update-initramfs -u

Dodatkowo możemy jeszcze wykonać  kopię MBR pierwszego i drugiego dysku poleceniem:

root@server:# dd if=/dev/sda of=/home/administrator/mbr_sda.bak bs=512 count=1
root@server:# dd if=/dev/sdb of=/home/administrator/mbr_sdb.bak bs=512 count=1

W przypadku awarii dysku, możemy przywrócić rekord rozruchowy wraz z tablicą partycji dla dysku sda poniższym poleceniem:

root@server:# dd if=/home/administrator/mbr_sda.bak of=/dev/sda bs=512 count=1

lub bez tablicy partycji dla dysku sda w przypadku zmiany na dysk o innym rozmiarze:

root@server:# dd if=/home/administrator/mbr_sda.bak of=/dev/sda bs=446 count=1

Po przywróceniu partycji z kopii, aby były one widoczne dla systemu bez jego ponownego uruchamiania, należy wykonać polecenie:

root@server: hdparm -z /dev/sda

Ponowną konfigurację mdadm możemy wykonać poleceniem:

root@server: dpkg-reconfigure mdadm

Zatrzymanie utworzonej wcześniej macierzy:

root@server: mdadm --stop /dev/md1

Usunięcie dysku z działającej macierzy:

root@server: mdadm /dev/md1 --fail /dev/sda1 --remove /dev/sda1

 Dodanie dysków z utworzoną macierzą na innym komputerze:

root@server: mdadm --assemble --scan