Správa linuxového serveru: Ještě trocha LVM
Ačkoliv LVM vyniká flexibilitou práce s úložným prostorem, jeho velkým problémem je možné selhání fyzických svazků (physical volume), na kterých je LVM postaveno. Pokud tedy vytvořím skupinu svazků (volume group) z několika pevných disků, je sice na jednu stranu hezké, že k tomu prostoru mohu přistupovat jako ke spojitému úložnému prostoru, se kterým mohu zacházet jako s jedním velkým pevným diskem, který mohu dále libovolně dělit, ale co když některý z těch disků selže? LVM se v tomto ohledu chová podobně jako RAID 0, nemá žádnou redundanci a selhání fyzického svazku znamená ztrátu dat.
LVM v Linuxu však redundance přeci jen schopen je. V rámci LVM je totiž možné vytvořit logický svazek (logical volume), který bude fyzicky zrcadlen nad dvěma nebo více fyzických svazích. To je totéž, co provádí RAID 1. Předpokladem pro vytvoření zrcadleného svazku jsou alespoň tři (ano, opravdu tři) fyzické svazky. Je tomu tak kvůli nutnosti uložení diskového logu na třetí, nezávislé zařízení.
Na úvod vám ukážu tu nejjednodušší situaci, do které se můžete dostat:
[root@debian ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb vg lvm2 a- 10.00g 10.00g
/dev/sdc vg lvm2 a- 10.00g 10.00g
/dev/sdd vg lvm2 a- 10.00g 10.00g
Zde jsou vidět tři potřebné fyzické svazky s dostatečnou kapacitou. V takovém případě postačí vytvořit zrcadlený logický svazek, takto:
[root@debian ~]# lvcreate -L 9G -n zrcadlo -m 1 vg
Logical volume "zrcadlo" created
Jakmile dojde k vytvoření zrcadleného oddílu, dojde i k zahájení úvodní synchronizace jednotlivých zrcadel. Je to proces velmi podobný jako v případě klasického RAIDu 1. Třetí disk, respektive malý kousek na něm, pak slouží jako synchronizační log, díky kterému bude možné udržet synchronizaci i po deaktivaci skupiny svazků (k té dojde třeba při restartu, apod.). Průběh synchronizace je možné sledovat pomocí nástroje lvs
:
[root@debian ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
zrcadlo vg mwi-a- 9.00g zrcadlo_mlog 1.39
Pokud byste chtěli sledovat situaci v reálném čase, můžete si pomoci nástrojem watch
:
watch -n 1 lvs
Tento příkaz bude de facto spouštět nástroj lvs
každou sekundu. Můžete samozřejmě použít i časy kratší, i když v tomto případě to patrně nebude nutné.
První komplikací, která může nastat, je absence třetího fyzického svazku pro uložení mirror logů. V takovém případě, nevadí-li vám nutnost opětovné synchronizace při každém restartu počítače, můžete použít následující trik:
lvcreate -L 5G -n zrcadlo -m 1 vg --mirrorlog core
Můžete použít i kratší zápis --corelog
místo --mirrorlog core
. Obojí zajistí možnost vytvořit daný logický svazek pouze na dvou fyzických svazcích místo třech.
Druhou možnou komplikací může být nedostatek souvislého prostoru na fyzických svazcích. Pro lepší ilustraci, uvažte následující situaci:
[root@debian ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
root vg -wi-a- 8.00g
storage vg -wi-a- 8.00g
[root@debian ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb vg lvm2 a- 10.00g 2.00g
/dev/sdc vg lvm2 a- 10.00g 10.00g
/dev/sdd vg lvm2 a- 10.00g 2.00g
Pokud se podíváte na dostupnou kapacitu skupiny svazků, zjistíte, že je možné vytvořit až 7GB velký zrcadlený logický svazek, ale volné místo na discích sdb
a sdd
je po dvou GB. Pokud předpokládáte, že v této konfiguraci postačí zadat LVM vytvoření zrcadleného oddílu a on potřebné místo uvolní, pak vás musím zklamat, tohle LVM automaticky provést neumí:
[root@debian ~]# lvcreate -L 6G -n zrcadlo -m 1 vg
Insufficient suitable allocatable extents for logical volume : 1025 more required
Unable to allocate extents for mirror(s).
Dejme tomu, že vám bude stačit 6GB. Abyste tedy mohli zrcadlený svazek vytvořit, musíte uvolnit potřebné místo na jednotlivých fyzických svazcích ručně. K tomu použijete nástroj pvmove
. Chcete-li 6GB velký svazek a máte-li v dané skupině svazků velikost fyzického extentu (PE) 4MB, budete potřebovat alespoň 1536 PE na dvou fyzických svazcích, neboť:
(6 * 1024) / 4 = 1536
Zjistit konkrétně hodnoty alokace PE můžete pomocí nástroje vgdisplay
:
[root@debian ~]# pvdisplay /dev/sdb
--- Physical volume ---
PV Name /dev/sdb
PE Size 4.00 MiB
Total PE 2559
Free PE 511
Allocated PE 2048
Jelikož v tomto případě potřebujete 1536 volných PE, přesunete PE od extentu 1022 až po poslední alokovaný extent, tedy 2048, ze svazku sdb
na svazek sdc
:
pvmove /dev/sdb:1022-2048 /dev/sdc
Totéž provedu se svazkem sdd
:
pvmove /dev/sdd:1022-2048 /dev/sdc
Výsledek bude vypadat takto:
[root@debian ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb vg lvm2 a- 10.00g 6.00g
/dev/sdc vg lvm2 a- 10.00g 1.99g
/dev/sdd vg lvm2 a- 10.00g 6.00g
Nyní již můžete konečně vytvořit požadovaný zrcadlený logický svazek:
[root@debian ~]# lvcreate -L 6G -n zrcadlo -m 1 vg
Logical volume "zrcadlo" created
Ruční žonglování s PE a nutnost řešit související matematické úlohy asi není to pravé ořechové, ale bohužel mi kromě možnosti napsat si za tímto účelem nějaký pomocný shellový skript není znám žádný rychlejší postup.
Pokud disk selže, projeví se to ve výpisu fyzických svazků takto:
[root@debian ~]# pvs
Couldn't find device with uuid 'fM74J2-9Utu-jvCL-mGVg-7xJW-iiQd-l0Lvgf'.
PV VG Fmt Attr PSize PFree
/dev/sdc vg lvm2 a- 10.00g 1.98g
/dev/sdd vg lvm2 a- 10.00g 0
unknown device vg lvm2 a- 10.00g 0
Pokud samotný zápis na zrcadlený svazek nevyvolá automatickou konverzi zrcadleného svazku na lineární (nezrcadlený), lze to učinit ručně, odebráním chybějících zařízení ze skupiny svazků:
[root@debian ~]# vgreduce --removemissing vg --force
Couldn't find device with uuid 'fM74J2-9Utu-jvCL-mGVg-7xJW-iiQd-l0Lvgf'.
WARNING: Bad device removed from mirror volume, vg/zrcadlo
WARNING: Mirror volume, vg/zrcadlo converted to linear due to device failure.
Wrote out consistent volume group vg
WARNING: dev_open(/etc/lvm/cache/.cache) called while suspended
Po výměně disku postačí nový disk vložit do skupiny svazků:
[root@debian ~]# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created
[root@debian ~]# vgextend vg /dev/sdb
Volume group "vg" successfully extended
A následně provést konverzi nyní lineárního svazku "zrcadlo" na svazek zrcadlený:
lvconvert -m1 vg/zrcadlo
LVM si uchovává podstatné údaje jednak v /etc/lvm
a jednak v hlavičkách fyzických svazků. Pokud máte celý systém na LVM a dojde k nějaké havárii a systém vám nenastartuje, pak musíte LVM připojit ručně.
Nástroje pvscan
, vgscan
a lvscan
po svém spuštění bez parametru osahají všechny dostupné disky a najdou všechny fyzické svazky (physical volumes), skupiny svazků (volume groups) a logické svazky (logical volumes).
Abyste vytvořili všechna potřebná zařízení v /dev
, použijte následující příkaz:
vgchange -ay
Pak budete moci přistupovat ke všem logickým svazkům, připojit je a provést případnou záchranou operaci.
Pokud budete spravovat server (a nejenom v tomto případě), pak se rozhodně vyplatí alokovat jednotlivým logickým svazkům co nejméně, nechat si ve skupině svazků volné místo a spíše logické svazky rozšiřovat dle potřeby, než alokovat celý dostupný prostor a pak přemýšlet, co zmenšit. Volný prostor je nutný nejen k vytváření dalších logických svazků, ale i k vytváření snapshotů.
Podle mého názoru je nejideálnější schéma nasazení LVM nad nějakým RAIDem, ať už RAIDem 1, 5, 6 nebo třeba 10. Samotné zrcadlení v rámci LVM je zajímavé, ale trpí jistými drobnými nedostatky, počínaje nutností mít tři fyzické svazky. Také je nutné počítat s tím, že LVM je co do funkčnosti podstatně rozsáhlejší a složitější než samotný RAID 1, ať už softwarový či hardwarový. V případě problémů (hardwarových i softwarových) je RAID 1 přeci jen jednodušší v případě záchranných operací.
Když už zmiňuji RAID a zrcadlení, neodpustím si zopakovat svou obligátní poznámku, že tyto technologie nejsou náhražkou zálohování, ba právě naopak. S každou funkcionalitou navíc rostou možnosti nějakého selhání či problému. V souvislosti s LVM je určitě dobré zmínit jeden velice zajímavý článek o jeho vztahu k souborovým systémům.
Tím bych problematiku LVM uzavřel. V příštím dílu seriálu se podívám na dm-crypt/LUKS z praktického hlediska.