Что такое LVM в Linux?
LVM расшифровывается как Logical Volume Manager (Менеджер Логических Томов). Это механизм, предоставляющий альтернативный традиционному, основанному на разделах, способ управления системами хранения данных. В LVM вместо создания разделов вы создаёте логические тома, которые затем можно так же легко монтировать в вашу файловую систему, как и разделы диска.
Одно исключение из предыдущего утверждения: вы не можете использовать логические тома для /boot. Это потому что GRUB (самый распространённый загрузчик для Linux) не умеет читать с логических томов. Известная альтернатива GRUB — systemd-boot — в свою очередь читает только файловые системы vfat, так что это тоже не сработает.
Компоненты LVM
В LVM есть три основных компонента:
- Физические тома (Physical Volumes)
- Группы томов (Volume Groups)
- Логические тома (Logical Volumes)
Хотя список состоит из трёх компонентов, только два из них являются прямыми аналогами в традиционной системе разделов. Это отражено в таблице:
| Традиционная система разделов | LVM |
|---|---|
| Разделы (Partitions) | Логические тома |
| Диски (Disks) | Группы томов |
Физические тома не имеют прямого аналога, но я расскажу о них скоро.
Зачем использовать LVM?
Основное преимущество LVM — простота изменения размера логического тома или группы томов. Он абстрагирует все сложные части (разделы, «сырые» диски) и оставляет нам центральный пул хранения для работы.
Если вы когда-либо испытывали ужас от изменения размера раздела, вы захотите использовать LVM.
Подготовка лаборатории для практики
Эта статья — не просто теория. Я буду показывать реальные примеры команд, и лучший способ чему-то научиться — поработать с этим на практике. Для этого я рекомендую использовать виртуальную машину.
Чтобы помочь вам, я подготовил простой файл Vagrantfile, который вы можете использовать для развёртывания очень лёгкой виртуальной машины в VirtualBox. Эта виртуальная машина имеет три дополнительных диска, которые мы можем использовать для примеров команд ниже.
Создайте каталог где-нибудь в вашей файловой системе и сохраните следующее в файле с именем Vagrantfile в этом каталоге.
Vagrant.configure "2" do |config|
config.vm.box = "ubuntu/focal64"
config.vm.hostname = "lvm"
3.times {|i| config.vm.disk :disk, size: "5GB", name: "drive-#{i}"}
config.vm.provider :virtualbox do |machine|
machine.memory = 1024
machine.cpus = 1
machine.customize ["modifyvm", :id, "--cpuexecutioncap", "50"]
end
end
# vi: set ft=ruby
Или, если хотите, можете использовать wget или curl, чтобы скачать файл из моего gist.
wget https://gist.githubusercontent.com/debdutdeb/98ed1b6aef36885d07ce8247188dfd5e/raw/524259da5dfa2d8750883d01c8159829729e224d/Vagrantfile
Убедитесь, что у вас установлены Vagrant и VirtualBox.
Как только Vagrantfile готов, установите переменную окружения VAGRANT_EXPERIMENTAL в значение disks.
export VAGRANT_EXPERIMENTAL=disks
Наконец, запустите виртуальную машину с помощью следующей команды (убедитесь, что вы находитесь в том же каталоге, что и Vagrantfile):
vagrant up
Когда машина запустится, вы можете использовать vagrant ssh для подключения к ней по SSH и запуска примеров команд из этой статьи.
Не забудьте выполнить vagrant destroy из того же каталога, что и Vagrantfile, когда закончите.
Установка LVM
Прежде чем использовать какие-либо команды, вам нужно установить пакет lvm2. Он должен быть предустановлен в большинстве современных дистрибутивов, особенно основанных на Ubuntu. Но всё же, я должен был упомянуть об этом, прежде чем двигаться дальше. Чтобы установить lvm2, обратитесь к документации вашего дистрибутива.
Практика с LVM
Для этой практической демонстрации я создал виртуальную машину с корневым хранилищем 40G (неважно) и тремя внешними дисками по 5G. Размер этих дисков произвольный.
vagrant@lvm:~$ lsblk -o name,size,fstype
NAME SIZE FSTYPE
loop0 55.5M squashfs
loop1 32.3M squashfs
loop2 70.4M squashfs
sda 40G
└─sda1 40G ext4
sdb 10M iso9660
sdc 5G
sdd 5G
sde 5G
Как видите, устройства, которые я буду использовать — это sdc, sdd и sde.
Помните, я говорил, что в LVM есть три основных компонента?
- Физические тома
- Группы томов
- Логические тома
Пришло время рассмотреть их один за другим.
1. Физические тома (Physical Volumes)
Самое первое, что нужно знать о LVM — это физические тома. Физические тома — это «сырьё» или строительные блоки, которые используются для достижения абстракции логических томов. Проще говоря, физические тома — это логическая единица системы LVM.
Физическим томом может быть что угодно: «сырой» диск или раздел диска. Создание и инициализация физического тома — это одно и то же. Оба означают, что вы просто подготавливаете строительные блоки (т.е. разделы, диски) для дальнейших операций. Это станет понятнее через мгновение.
Утилиты: Все утилиты для управления физическими томами начинаются с букв pv (от Physical Volume). Например, pvcreate, pvchange, pvs, pvdisplay и т.д.
[!WARNING]
Всё, что упомянуто после этого предупреждения, является деструктивным. Если вы не используете виртуальное окружение или облачный сервер, на котором не хранятся важные данные, или данные не могут быть достигнуты случайно, я советую вам остановиться прямо сейчас.
Создание физических томов
Вы можете создать физический том, используя «сырой» неразделённый диск или сами разделы.
Как я упоминал ранее, к моей виртуальной машине подключены три внешних диска, начнём с /dev/sdc.
Мы используем команду pvcreate для создания физического тома. Просто передайте ей имя устройства и ничего больше.
sudo pvcreate /dev/sdc
Вы должны увидеть что-то вроде этого:
vagrant@lvm:~$ sudo pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created.
Далее я разделю /dev/sdd на равные части. Используйте любой инструмент: cfdisk, parted, fdisk и т.д. Есть много инструментов для этой задачи.
sudo cfdisk /dev/sdb
vagrant@lvm:~$ lsblk -o name,size,fstype | grep sdd
sdd 5G
├─sdd1 2.5G
└─sdd2 2.5G
Теперь вы можете быстро создать ещё два физических тома из этих двух разделов одним действием, передав оба устройства в pvcreate одновременно.
sudo pvcreate /dev/sdd1 /dev/sdd2
Взгляните:
vagrant@lvm:~$ sudo pvcreate /dev/sdd1 /dev/sdd2
Physical volume "/dev/sdd1" successfully created.
Physical volume "/dev/sdd2" successfully created.
Вывод списка доступных физических томов
Есть три команды, которые можно использовать для получения списка доступных физических томов: pvscan, pvs и pvdisplay. Как правило, этим командам ничего не нужно передавать.
pvscan:
vagrant@lvm:~$ sudo pvscan
PV /dev/sdc lvm2 [5.00 GiB]
PV /dev/sdd1 lvm2 [2.50 GiB]
PV /dev/sdd2 lvm2 [<2.50 GiB]
Total: 3 [<10.00 GiB] / in use: 0 [0 ] / in no VG: 3 [<10.00 GiB]
pvs:
vagrant@lvm:~$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/sdc lvm2 --- 5.00g 5.00g
/dev/sdd1 lvm2 --- 2.50g 2.50g
/dev/sdd2 lvm2 --- <2.50g <2.50g
pvdisplay:
vagrant@lvm:~$ sudo pvdisplay
"/dev/sdc" is a new physical volume of "5.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc
VG Name
PV Size 5.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID SzSkdD-xKYa-4y7P-teyU-481p-uiQ8-qieMJJ
"/dev/sdd1" is a new physical volume of "2.50 GiB"
--- NEW Physical volume ---
PV Name /dev/sdd1
VG Name
PV Size 2.50 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 553Iy4-JJ21-LfIw-udtO-j9Cd-7gFS-iXXFVS
"/dev/sdd2" is a new physical volume of "<2.50 GiB"
--- NEW Physical volume ---
PV Name /dev/sdd2
VG Name
PV Size <2.50 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID bf7ghn-QkPm-EUdp-GdyW-shMG-5sMn-VhNtYB
Как видите, помимо простого вывода списка физических томов эти команды также предоставляют кучу другой информации об этих томах.
Удаление физического тома
Вы можете удалить физический том с помощью команды pvremove. Так же, как и pvcreate, просто передайте устройства (которые инициализированы как физические тома) в команду pvremove.
Для демонстрации я удалю /dev/sdd2 из списка.
sudo pvremove /dev/sdd2
Вывод должен быть идентичен этому:
vagrant@lvm:~$ sudo pvremove /dev/sdd2
Labels on physical volume "/dev/sdd2" successfully wiped.
Теперь выведите список физических томов с помощью sudo pvs:
vagrant@lvm:~$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/sdc lvm2 --- 5.00g 5.00g
/dev/sdd1 lvm2 --- 2.50g 2.50g
/dev/sdd2 больше нет.
2. Группы томов (Volume Groups)
Группы томов — это коллекции физических томов. Это следующий уровень абстракции в LVM. Группы томов — это пул хранения, объединяющий ёмкость хранения нескольких устройств «сырого» хранения.
Утилиты: Все имена утилит для групп томов начинаются с vg (от Volume Group), например, vgcreate, vgs, vgrename и т.д.
Создание групп томов
Группы томов создаются с помощью команды vgcreate. Первый аргумент для vgcreate — это имя, которое вы хотите дать этой группе томов, а остальные — список физических томов, которые будут обеспечивать этот пул хранения.
sudo vgcreate lvm_tutorial /dev/sdc /dev/sdd1
Пример:
vagrant@lvm:~$ sudo vgcreate lvm_tutorial /dev/sdc /dev/sdd1
Volume group "lvm_tutorial" successfully created
Вывод списка групп томов
Вывод списка групп томов аналогичен выводу списка физических томов, вы можете использовать разные команды с разным уровнем детализации: vgdisplay, vgscan и vgs.
Лично я предпочитаю команду vgs, sudo vgs:
vagrant@lvm:~$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
lvm_tutorial 2 0 0 wz--n- 7.49g 7.49g
vgscan:
vagrant@lvm:~$ sudo vgscan
Found volume group "lvm_tutorial" using metadata type lvm2
vgdisplay:
vagrant@lvm:~$ sudo vgdisplay
--- Volume group ---
VG Name lvm_tutorial
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 7.49 GiB
PE Size 4.00 MiB
Total PE 1918
Alloc PE / Size 0 / 0
Free PE / Size 1918 / 7.49 GiB
VG UUID LYVE9P-vY0G-OAW6-an8q-yfBx-rrB1-YU61m1
Вывод списка физических томов, подключённых к группе томов
Вы можете вывести список всех физических томов, подключённых к определённой группе томов, используя следующую команду:
sudo pvdisplay -S vgname=<volume_group_name> -C -o pv_name
Пример:
vagrant@lvm:~$ sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name
PV
/dev/sdc
/dev/sdd1
Вы также можете получить количество физических томов.
sudo vgdisplay -S vgname=<volume_group_name> -C -o pv_count
Пример:
vagrant@lvm:~$ sudo vgdisplay -S vgname=lvm_tutorial -C -o pv_count
#PV
3
Расширение группы томов
Расширение группы томов означает добавление дополнительных физических томов к группе томов. Для этого используется команда vgextend. Синтаксис прост:
vgextend <volume_group> <physical_volume1> <physical_volume2> ....
Давайте расширим нашу группу томов lvm_tutorial, добавив /dev/sdd2.
sudo vgextend lvm_tutorial /dev/sdd2
Обратите внимание на вывод:
vagrant@lvm:~$ sudo vgextend lvm_tutorial /dev/sdd2
Physical volume "/dev/sdd2" successfully created.
Volume group "lvm_tutorial" successfully extended
В разделе о физических томах мы закончили удалением /dev/sdd2 как физического тома, но раздел или «сырой» диск должны быть инициализированы как физический том, иначе LVM не сможет управлять им как частью группы томов. Поэтому vgextend сначала подготавливает /dev/sdd2, прежде чем добавить его в группу томов.
Теперь выведите список физических томов, подключённых к этой группе томов, просто чтобы убедиться.
sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name
Вывод:
vagrant@lvm:~$ sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name
PV
/dev/sdc
/dev/sdd1
/dev/sdd2
/dev/sdd2 теперь в списке, как и ожидалось.
Уменьшение группы томов
Подобно тому, как расширение группы томов означает добавление другого физического тома, уменьшение означает удаление одного или нескольких физических томов.
Мы используем команду vgreduce для этого. Общий синтаксис следующий:
vgreduce <vgname> <physical_volume1> <physical_volume2> ....
Давайте удалим физические тома /dev/sdc и /dev/sdd1.
sudo vgreduce lvm_tutorial /dev/sdc /dev/sdd1
Пример:
vagrant@lvm:~$ sudo vgreduce lvm_tutorial /dev/sdc /dev/sdd1
Removed "/dev/sdc" from volume group "lvm_tutorial"
Removed "/dev/sdd1" from volume group "lvm_tutorial"
Если группа томов имеет какие-либо активные логические тома, вы не сможете уменьшить её таким образом.
Выведите список физических томов снова.
sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name
Вывод:
vagrant@lvm:~$ sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name
PV
/dev/sdd2
Эти два физических тома удалены.
Теперь, ради оставшейся части статьи, добавьте эти два физических тома обратно.
sudo vgextend lvm_tutorial /dev/sdc /dev/sdd1
Удаление группы томов
Вы можете удалить группу томов с помощью команды vgremove.
sudo vgremove lvm_tutorial
Не запускайте эту команду сейчас, иначе вам придётся воссоздавать группу томов. Если хотите её протестировать, запустите в самом конце этой статьи.
3. Логические тома (Logical Volumes)
С этим вы будете работать в основном. Логический том похож на раздел, но вместо того, чтобы находиться поверх «сырого» диска, он находится поверх группы томов. Вы можете:
- Отформатировать логический том любой файловой системой.
- Смонтировать его в любом месте вашей файловой системы.
В этом разделе вы узнаете:
- Как создавать логические тома.
- Общие операции с логическим томом.
- Изменение размера логического тома.
- Удаление логического тома.
Утилиты: Все имена утилит для логических томов начинаются с lv (от Logical Volume). Например, lvcreate, lvs, lvreduce и т.д. (Также vgcreate, vgs, vgrename и т.д.)
Создание логических томов
Логические тома создаются с помощью команды lvcreate. Часто используемый синтаксис выглядит следующим образом:
sudo lvcreate -L <size> -n <lvname> <vgname>
Позвольте мне разобрать его для вас:
- Опция
-Lуказывает размер нового логического тома, вы можете использовать любое целое число с «GB», «MB» или «KB» в конце. Например, «1GB». - Опция
-nпредназначена для именования этого логического тома. - Наконец, вам нужно передать имя группы томов, частью которой будет этот логический том. Поэтому, указывая размер логического тома, убедитесь, что в группе томов есть доступное пространство.
Запустите следующую команду на виртуальной машине:
sudo lvcreate -L 5GB -n lv1 lvm_tutorial
Пример вывода:
vagrant@lvm:~$ sudo lvcreate -L 5GB -n lv1 lvm_tutorial
Logical volume "lv1" created.
Общие операции с логическим томом
Как я уже говорил, вы можете создать файловую систему на логическом томе, а также смонтировать его в любом месте файловой системы.
После создания логический том можно найти по пути /dev/<vgname>/<lvname>. Например, в нашем случае том будет находиться в /dev/lvm_tutorial/lv1.
vagrant@lvm:~$ ls -l /dev/lvm_tutorial/lv1
lrwxrwxrwx 1 root root 7 May 17 02:09 /dev/lvm_tutorial/lv1 -> ../dm-0
Теперь вы можете использовать его как любой раздел. Отформатировать его в ext4:
sudo mkfs.ext4 /dev/lvm_tutorial/lv1
Смонтировать его в каком-нибудь месте вашей текущей структуры каталогов, например, в /mnt:
sudo mount -t ext4 /dev/lvm_tutorial/lv1 /mnt
Изменение размера логического тома
Вы можете расширить логический том с помощью команды lvextend и уменьшить его размер с помощью команды lvreduce. Или вы можете использовать одну команду lvresize для выполнения обеих задач.
Сначала давайте посмотрим, осталось ли в группе томов свободное пространство или нет.
sudo vgs -S vgname=lvm_tutorial -o vg_free
Вывод:
vagrant@lvm:~$ sudo vgs -S vgname=lvm_tutorial -o vg_free
VFree
<4.99g
Согласно выводу, у меня осталось немного места, поэтому давайте увеличим размер тома на 2GB.
Помните, логический том всё ещё смонтирован в /mnt.
vagrant@lvm:~$ mount | grep '/mnt'
/dev/mapper/lvm_tutorial-lv1 on /mnt type ext4 (rw,relatime)
Используйте следующую команду для изменения размера тома:
sudo lvresize -L +2GB lvm_tutorial/lv1
Общий синтаксис примерно такой:
lvresize -L [+|-][Size] <vgname>/<lvname>
Символ + или - после -L зависит от того, пытаетесь ли вы увеличить или уменьшить размер тома соответственно.
После увеличения размера тома файловую систему также необходимо изменить. Для ext4 команда — resize2fs.
sudo resize2fs /dev/lvm_tutorial/lv1
Вывод:
vagrant@lvm:~$ sudo resize2fs /dev/lvm_tutorial/lv1
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/lvm_tutorial/lv1 is mounted on /mnt; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/lvm_tutorial/lv1 is now 1835008 (4k) blocks long.
Не все файловые системы поддерживают «горячее» изменение размера, Ext4 и XFS — одни из поддерживаемых. Я рекомендую придерживаться их.
Уменьшение размера логического тома — задача немного более сложная, и я не буду рассказывать об этом здесь, в этой статье. Я уменьшу размер этого тома на 1GB.
Удаление логического тома
Логический том удаляется командой lvremove. Синтаксис команды следующий:
lvremove <vgname>/<lvname>
Запустите эту команду на виртуальной машине:
sudo lvremove lvm_tutorial/lv1
Вывод:
vagrant@lvm:~$ sudo lvremove lvm_tutorial/lv1
Do you really want to remove and DISCARD active logical volume lvm_tutorial/lv1? [y/n]: y
Logical volume "lv1" successfully removed
Заключение
Существует множество других операций, которые можно выполнять с логическими томами, физическими томами и группами томов, но невозможно уместить всё это в одну статью.
Я оставил вам ещё один диск, /dev/sde, в виртуальной машине. Используйте его, попрактикуйтесь в некоторых командах из этой статьи, создайте новую группу томов, расширьте существующую — просто практикуйтесь