Legenda
Z minulého článku bych rád zopakoval některé výrazy a jejich zkratky.
- PE – Physical extents – Fyzické bloky LVM (výchozí velikost je 4 MB)
- LE – Logical extents – Logické bloky, které se mapují na PE
- LV – Logical volume – LVM oddíl
- PV – Physical volume – Fyzický oddíl či disk
- VG – Volume group – Skupina PV
Přehled příkazů
Pokud do řádky napíšeme lvm help
, objeví se nám výpis podobný tomu níže.
dumpconfig Dump aktivní konfigurace formats List dostupných formátů metadat help Zobrazit tuto nápovědu lvchange Změna atributů LV lvconvert Změna layoutu LV lvcreate Vytvoření LV lvdisplay Zobrazit informaci o LV lvextend Zvětšení LV lvmchange Zastaralé lvmdiskscan Vylistovat seznam zařízení, která mohou být použita jako PV lvmsadc Sbírat data o aktivitě lvmsar Vytvořit záznam o aktivitě lvreduce Zmenšení LV lvremove Zrušení LV lvrename Změna názvu LV lvresize Změna velikosti LV lvs Zobrazit informace o LV lvscan Zobrazit všechny LV ve všech VG pvchange Změna parametrů PV pvresize Změnit velikost PV pvck Zkontrolování konzistence PV pvcreate Inicializace PV pro použití s LVM pvdata Zobrazit metadata na PV pvdisplay Zobrazit informace o PV pvmove Přesunout PE z jenoho PV do druhého pvremove Smazat LVM metadata z PV pvs Zobrazit informace o PV pvscan Zobrazit všechny PV segtypes Zobrazit dostupné typy segmentů vgcfgbackup Zálohovat konfiguraci VG vgcfgrestore Obnovit konfiguraci VG vgchange Změna nastavení VG vgck Zkontrolovat konzistenci VG vgconvert Změna formátu metadat ve VG vgcreate Vytvořit VG vgdisplay Zobrazit informace o VG vgexport Odepsat VG ze systému vgextend Připsat PV do VG vgimport Zapsat odepsanou VG do systmu vgmerge Sjednocení VG vgmknodes Vytvoření zvláštního nodu v /dev pro VG vgreduce Odstranění PV z VG vgremove Zrušení VG vgrename Změna názvu VG vgs Informace o VG vgscan Hledání VG vgsplit Přesunutí PV do jiného nebo nového VG version Zobrazit verzi
Příkazů je velké množství, ale není třeba se jich obávat. Pro normální práci s LVM ve většině případů stačí použít jen některé z nich. Ne všechny jsou samostatné programy, ale často jen symlinky na program lvm.
cx@delorean:~$ ls -l /sbin/ | grep "> lvm" lrwxrwxrwx 1 root root 3 25. čen 19.06 lvconvert -> lvm lrwxrwxrwx 1 root root 3 25. čen 19.06 lvcreate -> lvm lrwxrwxrwx 1 root root 3 25. čen 19.06 lvdisplay -> lvm [...]
Jádro
Pro uživatele, kteří si dělají vlastní jádra, bude důležité vědět, že pro podporu LVM 2 v jádrech řady 2.6 stačí povolit:
Device Drivers ---> Multi-device support (RAID and LVM) ---> [*] Multiple devices driver support (RAID and LVM) < > RAID support <M> Device mapper support
Pro možnost přesunovat PE je ještě potřeba zaškrtnout Mirror target a pro snapshoty Snapshot target.
Operace
Silnou stránkou LVM je dynamická práce s oddíly. Po vytvoření oddílu s ním můžeme dál pracovat. Při používání LVM se doporučuje vytvořit oddíly malé. Například na 500 GB disku, si vytvoříme 10 GB pro systém, 10 GB pro /home a 10 GB pro další data. Ze začátku často nemůžeme tušit jak se budou oddíly využívat, a tak si vytvoříme pár malých a postupně je začneme zvětšovat. Systém se moc nerozrůstá, ale /home a oddíl pro data pravděpodobně bude. Osobně si do /home ukládám fotky, projekty, dokumenty a pár dalších drobností a celý oddíl je denně zálohovaný. Oddělím tak data, která nepotřebuji, a která jsou pro mě důležitá. 10 GB by mi za čas pro fotky nestačilo. Díky LVM ale není problém si oddíl za půl roku zvětšit o dalších 5 GB a chvíli s tím zase vydržet. Na takovém oddílu se projevuje fragmentace mnohem méně (hlavička necestuje přes celou plotnu, ale drží se jen v malých oblastech). U takhle malého oddílu také není problém vytvořit RAID.
Co se týče ostatních dat (hudba, videa, různé dočasné soubory, přednášky), tak u těch v mém případě o rychlost nebo spolehlivost zas tolik nejde, a také budou růst mnohem více „neočekávaně“ až se třeba dostanou i za kapacitu jednoho disku a budou se rozlézat do druhého. LVM nabízí řešení. Například při koupí dalšího disku můžeme přesunout PE z toho starého na nový. Pokud použijeme pro každý disk samostatný VG, tak se nám nebudou data rozlézat po obou discích, ale zůstanou jen na jednom. Tím dosáhneme aspoň toho, že po vypadnutí jednoho disku nepřijdeme o data na obou.
Vytvoření VG
VG je skupina fyzických oddílů (tím mám na mysli normální oddíly) nebo disků, ve které se spojí jejich kapacita do jednoho velkého virtuálního disku. Kapacita ve VG se může využít jakkoli.
Vytváření funguje tak, že si připravíme nejdříve PV za pomocí pvcreate a poté vytvoříme přes vgcreate samotnou skupinu, v tomto případě o jednom fyzickém oddíle. Výpis VG získáme napsáním vgs a u PV pvs.
fsmachine ~ # pvcreate /dev/sda3 fsmachine ~ # vgcreate test_lvm /dev/sda3 Volume group "test_lvm" successfully created fsmachine ~ # vgs VG #PV #LV #SN Attr VSize VFree test_lvm 1 0 0 wz--n- 37,26G 37,26G fsmachine ~ # pvs PV VG Fmt Attr PSize PFree /dev/sda3 test_lvm lvm2 a- 37,26G 37,26G
fsmachine ~ # vgscan Reading all physical volumes. This may take a while... Found volume group "test_lvm" using metadata type lvm2 fsmachine ~ # vgchange -a y 0 logical volume(s) in volume group "test_lvm" now active
O to by se měly starat init skripty nebo initrd většiny distribucí. Prvním příkazem si ověříme, že byl VG vytvořen a druhým ho aktivujeme. Více informací je napsáno níže a v minulém článku.
Vytvoření LV
LV je na povrch blokové zařízení jako každé jiné a můžeme s ním nakládat jako by byl normálním fyzickým oddílem. Vytváří se pomocí lvcreate
a výpis LV získáme napsáním lvs
.
fsmachine ~ # lvcreate -L 10G -n test1 test_lvm Logical volume "test1" created fsmachine ~ # lvcreate -L 5G -n test2 test_lvm Logical volume "test2" created fsmachine ~ # lvs LV VG Attr LSize Origin Snap% Move Log Copy% Convert test1 test_lvm -wi-a- 10,00G test2 test_lvm -wi-a- 5,00G
Mazání oddílů
fsmachine ~ # lvremove /dev/test_lvm/test2 Do you really want to remove active logical volume "test2"? [y/n]: y Logical volume "test2" successfully removed fsmachine ~ # lvs LV VG Attr LSize Origin Snap% Move Log Copy% Convert test1 test_lvm -wi-a- 10,00G
Změna názvu oddílu
Jednotlivá LV se mohou s malými omezeními jmenovat jakkoli a můžeme je také přejmenovávat.
fsmachine ~ # lvrename test_lvm test1 bettertest1 Renamed "test1" to "bettertest1" in volume group "test_lvm" fsmachine ~ # lvs LV VG Attr LSize Origin Snap% Move Log Copy% Convert bettertest1 test_lvm -wi-a- 10,00G
Zvětšování/zmenšování
Změna velikosti je nejdůležitější vlastnost LVM. Co se týká samotného LVM, změny je možné dělat online. U souborových systémů už to tak jednoduché není. Běžně pracuji s ext3 a reiserfs, takže jsem do ukázek zahrnul tyto dva. Oba se umí online zvětšit, ale na zmenšení musí být odpojeny.
V první ukázce vytvářím souborový systém reiserfs na našem testovacím LVM oddíle, připojuji ho a vypisuji jeho velikost.
fsmachine ~ # mkfs.reiserfs /dev/test_lvm/bettertest1 [...] fsmachine ~ # mount /dev/test_lvm/bettertest1 /mnt/testfs/ fsmachine ~ # df -h Souborový systém Velikost Užito Volno Uži% Připojeno do [...] /dev/mapper/test_lvm-bettertest1 10G 33M 10G 1% /mnt/testfs
Na druhé ukázce oddílu přidávám 5 GB a pomocí resize_reiserfs
měním velikost i souborového systému. Pozor na pořadí operací. Při zvětšování se nejdříve musí zvětšit oddíl a až poté teprve souborový systém. U zvětšování není nutné zadávat velikost, nástroj si ji zjistí sám z oddílu, na kterém je umístěn.
fsmachine ~ # lvextend -L +5G /dev/test_lvm/bettertest1 Extending logical volume bettertest1 to 15,00 GB Logical volume bettertest1 successfully resized fsmachine ~ # resize_reiserfs /dev/test_lvm/bettertest1 resize_reiserfs 3.6.19 (2003 www.namesys.com) resize_reiserfs: On-line resizing finished successfully. fsmachine ~ # df -h Souborový systém Velikost Užito Volno Uži% Připojeno do [...] /dev/mapper/test_lvm-bettertest1 15G 33M 15G 1% /mnt/testfs
Pro další ukázku už odpojuji náš oddíl a měním velikost reiserfs pomocí nástroje resize_reiserfs. Zde je nutné zadávat, o kolik se má velikost změnit. Lze zadat i pevnou hodnotu, na kterou má být oddíl zmenšen. Opět je nutné dávat pozor na pořadí, nejdříve zmenšit souborový systém a až poté teprve oddíl.
fsmachine ~ # umount /mnt/testfs/ fsmachine ~ # resize_reiserfs -s -7G /dev/test_lvm/bettertest1 [...] fsmachine ~ # lvreduce -L -7G /dev/test_lvm/bettertest1 WARNING: Reducing active logical volume to 8,00 GB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce bettertest1? [y/n]: y Reducing logical volume bettertest1 to 8,00 GB Logical volume bettertest1 successfully resized fsmachine ~ # df -h Souborový systém Velikost Užito Volno Uži% Připojeno do [...] /dev/mapper/test_lvm-bettertest1 8,0G 33M 8,0G 1% /mnt/testfs
To samé s malými obměnami se dělá u ext3. Používá se nástroj resize2fs
, který si také sám zjistí velikost oddílu, když zvětšuje souborový systém
fsmachine ~ # mkfs.ext3 /dev/test_lvm/bettertest1 fsmachine ~ # df -h Souborový systém Velikost Užito Volno Uži% Připojeno do [...] /dev/mapper/test_lvm-bettertest1 7,9G 147M 7,4G 2% /mnt/testfs fsmachine ~ # lvextend -L +5G /dev/test_lvm/bettertest1 Extending logical volume bettertest1 to 13,00 GB Logical volume bettertest1 successfully resized fsmachine ~ # resize2fs /dev/test_lvm/bettertest1 resize2fs 1.40.9 (27-Apr-2008) Filesystem at /dev/test_lvm/bettertest1 is mounted on /mnt/testfs; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/test_lvm/bettertest1 to 3407872 (4k) blocks. Systém souborů na /dev/test_lvm/bettertest1 je nyní 3407872 bloků dlouhý. fsmachine ~ # df -h Souborový systém Velikost Užito Volno Uži% Připojeno do [...] /dev/mapper/test_lvm-bettertest1 13G 149M 13G 2% /mnt/testfs
U zmenšování je to horší, protože resize2fs
nemá žádné +/- a velikost se musí zadávat absolutně.
fsmachine ~ # umount /dev/mapper/test_lvm-bettertest1 fsmachine ~ # resize2fs /dev/test_lvm/bettertest1 10G resize2fs 1.40.9 (27-Apr-2008) Resizing the filesystem on /dev/test_lvm/bettertest1 to 2621440 (4k) blocks. Systém souborů na /dev/test_lvm/bettertest1 je nyní 2621440 bloků dlouhý. fsmachine ~ # lvreduce -L 10G /dev/test_lvm/bettertest1 WARNING: Reducing active logical volume to 10,00 GB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce bettertest1? [y/n]: y Reducing logical volume bettertest1 to 10,00 GB Logical volume bettertest1 successfully resized fsmachine ~ # df -h Souborový systém Velikost Užito Volno Uži% Připojeno do [...] /dev/mapper/test_lvm-bettertest1 9,9G 147M 9,4G 2% /mnt/testfs
Přesun PE z disku na disk
Přesunování fyzických dat z disku na disk je trochu složitější. Jednoduchá varianta je, že stačí, když se přesune třeba /dev/sda1 do /dev/sdb1, to by pak mohlo vypadat takto: pvmove /dev/sda1 /dev/sdb1. Složitější a asi častější variantou bude přesunování LV z disku na disk. Například když si koupíme druhý disk a chceme oddělit disk s daty od systému. V takovém případě potřebujeme zjistit, kde se LV nachází, v jakých PE. To uděláme následovně:
fsmachine ~ # lvdisplay -m /dev/test_lvm/movetest --- Logical volume --- LV Name /dev/test_lvm/movetest VG Name test_lvm LV UUID 9ARYx2-cD3o-7oHr-4twY-VPaq-VSHG-Ly9bfU LV Write Access read/write LV Status available # open 0 LV Size 1,00 GB Current LE 256 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:1 --- Segments --- Logical extent 0 to 255: Type linear Physical volume /dev/sda3 Physical extents 2560 to 2815
Mimo jiné je v tomto výpisu řádek s titulkem Physical extents a hodnotou 2560 to 2815. Tyto hodnoty budeme potřebovat při „stěhování“.
fsmachine ~ # lvcreate -L 1G -n movetest test_lvm Logical volume "movetest" created fsmachine ~ # pvs PV VG Fmt Attr PSize PFree /dev/sda3 test_lvm lvm2 a- 37,26G 26,26G /dev/sdb1 test_lvm lvm2 a- 5,59G 5,59G fsmachine ~ # pvmove /dev/sda3:2560-2815 /dev/sdb1 /dev/sda3: Moved: 1,6% /dev/sda3: Moved: 3,1% [...] /dev/sda3: Moved: 98,4% /dev/sda3: Moved: 100,0% fsmachine ~ # pvs PV VG Fmt Attr PSize PFree /dev/sda3 test_lvm lvm2 a- 37,26G 27,26G /dev/sdb1 test_lvm lvm2 a- 5,59G 4,59G
PE jsou postupně zkopírovány na nová umístění a hned poté se LE přemapují na tyto nové adresy. Tímto postupem lze snadno s novým diskem odstranit fragmentaci oddílů.
RAID 0
LVM umí vytvářet i RAID 1 a 0. Druhý případ se vytváří následujícím způsobem.
fsmachine ~ # lvcreate -L 1G -i 2 test_lvm Using default stripesize 64,00 KB Logical volume "lvol0" created fsmachine ~ # pvs PV VG Fmt Attr PSize PFree /dev/sda3 test_lvm lvm2 a- 37,26G 26,76G /dev/sdb1 test_lvm lvm2 a- 5,59G 4,09G fsmachine ~ # lvs LV VG Attr LSize Origin Snap% Move Log Copy% Convert bettertest1 test_lvm -wi-a- 10,00G lvol0 test_lvm -wi-a- 1,00G movetest test_lvm -wi-a- 1,00G
Takhle jsme udělali 1 GB veliký oddíl, který je rozložený přes dva disky střídavě po malých blocích 64 KB. Pokud neuvedeme jméno oddílů, vygeneruje se automaticky.
RAID 1 by se dal vytvořit pomocí tohoto příkazu:
lvcreate -L 1G -m 2 -n raid1 test_lvm
Kde parametr -m určuje, na kolika discích se má oddíl rozkládat, ale bohužel se mi to nepodařilo rozjet.
Snapshoty
Vytvoření snapshotu je velmi jednoduché.
fsmachine ~ # lvcreate -s -L 1G -n test_snapshot /dev/test_lvm/bettertest1 Logical volume "test_snapshot" created fsmachine ~ # lvs LV VG Attr LSize Origin Snap% Move Log Copy% Convert bettertest1 test_lvm owi-ao 10,00G test_snapshot test_lvm swi-a- 1,00G bettertest1 0,00
V tomto vytvořeném snapshotu můžeme měnit až 1 GB bloků. Pokud se snapshot nezaplní, chová se jako normální oddíl, pokud ho neměníme, zůstává ve stavu, v jakém byl vytvořen. Pokud se ovšem zaplní, je dále nepoužitelný a jediné, co můžeme dělat, je smazat ho. Pozor na zaplněný snapshot. Jednou jsem na jeden zapomněl na notebooku, a když se po týdnu zaplnil, tak jsem nenabootoval. Tuto situaci vyřeší každé druhé liveCD.
Bezpečnost dat
Pokud hodláme využívat vlastností RAID pole, tak se doporučuje spíše vytvářet spolehlivé softwarové nebo hardwarové pole pod LVM než využívat možnosti polí v LVM. Tato možnost není rozhodně nutná všude. Domácí počítač se vyplatí spíše zálohovat než vytvářet složitě další virtuální zařízení. Tato doporučení souvisí s tím, že softwarové pole je v Linuxu na velmi dobré úrovni. Je stabilní, spolehlivé a hlavně jednoduché. LVM je na druhou stranu složitější a hůře se obnovují data. Ať už si ale vybereme způsob jaký chceme, je nutné naše data zálohovat, protože ani jedno řešení s RAIDem není stoprocentní.
LVM v systému
Jak jsem psal již v minulém dile, pokud už se rozhodneme používat LVM na nějakém stroji, měli bychom něco vědět o tom, jak se chová při nabíhání. Bohužel, jádro není schopno najít VG samo a potřebuje k tomu popud z userspace. K tomu slouží příkaz vgchange, který jednoduše aktivuje všechny VG, které se vyskytují na discích. Na tom není nic špatného, ale vyžaduje to nutnost initrd i tam, kde normálně potřeba není.
Obnova dat na LVM
Občas se stává, že není možné připojit oddíl se souborovým systémem, často na to pomůže fsck, metadata se opraví, a to je všechno, co je potřeba udělat, aby se oddíl dal znovu připojit. S LVM je toto trochu složitější. Pokud se z jakéhokoli důvodu poškodí metadata, vgscan při bootu neni schopný najít VG, nevytvoří tak nody v /dev a nepřipojí se disk. V této situaci jsou data rozházena po disku a bez záloh metadat není možné je pohodlně získat. Proto je při používání LVM praktiky nutností zálohovat metadat pomocí vgcfgbackup
a při problémech je obnovit pomocí vgcfgrestore
. Pokud se poškodil i souborový systém, který se nacházel na LV, která byla ve VG, tak použijeme fsck jako v jiných případech.
Zálohování tedy provedeme tímto způsobem:
fsmachine ~ # vgcfgbackup -f test_lvm.backup Volume group "test_lvm" successfully backed up.
A použítí zálohy vypadá takto:
fsmachine ~ # vgcfgrestore -f test_lvm.backup test_lvm Restored volume group test_lvm
Závěr
Na závěr bych rád řekl, že kdo se pustí do hraní si s LVM, měl by si to nejdříve vyzkoušet někde, kde neublíží svým datům. Sám jsem se občas dostal do situace, kdy mě od ztráty dat dělil jeden enter a jednalo se pouze o překlep či pokus. Naštěstí se zatím nic nestalo a LVM používám na svém notebooku a desktopu přes rok k plné spokojenosti. I když jsem to již říkal, tak to zopakuji. Ať již používáte LVM nebo ne, je nutné svoje data zálohovat, každá vrstva mezi fyzickým diskem a samotnými soubory je riziko navíc a stává se, že se něco nepovede, že vypadne proud a poškodí se metadata nebo úplně vypoví službu jeden z disků. LVM si drží svoje metadata o všech VG, PV a LV na všech PV, ale ani to občas nepomůže od ztráty dat.