LVM (Logical Volume Manager) ermöglicht flexible Speicherverwaltung unter Linux. Volumes können zur Laufzeit vergrößert, verkleinert und zwischen Festplatten verschoben werden.
LVM-Konzepte
Architektur
Physical Volumes (PV) → Volume Groups (VG) → Logical Volumes (LV)
+--------+ +--------+
| /dev/ | | /dev/ |
| sdb | | sdc | Physical Volumes
+--------+ +--------+
\ /
\ /
+------------+
| vg0 | Volume Group
+------------+
/ | \
/ | \
+----+ +----+ +----+
| lv | | lv | | lv | Logical Volumes
|root| |home| |var |
+----+ +----+ +----+
Terminologie
| Begriff | Beschreibung |
|---|
| PV | Physical Volume (Festplatte/Partition) |
| VG | Volume Group (Pool aus PVs) |
| LV | Logical Volume (virtuelle Partition) |
| PE | Physical Extent (kleinste Einheit) |
Installation
apt install lvm2
Physical Volumes
PV erstellen
# Auf Partition
pvcreate /dev/sdb1
# Auf ganzer Disk
pvcreate /dev/sdc
PVs anzeigen
pvs
pvdisplay
pvdisplay /dev/sdb1
PV entfernen
pvremove /dev/sdb1
Volume Groups
VG erstellen
vgcreate vg0 /dev/sdb1 /dev/sdc1
VG erweitern
pvcreate /dev/sdd1
vgextend vg0 /dev/sdd1
VG verkleinern
# Erst Daten von PV verschieben
pvmove /dev/sdb1
# Dann PV entfernen
vgreduce vg0 /dev/sdb1
VGs anzeigen
vgs
vgdisplay
vgdisplay vg0
Logical Volumes
LV erstellen
# Mit fester Größe
lvcreate -L 10G -n lv_home vg0
# Mit Prozent des freien Platzes
lvcreate -l 100%FREE -n lv_data vg0
# Mit Anzahl Extents
lvcreate -l 2560 -n lv_var vg0
LVs anzeigen
lvs
lvdisplay
lvdisplay /dev/vg0/lv_home
LV-Pfade
# Äquivalent
/dev/vg0/lv_home
/dev/mapper/vg0-lv_home
Dateisystem erstellen und mounten
# Dateisystem erstellen
mkfs.ext4 /dev/vg0/lv_home
# Mounten
mount /dev/vg0/lv_home /home
# In fstab eintragen
echo "/dev/vg0/lv_home /home ext4 defaults 0 2" >> /etc/fstab
LV vergrößern
Volume vergrößern
# Um 5 GB
lvextend -L +5G /dev/vg0/lv_home
# Auf 20 GB
lvextend -L 20G /dev/vg0/lv_home
# Gesamter freier Platz
lvextend -l +100%FREE /dev/vg0/lv_home
Dateisystem vergrößern
# ext4 (online möglich)
resize2fs /dev/vg0/lv_home
# XFS (online möglich)
xfs_growfs /home
# In einem Schritt
lvextend -L +5G --resizefs /dev/vg0/lv_home
LV verkleinern
ext4 verkleinern
# VORSICHT: Backup vorher!
# Unmounten
umount /home
# Dateisystem prüfen
e2fsck -f /dev/vg0/lv_home
# Dateisystem verkleinern
resize2fs /dev/vg0/lv_home 15G
# LV verkleinern
lvreduce -L 15G /dev/vg0/lv_home
# Wieder mounten
mount /dev/vg0/lv_home /home
XFS kann nicht verkleinert werden
XFS unterstützt kein Verkleinern.
Workaround: Backup, neues LV erstellen, Restore.
Snapshots
Snapshot erstellen
lvcreate -L 5G -s -n lv_home_snap /dev/vg0/lv_home
Snapshot mounten
mount -o ro /dev/vg0/lv_home_snap /mnt/snapshot
Snapshot als Backup nutzen
# Snapshot erstellen
lvcreate -L 5G -s -n backup_snap /dev/vg0/lv_data
# Backup durchführen
mount -o ro /dev/vg0/backup_snap /mnt/snapshot
tar -czf backup.tar.gz /mnt/snapshot
# Aufräumen
umount /mnt/snapshot
lvremove /dev/vg0/backup_snap
Snapshot mergen (Rollback)
# System auf Snapshot-Stand zurücksetzen
umount /dev/vg0/lv_home
lvconvert --merge /dev/vg0/lv_home_snap
# Neustart oder erneutes Mounten
Thin Provisioning
Thin Pool erstellen
lvcreate -L 50G --thinpool thin_pool vg0
Thin Volume erstellen
# Kann größer als Pool sein (Over-Provisioning)
lvcreate -V 100G --thin -n thin_vol vg0/thin_pool
Thin Snapshot
lvcreate -s -n thin_snap vg0/thin_vol
Migration zwischen Disks
Daten verschieben
# Neue Disk hinzufügen
pvcreate /dev/sdd
vgextend vg0 /dev/sdd
# Daten von alter Disk verschieben
pvmove /dev/sdb /dev/sdd
# Alte Disk entfernen
vgreduce vg0 /dev/sdb
pvremove /dev/sdb
LVM + RAID
RAID1-LV erstellen
lvcreate --type raid1 -m 1 -L 10G -n lv_mirror vg0
RAID5-LV erstellen
lvcreate --type raid5 -i 3 -L 10G -n lv_raid5 vg0
Cache (SSD + HDD)
SSD-Cache für HDD
# Cache-Pool erstellen (SSD)
lvcreate -L 20G -n cache_pool vg0 /dev/ssd
# Cache-Meta erstellen
lvcreate -L 100M -n cache_meta vg0 /dev/ssd
# Cache-Pool erstellen
lvconvert --type cache-pool --poolmetadata vg0/cache_meta vg0/cache_pool
# Cache auf LV anwenden
lvconvert --type cache --cachepool vg0/cache_pool vg0/lv_slow
Troubleshooting
LV wird nicht erkannt
# LVM-Scan
pvscan
vgscan
lvscan
# Volumes aktivieren
vgchange -ay vg0
VG inkonsistent
vgck vg0
vgreduce --removemissing vg0
# Backup wiederherstellen
vgcfgrestore vg0
# Oder aus /etc/lvm/backup/
Monitoring
Speicherplatz
# Übersicht
vgs
lvs
# Detailliert
pvdisplay
vgdisplay
lvdisplay
Thin Pool Nutzung
lvs -o+lv_metadata_size,metadata_percent,data_percent
Best Practices
Planung
- VG großzügig dimensionieren
- Nicht 100% allokieren (Reserve für Snapshots)
- Thin Provisioning für flexible Nutzung
- ext4 oder XFS je nach Anwendungsfall
Benennung
vg0, vg_data, vg_system
lv_root, lv_home, lv_var
Zusammenfassung
| Befehl | Funktion |
|---|
| pvcreate | Physical Volume erstellen |
| vgcreate | Volume Group erstellen |
| lvcreate | Logical Volume erstellen |
| lvextend | LV vergrößern |
| lvreduce | LV verkleinern |
| pvmove | Daten zwischen PVs verschieben |
| Option | Beschreibung |
|---|
| -L | Größe absolut (z.B. 10G) |
| -l | Größe in Extents oder % |
| -s | Snapshot erstellen |
| -n | Name vergeben |
| Pfad | Beschreibung |
|---|
| /dev/vg0/lv_home | LV-Pfad |
| /dev/mapper/vg0-lv_home | Mapper-Pfad |
| /etc/lvm/backup/ | VG-Backups |
Fazit
LVM bietet maximale Flexibilität bei der Speicherverwaltung. Volumes können ohne Neupartitionierung angepasst werden. Snapshots ermöglichen konsistente Backups laufender Systeme. Thin Provisioning optimiert die Speichernutzung. Für Server-Umgebungen ist LVM quasi Standard. Die Kombination mit RAID auf Hardware- oder Software-Ebene bietet zusätzliche Sicherheit.