LVM: Logical Volume Manager
- Ratkaisu levyjen partitiointiongelmaan
- Yhdistää joukon ”fyysisiä levyjä” (physical volumes, PV) levyryhmäksi (volume group, VG), josta sitten jaetaan ”loogisia levyjä” (logical volumes, LV) kuten partitioita
- PV:tä voi lisätä ja poistaa, LV:tä ja VG:tä voi luoda ja hävittää ja niiden kokoa muuttaa ”lennosta”, konetta boottaamatta
LVM: Logical Volume Manager
- snapshots, striping & mirroring (RAID), clustering
- Jotkin tiedostojärjestelmät (zfs, brtfs) tarjoavat itse osin samaa toiminnallisuutta, mutta eivät korvaa LVM:ää täysin
- Samassa koneessa voi olla sekä LVM että sen ulkopuolisia tiedostojärjestelmiä (usein /boot sen ulkopuolella)
LVM: PV-VG-LV
Physical volumes
|
hda
|
hdb
|
hdc
|
Logical volumes
|
/
|
/usr
|
/var
|
swap
|
/home
|
(unused)
|
LVM: PV-VG-LV
- PV:t voivat olla oikeita fyysisiä levyjä, partitioita, RAID-pakkoja, iSCSI-levyjakoja, kryptattuja tiedostoja... ”whatever looks like a disk”, myös erilaisia sekaisin
- LV:t eivät välttämättä fyysisesti yhtenäisiä vaan niiden osat voivat olla eri puolilla VG:tä
- Samassa VG:ssä levyt, joita halutaan käsitellä kokonaisuutena (varautua siirtämään kerralla toiseen koneeseen tms)
LVM-komennoista
- komentojen alkukirjaimet kertovat mihin ne vaikuttavat:
- pv* physical volume
- vg* volume group
- lv* logical volume
- kaikissa optio --help
- man komento
LVM-komennoista
- lvm komento [optiot]
- ”master”-komento, jonka alta löytyvät useimmat muut komennot
- yleensä sama kirjoittaako ”lvm komento” vai pelkästään komento, mutta esim. recovery-tilanteissa usein vain edellinen toimii, ja siinä on myös joitakin lisäkomentoja, joita ei erillisinä olekaan (esim. devtypes, dumpconfig)
- joitakin harvinaisia komentoja ei löydy lvm:n alta (mm. lvmdump)
- lvm help, lvm help komento
LVM-esimerkki: uusi VG
- Esimerkki uuden VG:n käyttöönotosta:
- Alustetaan fyysiset levyt:
- pvcreate /dev/vdb /dev/vdc
- Luodaan levyryhmä:
- vgcreate vg00 /dev/vdb /dev/vdc
LVM-esimerkki: uusi VG
- Luodaan loogisia levyjä:
- lvcreate --size 2T --name lvhome2 vg00
- lvcreate -L 4G -n swap2 vg01
- lvcreate --extents 50%VG -n big tt1-vg
- lvcreate -l 100%FREE -n vara tt1-vg2
- Kaksi erilaista koonmääritystapaa –size/-L ja –extents/-l
- Paljon optioita erikoistilanteisiin
LVM-esimerkki: uusi VG
- Luodaan LV:lle tiedostojärjestelmät ja mountataan ne:
- mkfs -t ext4 /dev/vg00/lvhome2
- mkdir /home2; mount /dev/vg00/lvhome2 /home2
- Otetaan LV swap-käyttöön:
- mkswap /dev/vg01/swap2
- swapon /dev/vg01/swap2
- Pysyväksi muokkaamalla /etc/fstab'ia
LVM: laitepolut
- Loogisen levyn laitepolku on perinteisesti
- /dev/<volume group>/<logical volume>
- siis esim. /dev/vg00/lvhome
- Nykyisissä Linuxeissa suositaan polkua
- /dev/mapper/<volume group>-<logical volume>
- siis esim. /dev/mapper/vg00-lvhome
- ja sitä on syytä käyttää /etc/fstab'issa.
LVM: laitepolut
- ”oikea” polku on tyyliä /dev/dm-0, edelliset luodaan symbolisina linkkeinä siihen; dm-laitetta ei yleensä koskaan pitäisi käyttää suoraan
- VG:n nimet historiallisesti vg* ja LV:n lv*, nykyisin useimmin suoraan kuvaavia (esim. VG koneen nimi tai “kone-vg”, LV ”usr” tai “lv-usr” jne)
PV:n luonti ja hävittäminen
- Fyysinen volume, PV, pitää alustaa ennen käyttöönottoa:
- pvcreate [options] laite[...]
- optiot harvoin tarpeen, joskus mm. --uuid, --force, --restorefile
- PV:n hävittäminen:
- pvremove laite
- poistaa vain metadatan PV:ltä, harvoin tarpeen (yleensä vgreduce hoitaa)
VG:n luonti
- vgcreate [options] nimi PV [PV...]
- vähintään yksi PV
- paljon optioita mutta harvoin tarpeen, mm. --maxlogicalvolumes, --maxphysicalvolumes, --physicalextentsize, --metadatacopies, --clustered...
VG:n hävittäminen
- vgremove [options] VGnimi [VGnimi...]
- jos VG ei ole tyhjä, varoittaa ja pyytää vahvistusta mutta suostuu poistamaan kuitenkin; LV:t voi myös poistaa yksitellen ensin
- ainoa yleinen optio -f (--force)
VG:n suurentaminen
- vgextend [options] VGnimi PVpath
- vgmerge VG1 VG2
- yhdistää (lisää) VG1:een VG2:n (kaikkine LV:neen)
- VG2 ei saa olla aktiivinen (ensin vgchange -a n vg2)
VG:n pienentäminen
- vgreduce [options] VGpath [PVpath]
- poistettavan PV:n oltava tyhjä (ks. pvmove)
- -a|--all poistaa kaikki tyhjät PVt
- --removemissing poistaa kadonneet (fyysisesti poistetut/särkyneet) PVt
Datan siirto VG:n sisällä
- pvmove [options] sourcePVpath [destPVpath [destPVpath...]]
- siirtää PV:n sisällön vapaaseen paikkaan tai nimettyihin PV:hen
- -n LVname siirtää vain nimetyn LV:n sisällön
- toimii taustalla, ei estä samanaikaista käyttöä (hidastaa kyllä)
- voi keskeyttää (vaikka bootata), jatkuu automaattisesti
- yleisin käyttö PV:n poisto (ennen vgreducea)
PV:n koon muuttaminen
- pvresize [--setphysicalvolumesize koko] PVPath [...]
- Muuttaa PV:n koon (oletuksena maksimiin)
- Ensin muutettava alla olevan laitteen (levyn) koko
- Pienennettäessä ensin vapautettava lopusta riittävästi tilaa
VG:n siirtäminen
- vgscan etsii kaikilta levyiltä PV:t ja VG:t ja ottaa ne käyttöön, usein tarpeen levyjen (PV:den) siirtojen/muutosten jälkeen.
- Harvemmin tarvitaan erikseen komentoja
- vgexport [-a|--all] VGName [VGName...]
- poistaa VG:n määrittelyn järjestelmästä siirtoa varten
- vgimport [-a|--all] VGname [VGname...]
- palauttaa VG:n määrittelyn ts. ottaa sen käyttöön (mahdollisesti eri) järjestelmään
- pvscan, lvmdiskscan etsivät PV:tä/LV:tä (hyvin harvoin tarpeen).
VG:n nimen muuttaminen
- vgrename OldVG NewVG
- samassa koneessa ei saa olla kahta samannimistä VG:tä
- OldVG voi olla nimi, polku tai UUID
- VG ei saa olla käytössä
VG:n konfiguraation tallennus
- vgcfgbackup, vgcfgrestore: VG:n metadatan backup ja palautus, yleensä automaattinen
- Joskus tarpeen särkyneen PV:n korvaamisessa (ensin pvcreate --restorefile … --uuid ...)
- /etc/lvm/backup
LV:n luonti
- lvcreate [optiot] volumegroup [PV[:PE[-PE]]...]
- -n|--name nimi
- -L|--size koko (kilo/mega/gita/tera/peta/exa)tavuina tai
- -l|--extents koko (LVM)lohkoina tai prosentteina
- (koko VG:stä %VG, vapaasta tilasta %FREE, PV:stä %VPS)
LV:n luonti
- Paljon muitakin harvemmin tarvittavia optioita, mm.
- PV:n ja PE:t (physical extents) voi määrätä
- ei luo tiedostojärjestelmää, se pitää tehdä erikseen (mkfs, mkswap)
- esim. lvcreate -n home -L 1G vg00
LV:n hävittäminen
- lvremove [f|--force] LVpath
- ensin tarvittaessa umount tai swapoff (pois myös fstab'ista)
- esim. lvremove /dev/vg00/lv2
LV:n koon muuttaminen
- lvresize [-L|--size] [+-]koko [-r|--resizefs] LVpath [Pvpath]
- lvresize [-l|--extents] [+-]koko [-r|--resizefs] LVpath [Pvpath]
- koon tai sen muutoksen voi ilmaista monella tavalla,
- esim. --extents 50%VG, -l 100%FREE, -L+1G …
- suurennettaessa myös halutun PV:n voi määrätä
- VG:ssä pitää olla tarpeeksi tilaa
LV:n koon muuttaminen
- Tiedostojärjestelmä pitää laajentaa tai suurentaa jälkeenpäin (resize2fs tms) tai käyttää -r -optiota (ei toimi aina, riippuu tiedostojärjestelmästä)
- Variantit vain suurentamiseen/pienentämiseen:
- lvextend, lvreduce
- soveltuvin osin samat optiot kuin lvresize
- hiukan turvallisempia kuin lvresize
LV:n nimen muuttaminen
- lvrename OldLV NewLV
- LV ei saa olla käytössä
Volume Groupin tila
- vgdisplay [options] [VGname...]
- vgs [options] [VGname...]
- VG:n status, erityisesti vapaan tilan määrä
- vgdisplay ”puhelias”, vgs tiivistetty
- Paljon optioita tulostuksen muotoiluun ym
Loogisen Volumen tila
- lvdisplay [options] [LVName...]
- lvs [options] [LVName...]
- LV:n status, mm. koko ja VG
- Ilman LV-nimeä listaa kaikki LV:t
Fyysisen Volumen tila
- pvdisplay [options] [PVpath]
- pvs [options] [PVpath]
- PV:n status, erityisesti vapaan tilan määrä
- Ilman PVpath-argumenttia listaa kaikki PV:t
LVM: vgchange
- vgchange [options] VGName
- muuttaa VG:n attribuutteja (melkein kaikkea mitä vgcreate asetti)
- erityisesti VG:n aktiivisuus: vgchange -a [n|y] - yleensä tapahtuu automaattisesti, mutta recovery-tilanteissa muuttaminen käsin joskus tarpeen, samoin vgmergen kanssa
LVM: lvchange, pvchange
- lvchange [options] LVPath [LVPath...]
- muuttaa LV:n attribuutteja, harvoin tarpeen
- pvchange [options] PVPath
- muuttaa PV:n attribuutteja, harvoin tarpeen
- pvchange -x n asettaa PV:n ”käyttökieltoon” esim. tulevaa poistoa ennakoiden
LVM snapshots
- lvcreate --snapshot -L size -n name […] OrigLV
- ”jäädytetty” kopio LV:stä luontihetkellä, sisäisesti tallettaa erot
- vie tilaa vain (koko ajan kasvavan) eron verran, mutta lakkaa toimimasta jos snapshot-LV tulee täyteen
LVM snapshots
- mahdollistaa koherentin varmuuskopion (kaikki snapshot-LV:n osat edustavat samaa ajanhetkeä), tärkeää etenkin tietokantojen kanssa
- voi käyttää yksinäänkin tilapäisenä varmuuskopiona (ennen jotain potentiaalisesti katastrofaalista kokeilua), palautus komennolla
- lvconvert --merge snapshot-LV-path
LVM snapshots
- snapshot-LV:tä ei normaalisti muuteta (mount -ro), mutta sitä voi muuttaa jos esim. halutaan säilyttää valikoituja muutoksia ennen palautusta
- yleensä hävitetään heti kun ei enää tarpeen (kun varmuuskopio tehty tms)
LVM RAID
- LVM sisältää (software-)RAID-toiminnallisuutta (striping & mirroring, nyttemmin myös RAID4/5/6), mutta sitä käytetään melko harvoin nykyisin: RAID yleensä toteutetaan erikseen mdadm:llä (monipuolisempi ja kypsempi, enemmän työkaluja) tai rauta-RAID-ohjaimella ja siten luotua RAID-laitetta käytetään PV:nä LVM:lle.
LVM clustering
- Clustering (CLVM): Jos käytössä on jaettu levy (SAN tms), LV voidaan jakaa monelle koneelle yhtaikaa. Synkronoinnista huolehtii clvmd (cluster lvm daemon), mutta toiminta yleensä edellyttää, että sovellukset ovat ”cluster-aware”.
- High-Availability -ympäristöön on RedHatin HA-LVM, joka myös jakaa levyn kahdelle koneelle mutta aktiivisena vain toisessa; optimoitu failover-scenarioon, ei edellytä cluster-säätöä sovelluksilta.
LVM-esimerkki: /home täynnä
- Olkoon /home (/dev/vg1/home) täynnä.
- Tarkistetaan onko VG:ssä tilaa:
- vgdisplay vg1 | grep Free #tai#
- vgs vg1
- Jos VG:ssä ei ollut tilaa, lisätään sinne levy tai pienennetään tai poistetaan jokin vanha LV
LVM-esimerkki: /home täynnä
- Kun tilaa on, laajennetaan /home:
- lvextend -L +1G -r /dev/vg1/home
- Jos -r -optio unohtui tai ei toiminut, laajennetaan tiedostojärjestelmä, tyypistä riippuen:
- resize2fs /dev/vg1/home # ext*
- xfs_growfs /home # xfs
- mount -o remount,resize /home # jfs
LVM-esimerkki: levyn lisäys
- Lisätään levy ensin ”fyysisesti” (virtuaalikoneelle vain virsh attach-disk tms), olkoon se /dev/vdb, partitioitu yhtenä osiona. (Partitiointi on yleensä välttämätöntä boottilevyn kanssa, eikä haittaa muutenkaan.)
- qemu-img create ...
- virsh attach-disk … vdb --persistent # alustakoneessa
- fdisk /dev/vdb # virtuaalikoneessa
LVM-esimerkki: levyn lisäys
- pvcreate /dev/vdb1 # alustetaan PV
- vgextend vg1 /dev/vdb1 # lisätään PV VG:hen
- # tarkistetaan miten meni:
- pvs
- vgs vg1
LVM-esimerkki: /usr/local erilleen
- Halutaan tehdä /usr/local'ista oma tiedostojärjestelmänsä. Oletetaan, että VG:ssä on tilaa (tässä 1GB).
- Luodaan uusi LV ja alustetaan se:
- lvcreate -L 1G -n local vg1
- mkfs -t ext4 /dev/vg1/local
- Lisätään määritys /etc/fstab'iin:
- echo ”/dev/mapper/vg1-local /usr/local ext4 defaults 0 2” >>/etc/fstab
LVM-esimerkki: /usr/local erilleen
- vanha /usr/local tilapäiselle nimelle, mountataan uusi:
- mv /usr/local /usr/oldlocal
- mkdir /usr/local
- mount /usr/local
LVM-esimerkki: /usr/local erilleen
- Tarkistetaan ja tarvittaessa korjataan hakemiston oikeudet:
- ls -ld /usr/oldlocal
- chmod 755 /usr/local
- chown root:root /usr/local
LVM-esimerkki: /usr/local erilleen
- Siirretään data ja hävitetään vanha hakemisto
- mv /usr/oldlocal/* /usr/local
- rmdir /usr/oldlocal
- /usr/local ei saa olla käytössä siirron aikana!
LVM-esimerkki: levyn vaihto
- Vaihdetaan kokonaan LVM-käytössä oleva levy (vdb) toiseen (vdc), koska se on on menossa rikki tai käynyt pieneksi tms.
- Kytketään uusi levy ”fyysisesti”:
- Lisätään uusi levy VG:hen:
- pvcreate /dev/vdc
- vgextend vg1 /dev/vdc
LVM-esimerkki: levyn vaihto
- Tyhjennetään vanha levy:
- Poistetaan vanha levy VG:stä:
- Poistetaan vanha levy:
- Levykirjaimet saattoivat vaihtua – tarkista!
LVM-esim: systeemilevyn vaihto
- Vaihdettava systeemilevy, jolla on sekä LVM:n ulkopuolinen partitio 1 (/dev/sda1, mountattuna /boot) että PV (/dev/sda2), boot loader (grub) master boot recordissa
- Partitioidaan uusi levy (sdb) käsin niin, että ensimmäinen (sdb1) on ainakin yhtä iso kuin ennenkin, lopusta sdb2, sitten partx/kpartx/partprobe tai boot
- Mountataan /boot varmuuden vuoksi readonly-tilaan:
- mount -o remount,ro /boot
LVM-esim: systeemilevyn vaihto
- Kopioidaan /boot dd:llä:
- dd if=/dev/sda1 of=/dev/sdb1
- umount /boot; mount /dev/sdb1 /boot # tarkistetaan että OK
- resize2fs /dev/sdb1 # jos kokoa suurennettiin
- Asennetaan boot loader uudelle levylle:
LVM-esim: systeemilevyn vaihto
- LVM-osan vaihto pvmove'lla kuten edellä mutta laitteina PV-partitiot /dev/sda2 ja /dev/sdb2
- Poistetaan vanha levy
- Bootataan mahdollisimman pian varmistuksen vuoksi - saattaa vaatia BIOSin tai VM:n määritysten muuttamista, mahdollisesti update-initramfs -u, /etc/fstab (jos levykirjainviittauksia)