====== Logical Volume Manager (LVM) ====== # aptitude -y install lvm2 * [[http://www.linuxhaven.de/dlhp/HOWTO/DE-LVM-HOWTO-4.html]] so kann man ein LVM-Volumen von einem Image mounten: * [[http://www.hutsky.cz/blog/2014/06/mount-a-disk-image-containing-lvm/]] === LVM-Fehlermeldungen die auch bei anderen Kommandos erscheinen === dieser Fehler tritt auf, wenn ein Volumen aus einer Volumengruppe entfernt wurde: WARNING: Device for PV H3cLlM-6Gnk-HK8W-ax7g-LAtT-0JpR-Fc7OMA not found or rejected by a filter. beheben lässt sich das Problem mit diesem Kommando: > pvscan --cache ===== LVM vergrößern ===== //Getestet mit Ubuntu 20.04 LTS// umount /data growpart /dev/vdb 1 vgextend vgsdata pvresize /dev/vdb1 vgdisplay vgsdata lvresize -l +100%FREE vgsdata/vol-data e2fsck -f /dev/mapper/vgsdata-vol--data resize2fs /dev/mapper/vgsdata-vol--data mount /data df -h /data ===== unterstützte Dateisysteme ===== * [[http://de.wikipedia.org/wiki/Logical_Volume_Manager]] LVM-Implementation (1998 von Heinz Mauelshagen geschrieben), die sich in der Bedienung stark an HP-UX anlehnt. Eine Online-Vergrößerung ist unter Anderem mit folgenden Dateisystemen möglich: ext2, ext3, und ext4, JFS, ReiserFS V3 so wie mit XFS. Ebenfalls ist die Spiegelung der Logical Volumes möglich und unabhängig vom verwendeten Dateisystem. Neben der LVM-Implementierung von Red Hat (ehemals Sistina) gibt es mit EVMS auch eine Implementierung von IBM, die über LVM hinaus auch fast alle anderen Massenspeicheraufgaben unterstützt (Partitionierung, RAID, Dateisystemverwaltung). Die Dateisysteme [[::FreeBSD:ZFS]] und [[btrfs]] enthalten bereits die Funktionen eines Logical Volume Manager's. Hier braucht man also keinen separaten Logical Volume Manager. * [[http://wiki.ubuntuusers.de/Dateisystemgröße_ändern#Dateisysteme-und-ihre-Eigenschaften]] ^Dateisysteme und ihre Möglichkeiten ^^^^^ ^Dateisystem ^Online ^^Offline ^^ ^ ^Vergrößern ^Verkleinern ^Vergrößern ^Verkleinern ^ | ext2/ext3/ext4 | ja | nein | ja | ja | | ReiserFS | nein | nein | ja | ja | | JFS | ja | nein | nein | nein | | XFS | ja | nein | nein | nein | | NTFS | nein | nein | ja | ja | | FAT | nein | nein | ja | ja | ===== Installation ===== * [[http://www.pro-linux.de/NB3/artikel/2/136]] Als erstes muss eine Partition angelegt werden und die Partions-ID auf __8e__ geändert werden. Dies passiert mit fdisk und sollte keinen große Probleme bereiten: # fdisk -l # fdisk -l /dev/sda # fdisk /dev/sda Als zweites muss die Partition (bzw. die Partitionen) initialisiert werden: # pvcreate /dev/sda3 Physical volume "/dev/sda3" successfully created Dann muss man eine //logische Volumengruppe// (z.B. home) anlegen: # vgcreate home /dev/sda3 Volume group "home" successfully created Jetzt kann man sich schon mal alle Informationen zur //logische Volumengruppe// anzeigen lassen: # vgs # vgdisplay # vgdisplay home Die Variable //Total PE// bezeichnet die Gesamtgröße der //logische Volumengruppe//. Und die Variable //Free PE// bezeichnet die Gesamtgröße des noch freien Bereiches in der //logische Volumengruppe//. Will man also die komplette Volumengruppe mit nur einem einzigen //logisches Volumen// (fritz) belegen, kann man das ganz einfach so machen: # lvcreate -l [Wert von "Free PE"] -n fritz home Logical volume "fritz" created Das //logisches Volumen// kann man sich so ansehen: # lvs # lvdisplay Gelöscht wird ein //logisches Volumen// so: # lvremove home/fritz Do you really want to remove active logical volume "fritz"? [y/n]: y Logical volume "fritz" successfully removed **Ein //logisches Volumen// (fritz) mit einer Größe von 1GB kann man wie folgt anlegen:** # lvcreate -L 1G -n fritz home Logical volume "fritz" created oder # lvcreate -L 100%FREE -n fritz home Logical volume "fritz" created Ein //logisches Volumen// vergrößert man um 1GB so: # lvresize -L +1G home/fritz Extending logical volume fritz to 2,00 GB Logical volume fritz successfully resized Die Größe eines //logisches Volumen// setzt man wie folgt auf einen festen Wert: # lvresize -L 3G home/fritz Extending logical volume fritz to 3,00 GB Logical volume fritz successfully resized Ein //logisches Volumen// vergrößert man wie folgt um 20% der aktuellen Gesamtgröße: # lvresize -l +20%LV home/fritz Extending logical volume fritz to 1,20 GB Logical volume fritz successfully resized Jetzt kann man das //logische Volumen// formatieren und einhängen: # mkfs -t ext4 /dev/home/fritz # mount /dev/home/fritz /home/fritz Man kann das ganze auch mit //LABEL// machen: # mkfs -t ext4 -L fritz /dev/home/fritz # mount LABEL=fritz /home/fritz Man kann an Stelle von "fritz" auch die komplette Bezeichnung des Mount-Points (/home/fritz) als Label verwenden: # mkfs -t ext4 -L /home/fritz /dev/home/fritz # mount LABEL=/home/fritz /home/fritz In der ///etc/fstab// würde der Eintrag dann so aussehen: LABEL=/home/fritz /home/fritz jfs defaults 0 0 Soll das Laufwerk sehr //sicher// (dafür aber langsamer) sein, dann noch das hier: # tune2fs -o journal_data /dev/home/fritz Möchte man ein //logisches Volumen// für //SWAP// verwenden, dann könnte man es so machen: # lvcreate -L 2G -n swap home # mkswap -L swap /dev/home/swap # vi /etc/fstab LABEL=swap none swap sw 0 0 einen **Snapshot** erstellen: # lvcreate -L10G -s -n der_schnappschuss /dev/home/fritz ==== LV vergrößern ==== === ext* === Seit Kernel 2.6.10 kann es auch im eingehängten Zustand vergrößert werden. # lvresize -L 30G data/mysql # umount /var/lib/mysql/ # e2fsck -yFf /dev/mapper/data-mysql # resize2fs -p /dev/mapper/data-mysql # mount /var/lib/mysql/ === jfs === JFS kann __nur_ im eingehängten Zustand vergrößert werden! # lvresize -L 30G data/mysql # mount -o remount,resize /var/lib/mysql/ ==== zu bedenken bei LV-Vergrößerungen ==== Die Möglichkeit zu haben, bei Bedarf ein zu klein bemessenes Dateisystem zu vergrößern ist zwar recht schön, ist aber auch in einigen Punkten problematisch. - Wenn man ein Dateisystem mit statischen Inodes (z.B.: [[ext3]] oder [[ext4]]) verwendet, dann bleibt die Anzahl der Inodes bei der Vergrösserung gleich. Das bedeutet, man kann jetzt zwar größere Dateien auf der Partition ablegen aber nicht mehr! - Liegen auf einer VolumenGruppe viele LV's und davon werden dann hin und wieder mal verschiedene LV's vergrössert, dann fragmentiert der Festplattenbereich auf der VolumenGruppe und dadurch werden die mechanischen Plattenkopfbewegungen unnötig in die Höhe getrieben. Das bedeutet, die gefühlte Arbeitsgeschwindigkeit der Platte sinkt. Aus diesem Grund sollte man das Vergrößern von LV's auf ein Minimum beschränken und bevorzugt ein Dateisystem einsetzen, welches mit dynamischen Inodes arbeitet (z.B.: JFS oder XFS). ==== LV löschen ==== physikalische Laufwerke/Volumen anzeigen > lsblk VG (Volumen-Gruppe) anzeigen > vgdisplay > vgdisplay vgname LV (logisches Volumen) aus einer Volumen-Gruppe anzeigen > ls -lha /dev/vgname/ LV (logisches Volumen) aus einer Volumen-Gruppe löschen > lvremove /dev/vgname/lvname Die Volumen-Gruppe löschen > vgremove vgname ==== LVM-Beispiel ==== === LVM-Volumen anlegen === Das komplette Laufwerk "''/dev/sdc''" soll mit einem LVM-Volumen versehen werden. eine eigene Partition über das komplette Laufwerk (100%) erstellen: > parted /dev/sdc (parted) p (parted) unit % (parted) mkpart primary 0% 100% (parted) p (parted) quit eine eigene Volumengruppe über die komplette Partition (100%) erstellen: > vgcreate binlog /dev/sdc1 > vgs das LVM-Volumen in der zuvor angelgten Volumengruppe anlegen: > lvcreate -l 100%FREE -n binlog vgsbinlog > vgs Dateisystem auf das LVM-Volumen schreiben: > mkfs -t ext4 -m 0 -L binlog /dev/mapper/vgsbinlog-binlog > echo "LABEL="binlog" /var/log/mysql/ ext4 defaults,noatime 2 2" >> /etc/fstab === LVM-Volumen anlegen === [[https://www.thomas-krenn.com/de/wiki/LVM_vergr%C3%B6%C3%9Fern]] das physikalische Volumen hat noch 500GB freien Platz: > lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT ... vdb 252:16 0 1000G 0 disk └─vdb1 252:17 0 500G 0 part └─vgsdata-vol--data 253:0 0 500G 0 lvm Partition auf 100% der Plattengröße vergrößern: > parted /dev/vdb (parted) p (parted) unit % (parted) mkpart primary 0% 100% (parted) p ... Number Start End Size File system Name Flags 1 0,00% 50,0% 50,0% primary lvm (parted) resizepart 1 100% (parted) p ... Number Start End Size File system Name Flags 1 0,00% 100% 100% primary lvm > lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vdb 252:16 0 1000G 0 disk └─vdb1 252:17 0 1000G 0 part └─vgsdata-vol--data 253:0 0 500G 0 lvm Volumengruppe auf 100% vergrößern: > vgs VG #PV #LV #SN Attr VSize VFree ... vgsdata 1 1 0 wz--n- <500,00g 0 > lvextend -l +100%FREE /dev/mapper/vgsdata-vol--data > vgs VG #PV #LV #SN Attr VSize VFree ... vgsdata 1 1 0 wz--n- <1000,00g 0 Dateisystem auf das LVM-Volumen schreiben: > resize2fs /dev/mapper/vgsdata-vol--data ===== Parse error at byte 3 ===== wenn dieser Fehler beim Aufruf eines beliebigen LVM-Befehl's auftritt (meist nach einem Absturz): # lvs Parse error at byte 3 (line 2): unexpected token dann müssen alle LV-Laufwerke runter gefahren werden und dann kann man den Kram hier löschen: # rm /etc/lvm/cache/.cache* ===== Eine LVM-Partition von einem mit dd erstellten Image mounten ===== [[http://www.utilities-online.info/articles/Mount-an-LVM-partition-image-cloned-with-dd/#.XUPcD_ybH0M]] hier wird die Partition mit der Loop-Methode gemountet: # losetup --all erstmal wird das Image überprüft: # file backup-cloud.img backup-cloud.img: LVM2 PV (Linux Logical Volume Manager), UUID: NiSuLv-fH2Z-eO4H-JoJ2-9yuG-fWvW-gmuJak, size: 10212081664 # fdisk -l backup-cloud.img Disk backup-cloud.img: 10.2 GB, 10212040704 bytes, 19945392 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes mounten # losetup /dev/loop0 backup-cloud.img # pvs PV VG Fmt Attr PSize PFree /dev/loop0 vg lvm2 a-- 9,51g 0 # vgchange -a y vg 2 logical volume(s) in volume group "vg" now active # mount -o ro /dev/vg/lv_root /mnt/old/ umount # umount /mnt/old/ # vgchange -a n vg 0 logical volume(s) in volume group "vg" now active # losetup -d /dev/loop0 # losetup --all ===== Partitionen auf einem LVM-Volumen mounten ===== root@computer01:~# pvs PV VG Fmt Attr PSize PFree /dev/sda2 system lvm2 a-- 90,68g 68,82g /dev/sdb1 data lvm2 a-- 1016,75g 426,75g root@computer01:~# ls -lha /dev/drbd/by-res/computer90/0 lrwxrwxrwx 1 root root 14 Mai 31 2019 /dev/drbd/by-res/computer90/0 -> ../../../drbd3 root@computer01:~# ls -lha /dev/drbd/by-res/computer90/ insgesamt 0 drwxr-xr-x 2 root root 60 Mai 31 2019 . drwxr-xr-x 6 root root 120 Mär 18 10:37 .. lrwxrwxrwx 1 root root 14 Mai 31 2019 0 -> ../../../drbd3 root@computer01:~# fdisk -lu /dev/drbd3 Medium /dev/loop0: 500 GiB, 536854491136 Bytes, 1048543928 Sektoren Einheiten: sectors von 1 * 512 = 512 Bytes Sektorengröße (logisch/physisch): 512 Bytes / 512 Bytes I/O Größe (minimal/optimal): 512 Bytes / 512 Bytes Typ der Medienbezeichnung: dos Medienkennung: 0x00034266 Gerät Boot Start Ende Sektoren Größe Id Typ /dev/loop0p1 * 2048 499711 497664 243M 83 Linux /dev/loop0p2 501758 1048543231 1048041474 499,8G 5 Erweiterte /dev/loop0p5 501760 1048543231 1048041472 499,8G 8e Linux LVM root@computer01:~# mount -o loop,offset=$((512*501760)) /dev/drbd3 /mnt/ root@computer01:~# losetup --all /dev/loop0: [0006]:502 (/dev/drbd3), offset 256901120 root@computer01:~# fdisk -lu /dev/loop0 Medium /dev/loop0: 499,8 GiB, 536597590016 Bytes, 1048042168 Sektoren Einheiten: sectors von 1 * 512 = 512 Bytes Sektorengröße (logisch/physisch): 512 Bytes / 512 Bytes I/O Größe (minimal/optimal): 512 Bytes / 512 Bytes root@computer01:~# vgs VG #PV #LV #SN Attr VSize VFree data 1 4 0 wz--n- 1016,75g 426,75g computer90-vg 1 3 0 wz--n- 499,74g 154,52g system 1 2 0 wz--n- 90,68g 68,82g root@computer01:~# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert computer90 data -wi-ao---- 500,00g pcsyslog02 data -wi-ao---- 30,00g syslog01 data -wi-ao---- 30,00g mysql computer90-vg -wi-a----- 286,10g root computer90-vg -wi-a----- 47,68g swap computer90-vg -wi-a----- 11,44g swap system -wi-ao---- 1,86g var system -wi-ao---- 20,00g root@computer01:~# mount /dev/mapper/computer90--vg-root /mnt/ ... root@computer01:~# umount /mnt/ root@computer01:~# vgchange -an /dev/mapper/computer90--vg root@computer01:~# losetup --all root@computer01:~# losetup -f /dev/loop0