Správa linuxového serveru: LVM prakticky

LVM byl v tomto seriálu představen na teoretické úrovni v jednom z prvních dílů. Nyní převedu teorii do praxe a ukážu vám, jak se s LVM pracuje. V tomto dílu proberu základní operace s LVM.

Abyste se v následujícím článku neztratili, doporučujeme si nejdříve přečíst předchozí díly seriálu, především však článek Správa linuxového serveru: LVM a diskové šifrování.

Vytvoření LVM svazku

Základem pro LVM jsou fyzické svazky (physical volumes). Nejprve tedy musíte vytvořit fyzické svazky, které později začleníte do skupiny svazků (volume group), kterou pak rozdělíte na jednotlivé logické svazky (logical volumes).

Ukážu vám to na příkladu. Řekněme, že máte v počítači tři pevné disky, na každém jeden oddíl vyplňující celý disk:

debian:~# cat /proc/partitions
major minor  #blocks  name
 
3     0    5242880 hda
3     1    5237158 hda1
3    64    5242880 hdb
3    65    5237158 hdb1
22    64    5242880 hdd
22    65    5237158 hdd1

Prvním krokem je vytvoření fyzického svazku. Vytvoříte tedy fyzický svazek z oddílu hdb1:

debian:~# pvcreate /dev/hdb1
Physical volume "/dev/hdb1" successfully created
debian:~#

Tímto byl vytvořen fyzický svazek. Podrobné informace o fyzickém svazku, který byl právě vytvořen, lze zobrazit s použitím nástroje pvdisplay, který vypíše informace o konkrétním fyzickém svazku, pokud mu jako parametr zadáte nějaký konkrétní, nebo vypíše informace o všech fyzických svazcích, o kterých ví (v tomto případě pouze o tom jednom), pokud jej spustíte bez parametrů:

debian:~# pvdisplay
"/dev/hdb1" is a new physical volume of "4.99 GB"
--- NEW Physical volume ---
PV Name               /dev/hdb1
VG Name
PV Size               4.99 GB
Allocatable           NO
PE Size (KByte)       0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               3wvOQk-M0uS-XJN6-nlrl-x8Uz-CJDF-in2fEs

Velikost svazku je 4.99GB, většina ostatních hodnot je poznamenána tím, že fyzický svazek není součástí žádné skupiny svazků (volume group). Abyste mohli fyzický svazek využít, musíte jej začlenit do skupiny svazků. Jelikož v tuto chvíli není k dispozici žádná skupina svazků, vytvoříte novou, třeba s názvem "data", s pomocí právě tohoto fyzického svazku:

debian:~# vgcreate data /dev/hdb1
Volume group "data" successfully created
debian:~#

Pro zjišťování informací o skupině svazků je k dispozici podobný nástroj - vgdisplay, jehož výpis v tuto chvíli vypadá takto:

debian:~# vgdisplay
--- Volume group ---
VG Name               data
System ID
Format                lvm2
Metadata Areas        1
Metadata Sequence No  1
VG Access             read/write
VG Status             resizable
MAX LV                0
Cur LV                0
Open LV               0
Max PV                0
Cur PV                1
Act PV                1
VG Size               4.99 GB
PE Size               4.00 MB
Total PE              1278
Alloc PE / Size       0 / 0
Free  PE / Size       1278 / 4.99 GB
VG UUID               SmBDKH-iTL3-K3aM-I4e6-qgyZ-XL05-wxG7P1
 
debian:~#

Z výpisu je vidět použitý formát (lvm2), počet fyzických svazků přiřazených do skupiny, dále celkovou velikost skupiny svazků i její obsazení. Všimněte si také zkratky PE, jejíž význam odhaluje jádro fungování LVM.

LVM pracuje na fyzické úrovni tak, že si rozdělí fyzické svazky do bloků určité velikosti, které pak přiděluje jednotlivým logickým svazkům. Tyto bloky jsou nazývány jako "physical extent" (dále PE). Ve výpisu je vidět, že jeden PE má v tomto případě velikost 4MB a skupina svazků jich má k dispozici celkem 1278, z nichž žádný není dosud alokován (přiřazen logickému svazku).

Ještě než se vrátím k vytváření logického svazku, upozorním ještě na to, čeho si pozorný čtenář jistě všiml, a sice nápadné podobnosti jednotlivých příkazů pro správu LVM, které se liší pouze úvodními dvěma písmeny. V případě LVM je dobré si v paměti uchovat anglické názvy všech pojmů jako "physical volume", "volume group" a "logical volume", protože počáteční písmena daných názvů tvoří prefix pro sadu příkazů, kterými je lze spravovat. Tudíž, pokud operujete s fyzickými svazky, použijete prefix pv následovaný slovíčky jako display, create, extend, atd., a analogický postup použijete v případě ostatních komponent LVM.

Avšak zpět k vytváření LVM. V tuto chvíli je tedy vytvořena skupina svazků z jednoho fyzického svazku. Zbývá poslední krok, a sice vytvoření logického svazku:

debian:~# lvcreate -L 4.99G data -n zalohy
Rounding up size to full physical extent 4.99 GB
Logical volume "zalohy" created

Parametr -L udává velikost logického svazku, v tomto případě 4.99G, kde G značí gigabyty. Parametr -numožňuje dát příslušnému logickému svazku jméno, v tomto případě "zalohy".

Příslušný logický svazek je k dispozici jako blokové zařízení /dev/mapper/data-zalohy a lze s ním zacházet jako s kterýmkoliv diskovým oddílem (nebo blokovým zařízením obecně). Příslušné zařízení má i symbolický odkaz /dev/data/zalohy, tudíž je k němu možné přistupovat i takto, o něco málo pohodlněji.

Pokud byste nyní použili nástroj lvdisplay k zobrazení informací o nově vytvořeném logickém svazku, dostali byste výpis podobný tomuto:

debian:~# lvdisplay
--- Logical volume ---
LV Name                /dev/data/zalohy
VG Name                data
LV UUID                hf1rYC-1ECA-PopX-AVwx-qquW-jOHI-EOnWDl
LV Write Access        read/write
LV Status              available
# open                 0
LV Size                4.99 GB
Current LE             1278
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           254:0

Na příslušném logickém svazku nyní zbývá už jen vytvořit souborový systém, v tomto případě ext3:

mkfs.ext3 /dev/data/zalohy

Souborový systém na novém logickém svazku lze nyní připojit a začít na něj kopírovat data.

Rozšíření logického svazku

Úžasnou výhodou LVM je kromě nezávislosti logického členění svazků na fyzických svazcích také možnost provádět různé změny, a to klidně i za běhu systému. Mezi tu nejjednodušší změnu patří zvětšení logického svazku, kterou nyní předvedu.

Podívejte se nejprve na to, co vypíše vgdisplay o skupině svazků (z výpisu jsem vybral pouze relevantní řádky):

debian:~# vgdisplay
--- Volume group ---
VG Name               data
...
Total PE              1278
Alloc PE / Size       1278 / 4.99 GB
Free  PE / Size       0 / 0
...

Jak je vidět, všechny PE (physical extents) byly již alokovány, to znamená, že v tuto chvíli již není z čeho vytvořit nový logický svazek. Skupina svazků se ale může sestávat z více než jednoho fyzického svazku. Je tedy možné přidat další blokové zařízení (ať už disk, oddíl, diskové pole, apod.) a rozšířit dostupnou kapacitu skupiny svazků:

debian:~# pvcreate /dev/hdd1
Physical volume "/dev/hdd1" successfully created
debian:~# vgextend data /dev/hdd1
Volume group "data" successfully extended

Prvním příkazem byl z diskového oddílu hdd1 vytvořen fyzický svazek, ve druhém kroku byla rozšířena skupina svazků "data" o nový fyzický svazek. Nástroj vgdisplay nyní potvrzuje navýšení kapacity skupiny svazků:

...
VG Size               9.98 GB
PE Size               4.00 MB
Total PE              2556
Alloc PE / Size       1278 / 4.99 GB
Free  PE / Size       1278 / 4.99 GB
...

V tuto chvíli již tedy je z čeho rozšířit stávající logický svazek "zalohy". Jak rozšíření skupiny svazků, tak rozšíření logického svazku je možné provádět za běhu systému. Není ani potřeba odpojit souborový systém na daném zařízení:

debian:~# df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/data-zalohy    5.0G  374M  4.3G   8% /mnt
debian:~# lvextend -L +2G /dev/data/zalohy
Extending logical volume zalohy to 6.99 GB
Logical volume zalohy successfully resized
debian:~# df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/data-zalohy    5.0G  374M  4.3G   8% /mnt

Výstup příkazu df jsem uvedl pro lepší pochopení toho, co se stalo. Jak je patrné, ačkoliv byl logický svazek zvětšen o 2GB, tedy na 7GB celkem, souborový systém stále hlásí kapacitu 5GB. Logický svazek se v tomto směru chová jako diskový oddíl, který byl rozšířen, ale souborový systém na něm nebyl nijak pozměněn, tudíž hlásí stejnou kapacitu jako před tím. Aby mohl souborový systém nově vzniklý extra prostor využít, je třeba jej rozšířit ručně.

V případě souborového systému ext3 lze použít nástroje resize2fs, který umí změnit jeho velikost a roztáhnout jej na celý oddíl. Tuto změnu je o něco lepší provádět na odpojeném souborovém systému, jelikož se jedná o mírně riskantní operaci, ale lze ji samozřejmě provést i na připojeném souborovém systému přímo za běhu:

debian:~# resize2fs /dev/data/zalohy
resize2fs 1.41.3 (12-Oct-2008)
Filesystem at /dev/data/zalohy is mounted on /mnt; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/data/zalohy to 1832960 (4k) blocks.
The filesystem on /dev/data/zalohy is now 1832960 blocks long.
 
debian:~# df -h
Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/data-zalohy   6.9G  375M  6.2G   6% /mnt

Nyní již souborový systém vykazuje správnou velikost, a tím byl proces rozšíření skupiny svazků i logického svazku dokončen.

Zmenšení logického svazku

Redukovat velikost souborového systému i logického svazku možné je, ale v tomto případě se již patrně nevyhnete nutnosti daný souborový systém odpojit, alespoň v případě ext3.

Postup je třeba provést ve správném pořadí (špatné pořadí povede skoro jistě ke ztrátě dat) - nejprve je třeba změnit velikost souborového systému, a teprve poté lze bezpečně změnit velikost logického svazku. Nástroj resize2fs se naštěstí chová opatrně a nepředpokládá, že uživatel vždy ví, co dělá:

debian:~# resize2fs /dev/data/zalohy 6G
resize2fs 1.41.3 (12-Oct-2008)
Filesystem at /dev/data/zalohy is mounted on /mnt; on-line resizing required
On-line shrinking from 1832960 to 1572864 not supported.

Při pokusu zmenšit připojený souborový systém začal resize2fs protestovat. Odpojíte tedy příslušný souborový systém a zkusíte to znovu:

debian:~# umount /dev/data/zalohy
debian:~# resize2fs /dev/data/zalohy 6G
resize2fs 1.41.3 (12-Oct-2008)
Please run 'e2fsck -f /dev/data/zalohy' first.

V tuto chvíli resize2fs zjistil, že souborový systém není označen jako "čistý" (patrně kvůli dřívějšímu zvětšení), tudíž doporučuje nechat souborový systém prověřit nástrojem fsck:

debian:~# e2fsck -f /dev/data/zalohy
e2fsck 1.41.3 (12-Oct-2008)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
 
/dev/data/zalohy: ***** FILE SYSTEM WAS MODIFIED *****
/dev/data/zalohy: 16269/458752 files (0.1% non-contiguous), 124768/1832960 blocks

Je vidět, že skutečně k nějaké úpravě, respektive opravě souborového systému došlo. Následuje třetí a poslední pokus o zmenšení souborového systému:

debian:~# resize2fs /dev/data/zalohy 6G resize2fs 1.41.3 (12-Oct-2008) Resizing the filesystem on /dev/data/zalohy to 1572864 (4k) blocks. The filesystem on /dev/data/zalohy is now 1572864 blocks long.

Operace proběhla úspěšně a souborový systém je nyní možné opět připojit. Po opětovném připojení lze ověřit, že byl opravdu zmenšen:

debian:~# df -h
Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/data-zalohy   6.0G  374M  5.3G   7% /mnt

Úplně posledním krokem celého procesu je zmenšení samotného logického svazku:

debian:~# lvreduce -L 6G /dev/data/zalohy
WARNING: Reducing active and open logical volume to 6.00 GB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce zalohy? [y/n]: y
Reducing logical volume zalohy to 6.00 GB
Logical volume zalohy successfully resized

Zde je třeba si dát velký pozor na to, aby velikost logického svazku nebyla nikdy menší než velikost souborového systému. Varování programu lvreduce je v tomto ohledu dobré brát velmi vážně.

Tím bych pro dnešek skončil. Příště se podívám na to, jak za běhu data přesouvat mezi fyzickými svazky a proberu také práci se snapshoty.