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ót | Nazwa | Znaczenie |
|---|---|---|
| PV | Physical Volume | fizyczna partycja/dysk przygotowana pod LVM (pvcreate) |
| VG | Volume Group | grupa wolumenów – pula miejsca złożona z jednego lub wielu PV (vgcreate) |
| LV | Logical Volume | wolumin logiczny wydzielony z VG, na którym zakłada się system plików (lvcreate) |
Podstawowy przepływ pracy: pvcreate → vgcreate → lvcreate → mkfs.* → 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
losetupnie przeżywają restartu systemu — po restarcie trzeba je odtworzyć poleceniemlosetup -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 LV | Wielkość | System plików | Punkt montowania | Testowy plik |
|---|---|---|---|---|
warszawa | 700 MB | ext4 | /mnt/polska/warszawa | ~500 MB zer (/dev/zero) |
krakow | 200 MB | ext4 | /mnt/polska/krakow | 150 MB losowych danych (/dev/urandom) |
koszalin | 100 MB | ext4 | /mnt/polska/koszalin | 80 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 LV | Wielkość | System plików | Punkt montowania |
|---|---|---|---|
berlin | 300 MB | ext4 | /mnt/niemcy/berlin |
hamburg | 150 MB | ext4 | /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
| Polecenie | Działanie |
|---|---|
pvcreate <urządzenie> | inicjalizacja partycji/dysku jako wolumenu fizycznego (PV) |
pvs / pvdisplay / pvscan | lista/szczegóły wolumenów fizycznych |
vgcreate <nazwa> <PV...> | utworzenie grupy wolumenów (VG) |
vgextend <VG> <PV> | dodanie kolejnego PV do istniejącej grupy |
vgs / vgdisplay | lista/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 / lvscan | lista/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 |