Робота з LVM
LVM (Logical Volume Manager) — це система керування дисками, яка додає рівень абстракції над фізичним сховищем. Вона дає змогу гнучко розподіляти дисковий простір, змінювати його розмір без зупинки системи та створювати резервні копії на основі знімків. LVM широко використовується як рівень зберігання для віртуалізації. У зашифрованих системах LVM часто розміщується поверх пристрою, зашифрованого за допомогою LUKS, тому після одного розблокування стає доступною вся група томів.
У цій статті розглядаються встановлення LVM у Linux, створення фізичних томів, груп томів і логічних томів, зміна їхніх розмірів, робота зі знімками та використання thin provisioning.
Встановлення LVM
LVM за замовчуванням входить до більшості дистрибутивів Linux. Якщо він відсутній, встановіть пакет lvm2 за допомогою системного менеджера пакетів.
У Debian та Ubuntu:
sudo apt-get install lvm2
У RHEL, CentOS Stream, AlmaLinux та Rocky Linux:
sudo dnf install lvm2
Створення фізичного тому
Фізичний том (PV) є базовим будівельним блоком LVM на найнижчому рівні. Це може бути весь диск (наприклад, /dev/sdb) або окремий розділ (наприклад, /dev/sdb1).
Використання цілого диска як PV спрощує подальші операції зміни розміру, оскільки спочатку не потрібно збільшувати розташований на ньому розділ. Використання розділу є кращим, якщо на диску також мають зберігатися дані, не пов'язані з LVM, або якщо інші системні інструменти очікують наявність таблиці розділів.
Створіть фізичний том за допомогою pvcreate:
sudo pvcreate /dev/sdb
Замініть /dev/sdb шляхом до вашого блокового пристрою.
Перевірте результат за допомогою pvdisplay:
sudo pvdisplay
У виведенні буде перелічено фізичні томи, якими наразі керує LVM, разом з їхнім розміром та інформацією про групу томів.
Створення групи томів
Група томів (VG) об'єднує один або кілька фізичних томів в єдиний пул сховища. З цього пулу створюються логічні томи.
Створіть групу томів з назвою vg0 з одного фізичного тому:
sudo vgcreate vg0 /dev/sdb
Або одразу з кількох фізичних томів:
sudo vgcreate vg0 /dev/sdb /dev/sdc
Перевірте результат за допомогою vgdisplay:
sudo vgdisplay
Створення логічного тому
Логічний том (LV) відображається в системі як звичайний блоковий пристрій. На ньому можна створити файлову систему та змонтувати її.
Створіть логічний том lv0 розміром 10 ГБ усередині групи томів vg0:
sudo lvcreate -n lv0 -L 10G vg0
Прапорець -n задає ім'я логічного тому, а -L — його розмір.
Перевірте результат за допомогою lvdisplay:
sudo lvdisplay
Створіть файлову систему на логічному томі:
sudo mkfs.ext4 /dev/vg0/lv0
Створіть точку монтування та змонтуйте файлову систему:
sudo mkdir -p /mnt/lv0 sudo mount /dev/vg0/lv0 /mnt/lv0
Нова файлова система тепер доступна в /mnt/lv0. Щоб автоматично монтувати її під час завантаження, додайте відповідний запис до /etc/fstab.
LVM надає кожен логічний том за двома еквівалентними шляхами: /dev/<vg>/<lv> та /dev/mapper/<vg>-<lv>. У наведеному вище прикладі це /dev/vg0/lv0 та /dev/mapper/vg0-lv0. Обидва шляхи вказують на один і той самий пристрій; інструменти та конфігураційні файли можуть використовувати будь-який із них.
Щоб переглянути повну ієрархію PV/VG/LV разом зі звичайними блоковими пристроями, виконайте:
lsblk
Зміна розміру томів
LVM підтримує зміну розміру без зупинки системи на кожному рівні: фізичних томів, груп томів і логічних томів.
pvresize оновлює представлення LVM про фізичний том після зміни розміру базового блокового пристрою (наприклад, після збільшення віртуального диска в гіпервізорі):
sudo pvresize /dev/sdb
vgextend додає фізичний том до наявної групи томів, збільшуючи її розмір:
sudo vgextend vg0 /dev/sdc
vgreduce видаляє фізичний том із групи томів:
sudo vgreduce vg0 /dev/sdc
lvresize змінює розмір логічного тому. Наприклад, щоб додати 5 ГБ до lv0:
sudo lvresize -L +5G /dev/vg0/lv0
Або щоб розширити логічний том і використати весь вільний простір у групі томів:
sudo lvresize -l +100%FREE /dev/vg0/lv0
Зверніть увагу на різницю між -L (велика літера) та -l (мала літера). Варіант із великою літерою приймає розмір із суфіксом одиниці, наприклад M, G або T. Варіант із малою літерою приймає кількість екстентів або відсоток.
Зміна розміру логічного тому не змінює розмір файлової системи на ньому. Використовуйте відповідний інструмент для конкретної файлової системи. Для ext2, ext3 та ext4:
sudo resize2fs /dev/vg0/lv0
Для XFS виконайте xfs_growfs для точки монтування файлової системи.
Для підтримуваних файлових систем, включно з ext4 та XFS, команда lvextend із прапорцем -r змінює розмір логічного тому та файлової системи за один крок:
sudo lvextend -r -L +5G /dev/vg0/lv0
Це найпоширеніший спосіб збільшення розміру без зупинки системи.
Зменшення логічного тому виконується у зворотному порядку: спочатку потрібно зменшити файлову систему і лише після цього логічний том. Якщо зробити навпаки, базовий пристрій буде обрізаний у той час, коли файлова система все ще вважає, що має початковий розмір, що призводить до знищення даних. Для ext4 операція виконується офлайн. Відмонтуйте файлову систему, виконайте sudo e2fsck -f /dev/vg0/lv0, зменште файлову систему за допомогою sudo resize2fs /dev/vg0/lv0 <new_size>, зменште логічний том до такого самого розміру за допомогою sudo lvresize -L <new_size> /dev/vg0/lv0, а потім знову змонтуйте файлову систему. XFS взагалі не підтримує зменшення розміру; єдиний спосіб зробити файлову систему XFS меншою — створити резервну копію, створити файлову систему меншого розміру та відновити дані.
Кожна з наведених вище команд підтримує --help для отримання повного списку параметрів.
Знімки LVM
Знімок фіксує стан логічного тому в певний момент часу. Він працює за механізмом copy-on-write: у міру зміни початкового логічного тому змінені блоки зберігаються в зарезервованому просторі знімка, тому знімок продовжує відображати початковий стан.
Знімки корисні для створення резервних копій працюючої файлової системи, узгоджених зі станом на момент збою, а також для тестування змін, які можна скасувати шляхом видалення знімка. Резервні копії, узгоджені з додатком, потребують додаткової координації, наприклад заморожування файлової системи або переведення додатка в стан очікування перед створенням знімка.
Створення знімка
Створіть знімок за допомогою lvcreate та прапорця -s:
sudo lvcreate -L 1G -s -n myvolume_snap /dev/myvg/myvolume
Це створить знімок myvolume_snap логічного тому myvolume у групі томів myvg, зарезервувавши 1 ГБ для змін. Вибирайте розмір зарезервованого простору залежно від обсягу даних, які, як очікується, зміняться протягом існування знімка: для майже неактивних томів потрібно мало місця, тоді як для томів з інтенсивним записом може знадобитися значна частина початкового розміру.
Для довготривалих знімків і сценаріїв із великою кількістю знімків розгляньте використання thin-знімків усередині thin pool. Вони отримують простір зі спільного пулу в міру потреби замість попереднього резервування фіксованого обсягу, що зазвичай є ефективнішим з точки зору використання простору.
Якщо початковий логічний том зміниться більше, ніж може вмістити знімок, знімок стане недійсним, а захоплені ним дані будуть втрачені. Розмір знімка має враховувати очікуваний обсяг змін протягом усього періоду його існування.
Використання знімка
Знімок можна змонтувати як будь-який інший логічний том. Для резервного копіювання та перевірки монтуйте його лише для читання, якщо доступ на запис справді не потрібен:
sudo mkdir -p /mnt/snapshot sudo mount -o ro /dev/myvg/myvolume_snap /mnt/snapshot
Після монтування знімок можна читати для резервного копіювання або перевірки.
Видалення знімка
Коли знімок більше не потрібен, видаліть його за допомогою lvremove:
sudo lvremove /dev/myvg/myvolume_snap
Видалення знімка звільняє зарезервований ним простір. Будь-які дані, записані безпосередньо у знімок, а не в початковий том, будуть втрачені.
Щоб повернути початковий том до стану, зафіксованого знімком, використовуйте lvconvert --merge замість lvremove:
sudo lvconvert --merge /dev/myvg/myvolume_snap
Після злиття знімок буде використаний і автоматично видалений. Якщо початковий том зараз використовується, злиття буде відкладено до наступної активації тому.
Thin provisioning
Thin pool — це спеціальний тип логічного тому, який виділяє простір для зберігання за потреби. Логічні томи, створені всередині нього (thin volumes), можуть мати заявлений розмір, що перевищує фактично доступний вільний простір у пулі, а реальне місце споживають лише записані блоки.
Ця технологія широко використовується у віртуалізації, де багато віртуальних дисків спільно використовують один пул сховища, але рідко всі одночасно досягають заявленої ємності.
Створення thin pool
Створіть thin pool mythinpool розміром 50 ГБ у групі томів myvg:
sudo lvcreate -L 50G -T -n mythinpool myvg
Прапорець -L задає розмір пулу, -T вказує lvcreate створити thin pool, а -n задає його ім'я. LVM виділяє пул із вільного простору групи томів; наприкінці команди можна вказати конкретні фізичні томи, якщо пул потрібно розмістити на певних пристроях.
Створення thin volume
Створіть thin volume mythinvolume розміром 10 ГБ усередині mythinpool:
sudo lvcreate -V 10G -T myvg/mythinpool -n mythinvolume
Прапорець -V задає віртуальний розмір thin volume, -T вказує thin pool, а -n задає ім'я нового тому.
Використання thin volume
Thin volume використовується так само, як будь-який інший логічний том. Створіть на ньому файлову систему:
sudo mkfs.ext4 /dev/myvg/mythinvolume
Після цього thin volume можна змонтувати та використовувати як звичайний блоковий пристрій.
Оскільки thin pool може використовувати overcommit, необхідно контролювати фактичне використання пулу. Простір даних і простір метаданих можуть вичерпуватися незалежно один від одного, і обидва є критичними: якщо thin pool під час запису в thin volume вичерпає простір даних або метаданих, операції запису до цього тому почнуть завершуватися з помилками.
Поточне використання простору даних і метаданих усіх логічних томів, включно з thin pool, можна перевірити за допомогою lvs:
sudo lvs -o +data_percent,metadata_percent
Коли значення data_percent або metadata_percent наближається до 100, розширте thin pool за допомогою lvextend, перш ніж він буде повністю заповнений.
Довідник команд
Поширені команди LVM, згруповані за рівнями.
Фізичні томи:
- pvcreate ініціалізує блоковий пристрій як фізичний том.
- pvdisplay показує детальну інформацію про фізичні томи.
- pvs показує компактну зведену таблицю фізичних томів.
- pvresize оновлює фізичний том після зміни розміру базового пристрою.
Групи томів:
- vgcreate створює групу томів з одного або кількох фізичних томів.
- vgextend додає фізичний том до групи томів.
- vgreduce видаляє фізичний том із групи томів.
- vgdisplay показує детальну інформацію про групи томів.
- vgs показує компактну зведену таблицю груп томів.
Логічні томи:
- lvcreate створює логічний том.
- lvextend та lvresize змінюють розмір логічного тому.
- lvremove видаляє логічний том.
- lvconvert --merge об'єднує знімок назад із його вихідним томом.
- lvdisplay показує детальну інформацію про логічні томи.
- lvs показує компактну зведену таблицю логічних томів.
Для повсякденного використання короткі команди pvs, vgs та lvs зазвичай зручніші за докладні варіанти *display. Кожна команда підтримує --help для отримання повного списку параметрів.