Mi is az a Volume? Sokak számára maga a “terra incognita” – az ismeretlen föld. Ez a rejtélyes réteg a fizikai disk-ek, és a filesystem között nem véletlenül ilyen fontos, nagyon sok hasznos lehetőséget rejt ez a technika, amire amúgy nem lennénk képesek. A következő írás egy kicsit próbál az LVM és a volume managerek világába betekintést adni. Habár írtam már ZFS-ről, és Veritas Volume Managerről is, mégis az LVM azért lett olyan népszerű, mert egyszerű a struktúrája, mégis a legfontosabb lehetőségeket az adminisztrátor kezébe adja.

Élet az LVM nélkül

Alap helyzetben vannak a diskek. Azokat egyszer statikusan feltudjuk darabolni részekre (partíciókra), és azokra filesystem-et tehetünk. Ezeket tudjuk ész nélkül mountolni. A hátránya az, hogy egy Linux-os filesystem struktúrába is lehetőségünk van mountpointokat skatulyázni, viszont kényelmetlen lehet. Arról nem is beszélve milyen átláthatatlanná tud válni egy össze vissza skatulyázott rendszerstruktúra.

Mire jó az LVM?

Az LVM gyakorlatilag a fizikai diskek és a filesystem közötti új réteg. Feladat pedig az, hogy a fizikai statikus tárterületeket dinamikusan tudja szabályozni. Ezáltal a tárterületek egyszerűen, és több esetben leállás nélkül is újraszervezhetőek.

Előkészületek az LVM-hez

Én jelen esetben három új disket adtam hozzá Ubuntu 10.04-es rendszeremhez
# fdisk -l

Látszik, hogy tök üresek a diskek. Létre kell hozni rajta egy (vagy tetszés szerint több) partíciót aminek LVM típusúnak kell lennie. Én ezt az első disken bemutatom, de mindhármon meg kell tenni.

Fdiskel nyissuk meg az első disket:
# fdisk /dev/sdb
Az fdisk menüjébe üssünk egy “n” betűt, azaz új partíciót akarunk létrehozni.

    Command (m for help): n

Meg fogja kérdezni, hogy extended vagy primary partíciót akarunk. Válasszuk most a “p”-t.
Meg kell adnunk melyik partíciót akarjuk létrehozni. Mivel nincs, válasszuk az egyest.

    Partition number (1-4): 1

Hanyas cilincertől kezdődjön:

    First cylinder (1-130, default 1): 1

Hanyas cilindernél érjen véget:

    Last cylinder, +cylinders or +size{K,M,G} (1-130, default 130): 130

Már csak ki kell választanunk a partíció típusát:

    Command (m for help): t

A “L” betűvel kérhetjük le a teljes listát, de nekünk Linux LVM kell, ami a “8e”:

    Hex code (type L to list codes): 8e

Már csak ki kell írnunk a diskre a változtatásokat:

    Command (m for help): w

Ha készen vagyunk akkor hasonló kimentet kell látnunk:
# fdisk -l

LVM használata

Physical Volume

Először is ahogy már feljebb elhangzott három rétege van az LVM-nek. Az első a Physical Volume=pv (Fizikai Kötet). Persze nekünk már vannak diskjeink LVM partíció típussal, de ahhoz hogy ezekből pv-diskek legyenek, inicializálnunk is kell.

Ezt tudjuk megtenni a következő paranccsal:

# pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1

Ha ki akarjuk listázni az aktuális pv-ket, akkor azt a következő paranccsal:

# pvdisplay

Ha törölni szeretnénk (csak ésszel, és olyat amire biztos nincs szükség), akkor azt a következő módon tehetjük meg:

# pvremove /dev/sdb1 /dev/sdc1 /dev/sdd1
# pvdisplay

Volume Group

A Volume Group nem más, mint egy csoportosítás. Itt jelenik meg először a közös “pool” szemlélet. Egy zsák amibe bedobáljuk mindazt amink van, a nagy közösből tetszőleges méreteket különíthetünk el. Ha például akarunk csinálni egy kötetet a root filrendszernek, és az adatok tárolására egy másikat, akkor jobb két külön csoportba sorolni. Természetesen egy PV vagy LV csak egy Volume Grouphoz tartozhat egyszerre.

Csináljunk egy új groupot a most létrehozott diskeknek (ha nem lennének a megadott diskek PV-k, akkor ezzel a parancsal, azok is létrejönnek).

# vgcreate data /dev/sdb1 /dev/sdc1 /dev/sdd1

Most ellenőrizzük, milyen Volume Groupok léteznek, és azokról mit lehet megtudni.

# vgdisplay

Ahol látszik a csopornak van egy mérete, ez a VG Size. Ennyi a pool nagy felhasználható mérete. Alatta a PE az az egység amikre felosztódik a volume group. Az én esetemben látszik, hogy ez 4MB, tehát 4MB-os egységekre van felkockázva a zsák. A Total PE azt mutatja, hogyha 4MB-os egy kocka akkor a zsákban hány kocka van. Lejebb pedig PE és tárhelyre lebontva is láthatjuk mennyi már kiosztott (Allocated) vagy még nem kiosztott (Free).

Értelemszerűen törölhetünk is egy volume groupot ha akarunk.

# vgremove data

Amennyiben a rendszerünk számára elérhető diskeken már van valamilyen LVM, csupán a rendszerünk nem látja még, akkor a következő parancs nagy segítségünkre lehet.

# vgscan

Logical Volume

Az utolsó rész pedig a Logival Volume-k, azok a virtuális szeletek a pool-ból, a Volume Group-ból, amikre filesystem fog kerülni. Ez talán a legfontosabb rész, hiszen ezen szerkezeti egységekből lesznek virtuális device-k, amiken tárolni fogunk.

Először is nézzük, hogy tudunk létrehozni egy LV-t.

# lvcreate –name elso –size 100M data

Jól látszik, hogy a parancs után nevesítenünk kell az új LV-t, majd megadni mekkora legyen a mérete, végül pedig, hogy melyik VG-ből legyen kiajánlva a terület. A parancs után a flag-eket, természetesen rövidítve is meg lehet adni.

Ha csináltunk egy új LV-t a data VG-n belül, akkor a megszokott parancs konvenció szerint kilistázhatjuk az lvdisplay paranccsal. Viszont amennyiben több VG-nk van, és azon belül is több PV, akkor a teljes lista hihetetlen nagy tud lenni. Ezért a parancs után definiálhatjuk melyik VG-ben akarjuk látni az adatokat.

# lvdisplay data

Ha egyszerűsített formába szeretnénk látni, vagy bármely block device-n akarunk felismertetni elkóborolt LV-ket, akkor a következő parancs hasznos lehet.

# lvscan

Illetve a létrejött device alapaján is lekérhetjük. A LV device-t a /dev/[VG_NAME]/[LV_NAME] alatt találhatjuk.

# lvdisplay -v /dev/data/elso

Természetesen törölni hasonlóképpen tudunk egy LV-t.

# lvremove /dev/data/elso

Ezek után már csupán a megfelelő filesystem-et kell a volume-ra ráhúzni, és mountolható is.

# mkfs.ext3 /dev/data/elso
# mkdir /elso
# mount /dev/data/elso /elso
# df -h /elso/

Amennyiben permanensé kívánjuk ezen mountpointokat tenni, akkor természetesen szükség lesz az /etc/fstab szerkesztésére.

Gyakori karbantartási munkák LVM-el

Volume növelése

Gyakori kérés, hogy növeljük meg a volume/mountpoint méretét. Fontos, az LVM támogatja természetesen ezt a műveletet, de az LVM csak egy virtuális disket ad, fontos, hogy a rajta lévő filesystem is támogassa azt. Én most EXT3-mal fogok játszadozni, de természetesen más filesystemek is tudják ezen funkciókat.

Első lépésként meg kell növelnünk a kívánt LV méretét. Erre két lehetőségünk van, vagy megadhatjuk mennyivel növekedjen a meglévő méret, vagy kijelölhetjük az új méret határát. A mostani volume mérete 100MB. Ha 200MB-ra akarom növelni a következő két parancs valamelyikét használva:

Itt azt adjuk meg menyivel legyen nagyobb:
# lvextend -L+100M /dev/data/elso
Itt azt adjuk meg, mennyi legyen az új nagyobb mérete:
# lvextend -L200M /dev/data/elso

Természetesen ekkor még csak a LV mérete nőtt meg, a mountolt filesystem mérete az változatlan.
# df -h
# lvdisplay -v /dev/data/elso

Akkor most növeljük az új LV méretéhez a filesystem méretét is. Ezt természetesen legbiztonságosabban akkor tehetjük meg, ha a filerendszerünk nincs mountolva, de bizonyos filesystem-ek támogatják az online bővítést is.

# resize2fs /dev/data/elso
# df -h /elso/
# ls -lah /elso/

Természetesen online/mountolt állapotában fogja a filesystem-et növelni, és minden adatunk sértetlenül megtalálható lesz.

Volume csökkentése

Míg a növelés kicsivel egyszerűbb, a csökkentés nehezebb, hisz a filerendszerhez a végéhez üres területet hozzácsapni egyszerűbb, de ahhoz hogy csökkenteni lehessen, ahhoz először egybefüggővé kell tenni az adatokat (defragmentálni), hogy a végén a filerendszernek teljesen üres területet különíthessünk el. Ezt fogjuk ugye leválasztani.

Itt sajnos ajánlás szerint mindenképp umountolnunk kell.
# umount /elso/
Ezért először FSCK-t futtatunk rajta.
# e2fsck -f /dev/data/elso
Ezek után, hogy elvileg folytonos a filesystem jöhet a csökkentés. Én a példában 100MB-ra csökkentem vissza.
# resize2fs /dev/data/elso 100M
Hogy már a filesystem kisebb az LV-ot is kisebbre vehetjük. Természetesen figyelmezteni fog, hogy a csökkentés roncsolhatja a filerendszert, de mivel mi gondoskodtunk már róla, ezért nyugottan mondjunk neki Y-t.
# lvreduce -L100M /dev/data/elso
Ezt követően már a csökkentett méretű filesystem mountolható is.

Disk cseréje egy Volume Group-ban
A helyzet a következő, kinőttük a meglévő disk csoportunkat. Alap esetben persze amíg lehet bővíthetünk, a most következő téma azt is bemutatja, viszont megspékeli azzal, hogy mivan, ha egy nagyobbat beteszünk, és egy kisebbet kiveszünk, miközben feltétel az, hogy nem állhat le a rendszer, tehát online kell megoldanunk.

Először is a rendszer számára láthatóvá kell tennünk az új disket. Majd megcsinálni rá az LVM partíciót. Ezt feljebb már bemutattam, tehát eme ismereteket már feltételezem.

Majd megcsináljuk a megfelelő PV-t belőlle:
# pvcreate /dev/sde1

Ha van új PV-nk a meglévő data VG-t bővítsük vele.
# vgextend data /dev/sde1
# vgdisplay

Amennyiben csak bővíteni akarnánk, most lennénk készen, viszont mi ki akarjuk venni az sdb disket, mert kicsi, ne foglalja a helyet és fogyasszon feleslegesen. Ezért először átmozgatunk minden dolgot az sdb-ról az új sde disk-re.

# pvmove /dev/sdb1 /dev/sde1

Jelen esetben nem volt neki mit átmozgatni, de normál esetben itt szépen átmozgatná az adatait. Ezek után pedig a régi sdb disket simán eltávolíthatjuk a VG-ből.

# vgreduce data /dev/sdb1

CheatSheet az LVM-hez

Directory and Files
Directories and Files ## Directories
/etc/lvm                    – default lvm directory location
/etc/lvm/backup         – where the automatic backups go
/etc/lvm/cache          – persistent filter cache
/etc/lvm/archive
       – where automatic archives go
/var/lock/lvm             – lock files to prevent metadata corruption

# Files
/etc/lvm/lvm.conf       – main lvm configuration file
$HOME/.lvm               – lvm history

Tools
diagnosticlvmdump
lvmdump -d <dir>
dmsetup [info|ls|status]

Note: by default the lvmdump command creates a tar ball

Physical Volumes
display

pvdisplay -v
pvs -v
pvs -a

pvs attributes are:
1. (a)llocatable
2. e(x)ported

scanningpvscan -v

Note: scans for disks for non-LVM and LVM disks

addingpvcreate /dev/sdb1

Common Attributes that you may want to use:

-M2 create a LVM2 physical volume

removingpvremove /dev/sdb1
checkingpvck -v /dev/sdb1

Note: check the consistency of the LVM metadata

change physical attributes

## do not allow allocation of extents on this drive
pvchange -x n /dev/sdb1

Common Attributes that you may want to use:

–addtag add a tag
-x allowed to allocate extents
-u change the uuid

movingpvmove -v /dev/sdb2 /dev/sdb3

Note: moves any used extents from this volume to another volume, in readiness to remove that volume

Volume Groups
displayvgdisplay -v
vgs -v
vgs -a -o +devices

vgs flags:
#PV – number of physical devices
#LV – number of configured volumes        

vgs
attributes are:

1. permissions (r)|(w)
2. resi(z)eable
3. e(x)ported
4. (p)artial
5. allocation policy – (c)ontiguous, c(l)ing, (n)ormal, (a)nywhere, (i)nherited
6. (c)luster

scanning vgscan -v
creatingvgcreate VolData00 /dev/sdb1 /dev/sdb2 /dev/sdb3
vgcreate VolData00 /dev/sdb[123]

Common Attributes that you may want to use:

-l  maximum logical volumes
-p maximum physical volumes
-s physical extent size (default is 4MB)
-A autobackup

extendingvgextend VolData00 /dev/sdb3
reducing vgreduce VolData00 /dev/sdb3

vgreduce –removemissing –force VolData00

removingvgremove VolData00

Common Attributes that you may want to use:

-f force the removal of any logical volumes

checkingvgck VolData00

Note: check the consistency of the LVM metadata

change volume attributes vgchange -a n VolData00

Common Attributes that you may want to use:

-a control availability of volumes within the group
-l  maximum logical volumes
-p maximum physical volumes
-s physical extent size (default is 4MB)
-x resizable yes or no (see VG status in vxdisplay)

renamingvgrename VolData00 Data_Vol_01

note: the volume group must not have any active logical volumes

converting metadata type vgconvert -M2 VolData00

Note: vgconvert allows you to convert from one type of metadata format to another for example from LVM1 to LVM2

mergingvgmerge New_Vol_Group Old_Vol_Group

Note: the old volumes group will be merged into the new volume group

splitingvgsplit Old_Vol_Group New_Vol_Group [physical volumes] [-n logical volume name]
importingvgimport VolData00

Common Attributes that you may want to use:

-a import all exported volume groups

exporting## to see if a volume has already been export use "vgs" and look at the third attribute should be a x
vgexport VolData00

Common Attributes that you may want to use:

-a export all inactive volume groups

backing up vgcfgbackup -f /var/backup/VolData00_bkup VolData00

Note: the backup is written in plain text

restoringvgcfgrestore -f /var/backup/VolData00_bkup VolData00

Common Attributes that you may want to use:

-l list backups of file
-f backup file
-M metadataype 1 or 2

cloningvgimportclone /dev/sdb1

Note: used to import and rename duplicated volume group

special files vgmknodes VolData00

Note: recreates volume group directory and logical volume special files in /dev

Logical Volumes
display

lvdisplay -v
lvdisplay –maps      display mirror volumes

lvs -v
lvs -a -o +devices

## lvs commands for mirror volumes

lvs -a -o +devices
lvs -a -o +seg_pe_ranges –segments

lvs attributes are:
1. volume type: (m)irrored, (M)irrored without initail sync, (o)rigin, (p)vmove, (s)napshot, invalid (S)napshot, (v)irtual, mirror (i)mage
                      mirror (I)mage out-of-sync, under (c)onversion
2. permissions: (w)rite, (r)ead-only
3. allocation policy – (c)ontiguous, c(l)ing, (n)ormal, (a)nywhere, (i)nherited
4. fixed (m)inor
5. state: (a)ctive, (s)uspended, (I)nvalid snapshot, invalid (S)uspended snapshot, mapped (d)evice present with-out tables,
             mapped device present with (i)nactive table
6. device (o)pen (mounted in other words)

scanning lvscan -v
lvmdiskscan
creating

## plain old volume
lvcreate -L 10M VolData00

## a striped volume
called lvol1
lvcreate -i 3 -I 32 -L 24M -n lvol1 vg01

## Mirrored volume
lvcreate -L 10M -m1 -n data01 vg01

Common Attributes that you may want to use:

-L size of the volume [kKmMgGtT]
-l number of extents
-C contiguous [y|n]
-i stripes
-I stripe size
-m mirrors
–mirrorlog

-n volume name

extending

lvextend -L 20M /dev/VolData00/vol01

Common Attributes that you may want to use:

-L size of the volume [kKmMgGtT]
-l number of extents
-C contiguous [y|n]
-i stripes
-I stripe size

reducing/resizing lvreduce -L 5M /dev/VolData00/vol01
lvresize -L 5M /dev/VolData00/vol01

Note: rounding will occur when extending and reducing volumes to the next extent (4MB by default)

you can extend a ext2/ext3 filesystem using the "resize2fs" command

removinglvremove /dev/VolData00/vol01
adding a mirror to a non-mirrored volume lvconvert -m1 –mirrorlog core /dev/VolData00/vol01 /dev/sdb2
change volume attributes

lvchange -a n /dev/VolData00/vol01

Common Attributes that you may want to use:

-a availability
-C contiguous [y|n]

renaminglvrname /dev/VolData00/vol_old /dev/VolData00/vol_new
snapshottinglvcreate –size 100M –snapshot -name snap /dev/vg01/data01
Miscellaneous
Simulating a disk failure dd if=/dev/zero of=/dev/sdb2 count=10
reparing a failed mirror ## check volume, persume /dev/sdb2 has failed
lvs -a -o +devices

# remove the failed disk from the volume (if not already done so) , this will convert volume into a non-mirrored volume
vgreduce –removemissing –force VolData00

## replace the disk physically, remember to partion it with type 8e
fdisk /dev/sdb
……..

## add new disk to LVM
pvcreate /dev/sdb2

## add the disk back into volume group
vgextend VolData00 /dev/sdb2

## mirror up the volume
lvconvert -m1 –mirrorlog core /dev/VolData00/vol02 /dev/sdb2