Hlavní navigace

LVM: Praktické ukázky

15. 8. 2008
Doba čtení: 13 minut

Sdílet

V minulém díle jsme si popsali, jak to v LVM chodí, a teď je čas na předvedení, jak se s LVM pracuje. Ukážeme si, jak vytvořit jednotlivé volume groupy a logical volumy, jak s nimi pracovat, měnit jejich velikost, vytvářet snapshoty a také jak obnovit data. Povíme si něco o tom, jak se LVM aktivuje a nakousneme bezpečnost dat.

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:

root_podpora

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.

Byl pro vás článek přínosný?

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.