23.18Logical Volume Manager (LVM)

Der Logical Volume Manager setzt eine logische Schicht zwischen das Dateisystem und die Partitionen der Festplatte. Das Prinzip, die Vorzüge und die Nomenklatur von LVM wurden bereits in Abschnitt 2.7, »RAID, LVM und Verschlüsselung«, erläutert. Dieser Abschnitt konzentriert sich auf die LVM-Administration.

Manche Distributionen stellen grafische Werkzeuge zur Administration von LVM im laufenden Betrieb zur Verfügung. Bei Fedora und Red Hat hilft Ihnen system-config-lvm bei der Konfiguration, bei SUSE das YaST-Modul System • LVM.

Auch wenn die Programme die LVM-Konfiguration erleichtern, setzen sie doch voraus, dass Sie die LVM-Konzepte verstanden haben. Beachten Sie, dass bei Größenänderungen in der Regel nur die Logical Volumes (LVs) geändert werden, nicht aber die darauf enthaltenen Dateisysteme. Deren Größe müssen Sie bei Verkleinerungen vorher, bei Vergrößerungen nachher selbst verändern.

Linux-intern ist für LVM das Kernelmodul dm_mod zuständig. Bei manchen Distributionen sind die LVM-Funktionen direkt in den Kernel kompiliert und erscheinen daher nicht im lsmod-Ergebnis.

Sofern LVM bereits während der Installation eingerichtet wird, kann sich auch die Systempartition in einem LV befinden. GRUB 2 ist LVM-kompatibel. Nur Wenn Sie noch mit GRUB 0.97 arbeiten (z.B. in CentOS 6 oder RHEL 6), brauchen Sie eine eigene, LVM-freie Boot-Partition.

Sie können LVM und RAID kombinieren. Üblicherweise richten Sie dazu zuerst einen RAID-Verbund ein und nutzen dann das resultierende Device /dev/mdn als Physical Volume (PV).

Ein Sonderfall ist RAID-0. Diese RAID-Variante wird von LVM direkt unterstützt. Um diese Funktion nutzen zu können, müssen Sie auf zwei oder mehr Festplatten jeweils ein PV einrichten. Diese PVs werden zu einer Volume Group (VG) vereint. Nun können Sie mit lvcreate -i n ein LV einrichten, das die Daten auf mehrere PVs und damit auf n PVs verteilt.

Die LVM-Administration erfolgt durch eine ganze Palette von Kommandos. Die Namen der Kommandos beginnen mit pv, vg oder lv, je nachdem, ob sie zur Bearbeitung von Physical Volumes, Volume Groups oder Logical Volumes gedacht sind. Die wichtigsten Vertreter sind in Tabelle 23.8 aufgezählt. Die Kommandos sind Teil des Pakets lvm2, das möglicherweise erst installiert werden muss.

Kommando

Funktion

lvcreate

richtet ein neues LV in einer VG ein.

lvdisplay

liefert Detailinformationen zu einem LV.

lvextend

vergrößert ein LV.

lvreduce

verkleinert ein LV.

lvremove

löscht ein LV.

lvrename

gibt dem LV einen neuen Namen.

lvscan

listet alle LVs auf.

pvcreate

kennzeichnet eine Partition oder ein Device als PV.

pvdisplay

liefert Detailinformationen zu einem PV.

pvremove

entfernt die PV-Kennzeichnung eines ungenutzten PVs.

pvscan

listet alle PVs auf.

vgchange

ändert die Attribute einer VG.

vgcreate

erzeugt eine neue VG aus einem oder mehreren PVs.

vgdisplay

liefert Detailinformationen zu einer VG.

vgextend

vergrößert eine VG um ein PV.

vgmerge

vereint zwei VGs.

vgreduce

verkleinert eine VG um ein ungenutztes PV.

vgrename

gibt einer VG einen neuen Namen.

vgscan

listet alle VGs auf.

Tabelle 23.8LVM-Kommandoübersicht

Anstelle der Einzelkommandos können Sie die gesamte LVM-Administration auch mit dem Kommando lvm ausführen, wobei Sie als ersten Parameter den gewünschten Befehl übergeben. Die Kommandos lvcreate und lvm lvcreate sind also gleichwertig.

Die folgenden Beispiele zeigen die Anwendung einiger LVM-Kommandos. Dabei gehe ich davon aus, dass während der Installation kein LVM eingerichtet wurde. Nun soll die zusätzliche Festplatte /dev/sdc via LVM genutzt werden. Die Partitionierung der Festplatte sieht so aus:

root# fdisk -l /dev/sdc Disk /dev/sdc: 320.0 GB, 320072933376 bytes Device Boot Start End Blocks Id System /dev/sdc1 1 1217 9775521 8e Linux LVM /dev/sdc2 1218 2434 9775552+ 8e Linux LVM

Um LVM zu initialisieren, führen Sie modprobe und vgscan aus. Sobald ein LVM-System eingerichtet ist, wird das LVM-Kernelmodul automatisch während des Rechnerstarts ausgeführt. Die manuelle Initialisierung ist also nur beim ersten Mal erforderlich:

root# modprobe dm_mod root# vgscan Reading all physical volumes (this may take a while...) No volume groups found

Aus didaktischen Gründen richte ich LVM zuerst auf der Partition /dev/sdc1 ein und erweitere das LVM-System später um /dev/sdc2. Wenn ohnedies klar ist, dass Sie die gesamte Festplatte für LVM nutzen möchten, ist es natürlich einfacher, gleich eine Partition in Maximalgröße mit pvcreate für die LVM-Nutzung zu kennzeichnen:

root# pvcreate /dev/sdc1 Physical volume "/dev/sdc1" successfully created

Nun müssen alle PVs zu einer VG zusammengefasst werden. In diesem Beispiel gibt es zwar vorerst nur ein einziges PV, der Schritt ist aber dennoch erforderlich. An das Kommando vgcreate muss auch der gewünschte Name der VG übergeben werden. In diesem Beispiel bekommt die VG den Namen myvg1:

root# vgcreate myvg1 /dev/sdc1 Volume group "myvg1" successfully created

myvg1 stellt jetzt eine Art Datenpool dar, der aber noch ungenutzt ist. Zur Nutzung müssen Sie innerhalb von myvg1 ein LV einrichten, also eine Art virtueller Partition. Dazu müssen Sie an das Kommando lvcreate drei Informationen übergeben: die gewünschte Größe des LVs, den Namen des neuen LVs und den Namen der existierenden VG:

root# lvcreate -L 2G -n myvol1 myvg1 Logical volume "myvol1" created

Durch das Kommando wird gleichzeitig auch die Datei /dev/myvg1/myvol1 erzeugt. Dabei handelt es sich um einen Link auf die Datei /dev/mapper/myvg1-myvol1. Das LV kann jetzt unter einem dieser beiden Device-Namen wie eine gewöhnliche Festplattenpartition verwendet werden.

Um in einem Logical Volume ein Dateisystem einzurichten, verwenden Sie beispielsweise mkfs.ext4 oder mkfs.xfs:

root# mkfs.ext4 /dev/myvg1/myvol1

Mit mount können Sie sich davon überzeugen, dass alles geklappt hat:

root# mkdir /test root# mount /dev/myvg1/myvol1 /test

Ein Grund dafür, LVM überhaupt zu verwenden, besteht darin, ein Dateisystem nachträglich vergrößern zu können, ohne die Festplatte neu partitionieren zu müssen. Im folgenden Beispiel wird das vorhin eingerichtete Dateisystem (/dev/myvg1/myvol1 via /test) von ursprünglich 2 GByte auf 3 GByte vergrößert. df zeigt die Kapazität von /test vor der Änderung:

root# df -h -T /test Dateisystem Typ Größe Benut Verf Ben% Eingehängt auf /dev/mapper/myvg1-myvol1 ext4 2,0G 760M 1,2G 40% /test

Dazu muss zuerst das Logical Volume vergrößert werden. Zu diesem Zweck müssen Sie den Device-Namen und die neue Größe an lvextend übergeben. Anschließend wird auch das ext4-Dateisystem entsprechend vergrößert.

root# lvextend -L 3G /dev/myvg1/myvol1 Extending logical volume myvol1 to 3,00 GB Logical volume myvol1 successfully resized root# resize2fs /dev/myvg1/myvol1

df beweist, dass alles funktioniert hat:

root# df -h -T /test Dateisystem Typ Größe Benut Verf Ben% Eingehängt auf /dev/mapper/myvg1-myvol1 ext4 3,0G 760M 2,1G 27% /test

Grundsätzlich ist auch eine Verkleinerung möglich. Allerdings müssen Sie dazu das betroffene Dateisystem zuerst aus dem Verzeichnisbaum lösen, mit fsck.ext4 überprüfen und schließlich mit resize2fs verkleinern. Erst jetzt dürfen Sie mit lvreduce das zugrunde liegende LV verkleinern.

Solange im Speicherpool (in der Volume Group) noch Platz ist, können Logical Volumes leicht vergrößert werden. Aber was tun Sie, wenn auch die VG voll ist? In diesem Fall legen Sie auf einer beliebigen Festplatte Ihres Rechners eine neue Partition an, richten diese Partition als Physical Volume ein und fügen sie mit vgextend zur Volume Group hinzu.

Die beiden folgenden Kommandos demonstrieren dies für die Partition /dev/sdc2. myvg1 bekommt damit eine Gesamtkapazität von rund 19 GByte, wovon 16 GByte frei sind:

root# pvcreate /dev/sdc2 Physical volume "/dev/sdc2" successfully created root# vgextend myvg1 /dev/sdc2 Volume group "myvg1" successfully extended root# vgdisplay myvg1 ... VG Size 18,64 GB Alloc PE / Size 640 / 2,50 GB Free PE / Size 4132 / 16,14 GB ...

Mit LVM können Sie Snapshots anlegen. Ein Snapshot ist ein unveränderliches Abbild des Dateisystems zu einem bestimmten Zeitpunkt. Der Snapshot kann wie ein eigenes Dateisystem in den Verzeichnisbaum integriert werden. Wenn sich das zugrunde liegende Dateisystem ändert, werden die originalen Daten für den Snapshot archiviert. Sie müssen bereits beim Anlegen des Snapshots angeben, wie viel Speicherplatz LVM für diesen Zweck reservieren soll. Ist dieser Speicherplatz erschöpft, wird der Snapshot ungültig und kann nicht mehr verwendet werden.

LVM-Snaphots bieten wesentlich weniger Funktionen als btrfs-Snapshots. LVM-Snapshots werden in der Regel für Backups verwendet. Sie stellen sicher, dass sich die Dateien während des Backups nicht ändern, das Backup also konsistent ist.

Die folgenden Kommandos zeigen, wie Sie zuerst einen Snapshot des LV myvol1 erstellen, diesen im Verzeichnis /media/backup in den Verzeichnisbaum einbinden, ein Backup davon erstellen, den Snapshot wieder aus dem Verzeichnisbaum lösen und schließlich löschen. Während das Backup läuft, kann das LV myvol1 uneingeschränkt weiterbenutzt werden (z.B. als Speicherplatz für einen Datenbank-Server). Die während des Backups durchgeführten Änderungen dürfen allerdings 100 MByte nicht überschreiten. Während des Backups können Sie mit lvdisplay /dev/vg1/snap ermitteln, wie viel Prozent dieses Speicherplatzes bereits in Verwendung sind.

Beachten Sie, dass Sie den Device-Namen des zugrunde liegenden Logical Volumes in der Form /dev/vgname/lvname angeben müssen, nicht in der Form /dev/mapper/vgname-lvname!

root# lvcreate -s -L 100M snap /dev/myvg1/myvol1 Logical volume snap created root# mkdir /media/backup root# mount /dev/vg1/snap /media/backup root# backup-script /media/backup (Backup erstellen) root# umount /media/backup root# lvremove /dev/vg1/snap