LVM — zarządzanie woluminami logicznymi na Linux
Opublikowano: 9 kwietnia 2026 · Kategoria: VPS / Linux / Storage
Standardowe partycje mają stały rozmiar — gdy zapełnisz /var na serwerze produkcyjnym
o 3:00 w nocy, bez LVM masz problem. LVM (Logical Volume Manager) to warstwa abstrakcji między
dyskami fizycznymi a systemem plików, która pozwala rozszerzać woluminy online, tworzyć snapshoty
i łączyć wiele dysków w jeden elastyczny pool przestrzeni dyskowej.
Architektura LVM: PV → VG → LV
LVM ma trójwarstwową architekturę:
- PV (Physical Volume) — fizyczny dysk lub partycja przygotowana dla LVM przez
pvcreate. Może to być cały dysk (/dev/sdb) lub partycja (/dev/sdb1). - VG (Volume Group) — pool przestrzeni złożony z jednego lub wielu PV. Możesz dodawać nowe PV do VG gdy brakuje miejsca. Analogia: VG to pula.
- LV (Logical Volume) — wolumin logiczny wycięty z VG, na którym tworzysz system plików (ext4, xfs). To odpowiednik tradycyjnej partycji. Analogia: LV to naczynie z puli.
Tworzenie LVM od podstaw
Scenariusz: masz dodatkowy dysk /dev/sdb (100 GB) i chcesz użyć go przez LVM:
# Krok 1: Instalacja narzędzi LVM (jeśli brakuje) sudo apt install lvm2 # Debian/Ubuntu sudo yum install lvm2 # CentOS/RHEL # Krok 2: Utwórz Physical Volume sudo pvcreate /dev/sdb # Physical volume "/dev/sdb" successfully created. # Krok 3: Utwórz Volume Group sudo vgcreate vg0 /dev/sdb # Volume group "vg0" successfully created # Krok 4: Utwórz Logical Volume (80 GB z 100 GB puli) sudo lvcreate -L 80G -n data vg0 # Logical volume "data" created. # Lub użyj całego dostępnego miejsca: sudo lvcreate -l 100%FREE -n data vg0
Formatowanie i montowanie
# Utwórz system plików ext4 sudo mkfs.ext4 /dev/vg0/data # Utwórz punkt montowania sudo mkdir -p /data # Zamontuj tymczasowo sudo mount /dev/vg0/data /data # Trwałe montowanie przez /etc/fstab # Użyj UUID (bezpieczniejszy niż nazwa urządzenia) sudo blkid /dev/vg0/data # /dev/vg0/data: UUID="abcd-1234" TYPE="ext4" # Dodaj do /etc/fstab: # UUID=abcd-1234 /data ext4 defaults,nofail 0 2 # Weryfikacja df -h /data
Rozszerzenie LV online — bez downtime
To najważniejsza cecha LVM — możesz rozszerzyć zamontowany wolumin bez zatrzymywania aplikacji:
# Sprawdź bieżący stan sudo lvs sudo vgs # Sprawdź ile miejsca zostało w VG # Rozszerz LV o 10 GB sudo lvextend -L +10G /dev/vg0/data # Lub użyj całego wolnego miejsca w VG sudo lvextend -l +100%FREE /dev/vg0/data # Rozszerz system plików ext4 (online, zamontowany) sudo resize2fs /dev/vg0/data # Dla XFS (inaczej niż ext4!): # sudo xfs_growfs /data # Argumentem jest punkt montowania, nie urządzenie # Weryfikacja df -h /data
Możesz też dodać nowy dysk do VG gdy LV zajął całe dostępne miejsce:
# Dodaj nowy dysk do istniejącej grupy woluminów sudo pvcreate /dev/sdc sudo vgextend vg0 /dev/sdc # Teraz VG ma więcej miejsca — możesz rozszerzyć LV sudo lvextend -l +100%FREE /dev/vg0/data sudo resize2fs /dev/vg0/data
Zmniejszanie LV — tylko offline
Zmniejszenie LV to operacja bardziej ryzykowna i wymaga odmontowania. Zawsze rób backup przed redukcją:
# UWAGA: Zmniejszenie LV = ryzyko utraty danych. Zrób backup! # Odmontuj wolumin sudo umount /data # Sprawdź i napraw system plików (OBOWIĄZKOWE przed redukcją) sudo e2fsck -f /dev/vg0/data # Zmniejsz system plików do docelowego rozmiaru (np. 30G) sudo resize2fs /dev/vg0/data 30G # Zmniejsz LV (musi być <= nowy rozmiar systemu plików) sudo lvreduce -L 30G /dev/vg0/data # Zamontuj z powrotem sudo mount /dev/vg0/data /data
LVM Snapshot — migawka dla backupu
# Utwórz snapshot woluminu data (CoW — Copy on Write) # --size = ile miejsca zarezerwować na zmiany od momentu snapshotu sudo lvcreate --snapshot --name data-snap --size 5G /dev/vg0/data # Zamontuj snapshot tylko do odczytu (np. dla backupu) sudo mkdir -p /mnt/snap sudo mount -o ro /dev/vg0/data-snap /mnt/snap # Zrób backup z zamontowanego snapshotu sudo rsync -avz /mnt/snap/ /backup/data/ # Odmontuj i usuń snapshot po backupie sudo umount /mnt/snap sudo lvremove /dev/vg0/data-snap # Przywróć oryginał ze snapshotu (rollback): # sudo umount /data # sudo lvconvert --merge /dev/vg0/data-snap # sudo lvchange -an /dev/vg0/data # sudo lvchange -ay /dev/vg0/data # sudo mount /dev/vg0/data /data
Thin Provisioning
Thin provisioning pozwala zaalokować więcej miejsca niż fizycznie dostępne — podobnie jak w chmurze. Przydatne gdy tworzysz wiele LV dla różnych serwisów i widzisz że nie wszystkie osiągną maksymalny rozmiar jednocześnie:
# Utwórz thin pool (50G fizycznej przestrzeni) sudo lvcreate --thin -L 50G vg0/thin-pool # Utwórz thin volumes (łącznie 80G, choć pool ma tylko 50G) sudo lvcreate --thin -V 30G --name web-data vg0/thin-pool sudo lvcreate --thin -V 30G --name db-data vg0/thin-pool sudo lvcreate --thin -V 20G --name logs-data vg0/thin-pool # Monitoruj użycie thin pool sudo lvs -a vg0
Inspekcja — pvs, vgs, lvs
# Physical Volumes — lista dysków w LVM sudo pvs sudo pvdisplay /dev/sdb # Szczegóły # Volume Groups — lista grup sudo vgs sudo vgdisplay vg0 # Szczegóły (w tym wolne miejsce) # Logical Volumes — lista woluminów sudo lvs sudo lvdisplay /dev/vg0/data # Szczegóły # Pełny przegląd drzewa LVM sudo lvscan
LVM vs woluminy chmurowe — porównanie
| Cecha | LVM | Cloud Volumes (EBS, Hetzner) |
|---|---|---|
| Rozszerzenie online | Tak (lvextend + resize2fs) | Tak (przez panel/API) |
| Snapshot | Tak (lvcreate --snapshot) | Tak (zarządzane przez chmurę) |
| Przenoszenie między serwerami | Nie (dane na fizycznym dysku) | Tak (odłącz i podłącz) |
| Koszt | 0 zł (software) | Dodatkowa opłata miesięczna |
| Najlepsze dla | Dedyki, VPS z wieloma dyskami | Efemeryczne serwery, łatwy backup |