Michal Čihař - Přechod na softwarový RAID 1 snadno a rychle

Přechod na softwarový RAID 1 snadno a rychle

RAID 1 poskytuje poměrně snadnou a levnou cestu jak se zabezpečit proti výpadku disku. V tomto článku se dozvíte jak snadné je takové pole sestavit.

Proč RAID 1

RAID 1 je nejjednodušší cesta jak se zajistit proti výpadku disku. Oproti vyšším úrovním RAIDu je vyšší redundace - stejná data se ukládájí na všechny disky v poli, ale pro jeho provozování stačí jen dva disky. Pokud máme k dispozici více disků, je vhodnější zvolit RAID 5 (odolné proti výpadkům jednoho disku) nebo RAID 6 (odolné proti výpadkům dvou disků a v aktuálním jádru hrozícím znovujmenováním G. W. Bushe ;-)).

Předpoklady

Začínáme s běžícím systémem ve kterém je nový disk, který chceme použít pro RAID se stávajícím diskem. Pro sestavení RAIDu by neměl být potřeba fyzický přístup ke stroji. Všechno se odehrává na jádru 2.6 (na starších se používaly jiné nástroje) a distribuci Debian (to by nemělo být podstatné, může to mít vliv maximálně na nastavení bootloaderu a jména balíčků).

Jak rozdělit disky

Rozdělení disků klidně můžeme odvodit ze stávajícího, ale s ohledem na RAID, je možná vhodnější zvolit jen jednu velkou partition (pokud tomu nebrání něco jiného, například požadavek na připojení některých oddílů jen pro čtení). Důvod pro jedinou partition s RAIDem na každém disku je ve výkonu. Ovladač RAIDu se totiž snaží optimalizovat čtení z pole a čte buď z prvního disku který nic neprovádí nebo z disku od kterého naposledy požadoval přístup do nejbližší oblasti. Protože poslední oblast přístupu je uložena v informacích o každém RAID poli, nebude se tento algoritmus při více polích na jednom disku chovat moc efektivně.

Příprava

Pro práci s RAIDem jsou potřeba nástroje (no v podstatě jen jeden nástroj :-), které nalezneme v balíčku mdadm. Dále je vhodné mít jádro se zakompilovanou podporou pro RAID, poté si jádro pole samo sestaví a nemusíme se o sestavení starat (distribuce často umožňují něco podobného pomocí initrd a modulů, ale je jednodušší to nechat na jádru).

Vytvoření RAIDu

Nový disk je v mém případě /dev/hdg, na něm vytvoříme partition pro raid. Výstup fdisk -l může vypadat například takto:

   Device Boot      Start         End      Blocks   Id  System
/dev/hdg1   *           1          16      128488+  fd  Linux raid autodetect
/dev/hdg2              17         140      996030   fd  Linux raid autodetect
/dev/hdg3             141         264      996030   fd  Linux raid autodetect

Důležité je nastavit typ partition na 0xfd, což je "Linux raid autodetect". Tím jádru řekneme, že tam má hledat superblok RAIDu a nemusíme se starat o jeho sestavení. Pak již pomocí mdadm můžeme vytvořit pole:

mdadm --create /dev/md0 -c 128 -l 1 -n 2 /dev/hdg1 missing

Parametr -c určuje velikost bloku (můžeme vynechat pro standardních 64 kiB), -l typ RAIDu (pro RAID 5 analogicky zadáme 5), -n počet zařízení v něm a slovem missing řekneme, že zařízení zatím chybí (a RAID tedy bude v degradovaném režimu).

Kopírování dat

Pak již stačí vytvořit náš oblíbený filesystém na /dev/md0 (například mkfs.xfs /dev/md0), přimountovat nový filesystém (mount /dev/md0 /mnt/newroot) a přenést data (stále za běhu systému):

tar cl / | tar xvC /mnt/newroot

Následuje podobná operace pro všechny další partition, pokud jich máme více.

Synchronizace

Teprvé poté vyhodíme ze serveru všechny uživatele, zastavíme služby a připojíme disky ze kterých kopírujeme jen pro čtení a provedeme synchronizaci změněných souborů:

rsync -avx --delete / /mnt/newroot

Pokud nevadí delší odstávka systému, tak můžeme provést kompletní přenos dat v tomto režimu a ušetřit si tak jeden krok.

Reboot s RAIDem

Nyní musíme nastavit bootloader. Já používám grub, pro něj bude záznam v /boot/grub/menu.lst vypadat zhruba takto (hd1,0 musí odpovídat nově vytvořenému RAIDU, později to změníme):

root        (hd1,0)
kernel      /vmlinuz root=/dev/md0 ro
boot

Pak ještě nainstalovat GRUB do MBR bootovacího disku: grub-install /dev/hda. Pokud při nás stálo štěstí tak po rebootu počítače, naběhne již z (degradovaného) RAIDu.

Přidání druhého disku

Nyní již zbývá jen dotvořit RAID na prvním disku, začneme opět vytvořením partition (nesmí být menší než jsou ty na disku který jsme použili jako první) a pak jen přidat partition do RAIDu:

mdadm /dev/md0 -a /dev/hda1

Kernel nyní začne synchronizovat disky, v /proc/mdstat můžeme sledovat průběh operace:

md0 : active raid1 hdg1[0] hda1[1]
      128384 blocks [2/1] [U_]
      [=============>.......]  recovery = 69.1% (88713/128384) \
finish=3min speed=4773K/sec

Než se synchronizace dokončí, připravíme si vše pro bootování z obou disků. V konfiguraci grubu stačí změnit root na (hd0,0) a poté grub nainstalovat na oba disky, opět pomocí grub-install.

Hotovo

Pokud už doběhla synchronizace disků, máme vše hotovo a úspěšně za sebou. V souboru /proc/mdstat se nyní můžeme pokochat stavem našeho zbrusu nového RAIDu:

Personalities : [linear] [raid0] [raid1]
md1 : active raid1 hdg2[0] hda2[1]
      995904 blocks [2/2] [UU]

md2 : active raid1 hdg3[0] hda3[1]
      995904 blocks [2/2] [UU]

md0 : active raid1 hdg1[0] hda1[1]
      128384 blocks [2/2] [UU]

unused devices: <none>

Pro jistotu můžeme zkusit ještě reboot za normální situace a po vypnutí prvního disku v BIOSu (grub ho pak neuvidí, ale kernel ho nejspíše objeví, takže tím se otestuje opravdu jen bootování) a můžeme se radovat z bezpečnějšího uložení dat (ale stejně budeme myslet na pravidelné zálohování :-).

Jako další kroky je vhodné nastavit monitorování disků pomocí S.M.A.R.T. (obvykle stačí nainstalovat balíček smartmontools) a RAIDu pomocí mdadm -F (v Debianu je tento monitoring součástí balíčku mdadm). Pak budeme včas informováni o problémech s disky.