LVM
Der Logical Volume Manager (LVM) ist eine hauptsächlich im UNIX- und Linux-Umfeld verbreitete Abstraktionsebene zwischen Festplatten und Dateisystemen sowie der Name der Linux-Implementation derselben.
- Festplatten (Physical Volume, PV) werden zu
- einem Pool (Volume Group, VG) zusammengefasst, aus dem dynamisch
- „Partitionen“ (Logical Volume, LV) angefordert werden können. Auf diesen Logical Volumes werden die Dateisysteme angelegt.
Vorteile von LVM
Es lassen sich im laufenden Betrieb Partitionen
- anlegen,
- vergrößern
- und verkleinern.
- zu einer einzigen (großen) Partition zusammenfassen.
- einen so genannten Snapshot eines Dateisystems erstellen (konsistente Zustandssicherung des Dateisystems z.B. für ein Backup)
- damit auch RAID-0 realisieren.
Kombinationen mit anderen Möglichkeiten, beispielweise Festplattenverschlüsselung, wie als Installationsoption bei der Alternate-Version von Ubuntu 7.10 angeboten, sind zusätzlich möglich.
Verwaltungstools
Befehl | Beschreibung |
---|---|
Befehle für physical volumes | |
pvcreate | Erzeugen eines PV |
pvdisplay | Anzeigen der Attribute von PVs |
pvscan | Suchen nach vorhandenen PVs |
pvchange | Ändern von Attributen von PVs |
pvresize | PV Vergrößern |
Befehle für volume groups | |
vgcreate | Erzeugen einer neuen VG |
vgremove | Löschen einer leeren VG ohne LVs |
vgextend | Erweitern einer VG um weitere PVs |
vgreduce | Verkleinern einer VG um leere PVs |
vgdisplay | Anzeigen von Attributen von VGs |
vgrename | Umbenennen einer VG |
vgscan | Suchen nach vorhandenen VGs |
vgchange | Ändern von Attributen und Aktivieren/Deaktivieren von VGs |
Befehle für logical volumes | |
lvcreate | Erzeugen eines LV |
lvremove | Löschen von inaktiven LVs |
lvextend | Vergrößern eines LV |
lvreduce | Verkleinern eines LV |
lvdisplay | Anzeigen von Attributen von LVs |
lvrename | Umbenennen eines LV |
lvscan | Suchen nach allen vorhandenen LVs |
lvchange | Ändern von Attributen eines LV |
Erweiterte Befehle
Befehl | Beschreibung |
---|---|
pvdata | Debug-Anzeigen der Attribute von PVs |
pvmove | LV-Daten online verlagern |
vgcfgbackup | Metadatensicherung von VGs durchführen |
vgcfgrestore | Metadatenrestauration auf PVs einer VG durchführen |
vgck | Überprüfung der Metadatenkonsistenz von VGs |
vgexport | VG abmelden, um deren PVs auf ein anderes System zu verlagern |
vgimport | Verlagerte VG am Zielsystem bekannt machen |
vgmerge | Zwei VGs zu einer verbinden |
vgmknodes | Neuanlegen der Gerätedateien von VGs |
vgsplit | Eine VG in zwei aufteilen |
e2fsadm | LV und Ext2-Dateisystem in der Größe ändern |
lvmchange | LVM zurücksetzen |
lvmsadc | Statistikdaten sammeln |
lvmsar | Gesammelte Statistikdaten anzeigen |
lvmcreate_initrd | Initial-RAM-Disk zum Booten mit Root-Dateisystem auf LV erzeugen |
lvmdiskscan | Nach als PV unterstützten Geräten suchen |
Quelle: tobias.schroepf.de mit Lizenz CC BY-NC-SA 3.0.
evms
evms (Enterprise Volume Management System) bietet eine Verwaltung von LVMs über verschiedene grafische Oberflächen (Kommandozeile: cli oder ncurses und grafisch).
ivman
Links
- Dokument Linux LVM-HOWTO: sehr gute (deutschsprachige) LVM-Anleitung.
Bedienung
Unterstützung im System
Vorraussetzungen
- es muss das Paket lvm2 installiert sein (alternativ ist evms möglich)
- der devicemapper (dm_mod) muss geladen sein; siehe Kernelmodule laden
LVM aktivieren
Falls ein Gerät beim booten nicht aktiv war sind auch das darauf enthaltene LVM-Geräte nicht automatisch erkannt worden.
pvscan -v vgscan -v vgchange -ay
Ohne den letzten Befehl verbleibt das logical volume im Status „inactive“.
Volumegroup inaktiv schalten
Der folgende Befehle schaltet eine volume-group auf inaktiv (es wird nichts gelöscht)
vgchange -a n /dev/volg1
PV löschen
vgremove /dev/pvdevice
(ebenso lvremove, vgremove)
LVM neu einrichten
PV erstellen
- eine Partition mit der Partitions-ID 8e (für LVM) erstellen, siehe partitionierung
- vgscan -v
- pvcreate /dev/PART
VG erstellen
vgcreate NAME_DER_VG /dev/PART_MIT_PV
Beispiel:
vgcreate vg_daten /dev/sda1
LV erstellen
lvcreate -L GRÖSSE -n NAME_DER_NEUEN_LV NAME_DER_VG
Beispiel:
lvcreate -L 52G -n lv_root vg_daten
LV vergrößern und verkleinern
Wie schon gesagt lässt sich mit LVM eine Partition nachträglich vergrößern und auch verkleinern. Möchte man das zuvor angelegte Logical Volume mit der Größe von 1000 Megabyte vergrößern, kann man dies mit lvextend
erledigen. Dazu gibt man einfach die neue Größe mit der Option -L direkt an. Alternativ könnte man auch mit -L+300M die neue Größe relativ zur bestehenden Größe angeben. Aufgrund der Größe von 4 Megabyte der Physical Extents, können die tatsächlisch erzeugten Größen der Logical Volumes etwas abweichen, da die erzeugten Logical Volumes damit immer nur ein Vielfaches von 4 MB groß sein können. Um diese Abweichung zu umgehen, können Sie beim Anlegen einer Volume Group die Größe der Physical Extents explizit kleiner angeben. Sehen Sie dazu auch den Abschnitt „Volume Group mit spezieller PE-Größe“.
lvextend -L 1300M /dev/volg1/logv1
Alternativ den gesamten freien Speicher hinzufügen:
lvextend -l +100%FREE /dev/volg1/logv1
Jetzt wurde erst die virtuelle Partition, also das Logical Volume vergrößert (T als Abkürzung für Terrabyte wäre auch möglich). Zusätzlich muss man nun auch das darin enthaltene Dateisystem vergrößern. Zuvor muss es allerdings mit umount aus dem Verzeichnisbaum entfernt und noch mit e2fsck auf Fehler überprüft werden.
umount /lvm-test e2fsck -f /dev/volg1/logv1 resize2fs /dev/volg1/logv1
Umgekehrt können Sie mit resize2fs das Dateisystem auch verkleinern, indem Sie die neue Größe in Blöcken (per Default 1024 Byte) angeben. Im Beispiel wird das Logical Volume wieder von 1300 Megabyte auf 1000 Megabyte verkleinert.
Achtung: Erst das Dateisystem und danach das Logical Volume mit lvreduce verkleinern! Würden Sie erst das Logical Volume mit lvreduce verkleinern, gehen die darin enthaltenen Daten verloren!
umount /lvm-test e2fsck -f /dev/volg1/logv1 resize2fs /dev/volg1/logv1 1000M lvreduce -L1000M /dev/volg1/logv1
Alternativ wäre eine relative Veränderung der Größe um einen bestimmten Speicherplatz möglich, dabei muss man aber genau rechnen (das nicht zu viel weggenommen wird), da resize2fs die Größe immer absolut haben möchte.
lvreduce -L-300M /dev/volg1/logv1
Um komfortabler zu arbeiten, gibt es das Kommando e2fsadm, das alle vorher beschriebenen Schritte wie lvextend, lvreduce, e2fsck und resize2fs zusammen ausführt. Wie der Name schon andeutet, funktioniert das Programm nur bei dem Dateisystem ext2. Falls das Programm nicht in Ihrer Distribution enthalten ist, können Sie es unter http://e2fsprogs.sourceforge.net/ downloaden. Das folgende Kommando vergrößert zum Beispiel das Logical Volume auf 1300 Megabyte. Zuvor muss es allerdings wieder mit umount ausgehängt werden.
umount /lvm-test e2fsadm -L 1300M /dev/volg1/logv1
Bei der Verkleinerung verfährt man in gleicher Weise:
umount /lvm-test e2fsadm -L 1000M /dev/volg1/logv1
PV vergrößern
Auch physikalische Volume (PV) können sich verändern (z. B. Image vergrößert).
vergrößern:
- alle Logical Volumes (LV) der Volume Group (VG) unmounten, wenn Swap-Partitionen als LVs enthalten sind, diese mit swapoff deaktivieren
- VG für die Vergrößerung inaktiv schalten:
vgchange -a n VG-NAME
- mit cfdisk die LVM-Partition löschen und größer (mit Typ 8e) anlegen
- das PV auf die neue Größe einstellen:
pvresize /dev/PV-DEVICE
- VG aktivieren:
vgchange -a y VG-NAME
- wieder alles wie vorher mounten mit
mount -a
PV aus VG entfernen
Wenn eine Volume-group (VG) aus mehreren physical volumes (PV) muss früher oder später auch mal eine PV aus der VG entfernt werden.
- Damit das funktioniert müssen zuerst alle logical volumes (LV) entfernt werden die von diesem PV abhängen. Die Daten sind damit natürlich auch gelöscht:
lvremove -f LV_NAME
- anschließend wird das PV aus der VG abgemeldet:
vgreduce VG_NAME PV_device
alternativ können (wenn das PV schon nicht mehr als device im system existiert) alle fehlenden PVs gelöscht werden:
vgreduce --removemissing VG_NAME
PV zu einer VG hinzufügen
Wenn eine Volume group (VG) durch eine oder mehrere physical volumes (PV) erweitert werden soll (hier im Beispiel hat die neue PV /dev/sdd1
, diese muss vorher mit Typ 8e partioniert worden sein):
vgextend VG_NAME /dev/sdd1
Anschließend erscheint die Erfolgsmeldung:
Volume group "VG_NAME" successfully extended
VG vergrößern und verkleinern
Da auch der Speicherplatz der Volume Group irgendwann belegt ist und man damit kein Logical Volume mehr anlegen oder vergrößern kann, ist es möglich, auch eine Volume Group mit dem Befehl vgextend
zu vergrößern. Man muss nur eine beliebige freie Partition wie in Abschnitt „PV einrichten“ als Physical Volume einrichten und es der Volume Group zufügen.
pvcreate /dev/sdb1 vgextend volg1 /dev/sdb1
Möchte man eine Volume Group verkleinern, kann man mit dem Befehl
vgreduce -a volg1
alle freien Physical Volumes aus der Volume Group entfernen. Um ein bestimmtes Physical Volume zu entfernen, muss man den genauen Pfad dessen angeben. Vorher kann man, falls erwünscht, mit dem Befehl pvdisplay -v überprüfen, ob das betreffende Physical Volume Daten enthält oder nicht.
pvdisplay -v /dev/hdb7 vgreduce volg1 /dev/hdb7
Voraussetzung ist immer, dass auf dem betreffenden Physical Volume keine Daten enthalten sind. Mit dem Kommando pvmove kann man vorher gegebenenfalls die Daten auf ein anderes Physical Volume verschieben.
Snapshots
Ein Snapshot ist eine Momentaufnahme der Daten eines Logical Volumes, das die vollständigen Daten enthält, aber seperat eingehängt werden kann. Nach einer angegebenen Datenmenge von Unterschieden wird es ungültig.
Snapshot erstellen
Vorraussetzungen:
- lvm-System
- ausreichend freier Speicherplatz (extents) in der VG
Beispiel:
lvcreate -L 100G --snapshot -n backup /dev/vg_data/lv_file
-L 100G
: nach 100 GB Unterschied zum aktuellen Datenstand wird der Snapshot ungültig.-n backup
: der Name des Snapshots/dev/vg_data/lv_file
: LV von dem ein Snapshot gemacht wird.
Der Snapshot kann nun wie ein normales Blockdevices benutzt werden u. a. sind mounts (hier schreibgeschützt) möglich:
mount -o ro /dev/vg_data/backup /media/snapshot
Die aktuelle Belegung anzuzeigen (Überprüfung: Wann wird der Snapshot ungültig?) :
lvdisplay /dev/mapper/vg_data-backup
--- Logical volume --- LV Name /dev/vg_data/backup VG Name vg_data LV UUID 21eCPd-qrfR-THpQ-6DCc-SxXU-pbNh-hvYKS1 LV Write Access read/write LV snapshot status active destination for /dev/vg_data/lv_file LV Status available # open 1 LV Size 5,86 TB Current LE 1536340 COW-table size 100,00 GB COW-table LE 25600 Allocated to snapshot 26,96% Snapshot chunk size 4,00 KB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 254:3
Aktuell sind demnach 26,96% (von 100GB) schon veränderte Daten. Nachdem 100 GB veränderte Daten vorliegen, ist der Snapshot nicht mehr verfügbar. In diesem Fall wird er als „INACTIVE“ angezeigt und lässt sich auch nicht mehr mounten:
--- Logical volume --- LV Name /dev/vg_data/backup VG Name vg_data LV UUID 21eCPd-qrfR-THpQ-6DCc-SxXU-pbNh-hvYKS1 LV Write Access read/write LV snapshot status INACTIVE destination for /dev/vg_data/lv_file LV Status available # open 0 LV Size 5,86 TB Current LE 1536340 COW-table size 100,00 GB COW-table LE 25600 Snapshot chunk size 4,00 KB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 254:3
snapshot löschen
lvremove /dev/vg_data/backup
Wenn der Befehl innerhalb eines Shellscriptes ausgeführt werden soll (oder die interaktive Sicherheitsabfrage unerwünscht ist) dann muss -f angefügt werden:
lvremove -f /dev/vg_data/backup
Mit folgendem Shellscript (abspeichern z. B. als lvm_snapshots_remove_all_inactive.sh
) werden alle inaktiven Snapshots gelöscht. Unbedingt erstmal im testmode ausführen und schauen ob alles funktioniert.
#!/bin/sh error=0 # change to 0 after test! testmode=1 inact_dev=`lvdisplay | grep -A 0 -B 5 'INACTIVE destination for ' | grep "LV Name" | sed s/"LV Name"// | sed "s/ //g"` if [ -z $inact_dev ];then if [ $testmode -eq 1 ];then echo "Debug: no inactive devices found" fi exit fi for dev in "$inact_dev"; do if [[ -e $dev ]]; then if [ $testmode -eq 1 ];then echo "Testmode activated, i would delete $dev (call: lvremove -f $dev)" else lvremove -f $dev fi if [ $? -ne 0 ]; then echo "could not delete $dev" error=1 fi else echo "not a valid device $dev" fi done if [ $error -eq 1 ]; then echo "there was an error at some point." exit 1 else exit 0 fi
Beispielkonfiguration /etc/mdadm.conf
# mdadm.conf # # Please refer to mdadm.conf(5) for information about this file. # # by default, scan all partitions (/proc/partitions) for MD superblocks. # alternatively, specify devices to scan, using wildcards if desired. DEVICE partitions # auto-create devices with Debian standard permissions CREATE owner=root group=disk mode=0660 auto=yes # automatically tag new arrays as belonging to the local system HOMEHOST <system> # instruct the monitoring daemon where to send mail alerts MAILADDR root MAILFROM SERVER2 - mdadm # mdadm --detail --scan >> /etc/mdadm/mdadm.conf : ARRAY /dev/md0 metadata=1.2 name=server2:0 UUID=1a025409:07a31a54:3381e050:de36be19