LVM a snapshoty
Minule jsem nakousl LVM a probral základní operace s ním. Dnes se podívám na přesun dat za běhu systému a tvorbu a práci se snapshoty.
Předpokládejme, že byl do systému přidán nový, velký pevný disk s tím, že starých dvou menších disků se chcete zbavit. Abyste to mohli udělat, musíte přenést data z dvou menších disků na velký, a následně odebrat příslušné fyzické svazky. K tomu slouží nástroj pvmove
, který umí přesouvat data mezi jednotlivými fyzickými svazky, a to přímo za provozu (vzhledem k tomu, že vrstva logických svazků je v rámci LVM oddělena od fyzických svazků, nepředstavuje tato procedura pro souborové systémy na daných logických svazcích žádnou změnu).
Pokud zadáte nástroji pvmove
pouze jeden fyzický svazek, přesune všechna data z daného svazku na ostatní fyzické svazky v dané skupině svazků:
debian:~# pvmove /dev/hdb1
/dev/hdb1: Moved: 37.2%
/dev/hdb1: Moved: 67.3%
/dev/hdb1: Moved: 100.0%
V tuto chvíli je fyzický svazek hdb1
volný, a je tedy možné jej odstranit ze skupiny svazků:
debian:~# vgreduce data /dev/hdb1
Teprve teď je možné zavolat pvremove
k odstranění logického svazku, nebo, přesněji řečeno, příslušných metadat, které si na daný oddíl LVM zapsalo:
debian:~# pvremove /dev/hdb1
Tento krok je samozřejmě nepovinný a není nutný - zejména, pokud máte v plánu přiřadit dané fyzické svazky jiné skupině svazků. Tentýž postup lze provést i s druhým diskem:
debian:~# pvmove /dev/hdd1
/dev/hdd1: Moved: 32.2%
/dev/hdd1: Moved: 64.0%
/dev/hdd1: Moved: 97.7%
/dev/hdd1: Moved: 100.0%
debian:~# vgreduce data /dev/hdd1
Removed "/dev/hdd1" from volume group "data"
debian:~# pvremove /dev/hdd1
Labels on physical volume "/dev/hdd1" successfully wiped
V tuto chvíli jsou všechna data přesunuta ze dvou menších disků na jeden větší. V případě výpadku napájení nebo pádu systému je po opětovném nastartování možné v přesunu pokračovat tím, že znovu spustíte nástroj pvmove
, bez parametrů. Proceduru je možné i přerušit, použijete-li parametr --abort
.
Stav fyzických svazků je možné rychle prověřit pomocí pvs
(podobnost s ls
není čistě náhodná):
debian:~# pvs
PV VG Fmt Attr PSize PFree
/dev/hdc1 data lvm2 a- 10.99G 4.99G
Podobným způsobem můžete vyvolat informace o logických svazcích (nástroj lvs
) nebo skupinách svazků (nástroj vgs
). Tyto nástroje poskytují v porovnání s nástroji *display
pouze základní přehled.
Pokud by se vám někdy stalo, že zapomenete provést vgreduce
a odstraníte prázdný, ale do skupiny zařazený fyzický svazek (navzdory protestům nástroje pvremove
, kterému je v takovém případě nutné ještě přidat parametr -ff
, aby tuto nebezpečnou operaci provedl), dojde k poměrně vážnému chybovému stavu, zejména v případě starších verzí LVM. Následky této nepříjemné situace je naštěstí možné jednoduše odstranit, a to následujícím příkazem:
vgreduce --removemissing volume_group
Na této hypotetické situaci bych rád ukázal tři věci. Jednak to, že varování nástrojů pro správu LVM je dobré nebrat na lehkou váhu a spíše se nejprve důkladně rozmyslet, jestli danou věc děláte správně, a teprve pak se pokusit obejít nějaký bezpečnostní mechanismus.
Za druhé, nástroje pro správu LVM umí ledacos, včetně postupů pro zotavení z nějakého problémového stavu. Studiem manuálových stránek se pak můžete vyhnout časově náročným a velice komplikovanýmručním postupům.
A konečně za třetí - LVM představuje další funkční vrstvu mezi médiem a souborovým systémem, jejíž případné chyby (nebo chyby administrátora při její správě) mohou negativně ovlivnit vaše data a zkomplikovat vám práci při případných záchranných operacích, pokud třeba selže HW. V této souvislosti opět zopakuji, že zálohování je nutnost.
Co je snapshot? Fotografové by tento termín přeložili asi jako "momentka". V případě LVM se jedná o "momentku" daného logického svazku a všech dat na něm, která se v daném okamžiku jakoby zmrazí. K této "momentce" pak můžete přistupovat jako k jinému logickému svazku (nebo obecně jako k blokovému zařízení), zatímco původní logický svazek byl již modifikován.
Snapshoty lze provádět i za běhu s připojeným souborovým systémem, i když tento postup může vést k nekonzistentním datům. Je to dáno tím, že snapshot je prováděn na úrovni "pod" souborovým systémem, o jehož stavu nemá LVM žádné informace (a naopak, souborový systém netuší, že ve funkční vrstvě pod ním došlo k nějakému zmražení stavu). Pokud tedy v okamžiku vytvoření snapshotu nějaká aplikace právě provádí zápis dat do souboru, nebo si data k zapsání na disk teprve uchovává v paměti s cílem je později uložit, je jasné, že snapshot bude obsahovat nekonzistentní data.
Souborový systém je možné před pořízením snapshotu odpojit nebo přepojit do režimu read-only, což by se, jen tak pro zajímavost, provedlo takto:
mount -o remount,ro /dev/zarizeni
LVM2, tedy aktuální implementace LVM v Linuxu, umí se snapshoty pracovat i v režimu pro zápis. Tím se liší od původní implementace LVM verze 1. LVM v Linuxu je schopné zahodit snapshot a nově i reintegrovat snapshot do původního svazku (merge). Tato poslední možnost však není k dispozici v Debianu Lenny, jelikož ten používá starší jádro i LVM nástroje. Dokonce jsem měl problémy s touto funkcionalitou i na Arch Linuxu s téměř aktuálním jádrem 2.6.32, pomohla až kompilace nového jádra 2.6.33, které se ještě ani nedostalo do repozitářů. Reintegrace snapshotů je tedy v tuto chvíli z hlediska serverů a jejich správy spíše hudbou budoucnosti, alespoň v případě "stabilních" distribucí jako Debian.
K čemu se dá využít snapshotů? K mnohému. Lze si díky nim vytvořit pojistku před nějakou radikálnější změnou (třeba upgrade celého systému na novou verzi), kterou je pak možné vrátit zpět, pokud se operace nezdaří nebo něco přestane fungovat.
S pomocí snapshotů lze usnadnit proces zálohování, i když se jistému krátkému výpadku služeb nevyhnete, chcete-li mít zálohu konzistentní. Abyste zajistili konzistenci dat, postačí na okamžik zastavit běžící démony přistupující k danému svazku, poté jej přepojit do režimu pouze pro čtení (nebo na chvilku odpojit), vytvořit snapshot, souborový systém znovu připojit (nebo obnovit možnost zápisu) a vypnuté démony znovu spustit. Poté je možné snapshot připojit a z něj provést zálohu, jejíž pořízení může trvat jakkoliv dlouho. Výsledkem je jen minimální výpadek služeb v porovnání s konzistentní a korektně provedenou zálohou bez snapshotů.
Ale dost již teorie, dovolte mi nyní práci se snapshoty demonstrovat prakticky. Předpokládejme, že máte k dispozici testovací logický svazek snaptest
ve skupině svazků vg
. Testovacímu svazku přiřadíte 5GB:
[root@arch ~]# lvcreate -L 5G -n snaptest vg
Logical volume "snaptest" created
Na svazku vytvoříte souborový systém, připojíte jej a překopírujete na něj nějaká data. Pro lepší představu uvádím příklad výpisu adresáře na daném logickém svazku před vytvořením snapshotu:
drwxr-xr-x 7 root root 4096 Feb 25 19:15 cache
drwxr-xr-x 227 root root 12288 Feb 25 19:15 doc
drwxr-xr-x 2 root root 4096 Feb 25 18:53 obsolete
V tomto stavu se rozhodnete vytvořit snapshot. Snapshot se vytváří úplně stejně jako logický svazek, pouze se přidá parametr -s
:
[root@arch ~]# lvcreate -s -L 2G -n momentka vg/snaptest
Logical volume "momentka" created
Všimněte si, že je nutné snapshotu přiřadit nějaký prostor (v tomto případě 2GB), kam se pak zapisují změny oproti fyzickému svazku, ze kterého je vytvořen.
V tuto chvíli začnete provádět změny. Na fyzickém svazku odstraníte adresář obsolete
obsahující stará a nezajímavá data. Přidáte nový adresář archive
, kam umístíte nějaké zálohy. Výsledek bude vypadat takto:
drwxr-xr-x 5 root root 4096 Feb 25 20:53 archive
drwxr-xr-x 7 root root 4096 Feb 25 19:15 cache
drwxr-xr-x 227 root root 12288 Feb 25 19:15 doc
V tuto chvíli máte na výběr mezi dvěma variantami. Můžete snapshot zrušit, nebo jej reintegrovat do původního logického svazku (merge).
Dojde-li ke zrušení snapshotu, přijdete o možnost dostat se k dřívějšímu stavu daného svazku, přičemž data na původním svazku zůstanou ve stavu, v jakém jsou před zrušením snapshotu, tj. veškeré změny, které jste od pořízení snapshotu provedli, zůstanou součástí daného logického svazku. V této situaci by tedy obsah logického svazku vypadal následovně:
drwxr-xr-x 5 root root 4096 Feb 25 20:53 archive
drwxr-xr-x 7 root root 4096 Feb 25 19:15 cache
drwxr-xr-x 227 root root 12288 Feb 25 19:15 doc
Rušení snapshotu je velmi jednoduché - postačí použít nástroj lvremove
a odebrat snapshot, jako by se jednalo o jakýkoliv jiný logický svazek:
lvremove vg/momentka
Můžete se dostat do situace, kdy chcete provést rollback, tedy dostat obsah snapshotu zpět do logického svazku. Jak již bylo řečeno dříve, podmínkou je aktuální verze LVM a jádra, které zatím ještě nejsou v mnoha distribucích (např. v Debianu Lenny) k dispozici. Samotný merge zajišťuje nástroj lvconvert
spuštěný s parametrem --merge
a umístěním snapshotu:
[root@arch ~]# lvconvert --merge vg/momentka Merging of volume momentka started. snaptest: Merged: 9.6% snaptest: Merged: 0.0% Merge of snapshot into logical volume snaptest has finished. Logical volume "momentka" successfully removed
Samotný merge vyžaduje odpojený souborový systém na logickém svazku - pokud byste zadali výše uvedený příkaz a měli svazek nebo snapshot připojený, obdrželi byste následující chybovou hlášku:
[root@arch ~]# lvconvert --merge vg/momentka
Can't merge over open origin volume
Merging of snapshot momentka will start next activation.
LVM by pak jen vyčkal, až bude možné merge provést, a jakmile by byl oddíl odpojen, proces by zahájil. V příkladu, který jsem uváděl, by po provedení této operace vypadal souborový systém takto:
drwxr-xr-x 7 root root 4096 Feb 25 19:15 cache
drwxr-xr-x 227 root root 12288 Feb 25 19:15 doc
drwxr-xr-x 2 root root 4096 Feb 25 18:53 obsolete
Jelikož lze se snapshoty pracovat jako s obyčejnými blokovými zařízeními, včetně zápisu na ně, vyvstává v této souvislosti otázka, zda-li je možné vytvořit snapshot ze snapshotu. Bohužel, tuto funkcionalitu LVM v Linuxu zatím nemá. Je však možné vytvořit více snapshotů pro jeden logický svazek:
[root@arch ~]# lvcreate -s -L 2G -n momentka2 vg/snaptest
Logical volume "momentka2" created
[root@arch ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
momentka vg swi-a- 2.00g snaptest 0.00
momentka2 vg swi-a- 2.00g snaptest 0.00
snaptest vg owi-ao 5.00g
Do snapshotu se de facto zapisují všechny rozdíly vůči logickému svazku, ze kterého byl vytvořen, a to metodou "copy on write". V zásadě, kapacita snapshotu se snižuje jak vlivem změn ve snapshotu, tak vlivem změn v logickém svazku, kterému snapshot náleží. Pokud dojde k zaplnění celého snapshotu, začnou se dít psí kusy:
[root@arch ~]# lvs
/dev/dm-0: read failed after 0 of 4096 at 0: Input/output error
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
momentka vg Swi-I- 2.00g snaptest 100.00
snaptest vg owi-a- 5.00g
[root@arch ~]# mount -t ext3 /dev/vg/momentka /mnt
mount: wrong fs type, bad option, bad superblock on /dev/mapper/vg-momentka
...
Výpis hlášek jádra nástrojem dmesg
začne ohlašovat nízkoúrovňové chyby na daném blokovém zařízení:
Buffer I/O error on device dm-0, logical block 1310718
EXT3-fs (dm-0): error: unable to read superblock
V tuto chvíli je již snapshot definitivně mrtvý, nedá se oživit, nedá se připojit, lze jej pouze odstranit:
lvremove vg/momentka
Pokud se ptáte, co se v takovém případě stane se souborovým systémem na původním logickém svazku, odpovědí je nic. Data na něm samozřejmě zůstanou. Horší situace nastane, pokud třeba používáte LVM pro kořenový oddíl, před upgradem systému vytvoříte jeho snapshot, abyste se mohli vrátit k původnímu systému, pokud se upgradem něco pokazí, následně provede upgrade, začnete s testováním a odhalíte fatální problém. Ještě než se pokusíte provést reintegraci (rollback) snapshotu pomocí nástroje lvconvert
a jeho parametru --merge
, pokusíte se získat co nejvíce informací o tom, co a proč se pokazilo. Mezi tím ale dojde místo na snapshotu a vy zůstanete s nefunkčním systémem.
Pokud budete používat snapshoty, pak je berte jako dočasné úložiště změn, o které můžete přijít, a původní logický svazek jako pevný bod, o který se můžete opřít. V situaci výše by bývalo stačilo, kdybyste před upgradem nastavili snapshot jako aktivní kořenový oddíl. Pak by přetečení snapshotu vyvolalo kolaps systému, ale vám by zůstal původní logický svazek ve stavu před upgradem.
Pokud má vaše distribuce novější LVM a jádro, pak máte možnost použít výše zmíněný merge
, čímž se vám rozšiřují možnosti práce se snapshoty - už nemusíte uvažovat o snapshotu jako o snímku, který nakonec budete muset zahodit. V průběhu času se budete moci rozhodnout jak snímek zahodit a používat nadále logický svazek v jeho aktuálním stavu, tak provést "rollback" a změny provedené na logickém svazku zahodit.
Tím bych tento díl ukončil. Příště proberu používání zrcadlení na LVM a téma LVM definitivně uzavřu.