Использование LVM облегчает конфигурирование дискового пространства. Если нужно добавить больше дискового пространства в LVM, достаточно расширить ваш LVM раздел (LVM volume) за счет свободного места в группе LVM (LVM group).

Также если вдруг вы заметите что один их ваших физических дисков в LVM group выходит из строя вы можете добавить новый физический жёсткий диск в LVM group и перенести данные на новый жесткий диск. В целом можно сделать это и без LVM копируя всё на внешний носитель, после заменить диск и вернуть все данные назад. Но в таком случае вам придётся останавливать сервисы, которые пишут на этот диск.

Еще один плюс — это возможность объединить большое количество жестких дисков в один. Например, у вас есть 4 диска по 2ТБ и вам надо отдать их все под базы данных при этом гораздо проще будет если бд будут хранится на одном разделе, а не на 4. Вот в такой ситуации вы объединяете все 4 диска и получаете раздел размером в 8 ТБ.

LVM даёт возможность делать snapshots. Что означает что вы можете сделать снимок раздела на определённый момент и уже по необходимости откатится к нему в будущем. Особенно полезно для всяких экспериментов.

Также в LVM реализованы все уровни RAID, но считается что это не совсем прямое предназначение LVM.

lvm base scheme

PD/Physical devices

Physical devices - это физические устройства, которые предоставляются для LVM group и где хранятся данные. Под Physical devices подразумевается разделы жд, физические жд, RAID массивы, SAN устройства.

Устройства должны быть инициализированы как LVM Physical volume чтобы их можно было использовать в LVM.

Physical devices

PV/Physical volumes (Физические тома)

Physical volumes - это базовое физическое хранилище используемое в LVM. Первым делом нужно инициализировать ваше устройство хранения данных как Physical volume для использования в LVM.

Инструменты LVM сегментируют Physical volumes на физические экстенты (Physical extends) которые представляют из себя небольшие фрагменты данных, которые действуют как минимальный блок хранения.

По сути является специальной файловой системой для LVM, где помимо прочего хранятся метаданные указывающие к какой VG относится устройство.

У каждого Physical volume есть свой супер-блок где хранятся метаданные о VG, который находится в начале диска.

Physical volumes

VG/Volume groups (Группа томов)

Volume groups - это пулы хранения (Storage pools), состоящие из одного или множества Physical volume. Т.е. можно сказать что Volume group то же самое что и LUN в схд, или одно общее единое пространство. Один Physical volume может быть назначен только одной Volume group. Может состоять из любого количества Physical Volumes и также расширятся в будущем. Хранит метаданные о том в каком PV находятся Physical extends и в каком Logical Volume находятся Logical extends и сопоставляет их.

Если разбирать преимущества LVM которые я описывал ранее можно сказать что как раз благодаря VG мы и получаем 4 диска объединённые в один, размером 8ТБ.

Volume groups

LV/Logical Volumes (Логические тома)

Logical Volumes - это набор из Logical extends, который соответствует Physical extends и имеют одинаковый размер. Logical extends сопоставляются с Physical extends и хранятся там же и не обязательно что все Logical extends одного LV хранятся на Physical extends одного PV. Также можно расширять LV благодаря наличию свободны Physical extends в PV. Каждый кусок Logical extends можно перенести на другой Physical extends, как раз имеется в виду ситуация с заменой диска не останавливая работу приложений.

Получается при использовании обычных разделов вы не можете создать раздел который начинается в начале диска, потом прерывается на середине и потом снова продолжается в конце. В LVM же благодаря Logical extends и Physical extends такое возможно.

Именно их мы и монтируем в ОС как разделы, создаются они из пространства VG.

Logical Volumes

Создаём LVM

После всей теории мы наконец переходим к практике.

Подготовка PD

Используя parted, о котором я писал тут создаём новые разделы для LVM. При использовании раздела для LVM тип раздела должен быть Linux LVM.

  1. Выводим список всех дисков
    sudo parted -l
    
  2. Создаём таблицу разделов и раздел
sudo parted /dev/sdd mklabel gpt
sudo parted /dev/sde mklabel gpt
sudo parted /dev/sdf mklabel gptsudo

sudo parted  /dev/sdd mkpart primary 1049kB 3220MB
sudo parted  /dev/sde mkpart primary 1049kB 3220MB
sudo parted  /dev/sdf mkpart primary 1049kB 3220MB

sudo parted /dev/sdd print
Number  Start   End     Size    File system  Name     Flags
 1      1049kB  3220MB  3219MB               primary
sudo parted /dev/sdd set 1 lvm on
sudo parted /dev/sde set 1 lvm on
sudo parted /dev/sdf set 1 lvm on

sudo parted /dev/sdd print
Number  Start   End     Size    File system  Name     Flags
 1      1049kB  3220MB  3219MB               primary  lvm

set 1 lvm on - это просто маркер чтобы пользователю ОС было понятно, что это LVM диск. Ядро же понимает, что это LVM благодаря типу раздела в таблице разделов. Например Коды типов разделов для mbr и GUID для gpt. Но при использовании LVM тип раздела прописывается в супер-блоке самого раздела и даже если в MBR или GPT стоит другой тип, то ядро выберет тип, который в супер-блоке, т.е. LVM. Про MBR и GPT я также писал ранее.

Создаём PV

Для этого используем pvcreate и указываем наши PD. Команда pvcreate делит наш PV на Physical extends, по умолчанию блоки по 4Мб.

sudo pvcreate /dev/sdd1 /dev/sde1 /dev/sdf1
sudo pvdisplay

Создаём VG

Для этого используем команду vgcreate где указываем название группы и наши PV. Если делать аналогии, то по сути вы получаете после vgcreate один большой HDD.

sudo vgcreate VG01 /dev/sdd1 /dev/sde1 /dev/sdf1
sudo vgdisplay
  --- Volume group ---
  VG Name               VG01
  System ID
  Format                lvm2
  Metadata Areas        3
  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                3
  Act PV                3
  VG Size               <8.99 GiB
  PE Size               4.00 MiB
  Total PE              2301
  Alloc PE / Size       0 / 0
  Free  PE / Size       2301 / <8.99 GiB
  VG UUID               33R3E3-wMFp-5xKi-HdVr-cKir-6efI-Fv2qMH

Команда создаст VG с именем VG01 и размером 6Гб.

Создаём LV

LV создаём используя команду lvcreate и указываем имя LV и его размеры и в конце имя VG. При этом используя опцию -L вы задаёте размер в байтах, а при использовании -l в Physical extends.

sudo lvcreate -n LV01 -l 1000 VG01
sudo lvcreate -n LV02 -L 700M VG01
sudo lvdisplay
 --- Logical volume ---
  LV Path                /dev/VG01/PV01
  LV Name                PV01
  VG Name                VG01
  LV UUID                HAxIpl-uJxf-YxdI-QIvT-3vbK-MHCi-ZmhjY6
  LV Write Access        read/write
  LV Creation host, time mylab-vm-4.dc2.my.local, 2021-10-02 17:12:30 +0600
  LV Status              available
  # open                 0
  LV Size                <3.91 GiB
  Current LE             1000
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

  --- Logical volume ---
  LV Path                /dev/VG01/PV02
  LV Name                PV02
  VG Name                VG01
  LV UUID                ic8QE3-bKiB-SMua-OR1c-Ax8a-IrM3-DKdP1M
  LV Write Access        read/write
  LV Creation host, time mylab-vm-4.dc2.my.local, 2021-10-02 17:12:55 +0600
  LV Status              available
  # open                 0
  LV Size                700.00 MiB
  Current LE             175
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3

Создаём файловую систему на LV

Для этого используем уже знакомую нам утилиту mkfs.

sudo mkfs.ext4 /dev/VG01/LV02
sudo mkfs.ext4 /dev/VG01/LV01

Монтируем наш LV

Ну и последним шагом будет монтирование в ОС.

sudo mkdir /my-lvm-01
sudo mkdir /my-lvm-02

sudo vim /etc/fstab
/dev/VG01/LV01  /my-lvm-01 ext4 defaults        0 0
/dev/VG01/LV02  /my-lvm-02 ext4 defaults        0 0
sudo mount -a
df -h

Удаляем LV

Для этого используем команду lvremove и передаём ей полный путь к LV.

sudo umount /my-lvm-01
sudo umount  /my-lvm-02

sudo lvremove /dev/VG01/LV01
sudo lvremove /dev/VG01/LV02

Удаляем VG

Для этого используем команду vgremove и передаём ей имя VG.

sudo vgremove VG01

Удаляем PV

Для этого используем команду pvremove и передаём ей имя PD.

sudo pvremove /dev/sdd1 /dev/sde1 /dev/sdf1