LVM в линукс

Table of Contents

Что такое LVM в Linux?

LVM расшифровывается как Logical Volume Manager (Менеджер Логических Томов). Это механизм, предоставляющий альтернативный традиционному, основанному на разделах, способ управления системами хранения данных. В LVM вместо создания разделов вы создаёте логические тома, которые затем можно так же легко монтировать в вашу файловую систему, как и разделы диска.

Одно исключение из предыдущего утверждения: вы не можете использовать логические тома для /boot. Это потому что GRUB (самый распространённый загрузчик для Linux) не умеет читать с логических томов. Известная альтернатива GRUB — systemd-boot — в свою очередь читает только файловые системы vfat, так что это тоже не сработает.

Компоненты LVM

В LVM есть три основных компонента:

  1. Физические тома (Physical Volumes)
  2. Группы томов (Volume Groups)
  3. Логические тома (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. Физические тома
  2. Группы томов
  3. Логические тома

Пришло время рассмотреть их один за другим.

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, в виртуальной машине. Используйте его, попрактикуйтесь в некоторых командах из этой статьи, создайте новую группу томов, расширьте существующую — просто практикуйтесь