Linux E X P R E S

Facebook

Správa linuxového serveru: LVM a snapshoty

debain_notext.png

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řesun dat za běhu systému

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ým ruč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.

Snapshoty

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).

Zrušení snapshotu

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

Merge snapshotu

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

Snapshoty snapshotů

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

Co se stane, když se snapshot zaplní

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.

Diskuze (1) Nahoru