TL;DR — Kurzzusammenfassung
Vollständige LVM-Anleitung für Linux: Logical Volumes erweitern, Disks hinzufügen, ext4/XFS online wachsen lassen, Thin Provisioning, Snapshots und Cloud-VMs.
LVM (Logical Volume Manager) ist die Standard-Speicher-Abstraktionsschicht unter Linux, die es ermöglicht, Speicherplatz ohne Ausfallzeit zu vergrößern, Snapshots zu erstellen und zu migrieren. Diese Anleitung behandelt den vollständigen LVM-Workflow: Architektur, Hinzufügen von Disks, Erweiterung von Logical Volumes, Wachsen und Verkleinern von Dateisystemen, Thin Provisioning, Snapshots, Disk-Erweiterung auf Cloud-VMs und die häufigsten Fehler in der Produktion.
Voraussetzungen
- Linux-System mit installiertem
lvm2-Paket (sudo apt install lvm2odersudo dnf install lvm2). - Root- oder Sudo-Zugriff.
- Mindestens eine bestehende LVM Volume Group oder eine zu initialisierende Disk.
- Grundkenntnisse der Linux-Disk-Partitionierung (
fdisk,lsblk,df).
LVM-Architektur
LVM führt drei Abstraktionsschichten zwischen physischen Disks und eingehängten Dateisystemen ein:
| Schicht | Befehlspräfix | Beschreibung |
|---|---|---|
| Physical Volume (PV) | pv* | Disk oder Partition, die für LVM initialisiert wurde |
| Volume Group (VG) | vg* | Speicherpool aus einem oder mehreren PVs |
| Logical Volume (LV) | lv* | Virtuelles Block-Gerät, das aus dem freien Speicher der VG entnommen wird |
Physical Extents (PE) sind die kleinste Zuteilungseinheit innerhalb einer VG (Standard 4 MiB). Jedes LV ist ein Bereich von PEs. Diese Abstraktion ermöglicht es LVs, mehrere Disks zu umfassen und jederzeit vergrößert zu werden.
Die Speicher-Stack sieht so aus:
/dev/sda1 /dev/sdb1 /dev/sdc ← physische Disks / Partitionen
└─── pvcreate ───────────┘
↓
Volume Group (vg_data) ← Pool von PEs
↓
lv_root lv_home lv_db ← Logical Volumes (Block-Geräte)
↓
ext4 ext4 xfs ← Dateisysteme auf den LVs
Aktuelles Layout anzeigen
lsblk — Block-Geräte-Baum
lsblk
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
# sda 8:0 0 50G 0 disk
# ├─sda1 8:1 0 1G 0 part /boot
# └─sda2 8:2 0 49G 0 part
# ├─vg_sys-lv_root 253:0 0 20G 0 lvm /
# └─vg_sys-lv_home 253:1 0 29G 0 lvm /home
pvdisplay, vgdisplay, lvdisplay
pvdisplay # Physical Volumes: Disk, Größe, genutzte/freie PEs
vgdisplay # Volume Groups: Gesamt / genutzte / freie PEs
lvdisplay # Logical Volumes: Pfad, Größe, Dateisystemtyp
Schnellbefehle:
pvs # kompakte PV-Zusammenfassung
vgs # kompakte VG-Zusammenfassung (VFree für verfügbaren Speicher)
lvs # kompakte LV-Zusammenfassung
df -h # Dateisystemnutzung (was das OS sieht)
Neue Disk zu LVM hinzufügen
Dies ist der häufigste Produktionsvorgang: eine VM erhält eine neue Disk und du möchtest diese Kapazität zu einer bestehenden VG hinzufügen.
Schritt 1 — Neue Disk partitionieren
fdisk /dev/sdb
# Innerhalb von fdisk:
# n → neue Partition
# p → primär
# 1 → Partitionsnummer
# [Enter] zweimal → gesamte Disk verwenden
# t → Typ ändern
# 8e → Linux LVM
# w → schreiben und beenden
Für GPT-Disks (>2 TB oder UEFI-Systeme) verwende gdisk oder parted. Setze den Partitionstyp auf Linux LVM.
Schritt 2 — Physical Volume initialisieren
pvcreate /dev/sdb1
# Physical volume "/dev/sdb1" successfully created.
Schritt 3 — Volume Group erweitern
vgextend vg_sys /dev/sdb1
# Volume group "vg_sys" successfully extended
vgs # bestätige, dass VFree gestiegen ist
Schritt 4 — Logical Volume erweitern
# Genau 20 GB hinzufügen
lvextend -L +20G /dev/vg_sys/lv_root
# Oder GESAMTEN freien Speicher der VG verwenden
lvextend -l +100%FREE /dev/vg_sys/lv_root
Schritt 5 — Dateisystem vergrößern
ext4 (online, kein Aushängen erforderlich):
resize2fs /dev/vg_sys/lv_root
XFS (online, Einhängepunkt verwenden):
xfs_growfs /
LV mit freiem Speicher in der VG erweitern
Wenn bereits freie PEs in der VG vorhanden sind (in vgs unter VFree sichtbar), überspringe die Disk-Hinzufüge-Schritte und gehe direkt zu lvextend:
vgs
# VG #PV #LV #SN Attr VSize VFree
# vg_data 2 3 0 wz--n- 200.00g 45.00g ← 45 GB frei
lvextend -L +30G /dev/vg_data/lv_db
resize2fs /dev/vg_data/lv_db # ext4
# oder
xfs_growfs /var/lib/mysql # XFS
Du kannst lvextend und resize2fs mit dem -r-Flag in einem einzigen Befehl kombinieren:
lvextend -L +30G -r /dev/vg_data/lv_db
Online- vs. Offline-Vergrößerung
| Dateisystem | Online wachsen? | Online verkleinern? | Hinweise |
|---|---|---|---|
| ext4 | Ja | Nein — Aushängen erforderlich | Flexibelste Option; unterstützt Wachsen und Verkleinern |
| XFS | Ja | Niemals | XFS kann prinzipiell nicht verkleinert werden |
| Btrfs | Ja | Ja | Online-Wachsen und -Verkleinern unterstützt |
| ext3 | Ja | Nein | Veraltet; bevorzuge ext4 |
| swap | Nein | Nein | swapoff, LV verkleinern, mkswap, swapon |
Logical Volume verkleinern (Nur ext4 — Gefährlich)
Verkleinern ist irreversibel, wenn es falsch gemacht wird. Erstelle immer ein Backup. XFS kann nicht verkleinert werden.
# 1. Dateisystem aushängen
umount /dev/vg_data/lv_home
# 2. Dateisystem VOR dem Verkleinern prüfen und reparieren
e2fsck -f /dev/vg_data/lv_home
# 3. Dateisystem auf die Zielgröße verkleinern
resize2fs /dev/vg_data/lv_home 50G
# 4. Logical Volume entsprechend verkleinern (muss >= Dateisystemgröße sein)
lvreduce -L 50G /dev/vg_data/lv_home
# 5. Wieder einhängen und überprüfen
mount /dev/vg_data/lv_home /home
df -h /home
Kritische Regel: führe immer zuerst resize2fs zum Verkleinern des Dateisystems aus, BEVOR du lvreduce ausführst. Das LV zuerst zu verkleinern schneidet Daten ab und beschädigt das Dateisystem.
Thin Provisioning
Thin Provisioning ermöglicht die Überbelegung von Speicher — mehr Speicher an LVs vergeben, als physisch in der VG vorhanden ist.
# Thin Pool erstellen (100 GB in einer VG, die möglicherweise nur 50 GB frei hat)
lvcreate --thin -L 100G vg_data/thin_pool
# Thin LVs aus dem Pool erstellen
lvcreate --thin -V 30G --name lv_web vg_data/thin_pool
lvcreate --thin -V 30G --name lv_db vg_data/thin_pool
# Tatsächliche Pool-Nutzung überwachen
lvs -a vg_data
# Data% zeigt, wie voll der Pool ist — Alarm bei 80%, Handlung bei 90%
Warnung: wenn ein Thin Pool vollständig gefüllt ist, werden alle LVs im Pool schreibgeschützt. Überwache die Nutzung mit lvs.
LVM-Snapshots
Snapshots erfassen den Zustand eines LV zu einem bestimmten Zeitpunkt mit Copy-on-Write. Sie sind die schnellste Möglichkeit, ein konsistentes Backup eines laufenden Servers zu erstellen.
# 5-GB-Snapshot von lv_root erstellen
lvcreate --snapshot -n lv_root_snap -L 5G /dev/vg_sys/lv_root
# Snapshot schreibgeschützt für Backup einhängen
mount -o ro /dev/vg_sys/lv_root_snap /mnt/snap
tar -czf /backup/root-$(date +%Y%m%d).tar.gz -C /mnt/snap .
umount /mnt/snap
# Snapshot nach Abschluss entfernen
lvremove /dev/vg_sys/lv_root_snap
Snapshot zusammenführen (Rollback)
# lv_root beim nächsten Start auf den Snapshot-Zustand zurücksetzen
lvconvert --merge /dev/vg_sys/lv_root_snap
reboot
LVM auf Cloud-VMs
Wenn du eine Disk in Azure, AWS oder GCP erweiterst, sieht das OS die größere Disk, aber das PV meldet noch die alte Größe. Verwende pvresize, um die LVM-Ansicht zu aktualisieren:
# Azure-Beispiel: Disk von 30 GB auf 50 GB im Portal erweitert
lsblk # /dev/sda sollte 50G anzeigen
# Partition bei Bedarf vergrößern
sudo growpart /dev/sda 2
# LVM mitteilen, dass das PV jetzt größer ist
pvresize /dev/sda2
# Bestätigen, dass freier Speicher in der VG erschienen ist
vgs
# LV erweitern und Dateisystem wachsen lassen
lvextend -l +100%FREE -r /dev/vg_sys/lv_root
Häufige Fehler
| Fehlermeldung | Ursache | Lösung |
|---|---|---|
Insufficient free space | Nicht genug PEs in der VG | Neues PV mit pvcreate + vgextend hinzufügen, oder -l +100%FREE verwenden |
Can't reduce LV below used space | resize2fs-Ziel kleiner als tatsächliche Daten | Erst e2fsck -f ausführen, dann Dateisystem vor lvreduce verkleinern |
Filesystem not showing new size | resize2fs / xfs_growfs nach lvextend nicht ausgeführt | resize2fs /dev/vg/lv oder xfs_growfs /einhängepunkt ausführen |
Device /dev/sdX not found | Partitionstabelle nicht neu eingelesen | partprobe /dev/sdX ausführen, dann pvcreate erneut versuchen |
WARNING: snapshot is full | COW-Speicher erschöpft | Snapshot erweitern: lvextend -L +2G /dev/vg/snap oder neu erstellen |
LVM vs ZFS vs Btrfs vs mdadm vs Einfache Partitionen
| Funktion | LVM | ZFS | Btrfs | mdadm | Einfache Partitionen |
|---|---|---|---|---|---|
| Online-Vergrößerung | Ja | Ja | Ja | Begrenzt | Nein |
| Snapshots | Ja (COW) | Ja (COW) | Ja (COW) | Nein | Nein |
| RAID | Ja | Ja (nativ) | Ja | Ja | Nein |
| Kompression | Nein | Ja | Ja | Nein | Nein |
| Thin Provisioning | Ja | Ja | Teilweise | Nein | Nein |
| Lernkurve | Mittel | Hoch | Mittel | Mittel | Niedrig |
| Ideal für | Allgemeine Linux-Server | NAS, FreeBSD | Desktop, Fedora | Legacy-RAID | Einfaches Einzellaufwerk |
Zusammenfassung
- LVM fügt die Abstraktion PV → VG → LV hinzu: Speicher vergrößern und verschieben ohne Neustart.
- Nutze
pvdisplay,vgdisplay,lvdisplayundvgs, um das aktuelle Layout zu verstehen. - Kapazität hinzufügen:
pvcreate→vgextend→lvextend→resize2fsoderxfs_growfs. - Wachsen von ext4 und XFS ist immer online und sicher; nutze
-rbeilvextendfür einen Schritt. - Verkleinern erfordert Aushängen +
e2fsck+resize2fsvorlvreduce. XFS kann nicht verkleinert werden. - Thin Provisioning ermöglicht Überbelegung; überwache Pool-Nutzung mit
lvs. - Snapshots sind schnelle COW-Backups; dimensioniere sie großzügig.
- Auf Cloud-VMs:
pvresizenach Disk-Erweiterung im Portal verwenden.