Przejdź do głównej zawartości

LVM (Logical Volume Manager) w Linuksie

Ćwiczenia w tym rozdziale są napisane pod współczesnego Ubuntu (22.04/24.04 LTS) i nie wymagają żadnego konkretnego hipervisora ani narzędzia GUI typu YaST. Jako "dyski" wykorzystujemy pliki obrazów podpięte przez losetup — dzięki temu ćwiczenie działa identycznie na fizycznej maszynie, w VM (VMware, VirtualBox, KVM, chmura) czy w WSL2 z uprawnieniami roota. Jeśli wolisz ćwiczyć na prawdziwych dodatkowych dyskach/partycjach wirtualnej maszyny — wszystkie polecenia pvcreate/vgcreate/lvcreate działają identycznie, wystarczy podać właściwe urządzenie (/dev/sdb1 zamiast /dev/loop0 itd.).

Przypomnienie – podstawowe pojęcia LVM

SkrótNazwaZnaczenie
PVPhysical Volumefizyczna partycja/dysk przygotowana pod LVM (pvcreate)
VGVolume Groupgrupa wolumenów – pula miejsca złożona z jednego lub wielu PV (vgcreate)
LVLogical Volumewolumin logiczny wydzielony z VG, na którym zakłada się system plików (lvcreate)

Podstawowy przepływ pracy: pvcreatevgcreatelvcreatemkfs.*mount.


Ćwiczenie 0 – przygotowanie środowiska

Instalacja narzędzi LVM

Na współczesnym Ubuntu narzędzia LVM (pvcreate, vgcreate, lvcreate...) znajdują się w pakiecie lvm2:

sudo apt update
sudo apt install lvm2

Sprawdź wersję i obecność modułu jądra dm_mod (device-mapper), na którym opiera się LVM:

lvm version
lsmod | grep dm_mod # zwykle wbudowany/ładowany automatycznie

Przygotowanie dysków testowych (pliki obrazów + losetup)

Utwórz katalog roboczy i dwa pliki-obrazy po 1 GB, które posłużą jako "dyski":

mkdir -p ~/lvm-lab && cd ~/lvm-lab
truncate -s 1G disk1.img
truncate -s 1G disk2.img

Podłącz je jako urządzenia blokowe /dev/loopX:

sudo losetup -fP disk1.img
sudo losetup -fP disk2.img
losetup -a # sprawdzamy, pod jakimi /dev/loopX są widoczne

Od tego momentu traktujemy /dev/loop0 i /dev/loop1 (lub jakie faktycznie przydzielił losetup) tak samo, jak w oryginalnym ćwiczeniu traktowano /dev/sdb//dev/sdc.

Uwaga: podłączenia przez losetup nie przeżywają restartu systemu — po restarcie trzeba je odtworzyć poleceniem losetup -fP diskN.img (metadane LVM na samym pliku pozostają nienaruszone, zmienia się tylko nazwa urządzenia w /dev). Jeśli ćwiczysz na prawdziwych dyskach/partycjach VM, ten krok pomijasz.

Sprawdź, jakie urządzenia blokowe są dostępne:

lsblk

Czas wykonania: 5 min.


Ćwiczenie 1 – tworzenie i rozszerzanie wolumenu projects

Tworzenie wolumenów fizycznych

sudo pvcreate /dev/loop0
sudo pvcreate /dev/loop1
pvs # lub: sudo pvdisplay

Grupa wolumenów i wolumin logiczny

Zakładamy grupę wolumenów projects z /dev/loop0 i tworzymy w niej wolumin logiczny pilot o wielkości 500 MB, montowany w /mnt/projects/pilot:

sudo vgcreate projects /dev/loop0
sudo lvcreate -L 500M -n pilot projects
sudo mkfs.ext4 /dev/projects/pilot
sudo mkdir -p /mnt/projects/pilot
sudo mount /dev/projects/pilot /mnt/projects/pilot

Weryfikacja

mount | grep pilot # sprawdzamy poprawność zamontowania lv
df -h # sprawdzamy ilość wolnego miejsca
lsblk # widać hierarchię: loop0 -> projects-pilot

Generujemy plik 250 MB z losową zawartością i sprawdzamy zajętość:

sudo dd if=/dev/urandom of=/mnt/projects/pilot/plik bs=1M count=250
df -h /mnt/projects/pilot

Rozszerzanie wolumenu logicznego (bez odmontowywania)

ext4 obsługuje rozszerzanie "na żywo" (online resize), więc nie trzeba odmontowywać systemu plików, żeby go powiększyć. Zwiększamy pilot do 700 MB:

sudo lvextend -L 700M -r /dev/projects/pilot

Flaga -r (--resizefs) każe od razu wywołać resize2fs/xfs_growfs na zmienionym LV — nie trzeba robić tego osobnym poleceniem. Sprawdzamy efekt:

df -h /mnt/projects/pilot
lvs

Rozszerzanie grupy wolumenów o kolejny dysk

Dodajemy drugi wolumin fizyczny do grupy projects:

sudo pvcreate /dev/loop1
sudo vgextend projects /dev/loop1
vgs projects

Zwiększamy pilot do 1,4 GB:

sudo lvextend -L 1.4G -r /dev/projects/pilot
df -h /mnt/projects/pilot

Dodanie kolejnego "dysku" fizycznego do grupy

Tworzymy trzeci obraz 2 GB i dołączamy go w całości do grupy:

truncate -s 2G ~/lvm-lab/disk3.img
sudo losetup -fP ~/lvm-lab/disk3.img
sudo pvcreate /dev/loop2
sudo vgextend projects /dev/loop2
vgs projects

Rozszerzamy pilot o kolejne 500 MB i weryfikujemy:

sudo lvextend -L+500M -r /dev/projects/pilot
df -h /mnt/projects/pilot

Sprzątanie

sudo umount /mnt/projects/pilot
sudo lvremove /dev/projects/pilot
sudo vgremove projects
sudo pvremove /dev/loop0 /dev/loop1 /dev/loop2

Czas wykonania ćwiczenia: 15 min.


Ćwiczenie 2 – wiele grup wolumenów (polska, niemcy)

Ćwiczenie rozszerzone, symulujące bardziej złożoną strukturę: dwie grupy wolumenów, po kilka wolumenów logicznych z różnymi systemami plików, rozszerzanie oraz pełne usunięcie konfiguracji.

Przygotowanie dysków

Tworzymy cztery obrazy po 512 MB i podłączamy jako loop devices:

cd ~/lvm-lab
for i in a b c d; do truncate -s 512M disk_$i.img; sudo losetup -fP disk_$i.img; done
losetup -a

Zapamiętaj przydzielone nazwy /dev/loopN (poniżej zakładamy loop0..loop3 w kolejności a,b,c,d) — w praktyce sprawdź je poleceniem losetup -a.

Grupa wolumenów polska

sudo pvcreate /dev/loop0 /dev/loop1
sudo vgcreate polska /dev/loop0 /dev/loop1
pvs

Tworzymy woluminy logiczne według schematu:

Nazwa LVWielkośćSystem plikówPunkt montowaniaTestowy plik
warszawa700 MBext4/mnt/polska/warszawa~500 MB zer (/dev/zero)
krakow200 MBext4/mnt/polska/krakow150 MB losowych danych (/dev/urandom)
koszalin100 MBext4/mnt/polska/koszalin80 MB losowych danych (/dev/urandom)
sudo lvcreate -L 700M -n warszawa polska
sudo mkfs.ext4 /dev/polska/warszawa
sudo mkdir -p /mnt/polska/warszawa
sudo mount /dev/polska/warszawa /mnt/polska/warszawa
sudo dd if=/dev/zero of=/mnt/polska/warszawa/plik bs=1M count=500

sudo lvcreate -L 200M -n krakow polska
sudo mkfs.ext4 /dev/polska/krakow
sudo mkdir -p /mnt/polska/krakow
sudo mount /dev/polska/krakow /mnt/polska/krakow
sudo dd if=/dev/urandom of=/mnt/polska/krakow/plik bs=1M count=150

sudo lvcreate -L 100M -n koszalin polska
sudo mkfs.ext4 /dev/polska/koszalin
sudo mkdir -p /mnt/polska/koszalin
sudo mount /dev/polska/koszalin /mnt/polska/koszalin
sudo dd if=/dev/urandom of=/mnt/polska/koszalin/plik bs=1M count=80

Sprawdzenie stanu wolumenów logicznych:

lvscan
lvs

Grupa wolumenów niemcy

sudo pvcreate /dev/loop2 /dev/loop3
sudo vgcreate niemcy /dev/loop2 /dev/loop3
Nazwa LVWielkośćSystem plikówPunkt montowania
berlin300 MBext4/mnt/niemcy/berlin
hamburg150 MBext4/mnt/niemcy/hamburg
sudo lvcreate -L 300M -n berlin niemcy
sudo mkfs.ext4 /dev/niemcy/berlin
sudo mkdir -p /mnt/niemcy/berlin
sudo mount /dev/niemcy/berlin /mnt/niemcy/berlin

sudo lvcreate -L 150M -n hamburg niemcy
sudo mkfs.ext4 /dev/niemcy/hamburg
sudo mkdir -p /mnt/niemcy/hamburg
sudo mount /dev/niemcy/hamburg /mnt/niemcy/hamburg

lvscan

Rozszerzanie wolumenu krakow o kolejny dysk

Dokładamy piąty obraz jako dysk zapasowy dla grupy polska:

truncate -s 512M ~/lvm-lab/disk_e.img
sudo losetup -fP ~/lvm-lab/disk_e.img
sudo pvcreate /dev/loop4
sudo vgextend polska /dev/loop4
sudo lvextend -L+256M -r /dev/polska/krakow
df -h /mnt/polska/krakow

Sprzątanie – usuwamy całą konfigurację

sudo umount /mnt/polska/warszawa /mnt/polska/krakow /mnt/polska/koszalin
sudo umount /mnt/niemcy/berlin /mnt/niemcy/hamburg

sudo lvremove -f /dev/polska/warszawa /dev/polska/krakow /dev/polska/koszalin
sudo vgremove polska
sudo pvremove /dev/loop0 /dev/loop1 /dev/loop4

sudo lvremove -f /dev/niemcy/berlin /dev/niemcy/hamburg
sudo vgremove niemcy
sudo pvremove /dev/loop2 /dev/loop3

# odpinamy loop devices i czyścimy pliki obrazów
sudo losetup -d /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3 /dev/loop4
rm -f ~/lvm-lab/*.img

Czas wykonania ćwiczenia: 20 min.


Trwałe montowanie po restarcie (na prawdziwych dyskach)

Jeśli ćwiczysz na realnych dyskach/partycjach VM (nie na loop devices, które i tak nie przeżywają restartu), dodaj wpis do /etc/fstab, żeby LV montował się automatycznie:

sudo blkid /dev/projects/pilot # odczytaj UUID
echo '/dev/projects/pilot /mnt/projects/pilot ext4 defaults 0 2' | sudo tee -a /etc/fstab
sudo systemctl daemon-reload
sudo mount -a # test wpisu bez restartu

Typ partycji dla LVM w klasycznym fdisk (MBR) to 8e (Linux LVM); przy tablicy GPT (gdisk/parted) używa się typu 8e00 / lvm. Przy loop devices ten krok jest pomijalny — pvcreate działa bezpośrednio na całym urządzeniu /dev/loopN.


Podsumowanie – najważniejsze polecenia LVM

PolecenieDziałanie
pvcreate <urządzenie>inicjalizacja partycji/dysku jako wolumenu fizycznego (PV)
pvs / pvdisplay / pvscanlista/szczegóły wolumenów fizycznych
vgcreate <nazwa> <PV...>utworzenie grupy wolumenów (VG)
vgextend <VG> <PV>dodanie kolejnego PV do istniejącej grupy
vgs / vgdisplaylista/szczegóły grup wolumenów
vgremove <VG>usunięcie grupy wolumenów
lvcreate -L <rozmiar> -n <nazwa> <VG>utworzenie wolumenu logicznego (LV)
lvextend -L+<rozmiar> -r <LV>rozszerzenie LV i od razu systemu plików (-r)
lvs / lvdisplay / lvscanlista/szczegóły wolumenów logicznych
lvremove <LV>usunięcie wolumenu logicznego
resize2fs <urządzenie>ręczne dopasowanie rozmiaru systemu plików ext do LV (gdy nie użyto -r)
e2fsck -f <urządzenie>sprawdzenie systemu plików ext przed zmianą rozmiaru
pvremove <urządzenie>usunięcie oznaczenia PV z partycji/dysku
losetup -fP <plik.img>podpięcie pliku obrazu jako urządzenia blokowego (środowisko testowe)
losetup -d <urządzenie>odpięcie loop device