LVM

Логика

На физическом устройстве создаётся физический том (Physical Volume).

Физические тома объединяются в группы логических томов (Logical Volume Group).

Группы логических томов разбивается на логические тома (Logical Volume).

В логическом томе создаётся файловая система и им назначаются точки монтирования.

Перевод с непонятного на русский: из физических томов собирается виртуальный жесткий диск (группа томов), который разбивается на разделы (логические тома), в которых создаются файловые системы. Для использования файловых систем, логические тома стандартным образом подключаются к файловой системе (об подключении файловых систем будет рассказано в статье о программе mount).

Подготовка разделов

К тестовой машине подключены три scsi жёстких диска.

Посмотреть список дисков и разделов можно при помощи программ fdisk или sfdisk.

# sfdisk -l
Disk /dev/sda: 1044 cylinders, 255 heads, 63 sectors/track
Units: cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start     End   #cyls    #blocks   Id  System

/dev/sda1   *      0+    130-    131-   1048576   83  Linux
/dev/sda2        130+   1044-    914-   7339008   8e  Linux LVM
/dev/sda3          0       -       0          0    0  Empty
/dev/sda4          0       -       0          0    0  Empty
Disk /dev/mapper/centos-root: 808 cylinders, 255 heads, 63 sectors/track
Disk /dev/mapper/centos-swap: 104 cylinders, 255 heads, 63 sectors/track
Disk /dev/sdb: 261 cylinders, 255 heads, 63 sectors/track
Disk /dev/sdc: 261 cylinders, 255 heads, 63 sectors/track
Disk /dev/sdd: 261 cylinders, 255 heads, 63 sectors/track

Как видно и приведённого выше вывода программы sfdisk, к система подключены 4 жёстких диска: sda, sdb, sdc и sdd. На первом диске установлена система. Последние три диска подключены, но не разбиты на разделы.

Создание физического тома

Сначала необходимо инициализировать физический том. Его можно создавать для диска целиком или в разделе на диске.

Для инициализации физического тома на жестком диске используем программу pvcreate.

# pvcreate /dev/sdb

Physical volume "/dev/sdb" successfully created.

В случае раздела, сначала необходимо поменять тип раздела на 8e (Linux LVM) и далее инициализировать при помощи программы pvcreate.

# sfdisk /dev/sdc
Checking that no-one is using this disk right now ...
OK

Disk /dev/sdc: 261 cylinders, 255 heads, 63 sectors/track
sfdisk:  /dev/sdc: unrecognized partition table type

Old situation:

sfdisk: No partitions found

Input in the following format; absent fields get a default value.
  ;  <c,h,s> <c,h,s>
Usually you only need to specify  and  (and perhaps ).

/dev/sdc1 :0
/dev/sdc1          0+    260     261-   2096482   83  Linux
/dev/sdc2 :
/dev/sdc2          0       -       0          0    0  Empty
/dev/sdc3 :
/dev/sdc3          0       -       0          0    0  Empty
/dev/sdc4 :
/dev/sdc4          0       -       0          0    0  Empty

New situation:
Units: cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sdc1          0+    260     261-   2096482   83  Linux
/dev/sdc2          0       -       0          0    0  Empty
/dev/sdc3          0       -       0          0    0  Empty
/dev/sdc4          0       -       0          0    0  Empty

Warning: no primary partition is marked bootable (active)
This does not matter for LILO, but the DOS MBR will not boot this disk.
Do you want to write this to disk? [ynq] y
Successfully wrote the new partition table

Re-reading the partition table ...

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)

Мы создали один раздел, использующий все дисковое пространство. По умолчанию ему присваивает id 83 (Linux).

Для создания физического тома необходимо изменить его на 8e (Linux LVM).

# sfdisk --change-id /dev/sdc 1 8e
Done

# sfdisk -l /dev/sdc

Disk /dev/sdc: 261 cylinders, 255 heads, 63 sectors/track
Units: cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sdc1          0+    260     261-   2096482   8e  Linux LVM
/dev/sdc2          0       -       0          0    0  Empty
/dev/sdc3          0       -       0          0    0  Empty
/dev/sdc4          0       -       0          0    0  Empty

Создадим физический том:

# pvcreate /dev/sdc1
Physical volume "/dev/sdc1" successfully created.

Если при инициализации тома на диске выдается сообщение об ошибке, скорее всего у диска уже инициализирована таблица разделов. Удалите таблицу разделов и произведите инициализацию по новой.

Например, если попытаться инициализировать физический том на диске sdc, мы получим следующее сообщение:

# pvcreate /dev/sdc
Device /dev/sdc excluded by a filter.

Посмотрим подробнее, в чем проблема:

# pvcreate /dev/sdc -vvv
…
/dev/sdc: size is 4194304 sectors
Closed /dev/sdc
/dev/sdc: Skipping: Partition table signature found
…

Сотрем таблицу разделов:

# dd if=/dev/zero of=/dev/sdc bs=1k count=1
1+0 records in
1+0 records out
1024 bytes (1.0 kB) copied, 0.000687572 s, 1.5 MB/s

Перечитаем таблицу разделов:

# blockdev --rereadpt /dev/sdc
# sfdisk -l /dev/sdc
Disk /dev/sdc: 261 cylinders, 255 heads, 63 sectors/track

Инициализируем Physical Volume на диске.

# pvcreate /dev/sdc
WARNING: Device for PV oCmhnY-cndS-Fj6d-NPJJ-evBF-C09N-Tg1ACj not found or rejected by a filter.
WARNING: Device for PV oCmhnY-cndS-Fj6d-NPJJ-evBF-C09N-Tg1ACj not found or rejected by a filter.
Physical volume "/dev/sdc" successfully created.

Не смотря на то, что физический том был создан, в дальнейшем, при любых действиях с lvm будет вылезать этот WARNING. Он появился потому, что мы не удалили физический том из раздела /dev/sdc1. И информация о нём сохранилась в кеше.

По хорошему, сначала надо было выполнить pvremove /dev/sdc1 и только потом очищать таблицу разделов.

Для удаления предупреждения выполните следующую команду:

# pvscan --cache

Она заставляет пересоздать кеш у демона lvmetad.

# pvcreate /dev/sdd
Physical volume "/dev/sdd" successfully created.

Посмотреть существующие физические тома можно при помощи команд:

# pvdisplay
--- Physical volume ---
PV Name               /dev/sda2
VG Name               centos
PV Size               <7.00 GiB / not usable 3.00 MiB
Allocatable           yes (but full)
PE Size               4.00 MiB
Total PE              1791
Free PE               0
Allocated PE          1791
PV UUID               PfpeCj-FuHJ-Di32-7CDZ-a6L0-BWFe-2HYoB8

"/dev/sdd" is a new physical volume of "2.00 GiB"
--- NEW Physical volume ---
PV Name               /dev/sdd
VG Name
PV Size               2.00 GiB
Allocatable           NO
PE Size               0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               Z7FmBB-QPcL-JhxY-j5wQ-8hU2-mGBR-tbe6kE

"/dev/sdb" is a new physical volume of "2.00 GiB"
--- NEW Physical volume ---
PV Name               /dev/sdb
VG Name
PV Size               2.00 GiB
Allocatable           NO
PE Size               0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               LJsUOk-jAZh-Pftx-XekM-1KXE-3q2t-wcvIm9

"/dev/sdc" is a new physical volume of "2.00 GiB"
--- NEW Physical volume ---
PV Name               /dev/sdc
VG Name
PV Size               2.00 GiB
Allocatable           NO
PE Size               0
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               jKdt7U-dJHJ-h61Q-iO2H-K7Go-7r8S-pTv7si

или

# pvscan
PV /dev/sda2   VG centos          lvm2 [<7.00 GiB / 0    free]
PV /dev/sdd                       lvm2 [2.00 GiB]
PV /dev/sdb                       lvm2 [2.00 GiB]
PV /dev/sdc                       lvm2 [2.00 GiB]
Total: 4 [<13.00 GiB] / in use: 1 [<7.00 GiB] / in no VG: 3 [6.00 GiB]

Создание группы томов

Для создания группы томов используется программа vgcreate.

# vgcreate vg3disk /dev/sdb /dev/sdc /dev/sdd
Volume group "vg3disk" successfully created

Была создана группа томов с именем vg3disk, включающая в себя физические тома: /dev/sdb, /dev/sdc и /dev/sdd.

В принципе, можно было не создавать физические тома при помощи pvcreate. Если они не были инициализированы, программа vgcreate сама инициализирует их.

Посмотрим какие группы томов есть в системе:

# vgscan
Reading volume groups from cache.
Found volume group "vg3disk" using metadata type lvm2
Found volume group "centos" using metadata type lvm2

или

# vgdisplay
--- Volume group ---
VG Name               vg3disk
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               >5.99 GiB
PE Size               4.00 MiB
Total PE              1533
Alloc PE / Size       0 / 0
Free  PE / Size       1533 / <5.99 GiB
VG UUID               7LX5lD-fDMd-iWwG-5Aoy-tMHl-si6F-MbVlyX

--- Volume group ---
VG Name               centos
System ID
Format                lvm2
Metadata Areas        1
Metadata Sequence No  3
VG Access             read/write
VG Status             resizable
MAX LV                0
Cur LV                2
Open LV               2
Max PV                0
Cur PV                1
Act PV                1
VG Size               <7.00 GiB
PE Size               4.00 MiB
Total PE              1791
Alloc PE / Size       1791 / <7.00 GiB
Free  PE / Size       0 / 0
VG UUID               fK2ddL-7P6Q-fpq4-5Vsj-TZCU-lzB1-tZrEIU

Для дальнейшего использования группы томов её необходимо активировать.

# vgchange -a y vg3disk
0 logical volume(s) in volume group "vg3disk" now active

Удаление групп томов

Для удаления группы томов её сначала делают неактивной.

# vgchange -a n vg3disk
  0 logical volume(s) in volume group "vg3disk" now active

Затем удаляют:

# vgremove vg3disk
  Volume group "vg3disk" successfully removed

Добавление/удаление физических томов в/из группу томов

# pvdisplay /dev/sdd
  --- Physical volume ---
  PV Name               /dev/sdd
  VG Name               vg3disk
  PV Size               2.00 GiB / not usable 4.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              511
  Free PE               511
  Allocated PE          0
  PV UUID               Z7FmBB-QPcL-JhxY-j5wQ-8hU2-mGBR-tbe6kE

Как видно из вывода программы pvdisplay, /dev/sdd входит в группу vg3disk. Удалим физический том /dev/sdd из логической группы vg3disk.

# vgreduce vg3disk /dev/sdd
  Removed "/dev/sdd" from volume group "vg3disk"
# pvdisplay /dev/sdd
  "/dev/sdd" is a new physical volume of "2.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdd
  VG Name
  PV Size               2.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               Z7FmBB-QPcL-JhxY-j5wQ-8hU2-mGBR-tbe6kE

# vgdisplay vg3disk
  --- Volume group ---
  VG Name               vg3disk
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  2
  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               3.99 GiB
  PE Size               4.00 MiB
  Total PE              1022
  Alloc PE / Size       0 / 0
  Free  PE / Size       1022 / 3.99 GiB
  VG UUID               ep3QcO-Pc0x-NFVm-Te7q-2UC3-8dhj-LVbCzT

Для того что бы добавить /dev/sdd в vg3disk следует выполнить:

# vgextend vg3disk /dev/sdd
  Volume group "vg3disk" successfully extended
# vgdisplay vg3disk
  --- Volume group ---
  VG Name               vg3disk
  System ID
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  3
  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               <5.99 GiB
  PE Size               4.00 MiB
  Total PE              1533
  Alloc PE / Size       0 / 0
  Free  PE / Size       1533 / <5.99 GiB
  VG UUID               ep3QcO-Pc0x-NFVm-Te7q-2UC3-8dhj-LVbCzT

# pvdisplay /dev/sdd
  --- Physical volume ---
  PV Name               /dev/sdd
  VG Name               vg3disk
  PV Size               2.00 GiB / not usable 4.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              511
  Free PE               511
  Allocated PE          0
  PV UUID               Z7FmBB-QPcL-JhxY-j5wQ-8hU2-mGBR-tbe6kE

Логический том

После инициализации и активации группу томов можно разбить на логические тома.

Прежде, чем продолжим, введём несколько дополнительных понятий.

Physical extent (PE) – физический том состоит из некоторого количестве PE. Размер PE задаётся при создании физического тома и по умолчанию равен 4 MiB.

# pvdisplay /dev/sdd
  --- Physical volume ---
  PV Name               /dev/sdd
  VG Name               vg3disk
  PV Size               2.00 GiB / not usable 4.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              511
  Free PE               511
  Allocated PE          0
  PV UUID               Z7FmBB-QPcL-JhxY-j5wQ-8hU2-mGBR-tbe6kE

Logical extent (LE) - логический том состоит из некоторого количества LE.

PE обычно равен размеру LE.

В нашем примере в группу томов vg3disk входят три физических тома с общим количеством PE: 511+511+511=1533.

При создании логического тома мы можем отображать LE на PE в любом из трёх физических томов. Существует два алгоритма отображение LE на PE:

  • Линейное – LE последовательно отображаются на PE сначала sdb, потом sdc и sdd.
  • Striped – расслоённое. Данные равномерно распределяются между физическими томами. LE[1] -> sdbPE[1], LE[2] -> sdcPE[1], LE[3] -> sddPE[1], LE[4] -> sdbPE[2] и т.д.

У Striped алгоритма существует серьезное ограничение – логический том не может быть расширен на вновь добавляемые физические тома. Иными словами, после заполнения физических томов, определенных при создании, нет возможности для увеличения размера логического тома.

Создание логического тома

Логический том создаётся программой lvcreate.

При создании мы можем указать размер тома:

  • -L – размер в байтах, мегабайтах и т.п. определяется цифрой и символом: из набора KMGTPE единицы в системе СИ с основанием 10 или из набора kmgtpe единицы в системе IEC с основанием 2.
  • -l – размер в LE.
# lvcreate -L1G -n lv1g01 vg3disk
  Logical volume "lv1g01" created.
# lvscan
  ACTIVE            '/dev/vg3disk/lv1g01' [1.00 GiB] inherit
  ACTIVE            '/dev/centos/swap' [820.00 MiB] inherit
  ACTIVE            '/dev/centos/root' [<6.20 GiB] inherit
# lvdisplay
  --- Logical volume ---
  LV Path                /dev/vg3disk/lv1g01
  LV Name                lv1g01
  VG Name                vg3disk
  LV UUID                5GzBrO-zvqP-dgJ4-21YG-Wkj2-gKK7-CkL9cC
  LV Write Access        read/write
  LV Creation host, time openfire.host.ru, 2019-05-14 12:12:06 +0300
  LV Status              available
  # open                 0
  LV Size                1.00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
…

Segments показывает на сколько физических томов располагается логический том.

В CentOS 7, после создания логического тома он доступен как блочное устройство через device mapper.

# ls -l /dev/mapper/vg3disk-lv1g01
lrwxrwxrwx 1 root root 7 May 14 12:12 /dev/mapper/vg3disk-lv1g01 -> ../dm-2

Удаление логического тома

Перед удалением логического тома, убедитесь, что файловая система находящаяся в нём не подключена.

# mount | grep vg3disk-lv1g01
# lvremove /dev/mapper/vg3disk-lv1g01
  Do you really want to remove active logical volume vg3disk/lv1g01? [y/n]: y
  Logical volume "lv1g01" successfully removed
# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0    8G  0 disk
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0    7G  0 part
  ├─centos-root 253:0    0  6.2G  0 lvm  /
  └─centos-swap 253:1    0  820M  0 lvm  [SWAP]
sdb               8:16   0    2G  0 disk
sdc               8:32   0    2G  0 disk
sdd               8:48   0    2G  0 disk
sr0              11:0    1 1024M  0 rom

Изменение размера логического тома

Размер логического тома увеличивается при помощи программы lvextend.

Новый размер можно указать как в абсолютных единицах:

-L4G

так и в относительных:

-L+3G

Следующая команда увеличивает размер логического тома на 3 гигабайта.

# lvextend -L+3G /dev/vg3disk/lv1g01
  Size of logical volume vg3disk/lv1g01 changed from 1.00 GiB (256 extents) to 4.00 GiB (1024 extents).
  Logical volume vg3disk/lv1g01 successfully resized.

Обратите внимание на то, что физический размер дисков, не превышает 2 гигабайта. А размер логического тома составляет 4 гигабайта.

Уменьшить размер можно при помощи программы lvreduce.

# lvreduce -L-1G /dev/vg3disk/lv1g01
  WARNING: Reducing active logical volume to 3.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
  Do you really want to reduce vg3disk/lv1g01? [y/n]: y
  Size of logical volume vg3disk/lv1g01 changed from 4.00 GiB (1024 extents) to 3.00 GiB (768 extents).
  Logical volume vg3disk/lv1g01 successfully resized.

Программа не случайно выводит предупреждение о возможной потере данных. Если в томе была файловая система, после уменьшения размера данные могут потеряться.

# lvdisplay
  --- Logical volume ---
  LV Path                /dev/vg3disk/lv1g01
  LV Name                lv1g01
  VG Name                vg3disk
  LV UUID                CRV5OA-lVI7-hjTs-xRiI-Fel8-kTLf-R2feTl
  LV Write Access        read/write
  LV Creation host, time openfire.host.ru, 2019-05-14 12:34:15 +0300
  LV Status              available
  # open                 0
  LV Size                3.00 GiB
  Current LE             768
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2