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 pvmove do 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.