RAID v Linuxu: Porovnání verzí
(→Sestavení pole: doplnění) |
(→Vytvoření pole: Vytvoření degradovaného pole) |
||
(Není zobrazeno 27 mezilehlých verzí od stejného uživatele.) | |||
Řádka 82: | Řádka 82: | ||
Pokud při vytvoření pole nedodáme všechny potřebné části, vytvoří se také, ale zůstane v degradovaném stavu. | Pokud při vytvoření pole nedodáme všechny potřebné části, vytvoří se také, ale zůstane v degradovaném stavu. | ||
+ | |||
+ | ==== Vytvoření degradovaného pole ==== | ||
+ | Pokud nejsou ve chvíli vytvoření pole k dispozici všechny členy, lze chybějící nahradit slovem <code>missing</code>. Lze použít i pro vytvoření pole z existujících členů tak, aby nedošlo k automatickému zahájení rekonstrukce pole: | ||
+ | |||
+ | # vytvoření RAID 1 s jedním členem | ||
+ | mdadm -C /dev/md1 -l1 -n2 /dev/hda3 missing | ||
+ | |||
+ | ==== Verze metadat ==== | ||
+ | {| class="wikitable" align="right" | ||
+ | ! align="left"| Verze | ||
+ | ! Pozice metadat | ||
+ | |- | ||
+ | | 0.9 | ||
+ | | Na konci zařízení | ||
+ | |- | ||
+ | | 1.0 | ||
+ | | Na konci zařízení | ||
+ | |- | ||
+ | | 1.1 | ||
+ | | Na začátku zařízení | ||
+ | |- | ||
+ | | 1.2 | ||
+ | | 4K od začátku zařízení | ||
+ | |} | ||
+ | |||
+ | Při vytvoření pole jsou na disk ukládána metadata, která vzniklé pole popisují. V současné době je možné se setkat se čtyřmi verzemi metadat: v0.9 (původní), v1.0, v1.1 a v1.2. Nevýhodou v0.9 je omezení na velikost 2 TiB. Další zmíněné tři formáty (tzv. version-1 superblock format) jsou variací na novější strukturu metadat, která umožňuje použít pokročilé vlastnosti MD subsystému. | ||
+ | |||
+ | ==== Konverze z v0.9 na v1.0 ==== | ||
+ | Verze 0.9 omezuje velikost RAID pole na 2 TiB. Pro další zvětšení pole (přidáním disků a následnou konverzí) není možné tuto hranici překročit (pole je sice větší, avšak obsažená data jsou omezena na zmíněné 2 TiB). Bohužel v současné době není k dispozici nástroj pro změny formátu metadat, avšak naštěstí existuje možnost, jak změnit formát z v0.9 na v1.0 ručně.<ref>http://marc.info/?l=linux-raid&m=130895284716309&w=2 – Neil Brown: Workaround to upgrade from v0.9 to v1.0</ref> Jeho podstatou je zastavení pole a jeho nové vytvoření s identickými parametry. Pokud jsou však parametry nového pole zadány špatně, dojde ke ztrátě dat. Navíc je možný pouze přechod z 0.9 na v1.0, protože oba formáty mají metadata na konci zařízení a vejdou se do stejného prostoru (při změněně nedojde k přepsání jiné části disku, než je oblast vyhrazená pro metadata). | ||
+ | |||
+ | Nejprve si vypište informace o poli, a pak pole zastavte: | ||
+ | |||
+ | mdadm --detail /dev/md0 | ||
+ | mdadm --stop /dev/md0 | ||
+ | |||
+ | Poté vytvořte pole se stejnými parametry (pozor, při chybě dojde ke ztrátě obsažených dat!): | ||
+ | |||
+ | mdadm --create /dev/md0 -l6 -n8 -c64 --layout=left-symmetric --metadata=1.0 --assume-clean /dev/sda1 /dev/sdb1 /dev/sdc1 ... | ||
=== Vytvoření souborového systému === | === Vytvoření souborového systému === | ||
Řádka 124: | Řádka 162: | ||
=== Sestavení pole === | === Sestavení pole === | ||
− | Chceme-li zastavené pole znovu spustit a zachovat data, musí být jen sestaveno (ne tedy vytvořeno, jak je uvedeno výše). K tomu slouží příkaz, kterému parametrem <code>-m</code> sdělíme, pro jaké ''minor number'' má hledat oddíly: | + | Chceme-li zastavené pole znovu spustit a zachovat data, musí být jen sestaveno (ne tedy vytvořeno, jak je uvedeno výše). K tomu slouží příkaz, kterému parametrem <code>-m</code> sdělíme, pro jaké ''Preferred minor number'' má hledat oddíly (v optimálním případě je číslo shodné s číslem MD zařízení, tj. zde pro <code>md1</code> je zřejmě ''Preferred minor number'' též 1): |
mdadm -A /dev/md1 -m1 | mdadm -A /dev/md1 -m1 | ||
Řádka 132: | Řádka 170: | ||
mdadm -A /dev/md1 -m1 --run | mdadm -A /dev/md1 -m1 --run | ||
− | '' | + | ''Preferred minor number'' lze také zjistit dotazem na příslušný oddíl, který chceme aktivovat. Následující příkaz vypíše informace z MD superbloku na prvním oddíle prvního disku v systému: |
mdadm -E /dev/sda1 | mdadm -E /dev/sda1 | ||
Řádka 147: | Řádka 185: | ||
/dev/md0: | /dev/md0: | ||
− | Version : | + | Version : 1.0 |
− | Creation Time : Thu | + | Creation Time : Thu Aug 18 11:36:07 2011 |
Raid Level : raid1 | Raid Level : raid1 | ||
− | Array Size : | + | Array Size : 20980784 (20.01 GiB 21.48 GB) |
− | + | Used Dev Size : 20980784 (20.01 GiB 21.48 GB) | |
Raid Devices : 2 | Raid Devices : 2 | ||
Total Devices : 2 | Total Devices : 2 | ||
− | + | Persistence : Superblock is persistent | |
− | Persistence : Superblock is persistent | + | |
+ | Intent Bitmap : Internal | ||
− | Update Time : | + | Update Time : Sat Sep 3 16:37:23 2011 |
− | State : | + | State : active |
Active Devices : 2 | Active Devices : 2 | ||
Working Devices : 2 | Working Devices : 2 | ||
Řádka 164: | Řádka 203: | ||
Spare Devices : 0 | Spare Devices : 0 | ||
− | UUID : | + | Name : localhost.localdomain:0 |
− | Events : | + | UUID : f8665378:b79d25a3:90cd2d67:750c7a5b |
+ | Events : 338168 | ||
Number Major Minor RaidDevice State | Number Major Minor RaidDevice State | ||
0 8 1 0 active sync /dev/sda1 | 0 8 1 0 active sync /dev/sda1 | ||
− | + | 2 8 17 1 active sync /dev/sdb1 | |
Ve výše uvedeném výpisu je vypsána informace o poli typu RAID1 (zrcadlo), které se skládá ze dvou oddílů (<code>/dev/sda1</code>, <code>/dev/sdb2</code>), jejich major-minor čísla jsou 8-1 a 8-17 (tj. čísla speciálních zařízení jednotlivých jednotlivých oddílů). Preferované minor number pole je 0 (nula), takže je pole automaticky sestaveno jako <code>/dev/md0</code>. Položka ''update time'' je používána při sestavování pole, kdy je potřeba zjistit, které členy pole obsahují platná data (novější záznam o poslední aktualizaci pole). Pokud jsou tedy u dvou členů zrcadla (RAID1) časy různé, použije se při sestavení pouze novější člen a starší člen je poté nutno s polem synchronizovat (viz kapitola ''Rekonstrukce degradovaného pole''). | Ve výše uvedeném výpisu je vypsána informace o poli typu RAID1 (zrcadlo), které se skládá ze dvou oddílů (<code>/dev/sda1</code>, <code>/dev/sdb2</code>), jejich major-minor čísla jsou 8-1 a 8-17 (tj. čísla speciálních zařízení jednotlivých jednotlivých oddílů). Preferované minor number pole je 0 (nula), takže je pole automaticky sestaveno jako <code>/dev/md0</code>. Položka ''update time'' je používána při sestavování pole, kdy je potřeba zjistit, které členy pole obsahují platná data (novější záznam o poslední aktualizaci pole). Pokud jsou tedy u dvou členů zrcadla (RAID1) časy různé, použije se při sestavení pouze novější člen a starší člen je poté nutno s polem synchronizovat (viz kapitola ''Rekonstrukce degradovaného pole''). | ||
Řádka 186: | Řádka 226: | ||
Ve výše uvedeném příkazu je sestaveno pole jako <code>/dev/md1</code>, i když by automaticky bylo sestaveno jako <code>/dev/md0</code>. Pole je sestaveno z prvků, které mají preffered minor number nastaven na nulu (podle parametru <code>-m0</code>). Další automatické sestavení proběhne jako <code>/dev/md1</code>, protože při sestavení se aktualizoval prefered minor number (viz parametr <code>--update=super-minor</code>). | Ve výše uvedeném příkazu je sestaveno pole jako <code>/dev/md1</code>, i když by automaticky bylo sestaveno jako <code>/dev/md0</code>. Pole je sestaveno z prvků, které mají preffered minor number nastaven na nulu (podle parametru <code>-m0</code>). Další automatické sestavení proběhne jako <code>/dev/md1</code>, protože při sestavení se aktualizoval prefered minor number (viz parametr <code>--update=super-minor</code>). | ||
− | === | + | === Zvětšení velikosti pole === |
Pro změny v organizaci pole slouží parametr <code>-G</code> (režim ''grow''). Nestačí-li nám již místo na disku, můžeme jeden starý disk vyměnit za nový, opět spustit počítač, vytvořit na novém disku větší oddíly a přidat je do existujícího pole. Proběhne rekonstrukce, avšak pole zůstane v původní velikosti (pole nevyužije větší oddíl celý). Vyměníme druhý starý disk za nový, vytvoříme na něm oddíly a znovu spustíme rekonstrukci. V tomto okamžiku máme k dispozici kompletní pole, které je menší, než umožňují vytvořené oddíly. Takové pole lze snadno zvětšit příkazem: | Pro změny v organizaci pole slouží parametr <code>-G</code> (režim ''grow''). Nestačí-li nám již místo na disku, můžeme jeden starý disk vyměnit za nový, opět spustit počítač, vytvořit na novém disku větší oddíly a přidat je do existujícího pole. Proběhne rekonstrukce, avšak pole zůstane v původní velikosti (pole nevyužije větší oddíl celý). Vyměníme druhý starý disk za nový, vytvoříme na něm oddíly a znovu spustíme rekonstrukci. V tomto okamžiku máme k dispozici kompletní pole, které je menší, než umožňují vytvořené oddíly. Takové pole lze snadno zvětšit příkazem: | ||
mdadm -G /dev/md1 --size max | mdadm -G /dev/md1 --size max | ||
− | Ve zbytku pole automaticky proběhne rekonstrukce, která zajistí identický obsah nové oblasti. | + | Ve zbytku pole automaticky proběhne rekonstrukce, která zajistí identický obsah nové oblasti. |
+ | |||
+ | ==== Zvětšení souborového systému ==== | ||
+ | Po zvětšení velikosti pole (blokového zařízení, na němž je umístěn souborový systém), je toto místo nevyužito. Proto je potřeba zvětšit souborový systém, který se na poli nachází. Podporuje-li použité jádro zvětšování za provozu (''online-resize''), není potřeba souborový systém odpojovat a stačí pouze zadat jeden ze dvou níže uvedených příkazů (podle verze <code>e2fsprogs</code>). Je-li použit příkaz <code>resize2fs</code> bez dalších parametrů, je provedeno zvětšení velikosti na maximální velikost, kterou umožňuje podkladové blokové zařízení (tj. typicky velikost oddílu nebo RAID pole). Přepínač <code>-p</code> způsobí, že bude průběžně vypisován průběh v procentech (podobně jako <code>-C0</code>). | ||
+ | resize2fs -p /dev/md1 # novější verze e2fsprogs (RHEL6) | ||
+ | resize4fs -p /dev/md1 # starší verze e2fsprogs (RHEL5) | ||
+ | ext2online -C0 /dev/md1 # starší verze e2fsprogs (RHEL4?) | ||
+ | |||
+ | ==== Odstranění bitmapy ==== | ||
+ | Pokud je v poli aktivní bitmapa zápisů, je nutné ji nejprve odstranit, poté změnit velikost pole a následně bitpamu opět přidat. Bitmapa se implicitně zapisuje do části metadat pole a automaticky se replikuje na všechny členy pole. Bitmapa může být i v souboru, avšak tento soubor nesmí být uvnitř toho samého pole, protože by došlo k deadlocku.<ref>http://cs.wikipedia.org/wiki/Deadlock – stránka o deadlocku na české Wikipedii</ref> Níže je uveden postup, kdy je po chybové zprávě bitmapa odstraněna, provedena změna velikost a pak je bitmapa opět přidána (tučně je zvýrazněn vstup uživatele), přičemž bitmapa může být opět přidána až po doběhnutí rekonstrukce pole (v případě zvětšení pole): | ||
+ | |||
+ | $ '''mdadm -G /dev/md1 --size max''' | ||
+ | mdadm: Cannot set device size for /dev/md1: Device or resource busy | ||
+ | Bitmap must be removed before size can be changed | ||
+ | $ '''mdadm -G /dev/md1 --bitmap=none''' | ||
+ | $ '''mdadm -G /dev/md1 --size max''' | ||
+ | $ '''cat /proc/mdstat''' # počkáme na dokončení rekonstrukce (resp. resynchronizace) pole | ||
+ | $ '''mdadm -G /dev/md1 --bitmap=internal''' | ||
+ | |||
+ | Bitmapa slouží k registraci zápisů do pole. Díky ní může být při rekonstrukci pole provedena pouze aktualizace dat změněných nedlouho od chvíle, kdy se pole rozpadlo. Proto je vhodné tuto rozdílovou bitmapu používat. Její existence se vypisuje v informacích o poli (viz kapitola [[#Zjištění vlastností pole|Zjištění vlastností pole]]). | ||
+ | |||
+ | ==== Offline zvětšení velikosti ==== | ||
+ | V případě, že zvětšujeme souborový systém a jádro online změnu velikosti nepodporuje, je nutné souborový systém nejprve odpojit, pak změnit velikost a poté znovu připojit. Při odpojování je nutné, aby byly ukončeny všechny programy, které mají na zmíněném souborovém systému otevřené soubory (vypíše je příkaz <code>lsof</code>). Nástroj pro změnu velikosti vyžaduje, aby byla těsně před jeho použitím provedena kontrola souborového systému příkazem <code>fsck</code>. Postup proto bude: | ||
+ | |||
+ | lsof /dev/md1 | ||
+ | umount /dev/md1 | ||
+ | fsck -f -C0 /dev/md1 | ||
resize2fs -p /dev/md1 | resize2fs -p /dev/md1 | ||
+ | mount /dev/md1 | ||
+ | |||
+ | === Zmenšení pole === | ||
+ | Zmenšení pole je potenciálně nebezpečná operace, protože může snadno dojít k přepsání dat na konci souborového systému. Mějte proto k dispozici zálohu vašich dat! Pole je možné zmenšit, avšak nejprve je nutné zmenšit velikost souborového systému, který je na něm uložen. Většina souborových systémů (ne-li všechny) neumožňuje online zmenšení velikosti, a proto je nutné souborový systém nejprve odpojit a teprve pak zmenšit jeho velikost. Nástroj pro změnu velikosti vyžaduje, aby byla těsně před jeho použitím provedena kontrola souborového systému příkazem <code>fsck</code>. Při výpočtu potřebného počtu bloků ne nutné počítat s tím, že do příslušného blokového zařízení (typicky oddíl, resp. partition) se musí vejít i RAID metadata, která jsou umisťována buď na začátek nebo na konec blokového zařízení v objemu asi 128 KiB. Současná implicitní verze metadat je 1.2 a je ukládána na konec blokového zařízení, na kterém je RAID prvek uložen. Po dokončení zmenšení spusťte pro jistotu příkaz <code>fsck</code>. Pokud budou nalezeny nekonzistence, přepsali jste si konec souborového systému metadaty z RAIDu… | ||
+ | |||
+ | umount /dev/md1 | ||
+ | fsck -f -C0 /dev/md1 | ||
+ | resize2fs -p /dev/md1 POČETBLOKŮ | ||
+ | mdadm -G /dev/md1 --size POČETBLOKŮ+128KiB | ||
+ | fsck -f -C0 /dev/md1 | ||
+ | |||
+ | Pokud je při pokusu o změnu velikosti pole hlášena chyba ''Cannot set device size for /dev/md10: Device or resource busy'', je nutné nejprve odstranit interní bitmapu, pak provést změnu velikosti a po dokončení rekonstrukce pole bitmapu opět aktivovat: | ||
+ | |||
+ | mdadm -G /dev/md1 --bitmap=none | ||
+ | mdadm -G /dev/md1 --size POČETBLOKŮ+128KiB | ||
+ | cat /proc/mdstat # počkáme na dokončení rekonstrukce (resp. resynchronizace) pole | ||
+ | mdadm -G /dev/md1 --bitmap=internal | ||
+ | fsck -f -C0 /dev/md1 | ||
+ | |||
+ | === Odstranění metadat pole === | ||
+ | Metadata jsou zapsána na oddíl při vytváření pole. Pokud je potřeba, aby pole již nebylo automaticky detekováno, je možné následujícím příkazem metadata odstranit (vynulovat): | ||
+ | |||
+ | mdadm --zero-superblock /dev/sda1 | ||
+ | |||
+ | == Konverze pole == | ||
+ | V Linuxu lze RAID pole konvertovat z jednoho formátu na druhý a lze též měnit počet disků, na kterých je pole rozloženo. Podporované změny jsou například: | ||
+ | |||
+ | RAID1 -> RAID5 | ||
+ | RAID5 -> RAID6 | ||
+ | |||
+ | === Konverze RAID1 na RAID5 === | ||
+ | Konverze dvojdiskového pole RAID1 na RAID5 je triviální záležitost, protože všechna data jsou na očekávaných místech. Výsledkem konverze je RAID5 pole v degradovaném stavu, do kterého je potřeba doplnit třetí disk. Nejprve je potřeba změnit pole RAID1 na RAID5: | ||
− | + | $ mdadm -G /dev/md2 --level=5 | |
+ | mdadm: level of /dev/md2 changed to raid5 | ||
+ | |||
+ | Stav ověříme: | ||
+ | |||
+ | $ cat /proc/mdstat | ||
+ | Personalities : [raid1] [raid6] [raid5] [raid4] | ||
+ | md2 : active raid5 sdh1[0] sdf1[1] | ||
+ | 1953511936 blocks level 5, 64k chunk, algorithm 2 [2/2] [UU] | ||
+ | |||
+ | Přidáme třetí disk: | ||
+ | |||
+ | $ mdadm /dev/md2 -a /dev/sdg1 | ||
+ | |||
+ | Ověříme stav: | ||
+ | |||
+ | cat /proc/mdstat | ||
+ | Personalities : [raid1] [raid6] [raid5] [raid4] | ||
+ | md2 : active raid5 sdg1[2](S) sdh1[0] sdf1[1] | ||
+ | 1953511936 blocks level 5, 64k chunk, algorithm 2 [2/2] [UU] | ||
+ | |||
+ | Nyní lze změnit rozvržení (layout) RAID5 ze dvou disků na tři. Na začátku této operace se nachází kritický úsek, kdy může dojít ke ztrátě dat, a proto je potřeba ohrožená data zálohovat do souboru. Během práce na ohroženém úseku, který se nachází na začátku pole, je zakázán zápis do pole, o což se postará sám příkaz <code>mdadm</code>. Pokud dojde k přerušení změny rozvržení pole, je nutné pole znovu sestavit (--assemble) s předáním souboru se zálohou. Následující příkaz změní layout (rozvržení) RAID5 ze dvou disků na tři: | ||
+ | |||
+ | mdadm -G /dev/md2 --raid-devices=3 --backup-file=/root/raid5.backup | ||
+ | mdadm: Need to backup 128K of critical section.. | ||
+ | |||
+ | Konverzí pole RAID5 (z rozvržení dvou na tři disky) dojde automaticky ke zvětšení kapacity. V tuto chvíli je možné zvětšit souborový systém, který se na RAID poli nachází (viz [[#Zvětšení souborového systému|Zvětšení souborového systému]]). | ||
== Monitorování stavu pole == | == Monitorování stavu pole == | ||
Řádka 214: | Řádka 338: | ||
echo "/sbin/mdadm --monitor --scan -1" > /etc/cron.hourly/mdmonitor | echo "/sbin/mdadm --monitor --scan -1" > /etc/cron.hourly/mdmonitor | ||
chmod +x /etc/cron.hourly/mdmonitor | chmod +x /etc/cron.hourly/mdmonitor | ||
+ | |||
+ | === Čekání na dokončení rekonstrukce === | ||
+ | Následující příkaz čeká na dokončení rekonstrukce pole a poté vrátí návratový kód odpovídající výsledku operace (pouze novější verze mdadm): | ||
+ | |||
+ | mdadm -W /dev/md0 | ||
== Spolupráce s LVM == | == Spolupráce s LVM == | ||
Řádka 245: | Řádka 374: | ||
mount | mount | ||
df -h | df -h | ||
+ | |||
+ | === Příklad rekonstrukce degradovaného pole === | ||
+ | Když dojde při práci s polem k chybě při práci s diskem, je právě používaný oddíl označen jako selhaný (failed, písmeno „F“) a pole se přepne do degradovaného stavu. Pokud je systém dobře nakonfigurován, správce o tom dostane zprávu (typicky e-mailem). Pole se typicky neobnovuje samo (ani restartem systému), je tedy nutný zásah správce (jak popisuje tento text). Stav pole lze zkontrolovat ve výpisu soubor <code>/proc/mdstat</code>: | ||
+ | |||
+ | $ cat /proc/mdstat | ||
+ | Personalities : [raid1] | ||
+ | md0 : active raid1 sda1[2](F) sdb1[1] | ||
+ | 30716160 blocks [2/1] [_U] | ||
+ | |||
+ | unused devices: <none> | ||
+ | |||
+ | Ve výše uvedeném výpisu je v poli <code>md0</code> označen oddíl <code>/dev/sda1</code> jako selhaný (písmeno „F“), přičemž se jedná o druhý člen pole (číslo 2 v hranatých závorkách). Stav disku je též na dalším řádku výpisu schematicky znázorněn podtržítkem (písmeno „U“ znamená „UP“, tj. funkční, podtržítko označuje nefunkční člen pole). Jedná se tedy o degradované pole RAID1 (zrcadlo), u kterého zůstal jeden funkční člen, takže pole je dále funkční, avšak neposkytuje již ochranu před závadou. Disk, který obsahuje selhaný oddíl <code>/dev/sda1</code> nemusí být celý vadný, protože se často stává, že došlo jen k dočasné chybě v komunikaci (což lze zjistit například tak, že pokud má disk více oddílů, jsou ostatní oddíly funkční). Stav disku lze zjistit také příkazem <code>smartctl</code> (viz článek [[Monitorování disků (S.M.A.R.T.)]]), kde disk sděluje své vlastní poznatky o své funkci: | ||
+ | |||
+ | smartctl -a /dev/sda | ||
+ | |||
+ | Pokud je disk schopen dalšího provozu, bude funkční i výpis jeho tabulky oddílů příkazem: | ||
+ | |||
+ | fdisk -l /dev/sda | ||
+ | |||
+ | <blockquote> | ||
+ | Pozor: ''Pokud výše uvedené příkazy <code>smartctl</code> a <code>fdisk</code> neposkytují rozumný výstup, „odpadl“ disk takovým způsobem, že s ním už nelze komunikovat. V tom případě je nutný „reset“ disku, ke kterému dojde restartem systému (příkaz <code>reboot</code>) nebo pomocí hardwarového tlačítka reset či úplného vypnutí počítače (příkaz <code>poweroff</code>) a jeho následné zapnutí tlačítkem nebo dokonce odpojením napájení počítače na několik minut. V každém případě si poznamenejte informace ze souboru <code>/proc/mdstat</code>.'' | ||
+ | </blockquote> | ||
+ | |||
+ | Je-li selhaný disk funkční (výše uvedené příkazy <code>smartctl</code> a <code>fdisk</code> poskytují rozumný výstup), lze i bez restartu nechat pole znovu zrekonstruovat. Nejprve je však nutné selhaný oddíl (ve výpisu souboru <code>/proc/mdadm</code> je u něj uvedeno písmeno F jako „failed“) z pole odstranit (přepínač <code>-r</code> jako „remove“): | ||
+ | |||
+ | mdadm /dev/md0 -r /dev/sda1 | ||
+ | |||
+ | Pak je možné oddíl znovu do pole zařadit. Pokud by disk nekomunikoval nebo komunikoval chybně, rekonstrukce selže a oddíl bude opět označen jako selhaný (písmeno F jako „failed“), což nebude mít na činnost pole žádný vliv. Volný (nepoužívaný) oddíl lze do pole začlenit (přepínač <code>-a</code> jako „add“) příkazem: | ||
+ | |||
+ | mdadm /dev/md0 -a /dev/sda1 | ||
+ | |||
+ | Rekonstrukci pole lze sledovat v souboru <code>/proc/mdstat</code>, průběžně pak pomocí příkazu <code>watch</code> (příkaz každé dvě vteřiny provede příkaz zadaný jako parametr, přerušit ho lze kombinací kláves CTRL+c): | ||
+ | |||
+ | watch cat /proc/mdstat | ||
+ | |||
+ | Výstup může vypadat například takto: | ||
+ | |||
+ | Every 2,0s: cat /proc/mdstat | ||
+ | |||
+ | Personalities : [raid1] | ||
+ | md0 : active raid1 sda1[2] sdb1[1] | ||
+ | 30716160 blocks [2/1] [_U] | ||
+ | [==>..................] recovery = 0.5% (167936/30716160) finish=6.0min speed=83968K/sec | ||
+ | |||
+ | Funkční pole lze uvést do degradovaného stavu i ručně (například proto, aby bylo možné výše zmíněný postup vyzkoušet) a to tak, že je nějaký člen pole označen jako selhaný („failed“) pomocí příkazu: | ||
+ | |||
+ | mdadm /dev/md0 -f /dev/sda1 | ||
+ | |||
+ | Po provedení výše uvedeného příkazu se pole dostane do stavu, jaký je na začátku tohoto řešeného příkazu (tj. degradované pole se selhaným prvkem <code>/dev/sda1</code>). Nezkoušejte označovat za selhané více prvků, než je možné u daného pole nechat selhat, aniž by to ovlivnilo funkčnost pole (u RAID1 musí zůstat alespoň jeden funkční, u RAID5 maximálně jeden selhaný, u RAID6 maximálně dva selhané). | ||
+ | |||
+ | == Reference == | ||
+ | <references /> | ||
== Externí odkazy == | == Externí odkazy == | ||
+ | * http://raid.wiki.kernel.org – Linux RAID Wiki | ||
* http://www.tldp.org/HOWTO/html_single/Software-RAID-HOWTO/ | * http://www.tldp.org/HOWTO/html_single/Software-RAID-HOWTO/ | ||
[[Kategorie:Práce s Linuxem]] | [[Kategorie:Práce s Linuxem]] |
Verze z 17. 3. 2016, 22:37
RAID (Redundant Array of Inexpensive Disks) je metoda, jak zvýšit výkon diskového systému nebo bezpečnost na disku uložených dat bez extrémních pořizovacích nákladů. Patří všude tam, kde je výpadek disku nebo dokonce ztráta dat nepřípustná. Typické nasazení jsou servery v počítačových sítích a místa, kde i malý výpadek přináší velké ekonomické ztráty.
Obsah
- 1 Úrovně RAID
- 2 Administrace RAIDu v Linuxu
- 2.1 Stav pole
- 2.2 Oddíly pro RAID
- 2.3 Vytvoření pole
- 2.4 Vytvoření souborového systému
- 2.5 Degradované pole
- 2.6 Rekonstrukce degradovaného pole
- 2.7 Zastavení pole
- 2.8 Sestavení pole
- 2.9 Zjištění vlastností pole
- 2.10 Změna preferovaného minor number
- 2.11 Zvětšení velikosti pole
- 2.12 Zmenšení pole
- 2.13 Odstranění metadat pole
- 3 Konverze pole
- 4 Monitorování stavu pole
- 5 Spolupráce s LVM
- 6 Význam dmraid
- 7 Řešené příklady
- 8 Reference
- 9 Externí odkazy
Úrovně RAID
Úrovně RAID se liší různou úrovní zabezpečení dat a výkonností. V praxi se nepoužívají všechny definované úrovně, ale jen ty nejvýhodnější. Podrobné informace najdete například na adrese http://cs.wikipedia.org/wiki/RAID.
RAID 0 (disk striping)
RAID 0 není vlastně žádný RAID. Zajišťuje pouze zvýšení výkonu paralelním provozováním více disků. Pole může být lineární (disky jsou jakoby spojeny za sebou) nebo prokládaná (kapacita je rozdělena na bloky, které se střídají – např. všechny liché na prvním a všechny sudé na druhém disku). Veškerá kapacita je určena pro ukládání dat (žádný prostor pro bezpečnostní informace). Pole má velikost 100% celkové kapacity. Při výpadku disku jsou data ztracena.
RAID 1 (disk mirroring)
RAID 1 je nejstarší používaná metoda zabezpečení dat. V počítači jsou dva stejně velké disky a oba provádějí všechny požadované operace. Rychlost zápisu proto klesá na 1/2 (musí se zapsat na oba disky). Naopak rychlost čtení může být v ideálním případě dvojnásobná (z každého disku je potřeba přečíst jen 1/2 dat). Pole má velikost 50 % celkové kapacity. Při výpadku disku z pole 2 disků je dále používán pouze zbývající disk a data nejsou dotčena. Vypadlý disk je však potřeba co nejrychleji nahradit, protože data už nejsou chráněna.
RAID 5
Bezpečnostní informace o paritě se ukládá rozprostřeně na všechny disky v poli, takže nedochází k přetěžování některého z disků. Zabezpečovací informace zabírají kapacitu jednoho z použitých disků. Minimální počet disků je 3. Pomocí zabezpečovací informace lze dopočítat ztracená data z 1 vypadlého disku. Výsledná kapacita je rovná součtu kapacity všech disků bez jednoho, takže s počtem disků se režie zmenšuje. Vypadlý disk je však potřeba co nejrychleji nahradit, protože data už nejsou chráněna.
RAID 6
RAID 6 je obdoba RAID 5, zabezpečovací informace jsou rozprostřeny po všech discích a zabírají kapacitu 2 disků. Pole je tak odolné vůči výpadku 2 disků. Při výpadku jednoho disku jsou tedy data po dobu rekonstrukce pole stále chráněna.
RAID 10
Označuje se jako RAID 1+0. Zrcadlené disky jsou tedy spojeny do 1 výsledného pole. Pole vyniká vysokou rychlostí čtení.
Administrace RAIDu v Linuxu
RAID pole lze v Linuxu vytvářet pomocí MD subsystému. Pro administraci RAID polí slouží v Linux příkaz mdadm
.
Stav pole
Jádro Linuxu udržuje informace o aktuálním stavu MD subsystému v souboru /proc/mdstat
. Pokud jsou v poli všechny disky, je pole funkční. V případě výpadku disku mluvíme o degradovaném RAID poli. Při vložení disku zpět do pole dojde k rekonstrukci chybějících dat (neplatí u RAID 0).
V níže uvedeném příkladu je v systému pole RAID 0, které se skládá ze dvou disků (sda1 a hda1). Pole je plně funkční (oba disku jsou ve stavu U jako up).
$ cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sda1[0] hda1[1] 19542976 blocks [2/2] [UU] unused devices: <none>
Detaily o aktivních polích je možné uložit do konfiguračního souboru pomocí příkazu:
echo DEVICE partitions > /etc/mdadm.conf mdadm --detail --scan >> /etc/mdadm.conf
Oddíly pro RAID
Pole RAID se obvykle sestavuje s oddílů. Pokud jsou oddíly, ze kterých je RAID pole sestaveno, označeny číselným identifikátorem fd (typ Linux raid autodetect), mohou být při startu jádra automaticky sestaveny (což je důležité v případě, že kořenový souborový systém také na RAID poli). V takovém případě ale musí být příslušné moduly přítomny v initrd obrazu, který jádro používá při svém zavedení do paměti počítače při startu systému.
V následujícím příkladu jsou vždy 1. a 3. oddíl na pevném disku /dev/hda
a /dev/sda
určen pro sestavení RAID pole:
$ fdisk -l /dev/hda Disk /dev/hda: 120.0 GB, 120060444672 bytes 255 heads, 63 sectors/track, 14596 cylinders Units = cylindry of 16065 * 512 = 8225280 bytes Zařízení Boot Start End Blocks Id System /dev/hda1 * 1 2433 19543041 fd Linux raid autodetect /dev/hda2 2434 2677 1959930 82 Linux swap / Solaris /dev/hda3 2678 14593 95715270 fd Linux raid autodetect
$ fdisk -l /dev/sda Disk /dev/sda: 120.0 GB, 120060444672 bytes 255 heads, 63 sectors/track, 14596 cylinders Units = cylindry of 16065 * 512 = 8225280 bytes Zařízení Boot Start End Blocks Id System /dev/sda1 * 1 2433 19543041 fd Linux raid autodetect /dev/sda2 2434 2677 1959930 82 Linux swap / Solaris /dev/sda3 2678 14593 95715270 fd Linux raid autodetect
Vytvoření pole
Pole se vytváří vždy v degradovaném stavu (neplatí pro RAID 0), takže okamžitě po vytvoření je zahájena rekonstrukce pole. Parametr -l
určuje typ RAID pole (0, 1, 5, 6 apod.), parametr -n
určuje počet prvků pole. Jednotlivé prvky pole musí být poté vyjmenovány:
# vytvoření RAID 0 mdadm -C /dev/md1 -l0 -n2 /dev/hda3 /dev/sda3
# vytvoření RAID 1 mdadm -C /dev/md1 -l1 -n2 /dev/hda3 /dev/sda3
# vytvoření RAID 5 mdadm -C /dev/md1 -l5 -n3 /dev/hda3 /dev/sda3 /dev/sdb3
Pokud při vytvoření pole nedodáme všechny potřebné části, vytvoří se také, ale zůstane v degradovaném stavu.
Vytvoření degradovaného pole
Pokud nejsou ve chvíli vytvoření pole k dispozici všechny členy, lze chybějící nahradit slovem missing
. Lze použít i pro vytvoření pole z existujících členů tak, aby nedošlo k automatickému zahájení rekonstrukce pole:
# vytvoření RAID 1 s jedním členem mdadm -C /dev/md1 -l1 -n2 /dev/hda3 missing
Verze metadat
Verze | Pozice metadat |
---|---|
0.9 | Na konci zařízení |
1.0 | Na konci zařízení |
1.1 | Na začátku zařízení |
1.2 | 4K od začátku zařízení |
Při vytvoření pole jsou na disk ukládána metadata, která vzniklé pole popisují. V současné době je možné se setkat se čtyřmi verzemi metadat: v0.9 (původní), v1.0, v1.1 a v1.2. Nevýhodou v0.9 je omezení na velikost 2 TiB. Další zmíněné tři formáty (tzv. version-1 superblock format) jsou variací na novější strukturu metadat, která umožňuje použít pokročilé vlastnosti MD subsystému.
Konverze z v0.9 na v1.0
Verze 0.9 omezuje velikost RAID pole na 2 TiB. Pro další zvětšení pole (přidáním disků a následnou konverzí) není možné tuto hranici překročit (pole je sice větší, avšak obsažená data jsou omezena na zmíněné 2 TiB). Bohužel v současné době není k dispozici nástroj pro změny formátu metadat, avšak naštěstí existuje možnost, jak změnit formát z v0.9 na v1.0 ručně.[1] Jeho podstatou je zastavení pole a jeho nové vytvoření s identickými parametry. Pokud jsou však parametry nového pole zadány špatně, dojde ke ztrátě dat. Navíc je možný pouze přechod z 0.9 na v1.0, protože oba formáty mají metadata na konci zařízení a vejdou se do stejného prostoru (při změněně nedojde k přepsání jiné části disku, než je oblast vyhrazená pro metadata).
Nejprve si vypište informace o poli, a pak pole zastavte:
mdadm --detail /dev/md0 mdadm --stop /dev/md0
Poté vytvořte pole se stejnými parametry (pozor, při chybě dojde ke ztrátě obsažených dat!):
mdadm --create /dev/md0 -l6 -n8 -c64 --layout=left-symmetric --metadata=1.0 --assume-clean /dev/sda1 /dev/sdb1 /dev/sdc1 ...
Vytvoření souborového systému
Na vytvořeném poli je možné vytvořit souborový systém. Není nutné čekat, až proběhne rekonstrukce pole. Příkaz tune2fs
vypíná automatické kontroly souborového systému, aby je mohl administrátor naplánovat na vhodnou dobu, kdy nebude neočekávaně prodloužen restart systému.
mkfs -t ext3 -j /dev/md1 tune2fs -c0 -i0 /dev/md1
V případě vytváření souborového systému pro běžnou instalaci (tj. cca 30 GB) je možné nechat počet vytvořených inodů na příkazu mkfs
. V případě, že vytváříme souborový systém pro domácí adresáře, ve kterých nebude mnoho malých souborů, je možné počet inodů zmenšit (přepínačem -N
). Kontrola pomocí příkazu fsck
pak probíhá mnohem rychleji. Tuto negativní vlastnost odstraňuje systém souborů ext4.
V případě polí s prokládanou strukturou (např. RAID 5 nebo 6) může mít vliv na výkonnost pole parametr stride, který je závislý na velikosti chunku u vytvořeného pole. Cílem je, aby aktualizace obsahu souborového systému nezasahovala do sousedního chunku pole, protože by se zbytečně zvýšil počet nutných I/O operací.
Pole s vytvořeným souborovým systém lze připojit do systému (a zkontrolovat kapacitu):
mount /dev/md1 /adresář df -h
Degradované pole
V případě problémů s diskem ho jádro automaticky označí jako F (failed) nebo ho rovnou z pole vyřadí (remove). Tím se pole dostane do degradovaného stavu.
Disk lze z pole vyřadit také ručně. Nejprve ho označíme jak failed (volba -f
) a pak ho z pole teprve odstraníme (remove, volba -r
). Pole bude dál pokračovat v degradovaném režimu:
mdadm /dev/md1 -f /dev/sda3 mdadm /dev/md1 -r /dev/sda3
Nechceme-li již odstraněný prvek pole používat, je nutné smazat informace v superbloku pole, aby si takového oddílu jádro již nevšímalo. Při použití tohoto příkazu musí být oddíl z pole předem vyřazen (viz výše):
mdadm --zero-superblock /dev/sda3
Rekonstrukce degradovaného pole
Pokud do degradovaného pole doplníme chybějící disk (tzv. hot-add), začne automaticky jeho rekonstrukce:
mdadm /dev/md1 -a /dev/sda3
Postup rekonstrukce lze sledovat v souboru /proc/mdstat
(viz výše). Rekonstrukce pole je odložena (DELAYED), pokud by měla probíhat na stejném disku, na kterém již nějaká rekonstrukce běží. Po dokončení aktivní rekonstrukce je automaticky zahájena odložená rekonstrukce.
Zastavení pole
Pole lze zastavit pouze v případě, že se nepoužívá (nesmí být připojeno příkazem mount):
mdadm -S /dev/md1
Sestavení pole
Chceme-li zastavené pole znovu spustit a zachovat data, musí být jen sestaveno (ne tedy vytvořeno, jak je uvedeno výše). K tomu slouží příkaz, kterému parametrem -m
sdělíme, pro jaké Preferred minor number má hledat oddíly (v optimálním případě je číslo shodné s číslem MD zařízení, tj. zde pro md1
je zřejmě Preferred minor number též 1):
mdadm -A /dev/md1 -m1
Pole lze sestavit i v degradovaném stavu, avšak je nutné přidat parametr --run
:
mdadm -A /dev/md1 -m1 --run
Preferred minor number lze také zjistit dotazem na příslušný oddíl, který chceme aktivovat. Následující příkaz vypíše informace z MD superbloku na prvním oddíle prvního disku v systému:
mdadm -E /dev/sda1
Pole lze místo sestavení (parametr -A
) také znovu vytvořit (parametr -C
, viz výše), avšak rekonstrukce špatně sestaveného pole může poškodit data. V takovém případě vytváříme pole tak, aby nebylo kompletní a rekonstrukci zahájíme až po ověření, že bylo pole správně sestaveno (používá se například u pole RAID 5, na kterém havarovaly dva disky a pokoušíme se zachránit data).
Zjištění vlastností pole
Vlastnosti pole lze zjistit několika různými způsoby:
mdadm -D /dev/md0 mdadm -Q --detail /dev/md0
V obou případech je zobrazeno například toto:
/dev/md0: Version : 1.0 Creation Time : Thu Aug 18 11:36:07 2011 Raid Level : raid1 Array Size : 20980784 (20.01 GiB 21.48 GB) Used Dev Size : 20980784 (20.01 GiB 21.48 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Intent Bitmap : Internal Update Time : Sat Sep 3 16:37:23 2011 State : active Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Name : localhost.localdomain:0 UUID : f8665378:b79d25a3:90cd2d67:750c7a5b Events : 338168 Number Major Minor RaidDevice State 0 8 1 0 active sync /dev/sda1 2 8 17 1 active sync /dev/sdb1
Ve výše uvedeném výpisu je vypsána informace o poli typu RAID1 (zrcadlo), které se skládá ze dvou oddílů (/dev/sda1
, /dev/sdb2
), jejich major-minor čísla jsou 8-1 a 8-17 (tj. čísla speciálních zařízení jednotlivých jednotlivých oddílů). Preferované minor number pole je 0 (nula), takže je pole automaticky sestaveno jako /dev/md0
. Položka update time je používána při sestavování pole, kdy je potřeba zjistit, které členy pole obsahují platná data (novější záznam o poslední aktualizaci pole). Pokud jsou tedy u dvou členů zrcadla (RAID1) časy různé, použije se při sestavení pouze novější člen a starší člen je poté nutno s polem synchronizovat (viz kapitola Rekonstrukce degradovaného pole).
Výše uvedené informace se zapisují do superbloku každého členu pole (dříve se superbloky nepoužívaly, takže bylo například obtížné pole po změně zapojení disků správně složit). Informace o poli musí být konzistentní ve všech členech pole. Z jednotlivých členů pole lze informace jednotlivě zjistit pomocí příkazu:
mdadm -Q --examine /dev/sda1
Ve výstupu příkazu je obdobná tabulka jako je uvedena výše. Navíc je vyznačeno, jakého člena pole jsme se zeptali.
Změna preferovaného minor number
V superbloku pole je zaneseno preferované minor number, se kterým je pole sestaveno. Tj. pro minor number 0 (nula) je vytvořeno zařízení /dev/md0
. Někdy je potřeba, aby se pole automaticky sestavilo pod jiným názvem zařízení (například 1, tj. /dev/md1
). V některých případech aktualizuje záznamy samo jádro, avšak obvykle je nutné změnit je ručně. Pole v takovém případě sestavíme s parametrem --update=super-minor
, který aktualizaci záznamů zajistí v okamžiku sestavení pole:
mdadm -A /dev/md1 -m0 --update=super-minor
Ve výše uvedeném příkazu je sestaveno pole jako /dev/md1
, i když by automaticky bylo sestaveno jako /dev/md0
. Pole je sestaveno z prvků, které mají preffered minor number nastaven na nulu (podle parametru -m0
). Další automatické sestavení proběhne jako /dev/md1
, protože při sestavení se aktualizoval prefered minor number (viz parametr --update=super-minor
).
Zvětšení velikosti pole
Pro změny v organizaci pole slouží parametr -G
(režim grow). Nestačí-li nám již místo na disku, můžeme jeden starý disk vyměnit za nový, opět spustit počítač, vytvořit na novém disku větší oddíly a přidat je do existujícího pole. Proběhne rekonstrukce, avšak pole zůstane v původní velikosti (pole nevyužije větší oddíl celý). Vyměníme druhý starý disk za nový, vytvoříme na něm oddíly a znovu spustíme rekonstrukci. V tomto okamžiku máme k dispozici kompletní pole, které je menší, než umožňují vytvořené oddíly. Takové pole lze snadno zvětšit příkazem:
mdadm -G /dev/md1 --size max
Ve zbytku pole automaticky proběhne rekonstrukce, která zajistí identický obsah nové oblasti.
Zvětšení souborového systému
Po zvětšení velikosti pole (blokového zařízení, na němž je umístěn souborový systém), je toto místo nevyužito. Proto je potřeba zvětšit souborový systém, který se na poli nachází. Podporuje-li použité jádro zvětšování za provozu (online-resize), není potřeba souborový systém odpojovat a stačí pouze zadat jeden ze dvou níže uvedených příkazů (podle verze e2fsprogs
). Je-li použit příkaz resize2fs
bez dalších parametrů, je provedeno zvětšení velikosti na maximální velikost, kterou umožňuje podkladové blokové zařízení (tj. typicky velikost oddílu nebo RAID pole). Přepínač -p
způsobí, že bude průběžně vypisován průběh v procentech (podobně jako -C0
).
resize2fs -p /dev/md1 # novější verze e2fsprogs (RHEL6) resize4fs -p /dev/md1 # starší verze e2fsprogs (RHEL5) ext2online -C0 /dev/md1 # starší verze e2fsprogs (RHEL4?)
Odstranění bitmapy
Pokud je v poli aktivní bitmapa zápisů, je nutné ji nejprve odstranit, poté změnit velikost pole a následně bitpamu opět přidat. Bitmapa se implicitně zapisuje do části metadat pole a automaticky se replikuje na všechny členy pole. Bitmapa může být i v souboru, avšak tento soubor nesmí být uvnitř toho samého pole, protože by došlo k deadlocku.[2] Níže je uveden postup, kdy je po chybové zprávě bitmapa odstraněna, provedena změna velikost a pak je bitmapa opět přidána (tučně je zvýrazněn vstup uživatele), přičemž bitmapa může být opět přidána až po doběhnutí rekonstrukce pole (v případě zvětšení pole):
$ mdadm -G /dev/md1 --size max mdadm: Cannot set device size for /dev/md1: Device or resource busy Bitmap must be removed before size can be changed $ mdadm -G /dev/md1 --bitmap=none $ mdadm -G /dev/md1 --size max $ cat /proc/mdstat # počkáme na dokončení rekonstrukce (resp. resynchronizace) pole $ mdadm -G /dev/md1 --bitmap=internal
Bitmapa slouží k registraci zápisů do pole. Díky ní může být při rekonstrukci pole provedena pouze aktualizace dat změněných nedlouho od chvíle, kdy se pole rozpadlo. Proto je vhodné tuto rozdílovou bitmapu používat. Její existence se vypisuje v informacích o poli (viz kapitola Zjištění vlastností pole).
Offline zvětšení velikosti
V případě, že zvětšujeme souborový systém a jádro online změnu velikosti nepodporuje, je nutné souborový systém nejprve odpojit, pak změnit velikost a poté znovu připojit. Při odpojování je nutné, aby byly ukončeny všechny programy, které mají na zmíněném souborovém systému otevřené soubory (vypíše je příkaz lsof
). Nástroj pro změnu velikosti vyžaduje, aby byla těsně před jeho použitím provedena kontrola souborového systému příkazem fsck
. Postup proto bude:
lsof /dev/md1 umount /dev/md1 fsck -f -C0 /dev/md1 resize2fs -p /dev/md1 mount /dev/md1
Zmenšení pole
Zmenšení pole je potenciálně nebezpečná operace, protože může snadno dojít k přepsání dat na konci souborového systému. Mějte proto k dispozici zálohu vašich dat! Pole je možné zmenšit, avšak nejprve je nutné zmenšit velikost souborového systému, který je na něm uložen. Většina souborových systémů (ne-li všechny) neumožňuje online zmenšení velikosti, a proto je nutné souborový systém nejprve odpojit a teprve pak zmenšit jeho velikost. Nástroj pro změnu velikosti vyžaduje, aby byla těsně před jeho použitím provedena kontrola souborového systému příkazem fsck
. Při výpočtu potřebného počtu bloků ne nutné počítat s tím, že do příslušného blokového zařízení (typicky oddíl, resp. partition) se musí vejít i RAID metadata, která jsou umisťována buď na začátek nebo na konec blokového zařízení v objemu asi 128 KiB. Současná implicitní verze metadat je 1.2 a je ukládána na konec blokového zařízení, na kterém je RAID prvek uložen. Po dokončení zmenšení spusťte pro jistotu příkaz fsck
. Pokud budou nalezeny nekonzistence, přepsali jste si konec souborového systému metadaty z RAIDu…
umount /dev/md1 fsck -f -C0 /dev/md1 resize2fs -p /dev/md1 POČETBLOKŮ mdadm -G /dev/md1 --size POČETBLOKŮ+128KiB fsck -f -C0 /dev/md1
Pokud je při pokusu o změnu velikosti pole hlášena chyba Cannot set device size for /dev/md10: Device or resource busy, je nutné nejprve odstranit interní bitmapu, pak provést změnu velikosti a po dokončení rekonstrukce pole bitmapu opět aktivovat:
mdadm -G /dev/md1 --bitmap=none mdadm -G /dev/md1 --size POČETBLOKŮ+128KiB cat /proc/mdstat # počkáme na dokončení rekonstrukce (resp. resynchronizace) pole mdadm -G /dev/md1 --bitmap=internal fsck -f -C0 /dev/md1
Odstranění metadat pole
Metadata jsou zapsána na oddíl při vytváření pole. Pokud je potřeba, aby pole již nebylo automaticky detekováno, je možné následujícím příkazem metadata odstranit (vynulovat):
mdadm --zero-superblock /dev/sda1
Konverze pole
V Linuxu lze RAID pole konvertovat z jednoho formátu na druhý a lze též měnit počet disků, na kterých je pole rozloženo. Podporované změny jsou například:
RAID1 -> RAID5 RAID5 -> RAID6
Konverze RAID1 na RAID5
Konverze dvojdiskového pole RAID1 na RAID5 je triviální záležitost, protože všechna data jsou na očekávaných místech. Výsledkem konverze je RAID5 pole v degradovaném stavu, do kterého je potřeba doplnit třetí disk. Nejprve je potřeba změnit pole RAID1 na RAID5:
$ mdadm -G /dev/md2 --level=5 mdadm: level of /dev/md2 changed to raid5
Stav ověříme:
$ cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] md2 : active raid5 sdh1[0] sdf1[1] 1953511936 blocks level 5, 64k chunk, algorithm 2 [2/2] [UU]
Přidáme třetí disk:
$ mdadm /dev/md2 -a /dev/sdg1
Ověříme stav:
cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] md2 : active raid5 sdg1[2](S) sdh1[0] sdf1[1] 1953511936 blocks level 5, 64k chunk, algorithm 2 [2/2] [UU]
Nyní lze změnit rozvržení (layout) RAID5 ze dvou disků na tři. Na začátku této operace se nachází kritický úsek, kdy může dojít ke ztrátě dat, a proto je potřeba ohrožená data zálohovat do souboru. Během práce na ohroženém úseku, který se nachází na začátku pole, je zakázán zápis do pole, o což se postará sám příkaz mdadm
. Pokud dojde k přerušení změny rozvržení pole, je nutné pole znovu sestavit (--assemble) s předáním souboru se zálohou. Následující příkaz změní layout (rozvržení) RAID5 ze dvou disků na tři:
mdadm -G /dev/md2 --raid-devices=3 --backup-file=/root/raid5.backup mdadm: Need to backup 128K of critical section..
Konverzí pole RAID5 (z rozvržení dvou na tři disky) dojde automaticky ke zvětšení kapacity. V tuto chvíli je možné zvětšit souborový systém, který se na RAID poli nachází (viz Zvětšení souborového systému).
Monitorování stavu pole
Nástroj mdadm
umožňuje monitorovat stav pole a v případě, že dojde k rozpadnutí pole (které však může dále pokračovat v činnosti), odešle upozornění administrátorovi systému. Administrátor se obvykle pokusí zahájit rekonstrukci pole pouhým přidáním vypadlého oddílu znovu do pole (viz výše), případně musí vyměnit vadný disk, vytvořit znovu oddíly a teprve pak pole nechat zrekonstruovat.
Nejprve připravíme konfigurační soubor /etc/mdadm.conf
, ve kterém by mělo být alespoň:
DEVICE partitions MAILADDR root
V RHEL je pro monitorování k dispozici skript, který spustí hlídacího démona. Druhým příkazem démona necháme automaticky spouštět při startu systému:
/etc/init.d/mdmonitor start chkconfig mdmonitor on
Pokud nastavíme systém tak, jak je uvedeno výše, přijde administrátorovi systému pouze jeden mail, který oznámí problém v poli (přechod do degradovaného stavu). Pokud bychom chtěli být informováni opakovaně, lze vytvořit skript, který se bude spouštět periodicky každou hodinu (analogicky do adresáře /etc/cron.daily
, aby byl proveden jen jednou denně):
echo "/sbin/mdadm --monitor --scan -1" > /etc/cron.hourly/mdmonitor chmod +x /etc/cron.hourly/mdmonitor
Čekání na dokončení rekonstrukce
Následující příkaz čeká na dokončení rekonstrukce pole a poté vrátí návratový kód odpovídající výsledku operace (pouze novější verze mdadm):
mdadm -W /dev/md0
Spolupráce s LVM
Jednotlivá vytvořená pole jsou často používána jako stavební prvky pro LVM (viz LVM v Linuxu, tzv. PV). LVM umožňuje plynule za chodu systému zvyšovat kapacitu, snadno migrovat souborový systém na nové disky, vytvářet snímky atd.
Význam dmraid
Jádro implementuje tzv. dmraid, což jsou pole, která se vytvářejí pro tzv. softwarové řadiče RAID (často obsažené na základních deskách). Pro jejich správu slouží speciální příkaz dmraid
. Pro svoji činnost používá dm
zařízení (obdoba LVM v Linuxu). Obecně nelze dmraid doporučit, protože má proti výše popisovaným md
zařízením omezené možnosti. Sofwarový RAID řadič obvykle nijak nezlepšuje práci s jednotlivými disky, poskytuje pouze informace o složení a konfiguraci jednotlivých polí, která je uložena v nevolatilní paměti řadiče.
Řešené příklady
Vytvoření pole RAID1
Nejprve je nutné vytvořit oddíly, ze kterých bude pole sestaveno. Aby bylo možné pole automaticky sestavit při restartu počítače ještě před spuštěním startovacích skriptů, je nutné použít jako prvky pole standardní oddíly (partition), které budou označeny identifikátorem fd
(typ Linux raid autodetect) a na nich se vytvoří persistent superblok. Pole bude vytvořeno na nových discích /dev/sdc
a /dev/sdd
. Nejprve vytvoříme oddíly přes celé disky a nastavíme jejich označení na fd
:
fdisk /dev/sdc fdisk /dev/sdd
Následně vytvoříme pole RAID1 a zkontrolujeme jeho stav výpisem souboru /proc/mdstat
. Nové pole automaticky zahájí rekonstrukci.
mdadm -C /dev/md1 -l1 -n2 /dev/sdc1 /dev/sdd1 cat /proc/mdstat
Souborový systém lze vytvořit již v době, kdy běží rekonstrukce. Pokud je vytvářen souborový systém ext3, na kterém budou spíše větší soubory (například domácí adresáře pro sdílení pomocí Samby), je vhodné pomocí parametru -N
snížit počet vytvářených inodů, protože pak rychleji proběhne kontrola disku příkazem fsck
. Počet inodů musí být přiměřený, protože když dojdou volné inody, tak není možné vytvářet další soubory, i když je na disku volné místo (v datových blocích – viz příkaz df
). Počet inodů není nutné snižovat, pokud je použit souborový systém ext4. Příkaz tune2fs
vypíná automatické periodické kontroly souborového systému (ne že by nebyly potřeba, ale lze je vhodně naplánovat a nebudou tak zdržovat neplánovaný restart systému).
mkfs -t ext3 -j /dev/md1 tune2fs -c0 -i0 /dev/md1
Poté vytvoříme adresář (mkdir
), do něj souborový systém připojíme (mount
) a zkontrolujeme jeho kapacitu (df
):
mkdir /mnt/test mount /dev/md0 /mnt/test mount df -h
Příklad rekonstrukce degradovaného pole
Když dojde při práci s polem k chybě při práci s diskem, je právě používaný oddíl označen jako selhaný (failed, písmeno „F“) a pole se přepne do degradovaného stavu. Pokud je systém dobře nakonfigurován, správce o tom dostane zprávu (typicky e-mailem). Pole se typicky neobnovuje samo (ani restartem systému), je tedy nutný zásah správce (jak popisuje tento text). Stav pole lze zkontrolovat ve výpisu soubor /proc/mdstat
:
$ cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sda1[2](F) sdb1[1] 30716160 blocks [2/1] [_U] unused devices: <none>
Ve výše uvedeném výpisu je v poli md0
označen oddíl /dev/sda1
jako selhaný (písmeno „F“), přičemž se jedná o druhý člen pole (číslo 2 v hranatých závorkách). Stav disku je též na dalším řádku výpisu schematicky znázorněn podtržítkem (písmeno „U“ znamená „UP“, tj. funkční, podtržítko označuje nefunkční člen pole). Jedná se tedy o degradované pole RAID1 (zrcadlo), u kterého zůstal jeden funkční člen, takže pole je dále funkční, avšak neposkytuje již ochranu před závadou. Disk, který obsahuje selhaný oddíl /dev/sda1
nemusí být celý vadný, protože se často stává, že došlo jen k dočasné chybě v komunikaci (což lze zjistit například tak, že pokud má disk více oddílů, jsou ostatní oddíly funkční). Stav disku lze zjistit také příkazem smartctl
(viz článek Monitorování disků (S.M.A.R.T.)), kde disk sděluje své vlastní poznatky o své funkci:
smartctl -a /dev/sda
Pokud je disk schopen dalšího provozu, bude funkční i výpis jeho tabulky oddílů příkazem:
fdisk -l /dev/sda
Pozor: Pokud výše uvedené příkazy
smartctl
afdisk
neposkytují rozumný výstup, „odpadl“ disk takovým způsobem, že s ním už nelze komunikovat. V tom případě je nutný „reset“ disku, ke kterému dojde restartem systému (příkazreboot
) nebo pomocí hardwarového tlačítka reset či úplného vypnutí počítače (příkazpoweroff
) a jeho následné zapnutí tlačítkem nebo dokonce odpojením napájení počítače na několik minut. V každém případě si poznamenejte informace ze souboru/proc/mdstat
.
Je-li selhaný disk funkční (výše uvedené příkazy smartctl
a fdisk
poskytují rozumný výstup), lze i bez restartu nechat pole znovu zrekonstruovat. Nejprve je však nutné selhaný oddíl (ve výpisu souboru /proc/mdadm
je u něj uvedeno písmeno F jako „failed“) z pole odstranit (přepínač -r
jako „remove“):
mdadm /dev/md0 -r /dev/sda1
Pak je možné oddíl znovu do pole zařadit. Pokud by disk nekomunikoval nebo komunikoval chybně, rekonstrukce selže a oddíl bude opět označen jako selhaný (písmeno F jako „failed“), což nebude mít na činnost pole žádný vliv. Volný (nepoužívaný) oddíl lze do pole začlenit (přepínač -a
jako „add“) příkazem:
mdadm /dev/md0 -a /dev/sda1
Rekonstrukci pole lze sledovat v souboru /proc/mdstat
, průběžně pak pomocí příkazu watch
(příkaz každé dvě vteřiny provede příkaz zadaný jako parametr, přerušit ho lze kombinací kláves CTRL+c):
watch cat /proc/mdstat
Výstup může vypadat například takto:
Every 2,0s: cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sda1[2] sdb1[1] 30716160 blocks [2/1] [_U] [==>..................] recovery = 0.5% (167936/30716160) finish=6.0min speed=83968K/sec
Funkční pole lze uvést do degradovaného stavu i ručně (například proto, aby bylo možné výše zmíněný postup vyzkoušet) a to tak, že je nějaký člen pole označen jako selhaný („failed“) pomocí příkazu:
mdadm /dev/md0 -f /dev/sda1
Po provedení výše uvedeného příkazu se pole dostane do stavu, jaký je na začátku tohoto řešeného příkazu (tj. degradované pole se selhaným prvkem /dev/sda1
). Nezkoušejte označovat za selhané více prvků, než je možné u daného pole nechat selhat, aniž by to ovlivnilo funkčnost pole (u RAID1 musí zůstat alespoň jeden funkční, u RAID5 maximálně jeden selhaný, u RAID6 maximálně dva selhané).
Reference
- ↑ http://marc.info/?l=linux-raid&m=130895284716309&w=2 – Neil Brown: Workaround to upgrade from v0.9 to v1.0
- ↑ http://cs.wikipedia.org/wiki/Deadlock – stránka o deadlocku na české Wikipedii