linux:lvm

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.

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.

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 (Enterprise Volume Management System) bietet eine Verwaltung von LVMs über verschiedene grafische Oberflächen (Kommandozeile: cli oder ncurses und grafisch).

Vorraussetzungen

  1. es muss das Paket lvm2 installiert sein (alternativ ist evms möglich)
  2. der devicemapper (dm_mod) muss geladen sein; siehe Kernelmodule laden

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“.

Der folgende Befehle schaltet eine volume-group auf inaktiv (es wird nichts gelöscht)

vgchange -a n /dev/volg1
vgremove /dev/pvdevice

(ebenso lvremove, vgremove)

PV erstellen

  1. eine Partition mit der Partitions-ID 8e (für LVM) erstellen, siehe partitionierung
  2. vgscan -v
  3. 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

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

Auch physikalische Volume (PV) können sich verändern (z. B. Image vergrößert).

vergrößern:

  1. alle Logical Volumes (LV) der Volume Group (VG) unmounten, wenn Swap-Partitionen als LVs enthalten sind, diese mit swapoff deaktivieren
  2. VG für die Vergrößerung inaktiv schalten:
    vgchange -a n VG-NAME
  3. mit cfdisk die LVM-Partition löschen und größer (mit Typ 8e) anlegen
  4. das PV auf die neue Größe einstellen:
    pvresize /dev/PV-DEVICE
  5. VG aktivieren:
    vgchange -a y VG-NAME
  6. wieder alles wie vorher mounten mit
    mount -a

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.

  1. 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
  2. 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

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

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.

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:

  1. lvm-System
  2. 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
# 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