LVM (bloková zařízení)

Z DCEwiki
Skočit na navigaci Skočit na vyhledávání


Schéma LVM

Základní prvky LVM z hledika administrátora systému:

  • PV - Physical volume (fyzický disk) - Libovolné blokové zařízení: oddíl na fyzickém disku (např. /dev/hda1), celý fyzický disk (např. /dev/hda), logický disk jiné LVM skupiny, etc.
  • VG - Volume group - skupina disků, je výchozím prvkem pro práci s LVM. Sdružuje jednotlivá bloková zařízení do jednoho celku, v jehož rámci se pak definují a spravují logické disky.
  • LV - Logical volume (logický disk) - se tvoří v rámci LVM skupiny. Operačnímu systému se tyto logické disky jeví jako fyzická bloková zařízení dm-1 (..a výše).

Základním prvkem LVM z hlediska operačního systému však není skupina PV zařízení ale rozsah, neboli extent.

EXTENT
je blok dat, vymezený rozsahem ( angl. extent), který může být uložen kdekoliv na kterémkoliv PV zařízení v rámci skupiny (VG). Jeho velikost je vždy násobkem tzv. fyzického rozsahu ( Physical Extent - PE) což je nejmenší možná velikost rozsahu (extentu) v rámci skupiny - VG.
  • Maximální počet možných fyzických extentů (PE) je závislý na dostupné kapacitě všech fyzických blokových zařízení (PV) a nastavené maximální velikosti fyzického extentu (PE) v rámci skupiny (VG).
  • Pokud fyzické blokové zařízení (PV) není součástí skupiny (VG), vykazuje nulový počet fyzických extentů (PE).
  • Teprve po přidání fyzického blokového zařízení (PV) do skupiny (VG) se spočítá, kolik by se do jeho diskové kapacity mohlo vejít fyzických extentů, neboť jejich počet je závislý na nastavené velikosti fyzického extentu (PE) v rámci skupiny (VG).
Poznámka Místo na fyzickém blokovém zařízení se ve skutečnosti neobsazuje po jednotlivých fyzických extentech, ale vždy pokud možno jako souvislý rozsah. K rozdělení rozsahu logického disku (LV) na dva či více fyzických rozsahů (PE) může dojít buď při dodatečném roztažením již existujícího logického disku (LV), nebo když přesáhne kapacitu původního fyzického blokového zařízení (PV) v rámci skupiny (VG), nebo při obsazování rozsahů, které původně zabíral jiný, již zrušený logický disk (LV).

Na výše uvedeném schématu jsou fyzické rozsahy (PE) naznačeny jako tečkované čtverečky, ale skutečné extenty (rozsahy) logických disků (LV) jsou orámovány plnou čarou a mají stejný odstín modré, jako logický disk (LV) kterému náleží. Povšimněte si, že druhý logický disk (LV) je rozdělen mezi obě fyzické blokové zařízení (PV) a je tak složen ze dvou extentů.


Příprava blokových zařízení pro začlenění do LVM skupiny

Aby bylo možné blokové zařízení do LVM skupiny začlenit, musí mít nastaven správný identifikátor. To lze zajistit buď příkazem pvcreate, nebo i (v případě diskových oddílů) nastavením přes fdisk - a to tak že se příslušnému diskovému oddílu nastaví identifikátor 8e.

Příklad demonstruje přípravu blokových zařízení pro začlenění do LVM skupiny:

  • fyzického IDE disku /dev/hda
  • prvního primárního diskového oddílu na SATA disku /dev/sda1
  • a RAID pole /dev/md1
Poznámka
stroj:~# pvcreate /dev/hda /dev/sda1 /dev/md1

Monitoring stavu blokových zařízení v rámci skupiny

pvscan

Příkaz pvscan vypisuje rychlé statistiky blokových zařízeních PV, které jsou v systému.

Poznámka
stroj:~# pvscan
  PV /dev/md2   VG storage         lvm2 [1,82 TiB / 0    free]
  PV /dev/md1   VG storage         lvm2 [897,40 GiB / 0    free]
  PV /dev/md3                      lvm2 [1,82 TiB]
  Total: 3 [4,52 TiB] / in use: 2 [2,70 TiB] / in no VG: 1 [1,82 TiB]

Z výše uvedeného výpisu lze vyčíst, že..

  • v systému jsou přítomna tři bloková zařízení typu RAID, která mají identifikátor 8e
  • z těchto tří zařízení jsou pouze dvě ( /dev/md1 a /dev/md2 ) součástí LVM skupiny s názvem storage
  • blokové zařízení /dev/md3 není prozatím součástí žádné skupiny a je prázdné (neobsahuje žádné extenty).
  • na ostatních blokových zařízeních které jsou ve skupině storage jsou obsazeny všechny extenty
Upozornění To že jsou obsazeny všechny extenty apriori neznamená že je obsazená veškerá disková kapacita. Logické disky, které tyto extenty zabírají ve skutečnosti nemusí obsahovat žádná data.

pvdisplay

Příkaz pvdisplay je určen ke zjišťování detailnějších informací o stavu jednotlivých blokových zařízeních v rámci LVM systému.

Z následujícího výpisu se můžete oproti stručnějšímu výpisu příkazu pvscan navíc dozvědět:

  • jaká je velikost extentu a kolik jich lze na každé zařízení umístit
  • že blokové zařízení /dev/md1 má volných 92622 extentů tj. že další extenty budou v případě vytvoření dalšího logického disku, nebo zvětšení některého z již existujících umístěny právě sem.
Poznámka
stroj:~# pvdisplay
  --- Physical volume ---
  PV Name               /dev/md2
  VG Name               storage
  PV Size               1,82 TiB / not usable 3,95 MiB
  Allocatable           yes (but full)
  PE Size               4,00 MiB
  Total PE              476931
  Free PE               0
  Allocated PE          476931
  PV UUID               Yjsx5u-59et-62Ki-MGkX-gfcv-JJdA-cD14Qr
   
  --- Physical volume ---
  PV Name               /dev/md1
  VG Name               storage
  PV Size               897,41 GiB / not usable 3,54 MiB
  Allocatable           yes 
  PE Size               4,00 MiB
  Total PE              229735
  Free PE               92622
  Allocated PE          137113
  PV UUID               MLA3Vx-0SFS-3N1Q-t8M6-iRcY-LNOa-W8TeNp
   
  "/dev/md3" is a new physical volume of "1,82 TiB"
  --- NEW Physical volume ---
  PV Name               /dev/md3
  VG Name               
  PV Size               1,82 TiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               8eGmWs-T7rC-jE86-lYiD-3qRF-drdW-CZ9b6f

Fragmentace v rámci LVM

Přesto, že se LVM snaží udržet rozsahy pokud možno kompaktní, časem může dojít k jejich rozdělení (neboli "fragmentaci"). U fragmentovaných logických disků (LV) se sníží výkon IO operací a jediným řešením je extenty srovnat a scelit.

Jak vlastně dochází k fragmentaci v rámci LVM skupiny?

Dochází k ní především při manipulaci s logickými disky (LV) v rámci skupiny (VG). Je-li logický disk (LV) odstraněn, použije LVM uvolněný prostor při vytvoření nového, nebo roztažení již existujícího, logického disku (LV). Díky tomu časem může dojít k takovému zpřeházení a rozsekání extentů jednotlivých logických disků, jako můžete názorně vidět na níže uvedeném schématu.

Schéma fragmentovaného LVM

Následující příklad demonstruje jak se můžete pomocí příkazu lvs dozvědět do jaké míry je logický disk data v rámci skupiny storage fragmentován:

Poznámka
stroj:~# lvs -o +seg_pe_ranges storage
  LV    VG      Attr   LSize Origin Snap%  Move Log Copy%  Convert PE Ranges             
  data  storage -wi-ao 2,69t                                       /dev/md2:137113-476930
  data  storage -wi-ao 2,69t                                       /dev/md1:0-134612     
  data  storage -wi-ao 2,69t                                       /dev/md2:0-137112     
  data  storage -wi-ao 2,69t                                       /dev/md1:137113-229734
  vidle storage -wi-a- 9,77g                                       /dev/md1:134613-137112

Jak omezit fragmentaci logických disků (LV)?

  • Nepoužívané logické disky (LV) rušte, až když už v rámci skupiny není žádné volné místo. Pak zrušte všechny nepoužívané disky najednou.
  • Po odstranění logických disků (LV) proveďte scelení a přerovnání logických disků (LV), tak abyste pak získali v rámci skupiny souvislé volné místo.
  • Logické disky recyklujte - tj. snažte se v maximální míře využívat již existující logické disky.
  • Velikost logických disků (LV) volte pokud možno takovou, aby je nebylo nutné navyšovat.

Příprava blokového zařízení na vyřazení ze skupiny - přesun dat

Pokud chceme rozdělené rozsahy logického disku (LV) scelit, nebo potřebujeme fyzické blokové zařízení (PV) ze skupiny (VG) vyhodit, použijeme pro přesun extentů příkaz pvmove. Rychlost přesunu je závislá na množství přesouvaných dat a možnostech řadiče.

Poznámka Na příkladu výše uvedeného výpisu fragmentace skupiny storage si můžete povšimnout, že logický disk data je rozdělen na čtyři bloky. V takovém případě je celkem zbytečné extenty přesouvat, ovšem můžeme toho využít k demonstraci použití příkazu pvmove a přitom celkový počet rozsahů zredukovat na dva.

Protože možnosti přesouvání extentů v rámci jednoho fyzického blokového zařízení (PV) jsou velmi omezené, je třeba do skupiny storage přidat další zařízení, pokud možno s co největší kapacitou. Optimální by bylo, aby to bylo rovněž raid pole - snížíte tak riziko ev. ztráty dat v případě že by se vyskytla nějaká chyba na některém z disků tohoto blokového zařízení.

Scelování "rozsekaných" extentů

Není nijak přehnané, hovořit v případě scelování o žonglování s extenty. Obzvláště v případě velkých logických disků, které svou kapacitou přesahují velikost zařízení pro odložení dat. Nicméně, doufám, že z níže uvedené ukázky bude dostatečně zřejmé jak se přesuny provádí, a jak vlastně uplatnit informace z výše uvedeného výpisu o fragmentaci logických disků.

Výchozí předpoklad je, aby pro přesun dat bylo ve VG skupině storage k dispozici další PV zařízení /dev/md3, o stejné kapacitě, jako má /dev/md2 (2 TB).

Poznámka
stroj:~# vgextend storage /dev/md3

Cílem přesunu by mělo být, po zrušení testovacího LV disku vidle, dosažení maximálně spojitého LV disku data, rozděleného pouze mezi dva rozsahy na dvou raid polích (aktuálně je tento disk rozdělen na 4 rozsahy) :

Poznámka
stroj:~# lvremove storage/vidle

Neadresované scelení extentů

Za předpokladu, že je nám jedno, jak budou po scelení tyto dva rozsahy rozděleny mezi PV zařízení, je nejjednodušší provést přesuny bez adresování extentů

Nejprve odsuneme všechna data z PV /dev/md1, kde byl LV disk vidle na prázdné PV zařízení /dev/md3:

Poznámka
stroj:~# pvmove -n storage/data /dev/md1 /dev/md3
Poznámka Není-li uvedeno cílové zařízení a ani adresa fyzického extentu od kterého se má začít rozsah ukládat, tak se data začnou ukládat postupně od začátku prvního dostupného zařízení ve skupině. V případě, že již nějaké extenty s daty na tomto PV zařízení jsou, dojde k rozdělení přesouvaných dat na více rozsahů.

Po scelení původně rozdělených rozsahů data přesuneme z PV /dev/md3 zpět. Aby však pvmove data umístil správně, uvedeme i tentokrát PV zařízení na které se mají data přesunout:

Poznámka
stroj:~# pvmove -n storage/data /dev/md3 /dev/md1

A abychom zaplnili zbytek /dev/md1 a nemuseli nic moc řešit, tak odsuneme zbylé extenty z PV /dev/md2. Tentokrát již nemusíme cílové PV zařízení řešit, protože by se data měly přilepit za rozsah na PV /dev/md1 a zbytek pak na PV /dev/md3.:

Poznámka
stroj:~# pvmove -n storage/data /dev/md2

Stejným způsobem bychom pak uvolnili PV disk /dev/md3 a zařízení vyřadili ze skupiny. Výpis fragmentace by pak vypadal po těchto operacích nejspíš takto:

Poznámka
stroj:~# lvs -o +seg_pe_ranges storage
  LV    VG      Attr   LSize Origin Snap%  Move Log Copy%  Convert PE Ranges             
  data  storage -wi-ao 2,69t                                       /dev/md3:0-381808
  data  storage -wi-ao 2,69t                                       /dev/md1:0-229734

Adresované přesouvání extentů

Při adresovaném přesunu extentů by bylo nejlepší nejprve část, která následovala za LV vidle odložit na PV /dev/md3:

Poznámka
stroj:~# pvmove -n storage/data /dev/md1:137113-229734 /dev/md3

A pak ji hned zpátky "přilepit" za první blok dat. Jelikož šlo o blok dat, který nepřesahuje svým objemem zbylou kapacitu zařízení, není nutné nic adresovat. Příkaz pvmove data umístí hned za data stávající:

Poznámka
stroj:~# pvmove -n storage/data /dev/md3 /dev/md1

Zaplnění zbytku, však již vyžaduje trochu počtů. Celková kapacita PV zařízení /dev/md1 (jak jsme mohli vidět na výpisu) je 229734. Data která již byla přesunuta, zabírají 227233. Takže do úplného zaplnění zbývá volných 2501 extentů, které můžeme přesunout ze začátku PV disku /dev/md2 za stávající rozsah:

Poznámka
stroj:~# pvmove -n storage/data /dev/md2:0-2501 /dev/md3:227234-229734

Zbylá data na PV /dev/md2 dostaneme na začátek přesunem na /dev/md3 a zpět. Výsledek výpisu fragmentace by měl být stejný, jako ve výše uvedeném příkladu.

Vypisování aktuálního stavu při přesunu

Při přesunu se vypisuje aktuální stav přesunu v procentech. Přesun probíhá tak, že LVM vytvoří dočasné blokové zařízení pvmove0, tak jako při snapshotu. Původní zařízení se uzamkne, a dokud nedojde k úplnému přesunu, zůstávají data uložena tam kde byla, zatím co rozdíly jsou udržovány v cache. Teprve po úspěšném zkopírování všech datových bloků se obsah cache zapíše do přesunutých extentů a původní obsazené extenty se uvolní.

Poznámka
stroj:~# pvmove -n /dev/data/blok /dev/md1 /dev/md0p2
  /dev/md1: Moved: 0,0%
  /dev/md1: Moved: 1,0%
  /dev/md1: Moved: 2,0%
  ...
  /dev/md1: Moved: 99,3%
  /dev/md1: Moved: 100,0%
Dá se přesun přerušit?
Ano. V takovém případě však ale zůstane logický disk uzamčen, dokud přesun dat nedokončíte nebo nezrušíte parametrem --abort. Viz níže příklad použití, v případě, že by byl probíhající přesun předčasně ukončen.
Poznámka
stroj:~# pvmove --abort -n /dev/data/blok /dev/md1 /dev/md0p2
Upozornění Pokud chceme přesouvat extenty logického disku ze kterého běží systém je třeba použít malý fígl.

Výpis, který při přesunu provádí pvmove vyžaduje, aby byla zachována možnost zapisovat do adresáře /var/run. Pokud tedy necháte přesouvat extenty logického disku, na kterém je umístěn, dojde s největší pravděpodobností ke kolapsu.

Stane se tak proto, že pvmove s tímto adresářem stále pracuje a v určitý moment dojde k situaci, že se bude snažit do něj zapsat, ale zároveň bude chtít blok do kterého jsou data fyzicky zapisována přesunout.

Řešení této situace však existuje. Stačí ještě před spuštěním přesunu namountovat tento adresář na tmpfs. Ten totiž běží v paměti stroje, a tak pvmove při přesunu nebude zapisovat na fyzický disk, ale do RAM.