Eleddig BSD és AIX írások „születtek tőlem”, most azonban egy idevágó gyakorlati probléma miatt úgy gondoltam, hogy egy rövid how-to-t írok egy másik témakörben – Linux operációs rendszer konfigurációval kapcsolatban. Úgy jött ki a lépés, hogy saját szerver építése kapcsán egy kisebb problémába ütköztem, melynek a megoldása végül azonban nem is volt olyan magától értetődő. Ennek a rövid leírásáról szól ez a cikk.
LVM tükrözés Ubuntu 12.04 LTS szerveren
A szerver operációs rendszer kiválasztásánál az Ubuntu 12.04 LTS szerver 64 bites verziójára esett a választás. A nyilvánvaló okok, gondolom, ismeretesek: stabilitás, Debian alap, kiváló support, az LTS miatt várhatóan hosszú ideig, kényelmes, kezes. A lemez kiosztáshoz a rugalmasság miatt az LVM-re esett a választásom. Azonban a rugalmasság és performancia mellett az adatbiztonságot sem tekintettem elhanyagolható szempontnak, és mivel a hardver-konfiguráció kettő darab hard disk-et tartalmaz, úgy döntöttem, tükrözött logical volume-kat fogok használni. Ez elsőre nagyon szimplán hangzik, de a létrehozásakor már nem tűnt annak. Lássuk a megoldást!
A hardver
Alapgép: HP ML110 G5 szerver
RAM: 8GB
CPU: Intel Q6600 CPU (4 mag)
Operatív tár: 2 db Maxtor 300GB SATAII merevlemez
Operációs rendszer: Ubuntu Linux 12.04 LTS server verzió, 64bit-es
A telepítéskor kettő darab partíciót hoztam létre mindkét merevlemezen:
– /dev/sda1 (250GB)
– /dev/sda2 (1GB)
– /dev/sdb1 (250GB)
– /dev/sdb2 (1GB)
Ezeket felhasználva létrehoztam egy ’xtvg’ nevű volume groupot (a továbbiakban: VG). Ez azonban még semmi mást nem tartalmazott, mint egy szintén létrehozott ’rootvol’ nevű logical volumet (továbbiakban: LV), erre telepítettem az alaprendszert. A partícionálatlan területeket későbbi felhasználásra szántam. Természetesen, ezzel nem voltam megelégedve, hiszen szervert építettem, minimum szerettem volna külön területet a /home-nak, a /tmp-nek , a /var-nak és a swap is hiányzott még, továbbá egy nagyobb filerendszer a kiszolgálandó adatoknak, ez lett a /data. Az alábbiak szerint:
# lvscan
Ez önmagában nem probléma, hiszen a szokásos módon, az lvcreate parancsot használva létrehozható az LV, majd tetszőleges filerendszerrel formázva már csatolható és használatba vehető. Ám még mindig nem tükrözött a kötet.
A fizikai kötetek (továbbiakban: PV) így néznek ki:
Megoldás
Az Ubuntu LVM kezelésének része az ’lvconvert’ alkalmazás, melynek segítségével meglevő LV konvertálható a megadott paraméterek szerint. A vonatkozó fórumbejegyzések szinte mindegyike a következőt parancsot javasolta:
# lvconvert -m 1 –corelog xtvg/rootvol
Ez szépnek is tűnt és első ránézésre örültem is. Egyedül a ’corelog’ nem volt tiszta, hogy mit jelent, hát utánanéztem. Az eredmény láttán gyorsan rájöttem, hogy nem ez az, ami nekem kell. A ’—corelog’ kapcsoló ugyanis azt csinálja, hogy az LV tranzakciós logját a memóriában tartja. Mit is jelent ez? Nem egyebet, minthogy egyrészt a tranzakciós log a memóriát foglalja (ezt én nem akarom), másfelől – és ez a rosszabb -, ha újraindul a szerver, a mirrornak újra kell épülnie (ez nagyon sok idő, és a szerver közben igen belassulhat), hiszen a memória tartalma kiürült, így a mirror státusza is ismeretlen. Ráadásul én a tranzakciós logot is redundánssá szerettem volna tenni, mert ha csak az egyik PV-n foglal helyet, akkor annak meghibásodása esetén megint csak bajban vagyok.
Erre való az ’lvconvert’ következő paramétere:
# lvconvert -m 1 xtvg/rootvol –mirrorlog mirrored
Azonban mikor ezt kiadtam, egy szép, kövér hibaüzenetet kaptam:
Not enough PVs with free space available for parallel allocation.
Consider –alloc anywhere if desperate.
Ezt sem értettem, hiszen két PV-m (a /dev/sda2 és /dev/sdb2) gyakorlatilag érintetlen volt. De OK. Legyen neki.
# lvconvert -m 1 xtvg/rootvol –mirrorlog mirrored –alloc anywhere
Ez le is futott, hiba nélkül. Azonban mikor a tükrözött LV paramétereit lekértem, tisztán látszott, hogy a mirrorlog, amelyett szintén tükrözni akartam, ugyanannak a merevlemeznek a két partíciójából kreált PV-jén helyezkedik el. Itt már azért ráncoltam a szemöldökömet, bosszantott kissé a dolog. Azt nem is említve, hogy szerettem volna a tranzakciós logot is egy külön LV-on tárolni!
Megpróbáltam egy kisebb LV-t létrehozni erre a célra:
# lvcreate -m1 –nosync -n logvol xtvg -L 50M
Ez létre is jött, de a ’rootvol’ LV tükörré konvertálásakor ehhez hozzá sem nyúlt, viszont ismét a már fentebb idézett hibaüzenetet kaptam. Hmm. Töröltem a ’logvol’ LV-t.
A megoldás következő lett, és ezután minden ment, mint a karikacsapás. A bűvös parancssor:
# lvcreate -i2 –L 50M -n logvol -I 128 xtvg
ahol a –i2 a csíkok száma, a –I 128 pedig a stripe mérete kilobájtban és 50MB nagyságú.
Ezután az első parancs kiadásakor használt paraméterekkel az ’lvconvert’ hiba nélkül lefutott. Automatikusan detektálta az így létrehozott ‘logvol‘ nevű log LV-t és használatba is vette. Ezután megkreáltam a többi igényelt LV-t, és az eredmény a következő lett:
# lvs -a -o +devices
Látjuk, hogy a ’rootvol’ LV a /dev/sda1 és /dev/sdb1 PV-ken van tükrözve, míg a ’rootvol’ tranzakciós logja a /dev/sda2 ill. /dev/sdb2 PV-ken. Jihháá, ezt akartam! Ezt a lépést a többi LV-n is végrehajtottam, az igényeimnek megfelelően, mint az fentebb is látszik. A swap kivételével mind kapott egy ext3 filerendszert, majd módosítottam az fstabot.
# cat /etc/fstab
# df –h
Összegzés
Az igényelt struktúra létrehozása – úgy gondolom – jogos igény. Kezdetben nem voltam birtokában a szükséges lépéseknek, csak annyiban voltam szinte biztos, hogy valami úton-módon ez megvalósítható. Teljesen bizonyossá azonban csak akkor vált, miután hosszas kísérletezés után eljutottam ahhoz a konfigurációhoz, melyet megálmodtam erre a szerverre. Akinek hasonló igénye van, remélem tudtam segíteni ezzel az írással!
Szia!
Bár nem mai az írás, azért hátha emlékszel rá. Ugyanezzel küzdök épp, és ha megfeszülök sem akarja a két mirrorlog-ot külön PV-kre tenni. Azt látom, hogy neked sikerült, csak azt nem látom, hogy ennek mi köze ahhoz, hogy létrehoztál előtte egy stripe-olt LV-t is? (Azért a biztonság kedvéért, kipróbáltam én is, de ugyanaz, egy lábra tette mind a két mirrorlog tükröt.)
Szia,
Tényleg régen volt már; nem annyira emlékszem :( De ha lesz egy szabad estém, kijátszom a konfigot neked újra egy Virtualbox-on. Üdv.
Az jó lenne, köszi előre is! :)
Közben nagy nehezen megfejtettem végre, úgyhogy már nem aktuális, köszi. Ha esetleg érdekel, annyi a titok, hogy az lvconvert parancsnál mindkét diszket meg kell adni, nem csak az újat, amit be akarunk vonni, hanem azt is, ami már az LV alatt van. Pl:
lvconvert -m 1 xtvg/rootvol –mirrorlog mirrored –alloc anywhere /dev/sda /dev/sdb
Így a két mirrorlog másolatot is mindkét diszkre ráteszi.