LVM na Linuxie — elastyczne zarządzanie dyskami
Table of Contents
Czym jest LVM i dlaczego warto go używać?
LVM (Logical Volume Manager) to warstwa abstrakcji między fizycznymi dyskami a systemami plików w Linuxie. Zamiast tworzyć partycje bezpośrednio na dysku (co jest sztywne i trudne do zmiany), LVM pozwala na dynamiczne zarządzanie przestrzenią dyskową – powiększanie, zmniejszanie i przenoszenie woluminów bez przestojów.
Główne zalety LVM:
- Zmiana rozmiaru woluminów w locie, bez odmontowywania
- Łączenie wielu dysków fizycznych w jedną logiczną przestrzeń
- Tworzenie snapshotów – migawek woluminów
- Thin provisioning – alokacja miejsca na żądanie
- Proste przenoszenie danych między dyskami
LVM jest standardem na serwerach produkcyjnych i domyślną konfiguracją w wielu dystrybucjach (Fedora, RHEL, CentOS, Ubuntu Server).
Kluczowe pojęcia
LVM opiera się na trzech warstwach:
PV (Physical Volume) – wolumin fizyczny. To dysk lub partycja, która została zainicjalizowana do użycia z LVM. Może to być cały dysk (/dev/sdb) lub pojedyncza partycja (/dev/sdb1).
VG (Volume Group) – grupa woluminów. Pula przestrzeni dyskowej złożonej z jednego lub wielu PV. To z niej wycinamy woluminy logiczne. Można ją traktować jak wirtualny dysk.
LV (Logical Volume) – wolumin logiczny. Odpowiednik tradycyjnej partycji, ale elastyczny. Na nim tworzymy system plików i montujemy go w systemie.
Przepływ wygląda tak:
Dyski fizyczne -> PV -> VG -> LV -> System plików
/dev/sdb vg_data lv_home ext4
/dev/sdc lv_var xfs
Instalacja
W większości dystrybucji narzędzia LVM są już zainstalowane. Jeśli nie, można je doinstalować:
# Debian/Ubuntu
sudo apt-get install lvm2
# Fedora/RHEL/CentOS
sudo dnf install lvm2
# Arch Linux
sudo pacman -S lvm2
Sprawdzenie, czy usługi LVM działają:
sudo systemctl status lvm2-lvmetad.service
Tworzenie PV, VG i LV – praktyczny przykład
Załóżmy, że mamy dwa dyski: /dev/sdb (50 GB) i /dev/sdc (50 GB), które chcemy połączyć w jedną przestrzeń LVM.
Krok 1: Utworzenie Physical Volumes
# Zainicjalizuj dyski jako PV
sudo pvcreate /dev/sdb /dev/sdc
# Sprawdź utworzone PV
sudo pvs
Przykładowy wynik:
PV VG Fmt Attr PSize PFree
/dev/sdb lvm2 --- 50.00g 50.00g
/dev/sdc lvm2 --- 50.00g 50.00g
Krok 2: Utworzenie Volume Group
# Utwórz grupę woluminów z obu dysków
sudo vgcreate vg_data /dev/sdb /dev/sdc
# Sprawdź grupę
sudo vgs
Przykładowy wynik:
VG #PV #LV #SN Attr VSize VFree
vg_data 2 0 0 wz--n- 99.99g 99.99g
Teraz mamy jedną pulę 100 GB z dwóch dysków.
Krok 3: Utworzenie Logical Volumes
# Utwórz LV o rozmiarze 60 GB na /home
sudo lvcreate -L 60G -n lv_home vg_data
# Utwórz LV o rozmiarze 30 GB na /var
sudo lvcreate -L 30G -n lv_var vg_data
# Lub używając procentu wolnego miejsca
# sudo lvcreate -l 100%FREE -n lv_backup vg_data
# Sprawdź utworzone LV
sudo lvs
Przykładowy wynik:
LV VG Attr LSize Pool Origin Data% Meta%
lv_home vg_data -wi-a----- 60.00g
lv_var vg_data -wi-a----- 30.00g
Krok 4: Utworzenie systemu plików i montowanie
# Utwórz system plików ext4
sudo mkfs.ext4 /dev/vg_data/lv_home
sudo mkfs.xfs /dev/vg_data/lv_var
# Zamontuj woluminy
sudo mount /dev/vg_data/lv_home /home
sudo mount /dev/vg_data/lv_var /var
Aby montowanie było trwałe, dodaj wpisy do /etc/fstab:
/dev/vg_data/lv_home /home ext4 defaults 0 2
/dev/vg_data/lv_var /var xfs defaults 0 2
Rozszerzanie i zmiana rozmiaru woluminów
To główna przewaga LVM nad tradycyjnymi partycjami. Zmiana rozmiaru woluminu jest prosta i w wielu przypadkach nie wymaga odmontowywania.
Powiększanie LV
# Dodaj 10 GB do lv_home
sudo lvextend -L +10G /dev/vg_data/lv_home
# Rozszerz system plików (ext4)
sudo resize2fs /dev/vg_data/lv_home
# Dla XFS użyj xfs_growfs
# sudo xfs_growfs /var
# Można to zrobić jednym poleceniem z flagą -r
sudo lvextend -L +10G -r /dev/vg_data/lv_home
Flaga -r (--resizefs) automatycznie rozszerza system plików po powiększeniu LV.
Dodanie nowego dysku do istniejącego VG
# Nowy dysk /dev/sdd
sudo pvcreate /dev/sdd
sudo vgextend vg_data /dev/sdd
# Teraz mamy więcej wolnego miejsca w VG
sudo vgs
Zmniejszanie LV
Zmniejszanie wymaga większej ostrożności. System plików musi być najpierw zmniejszony, a dopiero potem LV. XFS nie obsługuje zmniejszania.
# Odmontuj wolumin
sudo umount /home
# Sprawdź system plików
sudo e2fsck -f /dev/vg_data/lv_home
# Zmniejsz system plików do 40 GB
sudo resize2fs /dev/vg_data/lv_home 40G
# Zmniejsz LV do 40 GB
sudo lvreduce -L 40G /dev/vg_data/lv_home
# Zamontuj ponownie
sudo mount /dev/vg_data/lv_home /home
Uwaga: Zmniejszanie woluminu niesie ryzyko utraty danych. Zawsze rób kopię zapasową przed tą operacją.
Snapshoty
Snapshoty LVM to kopie stanu woluminu w danym momencie. Wykorzystują mechanizm copy-on-write – początkowo snapshot nie zajmuje dodatkowego miejsca. Przestrzeń jest zużywana dopiero wtedy, gdy dane na oryginalnym woluminie się zmieniają.
Tworzenie snapshotu
# Utwórz snapshot o nazwie snap_home z 5 GB na zmiany
sudo lvcreate -L 5G -s -n snap_home /dev/vg_data/lv_home
# Sprawdź snapshot
sudo lvs
Przykładowy wynik:
LV VG Attr LSize Pool Origin Data%
lv_home vg_data owi-aos--- 60.00g
snap_home vg_data swi-a-s--- 5.00g lv_home 0.00
Montowanie snapshotu
# Zamontuj snapshot jako tylko do odczytu
sudo mount -o ro /dev/vg_data/snap_home /mnt/snapshot
Przywracanie ze snapshotu
# Odmontuj oryginalny wolumin
sudo umount /home
# Przywróć dane ze snapshotu
sudo lvconvert --merge /dev/vg_data/snap_home
# Po merge snapshot jest automatycznie usuwany
# Zamontuj wolumin ponownie
sudo mount /dev/vg_data/lv_home /home
Usuwanie snapshotu
sudo lvremove /dev/vg_data/snap_home
Uwaga: Snapshoty LVM nie są zamiennikiem backupu. Gdy snapshot zapełni przydzieloną przestrzeń (w naszym przykładzie 5 GB), staje się nieważny. Monitoruj użycie za pomocą lvs.
Thin Provisioning
Thin provisioning pozwala na tworzenie woluminów logicznych, które są większe niż dostępna przestrzeń fizyczna. Miejsce na dysku jest alokowane dopiero w momencie faktycznego zapisu danych. To technika powszechnie używana w wirtualizacji i środowiskach chmurowych.
# Utwórz thin pool o rozmiarze 80 GB
sudo lvcreate -L 80G --thinpool thin_pool vg_data
# Utwórz thin LV o wirtualnym rozmiarze 200 GB
sudo lvcreate -V 200G --thin -n lv_thin1 vg_data/thin_pool
# Kolejny thin LV
sudo lvcreate -V 200G --thin -n lv_thin2 vg_data/thin_pool
# Sprawdź użycie
sudo lvs -a
Oba woluminy “widzą” 200 GB, ale faktycznie zużyją tyle miejsca, ile danych zostanie na nie zapisanych. Gdy thin pool się zapełni, trzeba go rozszerzyć lub dane zostaną utracone – dlatego monitorowanie jest kluczowe.
# Sprawdź zapełnienie thin pool
sudo lvs -o+data_percent,metadata_percent vg_data/thin_pool
LVM a tradycyjne partycje
- Tradycyjne partycje mają stały rozmiar ustalony w momencie tworzenia – LVM pozwala na zmianę rozmiaru w dowolnym momencie
- Na tradycyjnych partycjach nie można łączyć wielu dysków w jedną przestrzeń – LVM łączy wiele PV w jeden VG
- Tradycyjne partycje nie obsługują snapshotów – LVM ma wbudowane snapshoty
- Tradycyjne partycje są prostsze w konfiguracji – LVM wymaga nauki dodatkowych narzędzi
- Na tradycyjnych partycjach nie ma thin provisioning – LVM pozwala na overprovisioning
- Przenoszenie danych między dyskami wymaga ręcznego kopiowania przy tradycyjnych partycjach – LVM obsługuje
pvmovedo migracji w locie - Tradycyjne partycje nie wymagają dodatkowej warstwy abstrakcji – LVM dodaje złożoność, która może utrudnić odzyskiwanie danych w razie awarii
- Tradycyjne partycje są lepszym wyborem dla prostych desktopów – LVM jest standardem na serwerach
Ściąga – najczęściej używane komendy
Physical Volumes
sudo pvcreate /dev/sdX # Utwórz PV
sudo pvs # Lista PV (skrócona)
sudo pvdisplay # Lista PV (szczegółowa)
sudo pvremove /dev/sdX # Usuń PV
sudo pvmove /dev/sdb /dev/sdd # Przenieś dane między PV
Volume Groups
sudo vgcreate vg_name /dev/sdX # Utwórz VG
sudo vgs # Lista VG (skrócona)
sudo vgdisplay # Lista VG (szczegółowa)
sudo vgextend vg_name /dev/sdY # Dodaj PV do VG
sudo vgreduce vg_name /dev/sdX # Usuń PV z VG
sudo vgremove vg_name # Usuń VG
Logical Volumes
sudo lvcreate -L 50G -n lv_name vg_name # Utwórz LV
sudo lvs # Lista LV (skrócona)
sudo lvdisplay # Lista LV (szczegółowa)
sudo lvextend -L +10G -r /dev/vg/lv # Powiększ LV + filesystem
sudo lvreduce -L 30G /dev/vg/lv # Zmniejsz LV
sudo lvremove /dev/vg/lv # Usuń LV
sudo lvrename vg_name old_name new_name # Zmień nazwę LV
Snapshoty
sudo lvcreate -L 5G -s -n snap /dev/vg/lv # Utwórz snapshot
sudo lvconvert --merge /dev/vg/snap # Przywróć ze snapshotu
Diagnostyka
sudo lvm version # Wersja LVM
sudo dmsetup ls # Lista urządzeń device-mapper
sudo dmsetup status # Status urządzeń
sudo vgck vg_name # Sprawdź spójność VG
Rozwiązywanie problemów
LV nie jest widoczny po restarcie
# Aktywuj wszystkie VG
sudo vgchange -ay
# Sprawdź, czy LVM widzi dyski
sudo pvscan
sudo vgscan
sudo lvscan
Dysk zniknął z VG
# Sprawdź, które PV są niedostępne
sudo pvs -a
# Jeśli dysk jest fizycznie uszkodzony, usuń go z VG
sudo vgreduce --removemissing vg_data
Snapshot zapełnia się za szybko
# Sprawdź użycie snapshotu
sudo lvs -o+snap_percent
# Rozszerz snapshot
sudo lvextend -L +5G /dev/vg_data/snap_home
Nie można rozszerzyć LV – brak miejsca w VG
# Sprawdź wolne miejsce
sudo vgs
# Dodaj nowy dysk
sudo pvcreate /dev/sde
sudo vgextend vg_data /dev/sde
# Teraz rozszerz LV
sudo lvextend -L +20G -r /dev/vg_data/lv_home
Odczytanie konfiguracji LVM z dysku ratunkowego
# Przeskanuj dostępne woluminy
sudo vgscan
sudo lvscan
# Aktywuj woluminy
sudo vgchange -ay
# Zamontuj
sudo mount /dev/vg_data/lv_home /mnt
Podsumowanie
LVM to jedno z najważniejszych narzędzi do zarządzania przestrzenią dyskową na Linuxie. Elastyczność, snapshoty i możliwość łączenia wielu dysków w jedną pulę sprawiają, że jest standardem na serwerach produkcyjnych. Początkowa krzywa nauki jest niewielka, a korzyści – ogromne. Jeśli zarządzasz systemem z więcej niż jednym dyskiem lub potrzebujesz elastyczności w przydzielaniu przestrzeni, LVM jest naturalnym wyborem.