Hlavní navigace

O (nejen) softwarových diskových polích (2)

8. 12. 2003
Doba čtení: 6 minut

Sdílet

V dnešním dílu si podrobně probereme vyrábění SW RAIDů a práci s nimi v prostředí Linuxu.

Softwarová RAID pole

Softwarová RAID pole jsou v Linuxovém kernelu obsažena už od verze 2.2. Řadič v systému vytvoří RAID pole nad několika obyčejnými disky. Pole je potom v systému jako další blokové zařízení (/dev/md0, /dev/md1, …), se kterým se dá pracovat jako s jakýmkoli jiným diskem. Kromě jedné výjimky – momentálně Linux neumožňuje na poli vytvořit oddíly a používat je.

Pro pokročilé: Problém je v tom, že /dev/md?zařízení mají major 9 a minor podle zařízení – md0 nulu, md1 jedničku atp. To se liší od číslování jiných disků, které mají skoky podstatně větší – zde pro oddíly prostě nezbývá místo. Existuje prý patch, který to řeší, ale údajně není moc stabilní.

Vytvoření SW RAID pole

Nejprve je nutné mít v kernelu podporu SW raidu. Buď modulárně – existují moduly raid5, raid1 atp., a pokud máte dobře nastavený autoloading, nahrají se samy. Nebo je nutné podporu přímo zakompilovat. Poté ještě potřebujete raidtools (pro kernely 2.4 raidtools2), které obsahují utility pro práci s RAIDy.

Pro vytváření pole je nejprve nutné určit zařízení, ze kterých se bude skládat. Můžete využít celé disky, ale většinou se používá oddíl, neboť v druhém oddílu disku je swap. Doporučuji oddílu dát typ „Linux raid autodetect“ (s kódem fd). Bez toho z něj nebude možno případně bootovat. Oddíly nemusí mít přesně stejnou velikost – použije se velikost nejmenšího z nich.

Ještě poznámka k diskům: Pokud budete používat IDE disky, nepoužívejte, pokud to jen trochu jde, IDE disky na stejném IDE kanálu (master a slave). Silně to degraduje výkon pole. (Disk a ne moc používaná CDROM se dá snést.)

Předpokládejme, že jsme vytvořili diskové oddíly /dev/hda2 a /dev/hdc2, na kterých chceme dělat RAID 1. Nyní musíme napsat definiční soubor RAID pole (v /etc/raidtab). Může vypadat například takto:

raiddev                 /dev/md0
raid-level              1
nr-raid-disks           2
nr-spare-disks          0
persistent-superblock   1
chunk-size              32
device                  /dev/hda2
raid-disk               0
device                  /dev/hdc2
raid-disk               1

Nejprve je uvedena obecná konfigurace RAID zařízení:

  • raiddev – Jméno zařízení. První raid se jmenuje md0, druhý md1 atp.
  • raid-level – Level (úroveň raidu, který chceme vytvořit)
  • nr-raid-disks – Počet disků v raidu
  • nr-spare-disks – Počet spare disků
  • persistent-superblock – Spíše pro zpětnou kompatibilitu, perzistentní superblock slouží pro lepší detekci přesunů disků, silně doporučuji zapnout.
  • chunk-size – Udává velikost tzv. stripu. Má význam spíše pro ladění výkonu.

Dále jsou definována zařízení, ze kterých se skládá:

  • device – Zařízení

A typ:

  • raid-disk – Aktivní raid disk
  • spare-disk – Spare disk (horká záloha)
  • failed-disk – Neaktivní disk (použití si ukážeme později)

Disky se číslují v jedné řadě, bez ohledu na typ.

Práce se SW RAID polem

Pokud máme vše nakonfigurováno, můžeme pole vytvořit. Dělá se to příkazem mkraid. V tomto případě použijeme mkraid /dev/md0. Pokud vše proběhne v pořádku, je pole vytvořeno a spuštěno. Nyní jej musíme naformátovat (mke2fs /dev/md0) a pak jej již můžeme příkazem mount připojit (případně dát do fstabu atp.).

Pokud je pole na partitionech s typem „Linux raid autodetect“ a raid je zakompilovaný přímo v kernelu (ne v modulech), spustí se takové pole automaticky ve fázi inicializace kernelových driverů hned po jeho spuštění. Jinak můžeme již vytvořené pole spustit příkazem raidstart. Buď můžeme použít raidstart /dev/md0 pro určité pole nebo raidstart -a pro spuštění všech nadefinovaných polí. Většina distribucí ale po instalaci raidtools spouští raidstart -a při bootu, takže se pole spustí po startu „samo“.

Zde se ale skrývá jeden velký háček. Když se pole spouští autodetekcí v kernelu, je to opravdu autodetekce a kernel nezajímá obsah souboru/etc/ra­idtab. Ani nemůže, neboť v té době ještě vůbec není přimountovaný ani root filesystém. Ale pokud se použije příkaz raidstart, ten se na definici pole kouká, a neodpovídá-li současný stav definici, pole se nespustí, nebo se spustí jinak, než chceme.

Pokud například disk hdc (secondary master) přeřadíte na slave (hdd), pole nenaběhne, neboť v definici je, že má používat hdc2. Musíte ji změnit na hdd2 a teprve potom vše pojede.

Pokud jeden disk odejde a nahradíte jej novým, nezařadí se do pole automaticky. Musíte vytvořit stejný partition (například hdc2) a poté jej do pole explicitně přidat příkazem raidhotadd (například raidhotadd /dev/md0 /dev/hdc2).

Kontrola stavu pole

Stav pole můžeme kontrolovat v souboru /etc/mdstat. V něm jsou lidsky čitelné informace o stavu diskových polí:

Personalities : [raid1]
read_ahead 1024 sectors
md0 : active raid1 ide/host0/bus0/target0/lun0/part2[0] ide/host0/bus1/target0/lun0/part2[1]
      77625984 blocks [2/2] [UU]

unused devices: <none>

Pole Personalities udává, jaké úrovně RAIDu jsou v kernelu zakompilovány nebo nahrány v modulech.

Dále jsou uvedena jednotlivá disková pole, jejich konfigurace (úroveň a disky, ze kterých se skládají) a jejich stav. Podstatný je údaj [2/2] (dva disky ze dvou funkční) a [UU] (první i druhý disk funkční). Pokud je například první disk nefunkční, je tam uvedeno [1/2] a [_U].

Bootování z RAID pole

Pochopitelně je dobré mít možnost z RAID pole i bootovat. Zde uvedený návod platí pro LILO, jak se to dělá v GRUBu či jiných zavaděčích, nevím.

V lilo.conf je potřeba nastavit tyto parametry (hodnoty jsou nastaveny pro náš předchozí příklad):

boot=/dev/md0
raid-extra-boot="/dev/hda,/dev/hdc"
root=/dev/md0

Tím zajistíme, že se LILO zapíše na všechny disky, ze kterých je pole sestaveno, a i při výpadku jednoho z disků bude možno počítač nabootovat.

Bootování z RAID pole za použití initrd

Pro neznalé – initrd je metoda bootování, kdy se i ovladače potřebné pro připojení root filesystému natahují do jádra jako moduly. Funguje to tak, že ke kernelu je ještě soubor s obrazem ramdisku, který se po spuštění kernelu připojí (LILO ví, na kterých blocích kterého disku je uložen, takže je možno jej načíst i bez filesystému) a z něj se potřebné moduly natáhnou.

V nedávné diskusi na linux@linux.cz zazněl názor, že initrd neumožňuje bootování z RAIDu. Není to pravda. Je jen nutné si uvědomit věci, které jsem uvedl u popisu spouštění pole. V případě initrd není podpora RAIDu zakompilována v kernelu, ale je v modulech na ramdisku. Takže autodetekce pole nefunguje. Je nutné:

  • Mít na ramdisku v adresáři /etc soubor raidtab s platnou definicí pole, ze kterého se má bootovat.
  • Mít na ramdisku raidtools nebo alespoň raidstart.
  • Spustit raidstart -a předtím, než se pokusíme namountovat root filesystém

Pokud jsou tyto předpoklady dodrženy, funguje bootování z RAIDu i s initrd zcela správně a bez problémů.

(Děkuji tímto Markovi Veberovi ze Solnetu, který se se mnou na rozchození bootování initrd z RAIDu podílel.)

Swap na RAID poli

Na většině počítačů má smysl provozovat swap oddíl minimálně jako „nárazníkovou zónu“, pokud systém nečekaně potřebuje hodně paměti. Máme v zásadě dvě možnosti. Můžeme vytvořit další RAID oddíl (třeba /dev/md1) a umístit swap na něj.

Nebo můžeme mít na každém disku zvláštní oddíl a swap tak nemít na RAIDu. Sice se v případě, že odejde disk se swapem, počítač kousne, ale jak jsem psal výše, to se u IDE disků stává i tak. Já zde používám tuto metodu, neboť je jednodušší a konfigurace druhého pole je obdobná jako konfigurace prvního.

Převádění existujícího disku na RAID

Často je potřeba převést existující systém souborů na RAID pole. Buď proto, že distribuce neumožňuje jednoduše instalaci přímo na RAID pole, nebo proto, že jsme se rozhodli na RAID převést server, který předtím RAID nevyužíval.

root_podpora

Od toho slouží typ disku failed-disk. Pokud je uveden, bude kernel počítat takový disk do RAIDu, ale bude jej považovat za nefunkční a nebude na něj nic zapisovat.

Protože celá procedura je složitější, uvedu v příštím dílu, na závěr seriálu, kompletní příklad.

Byl pro vás článek přínosný?