Arbeiten mit LVM
LVM (Logical Volume Manager) ist ein Festplattenverwaltungssystem, das eine Abstraktionsschicht über dem physischen Speicher bereitstellt. Es ermöglicht eine flexible Zuweisung von Speicherplatz, die Größenänderung im laufenden Betrieb und snapshot-basierte Backups und wird häufig als Speicherschicht für die Virtualisierung eingesetzt. Auf verschlüsselten Systemen wird LVM häufig auf einem mit LUKS verschlüsselten Gerät eingerichtet, sodass durch eine einzige Entsperrung die gesamte Volume Group verfügbar wird.
Dieser Artikel behandelt die Installation von LVM unter Linux, die Erstellung von Physical Volumes, Volume Groups und Logical Volumes, deren Größenänderung, die Arbeit mit Snapshots sowie die Verwendung von Thin Provisioning.
LVM installieren
LVM ist standardmäßig in den meisten Linux-Distributionen enthalten. Falls es fehlt, installieren Sie das Paket lvm2 mit dem Paketmanager des Systems.
Unter Debian und Ubuntu:
sudo apt-get install lvm2
Unter RHEL, CentOS Stream, AlmaLinux und Rocky Linux:
sudo dnf install lvm2
Physical Volume erstellen
Ein Physical Volume (PV) ist der grundlegende Baustein von LVM auf der untersten Ebene. Es kann sich um eine vollständige Festplatte (zum Beispiel /dev/sdb) oder um eine einzelne Partition (zum Beispiel /dev/sdb1) handeln.
Die Verwendung einer vollständigen Festplatte als PV vereinfacht spätere Größenänderungen, da zunächst keine zugrunde liegende Partition vergrößert werden muss. Die Verwendung einer Partition ist vorzuziehen, wenn die Festplatte auch Daten außerhalb von LVM aufnehmen muss oder wenn andere Werkzeuge auf dem System eine Partitionstabelle erwarten.
Erstellen Sie ein Physical Volume mit pvcreate:
sudo pvcreate /dev/sdb
Ersetzen Sie /dev/sdb durch den Pfad zu Ihrem Blockgerät.
Überprüfen Sie das Ergebnis mit pvdisplay:
sudo pvdisplay
Die Ausgabe listet die Physical Volumes auf, die LVM derzeit verwaltet, einschließlich ihrer Größe und Informationen zur jeweiligen Volume Group.
Volume Group erstellen
Eine Volume Group (VG) kombiniert ein oder mehrere Physical Volumes zu einem gemeinsamen Speicherpool. Aus diesem Pool werden Logical Volumes erstellt.
Erstellen Sie eine Volume Group mit dem Namen vg0 aus einem einzelnen Physical Volume:
sudo vgcreate vg0 /dev/sdb
Oder aus mehreren Physical Volumes gleichzeitig:
sudo vgcreate vg0 /dev/sdb /dev/sdc
Überprüfen Sie das Ergebnis mit vgdisplay:
sudo vgdisplay
Logical Volume erstellen
Ein Logical Volume (LV) erscheint im System als normales Blockgerät. Sie können darauf ein Dateisystem erstellen und es einhängen.
Erstellen Sie ein Logical Volume lv0 mit einer Größe von 10 GB innerhalb der Volume Group vg0:
sudo lvcreate -n lv0 -L 10G vg0
Das Flag -n legt den Namen des Logical Volumes fest, während -L seine Größe festlegt.
Überprüfen Sie das Ergebnis mit lvdisplay:
sudo lvdisplay
Erstellen Sie ein Dateisystem auf dem Logical Volume:
sudo mkfs.ext4 /dev/vg0/lv0
Erstellen Sie einen Mount-Punkt und hängen Sie das Dateisystem ein:
sudo mkdir -p /mnt/lv0 sudo mount /dev/vg0/lv0 /mnt/lv0
Das neue Dateisystem ist nun unter /mnt/lv0 verfügbar. Um es beim Systemstart automatisch einzuhängen, fügen Sie einen passenden Eintrag in /etc/fstab hinzu.
LVM stellt jedes Logical Volume über zwei gleichwertige Pfade bereit: /dev/<vg>/<lv> und /dev/mapper/<vg>-<lv>. Im obigen Beispiel sind dies /dev/vg0/lv0 und /dev/mapper/vg0-lv0. Beide Pfade verweisen auf dasselbe Gerät; Werkzeuge und Konfigurationsdateien können einen der beiden Pfade verwenden.
Um die vollständige PV/VG/LV-Hierarchie zusammen mit den normalen Blockgeräten anzuzeigen, führen Sie Folgendes aus:
lsblk
Größe von Volumes ändern
LVM unterstützt die Größenänderung im laufenden Betrieb auf jeder Ebene: Physical Volumes, Volume Groups und Logical Volumes.
pvresize aktualisiert die LVM-Ansicht eines Physical Volumes, nachdem die Größe des zugrunde liegenden Blockgeräts geändert wurde (zum Beispiel nachdem eine virtuelle Festplatte im Hypervisor vergrößert wurde):
sudo pvresize /dev/sdb
vgextend fügt einer vorhandenen Volume Group ein Physical Volume hinzu und vergrößert dadurch die Volume Group:
sudo vgextend vg0 /dev/sdc
vgreduce entfernt ein Physical Volume aus einer Volume Group:
sudo vgreduce vg0 /dev/sdc
lvresize ändert die Größe eines Logical Volumes. Um beispielsweise 5 GB zu lv0 hinzuzufügen:
sudo lvresize -L +5G /dev/vg0/lv0
Oder um das Logical Volume auf den gesamten freien Speicherplatz in der Volume Group zu erweitern:
sudo lvresize -l +100%FREE /dev/vg0/lv0
Beachten Sie den Unterschied zwischen -L (Großbuchstabe) und -l (Kleinbuchstabe). Die Großbuchstaben-Variante erwartet eine Größe mit einem Einheitensuffix wie M, G oder T. Die Kleinbuchstaben-Variante erwartet eine Anzahl von Extents oder einen Prozentsatz.
Das Ändern der Größe eines Logical Volumes ändert nicht automatisch die Größe des darauf befindlichen Dateisystems. Verwenden Sie das passende Werkzeug für das jeweilige Dateisystem. Für ext2, ext3 und ext4:
sudo resize2fs /dev/vg0/lv0
Für XFS führen Sie xfs_growfs für den Mount-Punkt des Dateisystems aus.
Bei unterstützten Dateisystemen, einschließlich ext4 und XFS, ändert lvextend mit dem Flag -r die Größe des Logical Volumes und des Dateisystems in einem einzigen Schritt:
sudo lvextend -r -L +5G /dev/vg0/lv0
Dies ist die gebräuchlichste Methode zur Online-Vergrößerung.
Das Verkleinern eines Logical Volumes erfolgt in umgekehrter Reihenfolge: Zuerst muss das Dateisystem verkleinert werden und erst danach das Logical Volume. Wird die Reihenfolge umgekehrt, wird das zugrunde liegende Gerät verkürzt, während das Dateisystem weiterhin davon ausgeht, dass es seine ursprüngliche Größe besitzt. Dadurch werden Daten zerstört. Bei ext4 muss dieser Vorgang offline durchgeführt werden. Hängen Sie das Dateisystem aus, führen Sie sudo e2fsck -f /dev/vg0/lv0 aus, verkleinern Sie das Dateisystem mit sudo resize2fs /dev/vg0/lv0 <new_size>, verkleinern Sie das Logical Volume mit sudo lvresize -L <new_size> /dev/vg0/lv0 auf dieselbe Größe und hängen Sie das Dateisystem anschließend wieder ein. XFS unterstützt das Verkleinern überhaupt nicht. Die einzige Möglichkeit, ein XFS-Dateisystem zu verkleinern, besteht darin, es zu sichern, ein kleineres Dateisystem zu erstellen und die Daten wiederherzustellen.
Jeder der oben aufgeführten Befehle unterstützt --help für eine vollständige Liste der Optionen.
LVM-Snapshots
Ein Snapshot erfasst den Zustand eines Logical Volumes zu einem bestimmten Zeitpunkt. Er arbeitet nach dem Copy-on-Write-Prinzip: Wenn sich das ursprüngliche Logical Volume ändert, werden die geänderten Blöcke im reservierten Speicher des Snapshots gespeichert, sodass der Snapshot weiterhin den ursprünglichen Zustand anzeigt.
Snapshots sind nützlich, um konsistente Absturzsicherungen eines laufenden Dateisystems zu erstellen und Änderungen zu testen, die durch das Verwerfen des Snapshots zurückgesetzt werden können. Anwendungskonsistente Backups erfordern zusätzliche Koordination, beispielsweise das Einfrieren des Dateisystems oder das Anhalten der Anwendung in einem konsistenten Zustand, bevor der Snapshot erstellt wird.
Snapshot erstellen
Erstellen Sie einen Snapshot mit lvcreate und dem Flag -s:
sudo lvcreate -L 1G -s -n myvolume_snap /dev/myvg/myvolume
Dadurch wird ein Snapshot mit dem Namen myvolume_snap des Logical Volumes myvolume in der Volume Group myvg erstellt, wobei 1 GB für Änderungen reserviert werden. Wählen Sie die reservierte Größe entsprechend der Datenmenge, die sich während der Lebensdauer des Snapshots voraussichtlich ändern wird: Snapshots weitgehend inaktiver Volumes benötigen wenig Speicherplatz, während stark beschriebene Volumes einen erheblichen Teil der ursprünglichen Größe benötigen können.
Für langlebige Snapshots und Einsatzszenarien mit vielen Snapshots sollten Sie Thin Snapshots innerhalb eines Thin Pools in Betracht ziehen. Diese beziehen ihren Speicher bei Bedarf aus dem gemeinsamen Pool, anstatt im Voraus eine feste Menge zu reservieren, was in der Regel effizienter mit dem Speicherplatz umgeht.
Wenn sich das ursprüngliche Logical Volume stärker verändert, als der Snapshot aufnehmen kann, wird der Snapshot ungültig und die darin erfassten Daten gehen verloren. Dimensionieren Sie den Snapshot so, dass er die erwartete Änderungsmenge während seiner Lebensdauer aufnehmen kann.
Snapshot verwenden
Ein Snapshot kann wie jedes andere Logical Volume eingehängt werden. Für Backup- und Prüfzwecke sollten Sie ihn schreibgeschützt einhängen, sofern Schreibzugriff nicht tatsächlich erforderlich ist:
sudo mkdir -p /mnt/snapshot sudo mount -o ro /dev/myvg/myvolume_snap /mnt/snapshot
Nach dem Einhängen kann der Snapshot für Backups oder Prüfungen gelesen werden.
Snapshot entfernen
Wenn der Snapshot nicht mehr benötigt wird, entfernen Sie ihn mit lvremove:
sudo lvremove /dev/myvg/myvolume_snap
Durch das Entfernen eines Snapshots wird der von ihm reservierte Speicherplatz freigegeben. Alle Daten, die direkt in den Snapshot und nicht in das ursprüngliche Volume geschrieben wurden, gehen verloren.
Um das ursprüngliche Volume auf den im Snapshot erfassten Zustand zurückzusetzen, verwenden Sie lvconvert --merge anstelle von lvremove:
sudo lvconvert --merge /dev/myvg/myvolume_snap
Nach dem Zusammenführen wird der Snapshot aufgebraucht und automatisch entfernt. Wenn das ursprüngliche Volume derzeit verwendet wird, wird das Zusammenführen bis zur nächsten Aktivierung des Volumes zurückgestellt.
Thin Provisioning
Ein Thin Pool ist eine spezielle Art von Logical Volume, das Speicherplatz bei Bedarf zuweist. Logical Volumes, die daraus erstellt werden (Thin Volumes), können mit einer deklarierten Größe angelegt werden, die den tatsächlich freien Speicherplatz im Pool übersteigt. Nur die tatsächlich geschriebenen Blöcke verbrauchen realen Speicherplatz.
Dies wird häufig in der Virtualisierung eingesetzt, bei der viele virtuelle Festplatten einen gemeinsamen Speicherpool verwenden, aber nur selten alle gleichzeitig ihre angegebene Kapazität erreichen.
Thin Pool erstellen
Erstellen Sie einen Thin Pool mythinpool mit einer Größe von 50 GB in der Volume Group myvg:
sudo lvcreate -L 50G -T -n mythinpool myvg
Das Flag -L legt die Größe des Pools fest, -T weist lvcreate an, einen Thin Pool zu erstellen, und -n legt den Pool-Namen fest. LVM weist dem Pool Speicherplatz aus dem freien Speicher der Volume Group zu; bestimmte Physical Volumes können am Ende des Befehls angegeben werden, wenn der Pool auf bestimmten Geräten platziert werden soll.
Thin Volume erstellen
Erstellen Sie ein Thin Volume mythinvolume mit einer Größe von 10 GB innerhalb von mythinpool:
sudo lvcreate -V 10G -T myvg/mythinpool -n mythinvolume
Das Flag -V legt die virtuelle Größe des Thin Volumes fest, -T verweist auf den Thin Pool und -n legt den Namen des neuen Volumes fest.
Thin Volume verwenden
Ein Thin Volume wird wie jedes andere Logical Volume verwendet. Erstellen Sie darauf ein Dateisystem:
sudo mkfs.ext4 /dev/myvg/mythinvolume
Danach kann das Thin Volume eingehängt und wie ein normales Blockgerät verwendet werden.
Da Thin Pools überbucht werden können, müssen Sie die tatsächliche Auslastung des Pools überwachen. Sowohl der Datenbereich als auch der Metadatenbereich können unabhängig voneinander vollständig belegt werden, und beide sind kritisch: Wenn einem Thin Pool während des Schreibens in ein Thin Volume entweder der Daten- oder der Metadatenspeicher ausgeht, beginnen Schreibvorgänge für dieses Volume fehlzuschlagen.
Die aktuelle Nutzung von Daten- und Metadatenspeicher aller Logical Volumes, einschließlich Thin Pools, kann mit lvs überprüft werden:
sudo lvs -o +data_percent,metadata_percent
Wenn sich data_percent oder metadata_percent dem Wert 100 nähert, erweitern Sie den Thin Pool mit lvextend, bevor er vollständig gefüllt ist.
Befehlsreferenz
Häufig verwendete LVM-Befehle, nach Ebenen gruppiert.
Physical Volumes:
- pvcreate initialisiert ein Blockgerät als Physical Volume.
- pvdisplay zeigt detaillierte Informationen zu Physical Volumes an.
- pvs zeigt eine kompakte Übersichtstabelle der Physical Volumes.
- pvresize aktualisiert ein Physical Volume, nachdem das zugrunde liegende Gerät vergrößert wurde.
Volume Groups:
- vgcreate erstellt eine Volume Group aus einem oder mehreren Physical Volumes.
- vgextend fügt einer Volume Group ein Physical Volume hinzu.
- vgreduce entfernt ein Physical Volume aus einer Volume Group.
- vgdisplay zeigt detaillierte Informationen zu Volume Groups an.
- vgs zeigt eine kompakte Übersichtstabelle der Volume Groups.
Logical Volumes:
- lvcreate erstellt ein Logical Volume.
- lvextend und lvresize ändern die Größe eines Logical Volumes.
- lvremove entfernt ein Logical Volume.
- lvconvert --merge führt einen Snapshot wieder mit seinem ursprünglichen Volume zusammen.
- lvdisplay zeigt detaillierte Informationen zu Logical Volumes an.
- lvs zeigt eine kompakte Übersichtstabelle der Logical Volumes.
Für die tägliche Verwendung sind die kurzen Übersichtsbefehle pvs, vgs und lvs in der Regel praktischer als die ausführlichen Varianten *display. Jeder Befehl unterstützt --help für eine vollständige Liste der Optionen.