Praca z LVM
LVM (Logical Volume Manager) to system zarządzania dyskami, który dodaje warstwę abstrakcji nad fizyczną pamięcią masową. Umożliwia elastyczne przydzielanie miejsca na dysku, zmianę rozmiaru online oraz tworzenie kopii zapasowych opartych na snapshotach. Jest szeroko stosowany jako warstwa pamięci masowej dla wirtualizacji. W systemach szyfrowanych LVM jest często umieszczany na urządzeniu zaszyfrowanym za pomocą LUKS, dzięki czemu jedno odblokowanie udostępnia całą grupę woluminów.
Ten artykuł obejmuje instalację LVM w systemie Linux, tworzenie Physical Volume, Volume Group i Logical Volume, zmianę ich rozmiaru, pracę ze snapshotami oraz korzystanie z thin provisioning.
Instalacja LVM
LVM jest domyślnie dostępny w większości dystrybucji Linux. Jeśli nie jest zainstalowany, należy zainstalować pakiet lvm2 za pomocą menedżera pakietów systemu.
W Debianie i Ubuntu:
sudo apt-get install lvm2
W RHEL, CentOS Stream, AlmaLinux i Rocky Linux:
sudo dnf install lvm2
Tworzenie Physical Volume
Physical Volume (PV) jest podstawowym elementem LVM na najniższym poziomie. Może nim być cały dysk (na przykład /dev/sdb) lub pojedyncza partycja (na przykład /dev/sdb1).
Użycie całego dysku jako PV upraszcza późniejsze operacje zmiany rozmiaru, ponieważ nie trzeba wcześniej powiększać znajdującej się na nim partycji. Użycie partycji jest preferowane, gdy dysk ma również przechowywać dane niezwiązane z LVM lub gdy inne narzędzia systemowe wymagają tablicy partycji.
Utwórz Physical Volume za pomocą pvcreate:
sudo pvcreate /dev/sdb
Zastąp /dev/sdb ścieżką do właściwego urządzenia blokowego.
Sprawdź wynik za pomocą pvdisplay:
sudo pvdisplay
Dane wyjściowe zawierają listę Physical Volume, którymi obecnie zarządza LVM, wraz z ich rozmiarem i informacjami o Volume Group.
Tworzenie Volume Group
Volume Group (VG) łączy jeden lub więcej Physical Volume w jeden wspólny pulą pamięci. Z tej puli tworzone są Logical Volume.
Utwórz Volume Group o nazwie vg0 z jednego Physical Volume:
sudo vgcreate vg0 /dev/sdb
Lub z kilku Physical Volume jednocześnie:
sudo vgcreate vg0 /dev/sdb /dev/sdc
Sprawdź wynik za pomocą vgdisplay:
sudo vgdisplay
Tworzenie Logical Volume
Logical Volume (LV) jest widoczny w systemie jako zwykłe urządzenie blokowe. Można go sformatować systemem plików i zamontować.
Utwórz Logical Volume lv0 o rozmiarze 10 GB wewnątrz Volume Group vg0:
sudo lvcreate -n lv0 -L 10G vg0
Opcja -n ustawia nazwę Logical Volume, a -L określa jego rozmiar.
Sprawdź wynik za pomocą lvdisplay:
sudo lvdisplay
Utwórz system plików na Logical Volume:
sudo mkfs.ext4 /dev/vg0/lv0
Utwórz punkt montowania i zamontuj system plików:
sudo mkdir -p /mnt/lv0 sudo mount /dev/vg0/lv0 /mnt/lv0
Nowy system plików będzie teraz dostępny w /mnt/lv0. Aby montować go automatycznie podczas uruchamiania systemu, dodaj odpowiedni wpis do /etc/fstab.
LVM udostępnia każdy Logical Volume za pomocą dwóch równoważnych ścieżek: /dev/<vg>/<lv> oraz /dev/mapper/<vg>-<lv>. W powyższym przykładzie są to /dev/vg0/lv0 i /dev/mapper/vg0-lv0. Obie ścieżki wskazują na to samo urządzenie; narzędzia i pliki konfiguracyjne mogą używać dowolnej z nich.
Aby wyświetlić pełną hierarchię PV/VG/LV wraz ze zwykłymi urządzeniami blokowymi, uruchom:
lsblk
Zmiana rozmiaru woluminów
LVM obsługuje zmianę rozmiaru online na każdym poziomie: Physical Volume, Volume Group i Logical Volume.
pvresize aktualizuje informacje LVM o Physical Volume po zmianie rozmiaru bazowego urządzenia blokowego (na przykład po zwiększeniu rozmiaru dysku wirtualnego w hypervisorze):
sudo pvresize /dev/sdb
vgextend dodaje Physical Volume do istniejącej Volume Group, zwiększając tym samym jej rozmiar:
sudo vgextend vg0 /dev/sdc
vgreduce usuwa Physical Volume z Volume Group:
sudo vgreduce vg0 /dev/sdc
lvresize zmienia rozmiar Logical Volume. Na przykład, aby dodać 5 GB do lv0:
sudo lvresize -L +5G /dev/vg0/lv0
Lub aby rozszerzyć Logical Volume i wykorzystać całe wolne miejsce w Volume Group:
sudo lvresize -l +100%FREE /dev/vg0/lv0
Zwróć uwagę na różnicę między -L (wielka litera) a -l (mała litera). Wersja z wielką literą przyjmuje rozmiar z sufiksem jednostki, takim jak M, G lub T. Wersja z małą literą przyjmuje liczbę extentów lub wartość procentową.
Zmiana rozmiaru Logical Volume nie zmienia rozmiaru znajdującego się na nim systemu plików. Użyj odpowiedniego narzędzia dla danego systemu plików. Dla ext2, ext3 i ext4:
sudo resize2fs /dev/vg0/lv0
Dla XFS uruchom xfs_growfs dla punktu montowania systemu plików.
W obsługiwanych systemach plików, w tym ext4 i XFS, lvextend z opcją -r zmienia rozmiar Logical Volume i systemu plików w jednym kroku:
sudo lvextend -r -L +5G /dev/vg0/lv0
Jest to najczęściej stosowana metoda zwiększania rozmiaru online.
Zmniejszanie Logical Volume wykonuje się w odwrotnej kolejności: najpierw należy zmniejszyć system plików, a dopiero potem Logical Volume. Wykonanie tego w odwrotnej kolejności powoduje skrócenie urządzenia bazowego, podczas gdy system plików nadal zakłada, że ma swój pierwotny rozmiar, co prowadzi do zniszczenia danych. W przypadku ext4 operacja musi być wykonana offline. Odmontuj system plików, uruchom sudo e2fsck -f /dev/vg0/lv0, zmniejsz system plików za pomocą sudo resize2fs /dev/vg0/lv0 <new_size>, zmniejsz Logical Volume do tego samego rozmiaru za pomocą sudo lvresize -L <new_size> /dev/vg0/lv0, a następnie ponownie zamontuj system plików. XFS w ogóle nie obsługuje zmniejszania. Jedynym sposobem na zmniejszenie systemu plików XFS jest wykonanie kopii zapasowej, utworzenie mniejszego systemu plików i przywrócenie danych.
Każde z powyższych poleceń obsługuje opcję --help, która wyświetla pełną listę dostępnych opcji.
Snapshoty LVM
Snapshot rejestruje stan Logical Volume w określonym momencie. Działa za pomocą mechanizmu copy-on-write: gdy oryginalny Logical Volume ulega zmianom, zmodyfikowane bloki są zapisywane w zarezerwowanej przestrzeni snapshotu, dzięki czemu snapshot nadal pokazuje pierwotny stan.
Snapshoty są przydatne do tworzenia kopii zapasowych spójnych po awarii działającego systemu plików oraz do testowania zmian, które można cofnąć poprzez usunięcie snapshotu. Kopie zapasowe spójne z aplikacją wymagają dodatkowej koordynacji, takiej jak zamrożenie systemu plików lub wstrzymanie aplikacji przed utworzeniem snapshotu.
Tworzenie snapshotu
Utwórz snapshot za pomocą lvcreate i opcji -s:
sudo lvcreate -L 1G -s -n myvolume_snap /dev/myvg/myvolume
Spowoduje to utworzenie snapshotu o nazwie myvolume_snap dla Logical Volume myvolume w Volume Group myvg, z zarezerwowanym 1 GB miejsca na zmiany. Wybierz rozmiar zarezerwowanej przestrzeni w zależności od ilości danych, które mogą się zmienić podczas istnienia snapshotu: snapshoty prawie nieużywanych woluminów wymagają niewiele miejsca, natomiast woluminy intensywnie zapisywane mogą wymagać znacznej części pierwotnego rozmiaru.
W przypadku długotrwałych snapshotów oraz zastosowań obejmujących dużą ich liczbę rozważ użycie thin snapshotów wewnątrz thin pool. Pobierają one miejsce ze współdzielonej puli na żądanie zamiast rezerwować z góry stałą ilość miejsca, co zwykle pozwala efektywniej wykorzystać przestrzeń.
Jeśli oryginalny Logical Volume zmieni się bardziej, niż snapshot jest w stanie pomieścić, snapshot stanie się nieważny, a zapisane w nim dane zostaną utracone. Rozmiar snapshotu powinien uwzględniać przewidywaną ilość zmian w całym okresie jego istnienia.
Korzystanie ze snapshotu
Snapshot można zamontować tak samo jak każdy inny Logical Volume. Do operacji związanych z tworzeniem kopii zapasowych i inspekcją zaleca się montowanie go w trybie tylko do odczytu, chyba że dostęp do zapisu jest rzeczywiście wymagany:
sudo mkdir -p /mnt/snapshot sudo mount -o ro /dev/myvg/myvolume_snap /mnt/snapshot
Po zamontowaniu snapshot można odczytywać w celu wykonania kopii zapasowej lub inspekcji.
Usuwanie snapshotu
Gdy snapshot nie jest już potrzebny, usuń go za pomocą lvremove:
sudo lvremove /dev/myvg/myvolume_snap
Usunięcie snapshotu zwalnia zarezerwowaną przez niego przestrzeń. Wszelkie dane zapisane bezpośrednio w snapshotcie, a nie w oryginalnym woluminie, zostaną utracone.
Aby przywrócić oryginalny wolumin do stanu zapisanego w snapshotcie, użyj lvconvert --merge zamiast lvremove:
sudo lvconvert --merge /dev/myvg/myvolume_snap
Po scaleniu snapshot zostanie wykorzystany i automatycznie usunięty. Jeśli oryginalny wolumin jest obecnie używany, scalanie zostanie odroczone do czasu jego następnej aktywacji.
Thin provisioning
Thin pool to specjalny rodzaj Logical Volume, który przydziela miejsce w pamięci masowej na żądanie. Logical Volume utworzone w jego obrębie (thin volume) mogą mieć zadeklarowany rozmiar większy niż rzeczywiście dostępna wolna przestrzeń w puli, a rzeczywiste miejsce jest zużywane tylko przez zapisane bloki.
Technologia ta jest szeroko stosowana w wirtualizacji, gdzie wiele dysków wirtualnych współdzieli jedną pulę pamięci masowej, ale rzadko wszystkie jednocześnie osiągają zadeklarowaną pojemność.
Tworzenie thin pool
Utwórz thin pool mythinpool o rozmiarze 50 GB w Volume Group myvg:
sudo lvcreate -L 50G -T -n mythinpool myvg
Opcja -L ustawia rozmiar puli, -T informuje lvcreate, aby utworzył thin pool, a -n ustawia nazwę puli. LVM przydziela miejsce dla puli z wolnego miejsca w Volume Group; na końcu polecenia można wskazać konkretne Physical Volume, jeśli pula ma zostać umieszczona na określonych urządzeniach.
Tworzenie thin volume
Utwórz thin volume mythinvolume o rozmiarze 10 GB wewnątrz mythinpool:
sudo lvcreate -V 10G -T myvg/mythinpool -n mythinvolume
Opcja -V ustawia wirtualny rozmiar thin volume, -T wskazuje thin pool, a -n ustawia nazwę nowego woluminu.
Korzystanie z thin volume
Thin volume jest używany tak samo jak każdy inny Logical Volume. Utwórz na nim system plików:
sudo mkfs.ext4 /dev/myvg/mythinvolume
Następnie thin volume można zamontować i używać jak zwykłego urządzenia blokowego.
Ponieważ thin pool mogą być nadmiernie alokowane, należy monitorować rzeczywiste wykorzystanie puli. Zarówno przestrzeń danych, jak i przestrzeń metadanych mogą zostać wyczerpane niezależnie od siebie i oba zasoby są krytyczne: jeśli thin pool zabraknie miejsca na dane lub metadane podczas zapisu do thin volume, operacje zapisu na tym woluminie zaczną kończyć się błędami.
Aktualne wykorzystanie przestrzeni danych i metadanych wszystkich Logical Volume, w tym thin pool, można sprawdzić za pomocą lvs:
sudo lvs -o +data_percent,metadata_percent
Gdy data_percent lub metadata_percent zbliży się do 100%, rozszerz thin pool za pomocą lvextend, zanim zostanie całkowicie zapełniony.
Lista poleceń
Najczęściej używane polecenia LVM pogrupowane według poziomów.
Physical Volume:
- pvcreate inicjalizuje urządzenie blokowe jako Physical Volume.
- pvdisplay wyświetla szczegółowe informacje o Physical Volume.
- pvs wyświetla zwartą tabelę podsumowującą Physical Volume.
- pvresize aktualizuje Physical Volume po zmianie rozmiaru bazowego urządzenia.
Volume Group:
- vgcreate tworzy Volume Group z jednego lub większej liczby Physical Volume.
- vgextend dodaje Physical Volume do Volume Group.
- vgreduce usuwa Physical Volume z Volume Group.
- vgdisplay wyświetla szczegółowe informacje o Volume Group.
- vgs wyświetla zwartą tabelę podsumowującą Volume Group.
Logical Volume:
- lvcreate tworzy Logical Volume.
- lvextend i lvresize zmieniają rozmiar Logical Volume.
- lvremove usuwa Logical Volume.
- lvconvert --merge scala snapshot z powrotem z jego woluminem źródłowym.
- lvdisplay wyświetla szczegółowe informacje o Logical Volume.
- lvs wyświetla zwartą tabelę podsumowującą Logical Volume.
Do codziennego użytku krótkie polecenia podsumowujące pvs, vgs i lvs są zazwyczaj wygodniejsze niż rozbudowane warianty *display. Każde polecenie obsługuje opcję --help, która wyświetla pełną listę dostępnych opcji.