- předchozí článek - následující článek - obsah - úvodní stránka -

Linuxové noviny 07-08/2001

Softwarový RAID pod Linuxem

David Häring, 28. července 2001

Definice RAIDu

Na rozdíl od jiných hardwarových problémů jsou výpadky disků obvykle spojeny s časově náročnou obnovou dat ze záloh. Těmto problémům se ale můžeme vyhnout použitím redundantních diskových polí RAID, která jsou vůči výpadkům jednotlivých disků odolnější. Označení RAID pochází z anglického "Redundant Array of Inexpensive Disks" nebo také "Redundant Array of Independent Disks". Jedná se tedy o několik disků sloučených do jednoho logického svazku, který zpravidla zajišťuje určitou redundanci dat, díky které je pak odolný vůči hardwarovým výpadkům některého z disků. I když je v názvu obsaženo slovíčko "redundant", ne všechny typy RAIDu jsou skutečně redundantní. Zatímco některé typy RAIDu jsou navrženy s ohledem na maximální bezpečnost dat, jiné jsou naopak optimalizovány na rychlost.

Hardwarové a softwarové implementace RAIDu

RAID lze provozovat v podstatě dvojím způsobem. Buď je realizován v hardwaru, což obnáší speciální řadič osazený procesorem a zpravidla vybavený vlastní pamětí, která slouží jako cache. Veškeré funkce RAIDu plní řadič a z pohledu operačnímu systému se chová jako jediný disk. Tato řešení bývají poměrně drahá (Mylex, DPT - nyní Adaptec, ICP Vortex, velcí výrobci PC jako HP, IBM, Compaq apod. mají své vlastní implementace). Předností hardwarových řešení bývá maximální spolehlivost a ve srovnání se softwarovou variantou RAIDu dovedou odlehčit zátěži systému. RAID ovšem také může být realizován patřičným ovladačem na úrovni operačního systému a spousta operačních systémů to také dnes umožňuje. Toto řešení může být za jistých okolností flexibilnější a rychlejší, ale také náročnější na systémové prostředky - zejména na čas procesoru. V posledních letech se setkáváme i s napůl hardwarovými/softwarovými implementacemi RAIDu, kdy hardware obsahuje jen minimální podporu a většinu práce dělá ovladač - tato varianta je levná, ale řada produktů této kategorie je nevalné kvality a výkonu. Tento článek je zaměřený na softwarový RAID pod Linuxem.

Teorie fungování RAIDu

Než se zaměříme na detaily softwarového RAIDu pod Linuxem, podíváme se na princip fungování jednotlivých typů RAIDu a jejich vlastnosti.

RAID 0 (Nonredundant striped array)

Tento typ je určen pro aplikace, které vyžadují maximální rychlost a není redundantní. Naopak je potřeba vzít v úvahu, že pravděpodobnost výpadku takového pole roste s počtem disků. Ideální použití představují audio/video streamingové aplikace, eventuálně databáze a obecně aplikace, při kterých čteme sekvenčně velká množství dat. Základní jednotkou pole je tzv. stripe (z angl. "stripe", česky pruh), což je blok dat určité velikosti (běžně 4-64kB v závislosti na aplikaci). Po sobě jdoucí data jsou pak v poli rozložena střídavě mezi disky do "stripů" takovým způsobem, aby se při sekvenčním čtení/zápisu přistupovalo ke všem diskům současně. Tím je zajištěna maximální rychlost jak při čtení tak i zápisu, ale současně je tím dána také zranitelnost pole. Při výpadku kteréhokoliv disku se stávají data v podstatě nečitelná (respektive nekompletní). RAID 0 bývá označován rovněž jako striping. Protože není redundantní, má nejvýhodnější poměr cena/kapacita. Počet disků je libovolný. Je ovšem třeba pamatovat na to, že s rostoucím počtem disků v poli roste i pravděpodobnost výpadku pole (protože výpadek libovolného disku znamená havárii celého pole); RAID 0 je tedy velmi rychlý, ale méně bezpečný než samostatný disk.

RAID 1 (Mirrored array)

RAID 1 je naopak maximálně redundantní. Rychlost čtení může být oproti samostatnému disku výrazně vyšší, rychlost zápisu je stejná jako u samostatného disku. Funguje tak, že data jsou při zápisu "zrcadlena" na všechny disky v poli (tedy v případě RAIDu 1 tvořeného dvěma disku jsou data duplikována apod.). Při čtení lze využít vícero kopií dat a podobně jako u RAIDu 0 číst za všech disků současně. Tento typ pole je určen pro aplikace s důrazem na maximální redundanci. Výhodou tohoto redundantního řešení je stabilní výkon i v případě výpadku disku, nevýhodou je poměr cena/kapacita. Počet disků bývá buď 2 anebo libovolný, čím větší počet disků, tím větší redundance a odolnost proti výpadku.

RAID 2 (Parallel array with ECC)

Pole tohoto typu jsou dnes již historií, protože dnešní disky mají vlastní opravné mechanismy a uchovávají ECC informace pro každý sektor samy. V polích tohoto typu se stripovalo po jednotlivých sektorech a část disků pole byla vyhrazena pro ukládání ECC informací. Jakékoliv čtení i zápis proto zpravidla zahrnovalo přístup ke všem diskům pole, což bylo překážkou vyššího výkonu zejména u aplikacích pracujících se většími kusy dat. Tento typ není redundantní.

RAID 3 (Parallel array with parity)

Také tento typ polí se již nepoužívá, jedná se o předchůdce RAIDu 4. Stripovalo se po sektorech, ale jeden disk byl vyhrazen jako paritní, což zajišťovalo redundanci (princip zajištění redundance je stejný jako u RAIDu 4 a 5, který je popsán níže). Protože i v tomto případě se stripovalo po sektorech, jakékoliv čtení i zápis zpravidla zahrnovalo přístup ke všem diskům pole.

RAID 4 (Striped array with parity)

Raid 4 je redundantní pole, které se dnes již používá málo. Funkčně je podobné RAIDu 5, který je ale výkonnější. Funguje tak, že jeden disk je vyhrazen jako tzv. paritní disk. Na paritním disku je zaznamenán kontrolní součet (operace XOR přes data stejné pozice jednotlivých disků). Pokud tedy dojde k výpadku některého z datových disků, lze data rekonstruovat z dat zbylých disků a parity uložené na paritním disku. RAID 4 je odolný vůči výpadku libovolného jednoho disku a má tedy příznivý poměr cena/kapacita. Paritní disk ale představuje úzké hrdlo této architektury při zápisech, protože každý zápis znamená také zápis na paritní disk. Mimimální počet disků je 3.

RAID 5 (Striped array with rotating parity)

Tento typ poskytuje redundanci vůči výpadku libovolného jednoho disku s dobrým poměrem cena/kapacita a výkonem. RAID 5 je vylepšená varianta RAIDu 4 v tom, že parita není uložena na jednom vyhrazeném disku, ale je rozmístěna rovnoměrně mezi všemi disky pole, čímž se odstraní úzké hrdlo architektury RAIDu 4.

Paritu lze spočítat buď tak, že skutečně načteme a XORujeme data z odpovídajících datových stripů všech disků (takto se parita počítá při inicializaci pole, vyžaduje to tedy přístup ke všem diskům). Ve druhém případě načteme původní data z datového stripu, která se mají změnit, provedeme XOR s novými daty a výsledek ještě XORujeme s původní hodnotou parity (takto se parita počítá na již inicializovaném běžícím poli). Zápis dat tedy představuje dvoje čtení (dat a parity), výpočet parity a dvojí zápis (opět dat a parity). Počet přístupů na disk při zápisu je v tomto případě konstantní bez ohledu na počet disků v poli - přistupuje se vždy ke dvěma diskům - a to také má za následek nižší výkon tohoto typu pole ve srovnání s redundantním RAIDem 1.

V degradovaném režimu (degradovaný režim znamená stav, kdy je některý z disků z pole vyřazen kvůli hardwarové chybě) se pak musejí data uložená na vadném disku odvodit z dat zbývajících disků a parity. Na rozdíl od redundantního RAIDu 1, kde výpadek disku obvykle neznamená výrazný pokles výkonu, vykazuje RAID 5 v degradovaném režimu výrazně snížený výkon zejména při čtení. Minimální počet disků pro tento typ diskového pole jsou 3.

Kombinace více typů polí

Z definic výše popsaných typů polí vyplývá, že redundantní pole nejsou tak rychlá, jak bychom si mohli přát a naopak u RAIDu 0 nám chybí redundance. Existuje ovšem možnost, jak výhody jednotlivých typů diskových polí spojit. Tato metoda spočívá ve vytvoření kombinovaných polí, kdy disky v poli určitého typu jsou samy tvořeny poli jiného typu. Příkladem může být např. RAID 1+0, kdy jsou pole typu RAID 1 dále sloučeny do RAIDu 0. Takové pole je pak redundantní (toleruje výpadek až dvou disků), rychlejší zejména v zápisech než samotný RAID 1, a má lepší poměr cena/kapacita než RAID 1 (velikost je zde n/2 * disk a minimální počet disků je pak 4. Další možností je třeba RAID 0+1, RAID 5+0, RAID 5+1 apod.

Jak RAID ošetří výpadek disku

Všechny typy redundantních polí obvykle umožňují nakonfigurovat kromě aktivních disků ještě 1 či více rezervních disků. Aktivními disky zde rozumíme disky, které jsou součástí funkčního pole. V případě výpadku některého z aktivních disků pak může systém místo vadného disku okamžitě začít používat disk rezervní. Po aktivaci rezervního disku do pole systém provede na pozadí (tedy bez narušení dostupnosti pole) rekonstrukci pole a jakmile je rekonstrukce hotova, je pole opět plně redundantní. Rekonstrukcí je míněna buď synchronizace obsahu nového disku s ostatními aktivními disky (v prípadě RAIDu 1), anebo rekonstrukce obsahu původního vadného disku na základě redundantní informace (jedná-li se o RAID 4 nebo 5). Po dobu, než rekonstrukce proběhne, se pole nachází v tzv. degradovaném režimu, kdy v závislosti na konfiguraci nemusí být redundantní a v případě RAIDu 5 se to projeví sníženým výkonem (odtud název "degradovaný režim"). Je samozřejmě možné pole provozovat bez rezervních disků a disk vyměnit později manuálně. Detailně se na výměnu disků a rekonstrukci polí ještě podíváme později.

Redundantní pole neznamenají konec záloh

Redundantní disková pole jsou odolná pouze vůči výpadkům určitého počtu disků. Neochrání před výpadkem napájení, poškozením souborového systému při pádu celého systému nebo chybou administrátora. Proto je potřeba myslet i na další metody ochrany dat - např. na záložní zdroje napájení (UPS), žurnálovací souborové systémy apod. a v každém případě pravidelně zálohovat.

Typy polí podporovaných Linuxovým ovladačem RAIDu

Až doposud jsme se zabývali pouze teorií fungování diskových polí, podívejme se tedy jak to vypadá se softwarovým RAIDem v Linuxu. Softwarová implementace RAIDu pod OS Linux podporuje 5 typy diskových polí:

  • Linear - toto v podstatě není RAID, jedná se o možnost "pospojování" více disků do jednoho. Co se týče rychlosti, neliší se příliš od výkonu samostatných disků. Není redundantní, výhodou však je např. oproti RAIDu 0 to, že se v případě havárie jednoho z disků dají data ze zbývajících disků snáze obnovit, protože se nestripuje.
  • RAID 0 - zde je volitelná velikost stripu; tato výrazně (v závislosti na aplikaci) ovlivňuje výkon RAIDu.
  • RAID 1 - oproti klasické definici RAIDu 1 kdy se disky spojují pouze do párů, pod Linuxem můžeme vytvořit RAID 1 i z více než dvou aktivních disků.
  • RAID 4 - je sice implementován, ale funkčně nahrazen RAIDem 5
  • RAID 5 - opět je zde volitelná velikost stripu, která ovlivňuje výkon RAIDu.

Typ       počet disků    kapacita      redundance   shrnutí
--------------------------------------------------------------------------------
Linear    2 a více       n x disk      ne           není raid, 
                                                    pouze sloučení disků
			 
RAID 0    2 a více       n x disk      ne           maximální výkon při čtení 
                                                    i zápisu
		  	
RAID 1    2 a více       disk          ano          maximální redundance,
                                                    bez výrazné degradace 
                                                    výkonu při výpadku, 
                                                    rychlejší čtení,
                                                    vyšší cena
			
RAID 4    3 a více       (n-1) x disk  ano          nepoužívá se, 
                                                    nahrazen RAID 5
			 
RAID 5    3 a více       (n-1) x disk  ano          výhodný poměr cena/kapacita

tabulka: shrnutí používaných typů SW RAIDu

Historie, dostupnost, omezení

Původní ovladač "MetaDisku" (odtud název ovladače - md) napsal Marc Zyngier. Implementace zpočátku delší dobu podporovala pouze typy linear, RAID 0 a RAID 1. Později ovladač vyvíjeli zejména Ingo Molnár, Gadi Oxman a nyní Neil Brown. Přibyla podpora dalších typů polí a podpora bootování z RAIDu 0 a 1. V současné době se můžeme setkat se dvěma verzemi ovladače: verzí 0.42, kterou obsahují čistá jádra řady 2.2.x a verzí 0.90, která se nachází v jádrech řady 2.4.x. Jádra 2.2.x většiny distribucí ale obsahují podporu RAIDu verze 0.90, ovladač této verze pro jádra 2.2.x je k dispozici ve formě záplaty jádra. K provozování softwarového RAIDu je zapotřebí kromě jaderného ovladače také sada utilit raidtools (dříve mdtools), které musejí odpovídat verzi jaderného ovladače (raidtools 0.42 a raidtools 0.90).

Ovladače RAIDu jsou testovány především na platformě x86, ale lze je provozovat i na platformách Sun či Alpha (a možná i dalších, ovšem na těchto exotičtějších platformách jsou méně odladěny). Pro jádra řady 2.2.x platí určitá omezení, která vyplývají z architektury této řady jader:

  • na redundantním poli (tedy RAID 1 a 5) není možno bezpečně swapovat (a to ani do souboru) v průběhu rekonstrukce pole;
  • na redundantní pole (tedy RAID 1 a 5) není možno provozovat žurnálovací souborový systém (lépe řečeno, pokud probíhá na RAIDu 1 rekonstrukce pole, nesmí se používat žurnálování, na RAIDu 5 žurnálování použít nelze vůbec);
  • pole nelze libovolně kombinovat (přesněji lze vytvořit na první pohled funkční kombinované pole, ale výpadek disku může způsobit pád celého pole). Konkrétně je možné vytvářit pole 0+1 a kombinace polí 1,4 a 5. Nelze ale použít pole [145]+0.

Pro jádra řady 2.4 tato omezení neplatí.

Konfigurace

Konfigurace RAIDu verze 0.90 používá konfigurační soubor /etc/raidtab (na rozdíl od verze 0.42, kde byla konfigurace uložena v /etc/mdtab), ve kterém se používají následující direktivy:
  • raiddev: touto direktivou definice pole začíná, následuje označení pole. Svazky softwarového RAIDu se označují md1mdX.
  • raid-level: následuje direktivu raiddev, uvádíme zde typ pole (-1 = linear, 0 = RAID 0, 1 = RAID 1, 5 = RAID 5).
  • persistent-superblock: tato direktiva bude popsána níže, týká se kompatibility se starší verzí RAIDu.
  • chunk-size: velikost stripu, maximální velikost je 4MB (což je dáno konstantou MAX_CHUNK_SIZE ovladače), udává se v kB.
  • nr-raid-disks: zde uvádíme kolik diskových oddílů bude součástí pole (maximální počet je v jádrech 2.2.x 12, ale jsou k dispozici záplaty, které tento limit podstatně zvyšují)
  • nr-spare-disks: počet rezervních disků v poli
  • direktiva device jméno_oddílu následovaná jednou z direktiv raid-disk, spare-disk, parity-disk nebo failed-disk: tyto direktivy deklarují příslušné oddíly, které budou součástí pole.
  • raid-disk: tento oddíl bude aktivním oddílem.
  • spare-disk: tento oddíl bude sloužit jako rezervní.
  • parity-disk: tento oddíl bude sloužit jako paritní disk (RAID 4).
  • failed-disk: tento oddíl bude při inicializaci pole přeskočen (má význam pouze při sestavování pole v degradovaném stavu, viz diskuse níže).
  • parity-algorithm: specifikuje schéma rozložení parity u RAIDu 5 (možnosti jsou: left-symmetric, right-symmetric, right-asymmetric; z podporovaných je obecně nejrychlejší left-symmetric).
Konfigurace softwarového RAIDu je popsána v příslušném dokumentu HOWTO.

Starší verze softwarového RAIDu (0.40 až 0.51) používaly konfigurační soubor /etc/mdtab. Přestože tato starší verze ovladače je součástí "čistých jader" 2.2.x, je zastaralá a nebudeme se jí zde vůbec zabývat. Pro úplnost je starší verze RAIDu dokumentovaná v příslušném HOWTO.

Příklady konfigurací

Příklad konfigurace pole linear. Mějme pole typu linear složené ze dvou oddílů:

raiddev                 /dev/md0
raid-level              -1
persistent-superblock   1
nr-raid-disks           2
nr-spare-disks          0
device                  /dev/sda1
raid-disk               0
device                  /dev/sdb1
raid-disk               1

Příklad konfigurace RAID 0. Mějme diskové pole RAID 0 složené ze dvou oddílů, sda1 a sdb1, velikost stripu je 16 kB:

raiddev                 /dev/md0
raid-level              0
persistent-superblock   1
chunk-size              16
nr-raid-disks           2
nr-spare-disks          0
device                  /dev/sda1
raid-disk               0
device                  /dev/sdb1
raid-disk               1

Příklad konfigurace RAID 1. Mějme diskové pole RAID 1 složené ze dvou oddílů a s jedním rezervním oddílem:

raiddev                 /dev/md1
raid-level              1
nr-raid-disks           2
nr-spare-disks          1
device                  /dev/sda1
raid-disk               0
device                  /dev/sdb1
raid-disk               1
device                  /dev/sdc1
spare-disk              0

Příklad konfigurace pole RAID 5 s rozložením parity "left-symmetric", velikostí stripu 4 kB a jedním rezervním oddílem:

raiddev                 /dev/md2
raid-level              5
nr-raid-disks           3
chunk-size              4
parity-algorithm        left-symmetric
nr-spare-disks          1
device                  /dev/sda1
raid-disk               0
device                  /dev/sdb1
raid-disk               1
device                  /dev/sdc1
raid-disk               2
device                  /dev/sdc1
spare-disk              0

Obslužný software - Raidtools

Balíček raidtools (nahrazuje starší balíček mdtools určený pro starší verze ovladače RAIDu) obsahuje obslužné utility nezbytné k manipulaci s diskovými poli:
  • mkraid: pro inicializaci polí;
  • raidstart: pro spouštění diskových polí;
  • raidstop: pro vypnutí diskových polí;
  • raidhotadd: přidá nový diskový oddíl do aktivního diskové pole (náhradou za vadný oddíl, pokud jsou všechny oddíly pole funkční, přidá nový oddíl jako rezervní - "spare-disk"). Nelze tedy použít pro rozšíření kapacity pole;
  • raidhotremove: odejme vadný diskový oddíl z aktivního diskového pole;
  • raidsetfaulty: označí funkční diskový oddíl jako vadný, tím umožní jeho odejmutí z pole příkazem raidhotremove (možné využití např. při testování nebo výměnách funkčních disků); v posledních distribucích Red Hat se pro tento účel používá utilita raidhotgenerateerror;
  • raid0run: utilita pro spouštění starších polí typu linear nebo RAID 0 bez perzistentních superbloků (viz níže "Perzistentní superbloky a RAID 0 / linear").

V budoucnu zřejmě budou utility z balíčku raidtools nahrazeny jedinou utilitou mdctl, kterou vyvíjí Neil Brown. První verze této utility jsou již k dispozici. Utilita mdctl nemusí používat žádný konfigurační soubor, vše potřebné lze zadat na příkazové řádce, anebo to mdctl zjistí analýzou RAID superbloků uložených na discích (podobně funguje automatické startování polí jádrem při bootu). Cílem autora je tedy přidat výhody a robustnost, kterou poskytuje vlastnost raid autodetect jádra a zárověň se vyhnout potenciálním konfliktům mezi neaktuální konfigurací v souboru raidtab a skutečnou konfigurací polí, ke kterým časem může dojít, pokud používáme raidtools. Zatím je utilita mdctl ve stavu vývoje, takže její ostré použití ještě nelze doporučit.

Poznámka na vysvětlenou: Soubor raidtab odráží konfiguraci polí v době jejich sestavení, ovšem pokud třeba později vyměníme nebo přesuneme některé disky, nemusí již odrážet skutečnou konfiguraci. Pokud tedy z nějakého důvodu potřebujeme pole znovu inicializovat anebo ho jen startujeme pomocí raidstart, nesmíme zapomenout soubor raidtab ručně upravit, abychom se ušetřili v budoucnu nepříjemností.

Inicializace polí

Jakmile máme odpovídajícím způsobem rozdělené disky a připravený konfigurační soubor /etc/raidtab, můžeme pole inicializovat utilitou mkraid, která pole sestaví a aktivuje. Pokud zakládáme pole s perzistentními RAID superbloky (viz níže), pak mkraid vypíše i pozici RAID superbloků:

# mkraid  /dev/md5

handling MD device /dev/md5
analyzing super-block
disk 0: /dev/sda7, 20163568kB, raid superblock at 20163456kB
disk 1: /dev/sdb7, 20163568kB, raid superblock at 20163456kB

Po úspěšné inicializaci bychom měli v souboru /proc/mdstat, který obsahuje informace a aktivních polích vidět odpovídající záznam, např:

$ cat /proc/mdstat 

Personalities : [raid0] [raid1] [raid5] 
read_ahead 1024 sectors
md0 : active raid1 sdb1[1] sda1[0] 131968 blocks [2/2] [UU]

Poté nám nic nebrání pole zformátovat např. pomocí mke2fs, pokud chceme na poli provozovat souborový systém ext2. Utilita mke2fs akceptuje volbu -R stride=X, která udává kolik bloků souborového systému obsahuje 1 "stripe" pole. Tím pádem je také vhodné zadat ručně velikost bloku (parametr -b). Např. mějme pole typu RAID 0 s velikostí stripu 16 kB. Pokud budeme chtít použít velikost bloku souborového systému 4 kB, zadáme:

mke2fs /dev/md0 -b 4096 -R stride=4

Raid autodetect anebo raidstart?

Nyní tedy máme funkční diskové pole. Zbývá vyřešit způsob, jakým se bude pole vypínat při vypnutí systému a zapínat při startu systému. Jednou možností je použití utilit raidstart a raidstop. Pomocí těchto utilit můžeme pole aktivovat či zastavit kdykoliv, stačí tedy upravit příslušné startovací skripty. (Pokud už distribuce toto neobsahuje; např. distribuce Red Hat není potřeba upravovat, ze skriptu /etc/rc.d/rc.sysinit je raidstart volán automaticky, existuje-li soubor /etc/raidtab a raidstop je volán ze skriptu /etc/rc.d/init.d/halt.).

Disk /dev/sda: 255 heads, 62 sectors, 1124 cylinders
Units = cylinders of 15810 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/sda1             1        17    134354   fd  Linux raid autodetect
/dev/sda2            18        51    268770   fd  Linux raid autodetect
/dev/sda3            52       118    529635   fd  Linux raid autodetect
/dev/sda4           119      1124   7952430    5  Extended
/dev/sda5           119       152    268739   82  Linux swap
/dev/sda6           153       347   1541444   fd  Linux raid autodetect
/dev/sda7           348      1124   6142154   fd  Linux raid autodetect

výpis fdisku: nastavení diskových oddílů pro autodetekci RAID polí

Druhou, robustnější metodou je využití možnosti automatické aktivace polí jádrem při bootu. Aby mohla fungovat, je potřeba v prvé řadě používat perzistentní RAID superbloky a všechny diskové oddíly, které jsou součástí polí, musejí být v tabulce oddílů označeny jako typ Linux raid autodetect (tedy hodnota 0xfd hexadecimálně). Viz výpis fdisku - nastavení diskových oddílů pro autodetekci RAID polí.

Výhodou tohoto řešení navíc je, že jakmile je diskové pole inicializováno, nepoužívá se již pro opětovný start / zastavení pole konfigurační soubor /etc/raidtab. O sestavení a spuštění pole se postará ovladač RAIDu, který na všech diskových oddílech typu Linux raid autodetect vyhledá RAID superbloky a na základě informací v RAID superblocích pole spustí. Stejně tak ovladač RAIDu všechny pole korektně vypne v závěrečné fázi ukončení běhu systému poté, co jsou odpojeny souborové systémy. I v případě změny jmen disků nebo po přenesení disků na úplně jiný systém tedy pole bude korektně sestaveno a nastartováno, viz následující úryvek systémového logu po zámeně disků sdc za sdb a sdb za sda:

autorun ...
considering sdb6 ...
  adding sdb6 ...
  adding sda6 ...
created md4
bind<sda6,1>
bind<sdb6,2>
running: <sdb6><sda6>
now!
sdb6's event counter: 00000001
sda6's event counter: 00000001
md: device name has changed from sdc6 to sdb6 since last import!
md: device name has changed from sdb6 to sda6 since last import!
md4: max total readahead window set to 128k
raid1: device sdb6 operational as mirror 1
raid1: device sda6 operational as mirror 0
md: updating md4 RAID superblock on device
sdb6 [events: 00000002](write) sdb6's sb offset: 15332224
sda6 [events: 00000002](write) sda6's sb offset: 15332224

RAID superblok

Každý diskový oddíl, který je součásti raid svazku (výjimku tvoří pouze svazky bez perzistentních superbloků, viz níže) obsahuje tzv. RAID superblok. Tento superblok je 4kB část RAID oddílu vyhrazená pro informace o příslušnosti daného oddílu k určitému poli a o stavu pole. Následuje podrobný popis superbloku, který se nám bude později hodit při řešení některých problémových situcací popsaných níže. Čtenář, který se nechce RAIDem zabývat do hloubky, může tuto část přeskočit.

/* Device "operational" state bits */
#define MD_DISK_FAULTY          0 /* disk is faulty / operational */
#define MD_DISK_ACTIVE          1 /* disk is running or spare disk */
#define MD_DISK_SYNC            2 /* disk is in sync with the raid set */
#define MD_DISK_REMOVED         3 /* disk is in sync with the raid set */

typedef struct mdp_device_descriptor_s { __u32 number; /* 0 Device number in the entire set */ __u32 major; /* 1 Device major number */ __u32 minor; /* 2 Device minor number */ __u32 raid_disk; /* 3 The role of the device in the raid set */ __u32 state; /* 4 Operational state */ __u32 reserved[MD_SB_DESCRIPTOR_WORDS - 5]; } mdp_disk_t;

#define MD_SB_MAGIC 0xa92b4efc /* Superblock state bits */ #define MD_SB_CLEAN 0 #define MD_SB_ERRORS 1

typedef struct mdp_superblock_s { /* Constant generic information */ __u32 md_magic; /* 0 MD identifier */ __u32 major_version; /* 1 major version to which the set conforms */ __u32 minor_version; /* 2 minor version ... */ __u32 patch_version; /* 3 patchlevel version ... */ __u32 gvalid_words; /* 4 Number of used words in this section */ __u32 set_uuid0; /* 5 Raid set identifier */ __u32 ctime; /* 6 Creation time */ __u32 level; /* 7 Raid personality */ __u32 size; /* 8 Apparent size of each individual disk */ __u32 nr_disks; /* 9 total disks in the raid set */ __u32 raid_disks; /* 10 disks in a fully functional raid set */ __u32 md_minor; /* 11 preferred MD minor device number */ __u32 not_persistent; /* 12 does it have a persistent superblock */ __u32 set_uuid1; /* 13 Raid set identifier #2 */ __u32 set_uuid2; /* 14 Raid set identifier #3 */ __u32 set_uuid3; /* 14 Raid set identifier #4 */ __u32 gstate_creserved[MD_SB_GENERIC_CONSTANT_WORDS - 16]; /* Generic state information */ __u32 utime; /* 0 Superblock update time */ __u32 state; /* 1 State bits (clean, ...) */ __u32 active_disks; /* 2 Number of currently active disks */ __u32 working_disks; /* 3 Number of working disks */ __u32 failed_disks; /* 4 Number of failed disks */ __u32 spare_disks; /* 5 Number of spare disks */ __u32 sb_csum; /* 6 checksum of the whole superblock */ __u64 events; /* 7 number of superblock updates (64-bit!) */ __u32 gstate_sreserved[MD_SB_GENERIC_STATE_WORDS - 9]; /* Personality information */ __u32 layout; /* 0 the array's physical layout */ __u32 chunk_size; /* 1 chunk size in bytes */ __u32 root_pv; /* 2 LV root PV */ __u32 root_block; /* 3 LV root block */ __u32 pstate_reserved[MD_SB_PERSONALITY_WORDS - 4]; /* Disks information */ mdp_disk_t disks[MD_SB_DISKS]; /* Reserved */ __u32 reserved[MD_SB_RESERVED_WORDS]; /* Active descriptor */ mdp_disk_t this_disk; } mdp_super_t;

výpis: definice RAID superbloku: část hlavičkového souboru md_p.h

RAID superblok (o velikosti 4 kB) je uložen na konci diskového oddílu. Jeho pozici získáme buď ze systémového logu (ovladač RAIDu loguje updaty RAID superbloku):

md: updating md0 RAID superblock on device 
kernel: sdb1 [events: 000000e8](write) sdb1's sb offset: 8956096 

nebo ji také můžeme odvodit z velikosti diskového oddílu (komentář zdrojového kódu balíčku raidutils):

If x is the real device size in bytes, we return an apparent size of:
y = (x &  (MD_RESERVED_BYTES - 1)) - MD_RESERVED_BYTES
and place the 4kB superblock at offset y.

#define MD_RESERVED_BYTES  (64 * 1024)

Nejjednodušší je ale podívat se do /proc/mdstat, kde je uvedena velikost každého svazku v blocích, např. u pole typu RAID 1:

md0 : active raid1 sdb1[1] sda1[0] 131968 blocks [2/2] [UU]

RAID superblok z diskového oddílu sdb1 pak získáme a uložíme do souboru /tmp/superblok příkazem:

dd if=/dev/sdb1 of=/tmp/superblok bs=1k skip=131968 count=4

Jestliže se jedná o pole RAID 0, složené ze dvou disků, pak velikost získanou z /proc/mdstat vydělíme 2 např:

md4 : active raid0 sdd1[1] sdc1[0] 17942272 blocks 16k chunks

pak superblok zkopírujeme příkazem:

dd if=/dev/sdb1 of=/tmp/superblok bs=1k skip=8971136 count=4

Prohlédnout si jej můžeme např. pomocí utility od (s vhodnými parametry, např. od -Ax -tx4). Pro kontrolu, superblok vždy začíná "magickým číslem" 0xa92b4efc. Superblok obsahuje zejména následující informace:

  • verzi ovladače raidu, kterým byl vytvořen,
  • jedinečný identifikátor pole,
  • typ RAIDu,
  • datum vytvoření RAID svazku,
  • počty disků (aktivních, rezervních apod.),
  • preferované vedlejší číslo RAID zařízení,
  • stav pole,
  • kontrolní součet superbloku,
  • počet updatů superbloku,
  • datum posledního updatu superbloku,
  • velikost stripu,
  • informace o stavu jednotlivých diskových oddílů.

Perzistentní superbloky a RAID 0 / linear

Pokud provozujeme pole RAID 0 či linear, máme možnost zvolit variantu bez použití perzistentního superbloku. Volba "persistent-superblock 0", znamená, že se RAID superblok nebude ukládat na disk. Tato možnost existuje z důvodů zachování kompatibility s polemi zřízenými pomocí starší verzí ovladače RAIDu. Po vypnutí takového pole nezůstane na svazku informace o konfiguraci a stavu pole. Proto je tato pole nutné vždy znovu inicializovat při každém startu buď utilitou mkraid, nebo pomocí utility raid0run (což je pouze symbolický odkaz na mkraid) a nelze využít automatického startování polí jádrem při bootu.

Poznámka: Na tuto volbu je třeba dávat pozor při konfiguraci - pokud při konfiguraci pole RAID 0 direktivu persistent-superblock vynecháme, použije se standardní hodnota 0, tedy pole bez perzistentních superbloků!

Monitorování stavu pole

Aktuální stav diskových polí zjistíme vypsáním souboru /proc/mdstat. První řádek obsahuje typy polí, které ovladač podporuje (záleží na konfiguraci jádra). U jednotlivých RAID svazků je pak uvedeno které diskové oddíly svazek obsahuje, velikost svazku, u redundantních polí pak celkový počet konfigurovaných oddílů a z toho počet funkčních, následovaný schématem funkčnosti v hranatých závorkách. Následující příklad uvádí stav funkčního pole RAID 1:

md0 : active raid1 hdc1[1] hda1[0] 136448 blocks [2/2] [UU]

Druhý příklad uvádí stav pole RAID 1 po výpadku jednoho disku, oddíl sdc1 je označen jako nefunkční (F=Failed místo čísla aktivního oddílu):

md0 : active raid1 sdc1[F] sdd1[0] 8956096 blocks [2/1] [U_]

Třetí příklad ukazuje stav pole RAID 1, kdy probíhá rekonstrukce:

md1 : active raid1 hdc2[1] hda2[0] 530048 blocks [2/2] [UU] \
resync=4% finish=6.7min

Součástí raidtools bohužel není utilita k monitorování stavu diskových polí, takže si administrátor musí vypomoci skriptem, který je pravidelně spouštěn z cronu a kontroluje /proc/mdstat (jednoduše např. tak, že si skript na disk uloží obsah /proc/mdstat nebo jeho MD5 součet a následně kontroluje, jestli se /proc/mdstat změnil; v případě změny pak prostřednictvím e-mailu uvědomí administrátora) anebo filtrem systémového logu.

Rekonstrukce pole

Redundantní typy polí je třeba po inicializaci, po výměně disku, nebo po nahrazení vadného disku rezervním (viz direktiva spare-disk v /etc/raidtab) rekonstruovat či synchronizovat. Ve všech případech systém rekonstrukci spouští automaticky. Průběh rekonstrukce je možné sledovat v /proc/mdstat (viz příklad o několik řádek výše). Rekonstrukce probíhá s nízkou prioritou, nezabere tedy čas procesoru na úkor jiných aplikací, ale bude se snažit využít maximální prostupnosti I/O zařízení. Proto můžeme po dobu rekonstrukce pozorovat zpomalení diskových operací. Maximální rychlost rekonstrukce ovšem také lze ovlivnit nastavením limitu v /proc/sys/dev/md/speed-limit, výchozí hodnota je 100 kB/sec. Ovladač RAIDu umí současně spustit rekonstrukci na několika polích současně. Pokud jsou však oddíly jednoho disku součástí více polí, které by se měly synchronizovat současně, provede se synchronizace polí postupně (z důvodu výkonu). V systémovém logu se pak objeví neškodné hlášení typu "XX has overlapping physical units with YY":

md: syncing RAID array md1
md: minimum _guaranteed_ reconstruction speed: 100 KB/sec.
md: using maximum available idle IO bandwith for reconstruction.
md: using 128k window.
md: serializing resync, md2 has overlapping physical units with md1!
md: md1: sync done.
md: syncing RAID array md2
md: minimum _guaranteed_ reconstruction speed: 100 KB/sec.
md: using maximum available idle IO bandwith for reconstruction.
md: using 128k window.
md: md2: sync done.

V /proc/mdstat jsou ty svazky, na kterých je rekonstrukce pozastavena, označeny jako plně funkční, ale je u nich poznámka resync=DELAYED:

Personalities : [linear] [raid0] [raid1] [raid5] 
read_ahead 1024 sectors
md2 : active raid1 hdc3[1] hda3[0] 530048\
 blocks [2/2] [UU] resync=DELAYED
md1 : active raid1 hdc2[1] hda2[0] 530048\
 blocks [2/2] [UU] resync=4% finish=6.7min
md0 : active raid1 hdc1[1] hda1[0] 136448\
 blocks [2/2] [UU]

Pokud zformátujeme a připojíme čerstvě zřízené redundantní pole, na kterém probíhá rekonstrukce, mohou se v systémovém logu objevit následující neškodné hlášení (je to způsobené tím, že mke2fs, fsck a ovladač FS používají při přístupu jinou velikost bloku, než je výchozí velikost se kterou pracuje ovladač raidu):

kernel: set_blocksize: b_count 1, dev md(9,3),\
 block 96765, from c014
kernel: set_blocksize: b_count 1, dev md(9,3),\
 block 96766, from c014
kernel: set_blocksize: b_count 2, dev md(9,3),\
 block 96767, from c014
kernel: md3: blocksize changed during write 
kernel: nr_blocks changed to 32 (blocksize 4096,\
 j 24160, max_blocks 385536)

Redundantní pole: výměna disku, hot plug

Pokud při čtení nebo zápisu na některý z diskových oddílů, který je součástí redundantního diskového pole, dojde k chybě, je dotyčný oddíl označen jako vadný a pole jej přestane používat. Pokud máme v daném diskovém poli zařazen jeden nebo více rezervních disků (direktiva spare-disk), je tento v případě výpadku automaticky aktivován, systém provede rekonstrukci pole a průběh rekonstrukce zaznamená do systémového logu. V opačném případě pole zůstane v provozu v degradovaném režimu, pak to v systémovém logu bude vypadat zhruba takto:

kernel: SCSI disk error : host 0 channel 0\
 id 4 lun 0 return code = 28000002
kernel: [valid=0] Info fld=0x0, Current sd08:11:\
 sense key Hardware Error
kernel: Additional sense indicates\
 Internal target failure 
kernel: scsidisk I/O error:\
 dev 08:11, sector 2625928 
kernel: raid1: Disk failure on sdb1,\
 disabling device.  
kernel: Operation continuing on 1 devices 
kernel: md: recovery thread got woken up ... 
kernel: md0: no spare disk to reconstruct\
 array! - continuing in degraded mode
kernel: md: recovery thread finished ... 

Příjemnou vlastností diskových polí je také možnost výměny disku za chodu systému. Samozřejmě k tomu potřebujeme v prvé řadě hardware, který to umožňuje. Ovladače slušných SCSI řadičů umožňují přidávání či ubírání zařízení, to ale samo o sobě nestačí. Je zapotřebí používat SCA disky určené pro "hot swap" a odpovídající SCSI subsystém s SCA konektory a elektronikou, která zajistí stabilitu SCSI sběrnice při odebírání či přidávání zařízení.

Mějme pole typu RAID 1, ve kterém došlo k chybě na oddílu sdc1. Disk sdc1 je připojen ke kanálu 0 SCSI řadiče 0 a má ID rovno 4:

md0 : active raid1 sdc1[F] sdd1[0] 8956096 blocks [2/1] [U_]

Jak tedy probíhá výměna vadného disku, máme-li k tomu potřebné hardwarové vybavení:

  • provedeme raidhotremove /dev/md0 /dev/sdc1, což vyřadí vadný oddíl z pole md0,
  • provedeme echo "scsi remove-single-device 0 0 4 0">/proc/scsi/scsi, ovladač SCSI řadiče "zapomene" na zařízení na řadiči 0, kanálu 0, ID 4, LUN 0,
  • vyjmeme vadný disk sdc,
  • vložíme nový disk sdc,
  • vykonáme echo "scsi add-single-device 0 0 4 0" >/proc/scsi/scsi, což nový disk zpřístupní systému,
  • pomocí utility fdisk vytvoříme diskové oddíly,
  • vykonáme raidhotadd /dev/md0 /dev/sdc1, čímž přidáme oddíl sdc1 nového disku do pole md0 a na pozadí se spustí rekonstrukce pole.

Pokud nemáme hardware potřebný k "hot-swap" výměně disků, musíme se smířit s vypnutím systému, výměnou vadného disku a opětovným zapnutím systému. Potom stačí pouze vytvořit pomocí fdisku odpovídající diskové oddíly a příkazem raidhotadd je zařadit do diskového pole. Příkazy pro přidávaní a ubírání SCSI zařízení jsou popsány ve zdrojovém kódu jádra (soubor linux/drivers/scsi/scsi.c).

IDE nebo SCSI?

Doposud jsme se zbývali obecně fungováním softwarového RAIDu, ovšem ve chvíli kdy se rozhodneme sestavit systém s RAIDem, musíme se zamyslet nad výhodami a nevýhodami těchto rozhraní, které s provozováním diskových polí souvisejí. Protože tato problematika je sama o sobě rozsáhlá, uvedeme na tomto místě pouze několik zásadních rozdílů:

Rozhraní SCSI má několik rysů, které napomáhají vyššímu výkonu diskového subsystému:

  • Tagged command queing: SCSI zařízení mohou přijmout současně více příkazů (běžné SCSI řadiče až 256, disky obvykle až 64) a postupně je zpracovat v libovolném pořadí (možnost optimalizace). Toto je výhodou zejména u zařízení s dostatečnou cache (dnešní disky mají běžně 2 MB, případně 4 MB i více).
  • Elevator sorting: pořadí příkazů je přerovnáno takovým způsobem, aby se ztrácelo co nejméně času přesouváním hlaviček disku.
  • Podpora Disconnect/Reconnect: SCSI zařízení mohou uvolnit sběrnici pro komunikaci dalším zařízením, po dobu kdy např. zpracovávají příkazy.
  • počet zařízení, který lze k SCSI řadičům připojit je poměrně vysoký (běžně 7 či 15 zařízení na jeden kanál, ovšem musíme také myslet na prostupnost).

Rozhraní IDE má naopak několik nedostatků, které komplikují jeho nasazení, zejména:

  • na jednom kanálu mohou být připojena pouze 2 zařízení,
  • maximální délka kabelu je mnohem kratší než u zařízení SCSI,
  • IDE disky zpravidla nepodporují Disconnect/Reconnect, tedy po dobu provádění příkazu drží sběrnici, což způsobuje zbytečné prodlevy, pokud jsou na jednom kanálu oba disky. Jedno zařízení funguje jako tzv. "master" a druhé jako "slave". Závada zařízení které je připojené jako "master" může často znepřístupnit i druhé zařízení, které je připojeno jako "slave".

Je tedy jasné, že ačkoliv maximální teoretické propustnosti obou rozhraní jsou dnes poměrně vysoké, v prostředí, kde je kladen důraz na reálnou vysokou propustnost nejen při sekvenčním čtení nebo zápisu, je rozhraní SCSI stále volbou číslo jedna. Pokud se rozhodneme budovat systém na bázi IDE, rozhodně se vyplatí obsazovat každý kanál IDE pouze jedním zařízením. (A to jak z důvodu výkonu, tak stability, protože pokud bychom např. sestavili pole RAID 5 z IDE disků a disky by byly na kanálech po dvou, riskujeme v případě výpadku některého z "master" disků havárii celého pole, protože tím mohou v krajním případě vypadnout disky oba - jak "master" tak i "slave"".)

Testování

Když zprovozníme redundantní diskové pole, bude nás zajímat i způsob, jakým otestovat jeho odolnost proti výpadku disku. Můžeme k tomu použít utilitu raidsetfaulty, která simuluje výpadek disku a označí jej jako vadný (je potřeba mít dostatečně novou verzi balíčku raidtools, ve starších verzích tatu utilita chybí). Potom můžeme disk vyřadit z pole příkazem raidhotremove, opět přidat příkazem raidhotadd a sledovat průběh rekonstrukce pole. Metodu testování tím, že za chodu vytáhneme konektor disku, rozhodně nelze doporučit, protože tímto způsobem můžeme hardware vážně poškodit.

Tipy

Nyní už máme za sebou jak teorii fungování RAIDu, tak z velké části i praxi softwarového RAIDu pod Linuxem. V této poslední části se zaměříme na méně obvyklé postupy a tipy, jak řešit některé problémové situace.

Jak založit redundantní pole v degradovaném režimu

Softwarový RAID je poměrně flexibilní. Pokud jsme například v situaci, kdy potřebujeme převést systém běžící na samostatném disku na redundantní pole RAID 1, nemusíme kvůli tomu reinstalovat systém. Můžeme využít toho, že lze vytvořit pole v degradovaném režimu. Dejme tomu, že máme instalovaný systém na diskovém oddílu sda1 a pro zjednodušení je to jediný oddíl na disku sda. Do počítače jsme přidali disk stejně velký disk sdb a máme připraveno jádro podporující sofwarový RAID. Pomocí fdisku vytvoříme diskový oddíl sdb1 obdobně jako je na disku sda. Nyní vytvoříme konfigurační soubor /etc/raidtab:

raiddev /dev/md0
raid-level                1
persistent-superblock     1
nr-raid-disks             2
nr-spare-disks            0
device                    /dev/sdb1
raid-disk                 0
device                    /dev/sda1
failed-disk               1

Pomocí mkraid inicializujeme pole, vytvoříme na něm souborový systém (např. pomocí mke2fs), přípojíme a zkopírujeme na něj data z sda1. Odpovídajícím způsobem upravíme konfigurační soubory na svazku md0 (/etc/fstab apod.). Po té systém nabootujeme ze svazku md0 (třeba pomocí diskety anebo upravíme konfiguraci pro LILO), zkontrolujeme, že je vše v pořádku a příkazem raidhotadd přidáme oddíl sda1 do pole.

Jak přidat třetí aktivní disk do pole RAID 1

Pokud máme pole RAID 1 tvořené dvěma disky a rozhodneme se pro zvýšení redundance přidat ještě třetí, nestačí na to pouze příkaz raidhotadd. Ten totiž disk do pole přidá, ale pouze jako disk rezervní ("spare"). Pokud chceme, aby byl třetí disk také aktivní, musíme si opět pomoci direktivou failed-disk v konfiguračním souboru /etc/raidtab. Třetí disk označíme jako failed-disk a nezapomeneme zvýšit celkový počet aktivních disků na 3 (nr-raid-disk):

raiddev /dev/md0
raid-level                1
persistent-superblock     1
nr-raid-disks             3
nr-spare-disks            0
device                    /dev/sda1
raid-disk                 0
device                    /dev/sdb1
raidd-disk   
device                    /dev/sdc1
failed-disk   

Poté pomocí mkraid pole znovu inicializujeme a příkazem raidhotadd přidáme oddíl sdc1. (Tím, že označíme nový disk jako failed-disk zajistíme, že jej mkraid při inicializaci přeskočí, ale pole bude počítat se 3 disky, následné spuštění raidhotadd pak zajistí aktivaci.)

Když z RAIDu 5 vypadne více disků

RAID 5 je odolný vůči výpadku jednoho disku. Protože se stripuje, nejsou data z jednotlivých disků samostatně použitelná a tato situace je téměř neřešitelná. Co tedy dělat v případě, když k výpadku více než jednoho disku dojde? Pokud disky zůstaly po výpadku pole alespoň částečně použitelné, můžeme se pokusit o obnovení pole následujícím způsobem, opět s využitím direktivy failed-disk. Utilita mkraid v podstatě pouze zapíše na oddíly RAID svazku superbloky a nastartuje pole - nijak tedy nemění obsah oddílů. Teprve jaderný ovladač RAIDu spouští rekonstrukci a tomu můžeme zabránit tím, že pomocí mkraid pole znovu inicializujeme, ale pouze v degradovaném režimu (upravíme raidtab). Pole pak můžeme připojit s příznakem pouze pro čtení a zjistit, nakolik jsou data na svazku použitelná. Toto můžeme podle potřeby opakovat a postupně z pole vynechat jiný z disků, které z pole v době havárie vypadly, až najdeme takovou kombinaci, při které je souborový systém poškozen nejméně (můžeme zkusit spustit fsck). Potom můžeme svazek připojit i pro zápis a pomocí fsck souborový systém naostro opravit. Na závěr můžeme přidat i poslední chybějící disk pomocí raidhotadd, což vede ke spuštění rekonstrukce pole. Tato metoda ale představuje krajní řešení a rozhodně od ní nelze očekávat zázraky.

Když se změní pořadí či jména disků

Pokud se změní pořadí nebo jména zařízení (např. přidání dalších disků či periferií), které tvoří RAID svazek a nepoužíváme automatické startování RAIDu jádrem při bootu, musíme odpovídajícím způsobem upravit konfigurační soubor /etc/raidtab a případně pole znovu inicializovat pomocí mkraid -force (pozor - pouze pro ty, kteří vědí, co dělají). Pokud používáme vlastnost "raid autodetect" jádra, ovladač RAIDu si poradí sám a pole sestaví a spustí podle informací uložených v RAID superblocích diskových oddílů.

Rozšíření pole, konverze raidu na jiný typ

Utilita raidreconf, kterou původně vyvíjel Jakob Oestergaard, nyní vyvíjená jako open source aktivita Connexem, umí zmenšovat, zvětšovat RAID 0 a 5 svazky, převádět svazky typu RAID 0 na RAID 5, přidat nový disk do RAIDu 1 a 5, vytvořit pole RAID 0 ze samostatných disků. Tato utilita ale není dostatečně testována, takže pozorné čtení manuálu a záloha je naprostou nutností! Spolu s utilitou resize2fs je tedy možné tedy možné měnit i velikost polí.

Boot raid

Je možné provozovat kořenový svazek na RAIDu, a to typu linear, RAID 0 a RAID 1. Konfigurace starších verzí LILa byla sice trochu problematická, ale nové verze LILa již RAID podporují přímo, viz Software-RAID-0.4x-HOWTO (ke starší verzi RAIDu), Boot+Root+Raid+LILO HOWTO (k nové verzi RAIDu).

Jak potlačit autodetekci RAID polí

Pokud máme jádro s podporou autodetekce RAID polí a z nějakého důvodu potřebujeme autodetekci dočasně vypnout, můžeme jádru při startu zadat parametr raid=noautodetect.

RAID a swap

V souvislosti s RAIDem se často diskutuje o tom, zda má smysl vytvářet odkládací oddíly na RAIDu a když ano, tak jaký typ pole použít. Tady je zapotřebí vzít v potaz omezení daná ovladačem RAIDu (viz výše omezení platná pro jádra 2.2.x) a dále se musíme rozhodnout, zda nám jde o zrychlení swapování, nebo o robustnost systému. Pokud nám jde o rychlost, můžeme jako odkládací oddíl použít svazek RAID 0; ovšem podobného efektu můžeme dosáhnout i bez použití RAIDu a to tak, že v /etc/fstab uvedeme u odkládacích oddílů stejnou prioritu:

/dev/sda3     none    swap    sw,pri=1
/dev/sdb3     none    swap    sw,pri=1

Používat pro swap RAID 0 je tedy v podstatě zbytečné. Naopak v případě, že nám jde o robustnost systému, můžeme pro odkládací oddíl s výhodou použít RAID 1 svazek. Systém pak s výpadkem disku nepřijde o část swapu.

Výkon a stabilita

Nejprve srovnejme výkon softwarového raidu pod jádry 2.2 a 2.4: RAID 0 je rychlejší u jader 2.4, RAID 1 je na tom zhruba stejně, RAID 5 byl na řadě 2.4 z počátku výrazně pomalejší, i když toto se v poslední době rychle mění a nyní je výkon srovnatelný nebo lepší. Pokud jde o srovnání rychlosti softwarového RAIDu a hardwarových řešení, softwarový RAID je oproti hardwarové implementaci samozřejmě náročnější na systémové prostředky, ale na druhou stranu bývá mnohdy rychlejší (výrazně rychlejší bývá zejména RAID 0). (Poznámka: pro vylepšení výkonu RAIDu 1 při čtení existuje záplata ovladače RAIDu "readbalance".)

Pokud jde o robustnost implementace, stabilita RAIDu typů linear, RAID 0 a 1 je poměrně vysoká, naopak nasazení RAIDu 5 v ostrém provozu ještě nelze doporučit. V této souvislosti ještě zmíním jednu vlastnost Linuxové implementace softwarového RAIDu: V případě jakékoliv I/O chyby ovladač RAIDu okamžitě daný diskový oddíl z RAIDu vyřadí, bez ohledu na to, jestli se jedná o chybu fatální, anebo o případ, kdy by třeba stačilo danou I/O operaci zopakovat. Jinými slovy disk, který občas vrátí nějakou chybu, ale je nadále více méně schopný fungovat (a který by systém nadále používal, pokud by nebyl součástí RAID svazku, ale byl připojený jako samostatný oddíl), linuxový ovladač přestane používat. Tím se zbytečně snižuje robustnost RAIDu, protože snadněji může dojít k situaci, kdy z pole vypadne postupně i více disků, než kolik je k provozu daného pole třeba a pole zhavaruje. Proto lze doporučit použití rezervních disků a vyhnout se shánění rezervního disku na poslední chvíli, kdy už pole mezitím běží v degradovaném režimu. Ze srovnání softwarových RAID implementací Linuxu, Windows 2000 a Solarisu vyplývá, že linuxový RAID ve výchozím nastavení provádí rekonstrukci se sníženou prioritou a limitovanou rychlostí, takže probíhající rekonstrukce mnohem méně negativně ovlivňuje výkon systému po dobu rekonstrukce. (Poznámka: V odkazovaném srovnání ovšem autoři opakovaně chybně uvádějí absenci některých vlastností linuxové softwarové implementace RAIDu.)

Závěrem

Softwarový RAID je cenově lákavou alternativou nákladných hardwarových řešení. Další výhodou je flexibilita (např. možnost sestavení pole v degradovaném režimu, možnost eventuální částečné záchrany dat v případě výpadku celého pole, protože je známá struktura dat v diskovém poli, konverze RAID svazků z jednoho typu RAIDu na jiný). Některé z těchto možností jsou ale spíše experimentálního rázu. Za spolehlivé lze označit implementace RAIDu typu linear, RAID 0 nebo RAID 1. Softwarový RAID je náročnější na systémové prostředky než hardwarová řešení, některé typy (zejména RAID 0) ovšem mohou být výrazně rychlejší než hardwarové varianty. Je tedy na adminstrátorovi, aby zvážil výhody a nevýhody sofwarového či hardwarového RAIDu vzhledem k aktuálním podmínkám.

Tento článek ani v nejmenším nenahrazuje dokumentaci k ovladači Linuxového softwarového RAIDu či obslužným utilitám - proto zde až na výjimky záměrně nejsou komentovány přepínače obslužných utilit. Důkladné čtení dokumentace (nebo v případě nejasností studium zdrojového kódu - dokumentace bohužel stále není úplná) by mělo být samozřejmostí, rovněž existuje konference linux-raid s prohledávatelným archívem. A ještě úplně poslední poznámka na závěr: nezapomínejme, že (redundantní) RAID chrání pouze před výpadkem určitého počtu disků a rozhodně nenahrazuje nutnost pravidelného zálohování dat. *


- předchozí článek - následující článek - obsah - úvodní stránka -