Grundlagen

LVM unter Linux: physische Volumes, Volume-Gruppen und logische Volumes in der Praxis

Aktualisiert: · Skillaria.Top

LVM (Logical Volume Manager) ist unter Linux eine Schicht zwischen Festplatten und Dateisystemen: Platten werden zu physischen Volumes (PV), zu einer Volume-Gruppe (VG) zusammengefasst, aus der sich logische Volumes (LV) beliebiger Größe schneiden lassen. Der wichtigste Vorteil: Ein Volume lässt sich im laufenden Betrieb mit lvextend -r vergrößern, eine neue Platte ohne Dienstunterbrechung in die Gruppe aufnehmen und vor einer riskanten Operation ein Snapshot anlegen.

LVM (Logical Volume Manager) ist der Logical Volume Manager unter Linux. Er trennt Dateisysteme von den physischen Festplatten. Statt /var fest an die Partition /dev/sdb1 zu binden, legen Sie Festplatten in einen gemeinsamen Pool und schneiden daraus Volumes in der gewünschten Größe. Wird der Platz knapp, wächst das Volume mit einem einzigen Befehl, ohne Neustart und ohne Dienstunterbrechung. Im Folgenden zeigen wir, wie LVM unter Linux aufgebaut ist, wie Sie Volumes von Grund auf anlegen, vergrößern und Snapshots erstellen und welche Fehler Sie dabei vermeiden sollten.

Wozu LVM, wenn es normale Partitionen gibt

Eine normale Partition ist ein zusammenhängender Bereich einer einzelnen Festplatte. Ihre Größe legen Sie beim Partitionieren fest, und vergrößern lässt sie sich nur, wenn direkt dahinter freier Platz liegt. Ist die Platte voll, müssen Sie eine neue kaufen, die Daten umziehen, die /etc/fstab umschreiben und den Dienst dafür anhalten.

LVM löst drei Aufgaben:

  • Flexible Größe. Ein logisches Volume können Sie jederzeit vergrößern (bei ext4 auch verkleinern).
  • Zusammenfassen von Platten. Mehrere physische Platten werden zu einem Pool; ein einzelnes Volume kann gleichzeitig auf zwei Platten liegen.
  • Snapshots. Ein augenblickliches Abbild eines Volumes vor einem Update, einer Datenbankmigration oder einer anderen riskanten Operation.

Deshalb schlagen die Installer von Ubuntu Server, RHEL, Rocky und AlmaLinux LVM standardmäßig vor, und auf Datenservern wird es fast immer eingesetzt.

Drei Ebenen von LVM: PV, VG und LV

Die gesamte Logik von LVM passt in drei Begriffe. Eine anschauliche Analogie: Die Festplatten sind Säcke Mehl, die Volume-Gruppe ist das gemeinsame Lager, die logischen Volumes sind die Portionen, die Sie aus dem Lager abwiegen.

EbeneWas es istBeispielnameWird erstellt mit
PV (Physical Volume)Festplatte oder Partition, die für LVM vorbereitet ist/dev/sdb, /dev/sdc1pvcreate
VG (Volume Group)Pool aus einem oder mehreren PVsdata_vgvgcreate
LV (Logical Volume)Volume, aus der VG geschnitten; darauf legen Sie das Dateisystem an/dev/data_vg/applvcreate

Innerhalb einer VG wird der Platz in Extents (PE, physical extents) aufgeteilt, also in Blöcke fester Größe, standardmäßig 4 MiB. Ein logisches Volume ist einfach eine Menge von Extents, die nicht zusammenhängen müssen und auf verschiedenen Platten liegen können. Deshalb lässt sich ein Volume so leicht vergrößern: LVM hängt ihm freie Extents einfach von irgendwo an.

Das Gerät eines logischen Volumes ist unter zwei gleichwertigen Pfaden erreichbar: /dev/data_vg/app und /dev/mapper/data_vg-app. Darunter steckt ein Device-Mapper-Gerät des Kernels.

Was bereits vorhanden ist

Stellen Sie zuerst sicher, dass das Paket installiert ist: Unter Debian und Ubuntu heißt es lvm2 (sudo apt install lvm2), in der RHEL-Familie ist es standardmäßig dabei. Für eine Übersicht gibt es kurze und ausführliche Befehle:

$ sudo pvs
  PV         VG      Fmt  Attr PSize   PFree
  /dev/sdb   data_vg lvm2 a--  <20.00g      0
  /dev/sdc   data_vg lvm2 a--  <20.00g  <10.00g

$ sudo vgs
  VG      #PV #LV #SN Attr   VSize  VFree
  data_vg   2   1   0 wz--n- 39.99g <10.00g

$ sudo lvs
  LV   VG      Attr       LSize  Pool Origin Data%  Meta%
  app  data_vg -wi-ao---- 30.00g

Ausführliche Angaben liefern pvdisplay, vgdisplay und lvdisplay. Ein Gesamtbild zusammen mit normalen Partitionen gibt lsblk: Logische Volumes erscheinen dort mit dem Typ lvm.

$ lsblk /dev/sdb /dev/sdc
NAME             MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb                8:16   0  20G  0 disk
└─data_vg-app    253:0    0  30G  0 lvm  /srv/app
sdc                8:32   0  20G  0 disk
└─data_vg-app    253:0    0  30G  0 lvm  /srv/app

Das Volume app mit 30 GB liegt hier gleichzeitig auf zwei Platten mit je 20 GB. Eine normale Partition kann das nicht.

LVM von Grund auf: von der leeren Platte zum eingehängten Volume

Angenommen, dem Server wurde eine leere Platte /dev/sdb hinzugefügt, und für die Daten der Anwendung brauchen Sie ein Volume mit 15 GB. Prüfen Sie den Gerätenamen zweimal mit lsblk: Alle folgenden Befehle löschen die Daten auf dem angegebenen Gerät.

Schritt 1: Physisches Volume anlegen

$ sudo pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.

Sie können LVM die ganze Platte geben oder zuerst mit fdisk oder parted eine Partition vom Typ „Linux LVM“ anlegen und diese angeben (/dev/sdb1). Eine Partition ist für andere Administratoren übersichtlicher und schützt davor, dass jemand die Platte versehentlich unter LVM neu partitioniert. Eine ganze Platte lässt sich in der Cloud dagegen einfacher vergrößern.

Schritt 2: Volume-Gruppe anlegen

$ sudo vgcreate data_vg /dev/sdb
  Volume group "data_vg" successfully created

Schritt 3: Logisches Volume schneiden

$ sudo lvcreate -n app -L 15G data_vg
  Logical volume "app" created.

Die Option -L legt eine absolute Größe fest, -l eine Größe in Extents oder Prozent: -l 100%FREE belegt den gesamten freien Platz der Gruppe, -l 50%VG die Hälfte. Es ist eine gute Praxis, in der VG einen freien Rest zu lassen: Diesen können Sie später jedem Volume zuweisen oder für einen Snapshot verwenden.

Schritt 4: Dateisystem und Einhängen

$ sudo mkfs.ext4 /dev/data_vg/app
$ sudo mkdir -p /srv/app
$ sudo mount /dev/data_vg/app /srv/app
$ df -h /srv/app
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/data_vg-app   15G   24K   14G   1% /srv/app

Damit das Volume nach einem Neustart eingehängt wird, ergänzen Sie eine Zeile in /etc/fstab. Bei logischen Volumes ist der Pfad /dev/mapper/... stabil, Sie können also ihn oder die UUID aus blkid verwenden:

/dev/mapper/data_vg-app  /srv/app  ext4  defaults  0 2

Prüfen Sie den Eintrag mit sudo mount -a, bevor Sie neu starten: Ein Fehler in der fstab kann den Server in den Notfallmodus schicken.

Ein LVM-Volume vergrößern, ohne den Dienst anzuhalten

Das ist der Hauptgrund, LVM zu schätzen. Das Volume wächst bei eingehängtem Dateisystem, und die Anwendung schreibt weiter. Das Vorgehen hängt davon ab, ob in der Gruppe noch Platz frei ist.

Wenn die VG freien Platz hat

$ sudo vgs data_vg
  VG      #PV #LV #SN Attr   VSize   VFree
  data_vg   1   1   0 wz--n- <20.00g <5.00g

$ sudo lvextend -r -L +4G /dev/data_vg/app
  Size of logical volume data_vg/app changed from 15.00 GiB to 19.00 GiB.
  Logical volume data_vg/app successfully resized.
resize2fs 1.47.0
Filesystem at /dev/mapper/data_vg-app is mounted on /srv/app; on-line resizing required

Der entscheidende Schalter ist -r (--resizefs): Er vergrößert nach dem Volume direkt auch das Dateisystem. Ohne ihn wird das Volume größer, aber df -h zeigt weiterhin die alte Größe, weil das Dateisystem den neuen Platz nicht kennt. Das ist der häufigste Fehler. In diesem Fall genügt es, resize2fs für ext4 oder xfs_growfs für XFS manuell auszuführen:

$ sudo resize2fs /dev/data_vg/app      # ext4, wird mit dem Gerät angegeben
$ sudo xfs_growfs /srv/app             # XFS, wird mit dem Einhängepunkt angegeben

Beachten Sie den Unterschied: -L +4G fügt 4 GB hinzu, -L 4G setzt die Endgröße auf 4 GB. Um dem Volume den gesamten verbleibenden Platz zu geben, verwenden Sie -l +100%FREE.

Wenn der Platz in der VG aufgebraucht ist: Platte hinzufügen

Schließen Sie die neue Platte an (in der Cloud das Volume anhängen), finden Sie sie mit lsblk und nehmen Sie sie in die Gruppe auf:

$ sudo pvcreate /dev/sdc
$ sudo vgextend data_vg /dev/sdc
  Volume group "data_vg" successfully extended
$ sudo lvextend -r -l +100%FREE /dev/data_vg/app

Drei Befehle und keine Ausfallzeit. Das Dateisystem liegt jetzt auf zwei Platten, und die Anwendung bemerkt davon nichts.

Wenn die Platte in der Cloud vergrößert wurde

In der Cloud ist es oft einfacher, die vorhandene Platte zu vergrößern, statt eine neue hinzuzufügen. Der Kernel sieht dann die neue Größe des Geräts, und das physische Volume muss mit pvresize gedehnt werden:

$ sudo pvresize /dev/sdb
  Physical volume "/dev/sdb" changed
$ sudo lvextend -r -l +100%FREE /dev/data_vg/app

Ist das PV auf einer Partition (/dev/sdb1) angelegt, vergrößern Sie zuerst die Partition, zum Beispiel mit growpart /dev/sdb 1 aus dem Paket cloud-guest-utils, und erst danach pvresize /dev/sdb1.

Kann man ein LVM-Volume verkleinern?

Ja, aber nicht bei jedem Dateisystem und nicht im laufenden Betrieb. XFS lässt sich überhaupt nicht verkleinern, hier bleibt nur das Neuanlegen mit Umzug der Daten. ext4 lässt sich verkleinern, aber nur im ausgehängten Zustand:

$ sudo umount /srv/app
$ sudo lvreduce -r -L 10G /dev/data_vg/app

Mit -r prüft LVM das Dateisystem selbst (e2fsck) und verkleinert es vor dem Volume. Ohne -r schneiden Sie leicht ein Volume ab, das kleiner ist als das Dateisystem darauf, und zerstören die Daten. Machen Sie vor dem Verkleinern immer eine Sicherungskopie.

LVM-Snapshots: ein Abbild des Volumes vor einer riskanten Operation

Ein Snapshot ist ein augenblickliches Abbild eines logischen Volumes. Er entsteht in Sekundenbruchteilen und kopiert keine Daten: LVM arbeitet nach dem Prinzip Copy-on-Write und sichert in den Snapshot nur die Blöcke, die sich am Quellvolume nach seiner Erstellung ändern. Der Snapshot braucht in der VG daher nur Platz für die Änderungen, nicht für das gesamte Volume.

$ sudo lvcreate -s -n app_before_upgrade -L 2G /dev/data_vg/app
  Logical volume "app_before_upgrade" created.

$ sudo lvs data_vg
  LV                 VG      Attr       LSize  Origin Data%
  app                data_vg owi-aos--- 19.00g
  app_before_upgrade data_vg swi-a-s---  2.00g app    0.01

Die Spalte Data% zeigt, wie voll der Speicher für die Änderungen ist. Erreicht er 100 %, wird der klassische Snapshot ungültig und bleibt nur noch zum Löschen. Wählen Sie die Größe mit Reserve für den erwarteten Umfang der Änderungen, und beobachten Sie lange bestehende Snapshots mit lvs oder vergrößern Sie sie mit lvextend.

Zurückrollen auf den Snapshot

Ist ein Update schiefgelaufen, bringen Sie das Volume in den Zustand zurück, den der Snapshot festgehalten hat:

$ sudo umount /srv/app
$ sudo lvconvert --merge /dev/data_vg/app_before_upgrade
  Merging of volume data_vg/app_before_upgrade started.
$ sudo mount /srv/app

Nach dem Zusammenführen verschwindet der Snapshot. Lässt sich das Volume nicht aushängen (etwa wenn es das Wurzelsystem ist), wird das Zusammenführen bis zur nächsten Aktivierung des Volumes verschoben, also bis zum Neustart.

Wenn alles gut gelaufen ist

Dann löschen Sie den Snapshot einfach, damit er weder die Schreibvorgänge bremst noch Platz belegt:

$ sudo lvremove /dev/data_vg/app_before_upgrade

Ein Snapshot eignet sich auch gut, um eine konsistente Sicherung eines laufenden Systems zu ziehen. Hängen Sie ihn nur lesend ein (mount -o ro) und kopieren Sie mit rsync oder tar. Bei XFS ergänzen Sie die Option nouuid, sonst verweigert das Einhängen den Dienst, weil die UUID mit dem Original übereinstimmt.

LVM und RAID: verwechseln Sie die Aufgaben nicht

LVM schützt allein nicht vor einem Plattenausfall. Ist ein Volume auf zwei Platten verteilt und eine davon fällt aus, geht das ganze Volume verloren, nicht nur die Hälfte. Für Ausfallsicherheit legt man unter LVM ein RAID (mdadm) an oder nutzt den in LVM eingebauten Spiegelmodus (lvcreate --type raid1 -m 1).

Weder RAID noch Snapshots ersetzen eine Sicherungskopie. Der Snapshot liegt auf denselben Platten wie das Original, und RAID spiegelt auch ein versehentliches rm -rf brav mit. Sie brauchen eine separate Kopie auf einem anderen Datenträger.

Spickzettel der LVM-Befehle

AufgabeBefehl
Übersicht über PV, VG, LVpvs, vgs, lvs
Physisches Volume anlegenpvcreate /dev/sdb
Gruppe anlegenvgcreate data_vg /dev/sdb
Platte zur Gruppe hinzufügenvgextend data_vg /dev/sdc
Volume anlegenlvcreate -n app -L 15G data_vg
Volume und Dateisystem vergrößernlvextend -r -L +5G /dev/data_vg/app
PV nach Vergrößerung der Platte dehnenpvresize /dev/sdb
Snapshotlvcreate -s -n snap -L 2G /dev/data_vg/app
Zurückrollen auf Snapshotlvconvert --merge /dev/data_vg/snap
Platte aus der Gruppe entfernenpvmove /dev/sdb, danach vgreduce data_vg /dev/sdb
Volume löschenlvremove /dev/data_vg/app

Typische Fehler

  • Volume vergrößert, aber df zeigt die alte Größe. Sie haben -r vergessen. Führen Sie resize2fs oder xfs_growfs aus.
  • Insufficient free space. In der Gruppe sind keine freien Extents mehr: Prüfen Sie vgs und nehmen Sie eine Platte per vgextend auf oder dehnen Sie das PV.
  • Device /dev/sdc excluded by a filter. Auf der Platte ist noch eine alte Partitionstabelle oder Dateisystem-Signatur. Wenn die Daten dort sicher entbehrlich sind, entfernen Sie die Signatur mit wipefs -a /dev/sdc.
  • Snapshot ist Invalid. Der Speicher für die Änderungen ist zu 100 % voll gelaufen. Wiederherstellen lässt sich der Snapshot nicht, nur löschen. Planen Sie beim nächsten Mal mehr Platz ein.

Fazit

LVM unter Linux besteht aus drei Schichten: Physische Volumes (PV) werden zu einer Volume-Gruppe (VG) zusammengefasst, aus der logische Volumes (LV) geschnitten werden. Daraus ergibt sich, was normale Partitionen nicht bieten: Vergrößern im laufenden Betrieb mit lvextend -r, Hinzufügen von Platten ohne Ausfallzeit und Snapshots vor riskanten Änderungen. LVM ersetzt aber weder RAID noch Sicherungskopien. Plattenaufteilung, LVM, RAID und Kontingente behandeln wir im Linux-Kurs in der Praxis.

Häufige Fragen

Kann ich eine bereits genutzte Partition mit Daten auf LVM umstellen?

Direkt nicht: pvcreate überschreibt den Anfang des Geräts. Sie legen LVM auf einer anderen Platte an, kopieren die Daten mit rsync, passen die fstab an und geben erst danach die alte Partition frei.

Bremst LVM die Festplatte aus?

Ohne Snapshots ist der Mehraufwand des Device Mappers praktisch nicht spürbar. Aktive klassische Snapshots verlangsamen Schreibvorgänge auf dem Originalvolume wegen Copy-on-Write, deshalb sollten Sie sie nicht wochenlang behalten.

Brauche ich LVM auf einem Heim-PC oder Notebook?

Nicht zwingend, aber nützlich bei verschlüsselten Platten (LUKS mit LVM darin) und wenn Sie Partitionsgrößen ändern möchten, ohne neu zu partitionieren. Auf Datenservern ist LVM praktisch Standard.

Was ist Thin Provisioning in LVM?

Dünne Volumes: Sie legen einen Pool an (lvcreate --type thin-pool), und die Volumes darin belegen echten Platz erst beim Schreiben. So können Sie Volumes mehr versprechen, als physisch vorhanden ist, aber die Auslastung des Pools muss überwacht werden.

Wie entferne ich eine Platte aus der Volume-Gruppe, ohne Daten zu verlieren?

Verschieben Sie die Extents mit pvmove /dev/sdb auf die anderen Platten der Gruppe (dafür muss genug freier Platz vorhanden sein), entfernen Sie die Platte mit vgreduce data_vg /dev/sdb und geben Sie sie mit pvremove /dev/sdb frei.

Das Thema im Video lernen

Dieses Thema wird im Kurs „Linux: с нуля до уверенного администрирования“ ausführlich mit Praxis behandelt.

Zum Kurs