Менеджер логических томов (англ. logical volume manager) — подсистема операционных систем Linux и OS/2, позволяющая использовать разные области одного жёсткого диска и/или области с разных жёстких дисков как один логический том. Реализована с помощью подсистемы device mapper.
LVM добавляет уровень абстракции между физическими/логическими дисками (привычными разделами, с которыми работает fdisk и аналогичные программы) и файловой системой. Это достигается путём разбивки изначальных разделов на блоки, либо использования отдельных разделов или блочных устройств (physical volume (pv)) и объединения их в единый виртуальный том, точнее группу томов (volume group (vg)), которая далее разбивается на логические тома (logical volume (lv)). Для файловой системы логический том представлен как обычное блочное устройство, хотя отдельные pv тома могут находиться на разных физических устройствах (и даже сам pv может быть распределён подобно RAID).
LVM1 не поддерживает расширение существующего логического тома на новые физические тома. LVM2 позволяет это, но не отменяет ограничений, связанных с реализацией файловых систем (ФС). Например, ФС JFS не поддерживает изменение размера тома, XFS допускает только его увеличение.
Поскольку система управления логическими томами использует собственную модель представления дискового пространства, нам необходимо определиться с терминами и взаимосвязями понятий. Рассмотрим схему, основанную на диаграмме Эрика Бегфорса (Erik Bеgfors), приведенную им в списке рассылки linux-lvm. Она демонстрирует взаимосвязь понятий системы LVM:
sda1 sda2 sdb sdc <-- PV
| | | |
| | | |
+--------+- VG00 -+-------+ <-- VG
|
+-------+-------+---------+
| | | |
root usr home var <-- LV
| | | |
ext3 reiserfs reiserfs xfs <-- Файловые системы
PV, Physical volume, физический том. Обычно это раздел на диске или весь диск. В том числе, устройства программного и аппаратного RAID (которые уже могут включать в себя несколько физических дисков). Физические тома входят в состав группы томов.
VG, Volume group, группа томов. Это самый верхний уровень абстрактной модели, используемой системой LVM. С одной стороны группа томов состоит из физических томов, с другой – из логических и представляет собой единую административную единицу.
LV, Logical volume, логический том. Раздел группы томов, эквивалентен разделу диска в не-LVM системе. Представляет собой блочное устройство и, как следствие, может содержать файловую систему.
PE, Physical extent, физический экстент. Каждый физический том делится на порции данных, называющиеся физическими экстентами. Их размеры те же, что и у логических экстентов.
LE, Logical extent, логический экстент. Каждый логический том делится на порции данных, называющиеся логическими экстентами. Размер логических экстентов не меняется в пределах группы томов.
Для работы с LVM нужен пакет lvm2. Для его установки от имени суперпользователя выполним команду:
user@host:~$ sudo apt-get install lvm2
Работу с LVM надо производить от имени суперпользователя, поэтому выполним команду sudo su и введем пароль суперпользователя
user@host$ sudo su
[sudo] password for username:
root@host#
Перед использованием диска или раздела в качестве физического тома необходимо его инициализировать.
Для целого диска:
root@host# pvcreate /dev/sdd
Physical volume "/dev/sdd" successfully created
Эта команда создает в начале диска дескриптор группы томов.
Для создания группы томов используется команда 'vgcreate'
root@host# vgcreate vg0 /dev/sdd
Volume group "vg0" successfully created
Для того, чтобы создать логический том lv0, размером 1500Мб, выполните команду:
root@host# lvcreate -L1500 -n lv0 vg0
Без указания суффикса размеру раздела используется множитель «мегабайт» (в системе СИ равный 106 байт),
что и продемонстрировано в примере выше. Суффиксы в верхнем регистре (KMGTPE) соответствуют единицам в
системе СИ (с основанием 10), например, G — гигабайт равен 109 байт, а суффиксы в нижнем регистре (kmgtpe)
соответствуют единицам в системе IEC (с основанием 2), например g — гибибайт равен 230 байт.
Для создания логического тома размером в 100 логических экстентов с расслоением по двум физическим томам и размером блока данных 4 KB:
root@host# lvcreate -i2 -I4 -l100 -n lv0 vg0
Если вы хотите создать логический том, полностью занимающий группу томов, выполните команду vgdisplay,
чтобы узнать полный размер группы томов, после чего используйте команду lvcreate.
root@host# vgdisplay vg0 | grep "Total PE"
Total PE 476932
root@host# lvcreate -l 476932 vg0 -n lv0
Эти команды создают логический том lv0, полностью заполняющий группу томов.
Определяем, как будет называться наше устройство. Это понадобится нам для создания на нем файловой системы.
root@host# ls -lh /dev/mapper
итого 0
crw------- 1 root root 10, 236 марта 12 15:46 control
lrwxrwxrwx 1 root root 7 марта 12 15:46 isw_beafjaidab_Volume0 -> ../dm-1
lrwxrwxrwx 1 root root 7 марта 12 15:46 isw_beafjaidab_Volume0p1 -> ../dm-2
lrwxrwxrwx 1 root root 7 марта 12 15:46 isw_beafjaidab_Volume0p2 -> ../dm-3
lrwxrwxrwx 1 root root 7 марта 12 15:46 isw_beafjaidab_Volume0p5 -> ../dm-4
lrwxrwxrwx 1 root root 7 марта 12 17:38 vg0-lv0 -> ../dm-0
Судя по выводу команды, у нас оно будет называться vg0-lv0.
Я буду использовать файловую систему ext4. Команда для ее создания следующая:
root@host# mkfs -t ext4 /dev/mapper/vg0-lv0
Создаем точку монтирования. У меня это будет /mnt/vg0-lv0
root@host# mkdir -p /mnt/vg0-lv0
Монтируем наш логический том
root@host# mount /dev/mapper/vg0-lv0 /mnt/vg0-lv0
Если все прошло без ошибок, то можно настроить автоматическое монтирование нашего логического тома
при запуске системы. Для этого в файл /etc/fstab добавим информацию о нашем томе:
root@host# cat /etc/fstab
#<file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc nodev,noexec,nosuid 0 0
/dev/mapper/isw_beafjaidab_Volume0p1 / ext4 errors=remount-ro 0 1
/dev/mapper/isw_beafjaidab_Volume0p5 none swap sw 0 0
# Монтируем соданный нами том при запуске системы
/dev/mapper/vg0-lv0 /mnt/vg0-lv0 ext4 defaults 1 2
Посмотреть информацию о группе томов можно командой vgdisplay,
по созданным логическим томам – lvdisplay, по физическим томам – pvdisplay.
У меня вывод этих команд выглядит так:
root@host# vgdisplay
--- Volume group ---
VG Name vg0
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 1,82 TiB
PE Size 4,00 MiB
Total PE 476932
Alloc PE / Size 476932 / 1,82 TiB
Free PE / Size 0 / 0
VG UUID WRMF19-eMsH-3ZmS-EUjH-cm9k-YYJF-Fwwh0W
root@host# lvdisplay
--- Logical volume ---
LV Name /dev/vg0/lv0
VG Name vg0
LV UUID Cld9n4-1GTd-eVKt-OOW3-EAFj-3PuW-YE7A2z
LV Write Access read/write
LV Status available
# open 2
LV Size 1,82 TiB
Current LE 476932
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:0
root@host# pvdisplay
--- Physical volume ---
PV Name /dev/sdd
VG Name vg0
PV Size 1,82 TiB / not usable 1,09 MiB
Allocatable yes (but full)
PE Size 4,00 MiB
Total PE 476932
Free PE 0
Allocated PE 476932
PV UUID n6xSNA-8X3i-Vk5U-10qs-E6Rk-sW8O-HwKdXR
Допустим у нас есть чистый неразмеченный диск размером 1ТБ. Инициализируем его.
root@host# pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created
Если диск содержит файловую систему (использовался ранее), то при выполнении приведенной выше команды могут быть ошибки. Если это происходит, то сначала необходимо затереть таблицу разделов командой вроде этой:
root@host# dd if=/dev/zero of=/dev/sdc bs=10M count=100
100+0 записей получено
100+0 записей отправлено
скопировано 1048576000 байт (1,0 GB), 8,22901 c, 127 MB/c
Расширяем группу томов, добавляя в нее новый диск.
root@host# vgextend vg0 /dev/sdc
Volume group "vg0" successfully extended
Увеличиваем размер логического тома на 800ГБ (можно и больше, но в пределах размера физического диска).
root@host# lvextend -L+800G /dev/mapper/vg0-lv0
Extending logical volume lv0 to 1,69 TiB
Logical volume lv0 successfully resized
Проверяем файловую систему логического тома.
root@host# e2fsck -f /dev/mapper/vg0-lv0
e2fsck 1.42 (29-Nov-2011)
Проход 1: Проверка inodes, блокs, а также размеров
Pass 2: Checking каталог structure
Pass 3: Checking каталог connectivity
Pass 4: Checking reference counts
Pass 5: Checking группа summary information
/dev/mapper/vg0-lv0: 13787/61054976 files (1.1% non-contiguous), 229171839/244190208 blocks
Изменяем размер файловой системы.
root@host# resize2fs /dev/mapper/vg0-lv0
resize2fs 1.42 (29-Nov-2011)
Resizing the filesystem on /dev/mapper/vg0-lv0 to 453905408 (4k) blocks.
The filesystem on /dev/mapper/vg0-lv0 is now 453905408 blocks long.
Операция может продолжаться достаточно долго. Все зависит от размера файловой системы.
После этого монтируем логический том и проверяем его размер.
root@host# mount /dev/mapper/vg0-lv0
root@host# df -h | grep vg0
/dev/mapper/vg0-lv0 1,7T 860G 759G 54% /mnt/vg0-lv0
Необходимо отмонитровать логический том
root@host# umount /dev/mapper/vg0-lv0
Проверяем файловую систему
root@host# fsck -f /dev/mapper/vg0-lv0
Уменьшаем файловую систему до нужного размера. В моем примере новый размер файловой системы будет 600ГБ.
root@host# resize2fs /dev/mapper/vg0-lv0 600G
Правим таблицу разделов на логическом устройстве. Вам необходимо ввести команды, выделенные зеленым цветом.
root@host# fdisk /dev/mapper/vg0-lv0
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-1812889599, default 2048): Тут жмем "ENTER"
Last sector, +sectors or +size{K,M,G,T,P} (2048-1812889599, default 1812889599): +600G
Created a new partition 1 of type 'Linux' and of size 600 GiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
...
Проверяем файловую систему
root@host# fsck -f /dev/mapper/vg0-lv0
Уменьшаем размер логического тома до 600ГБ.
root@host# lvreduce --size 600G /dev/mapper/vg0-lv0
WARNING: Reducing active logical volume to 600,00 GiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv0? [y/n]: y
Size of logical volume vg0/lv0 changed from 864,45 GiB (221300 extents) to 600,00 GiB (153600 extents).
Logical volume lv0 successfully resized
Проверяем что получилось.
root@host# lvdisplay
--- Logical volume ---
LV Path /dev/vg0/lv0
LV Name lv0
VG Name vg0
LV UUID qDNW79-9Sb0-K6oF-o5vh-d3uF-0DaU-nJ4Jmg
LV Write Access read/write
LV Creation host, time vmsrv, 2016-07-14 19:11:11 +0300
LV Status available
# open 0
LV Size 600,00 GiB
Current LE 153600
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:0
Монтируем логический том и проверяем его размер.
root@host# mount /dev/mapper/vg0-lv0
root@host# df -h
Файловая система Размер Использовано Дост Использовано% Cмонтировано в
...
/dev/mapper/vg0-lv0 591G 110G 451G 20% /mnt/vg0-lv0
...
Чтобы переименовать существующий логический том, используйте команду lvrename.
Обе приведенные команды изменят имя логического тома lvold в группе vg02 на lvnew.
root@host#lvrename /dev/vg02/lvold /dev/vg02/lvnew
root@host#lvrename vg02 lvold lvnew
Физический перенос группы томов на другую систему организовывается при помощи команд vgexport и vgimport.
Сперва необходимо размонтировать все логические тома группы томов и деактивировать группу:
root@host# unmount /mnt/design/users
root@host# vgchange -an design
vgchange -- volume group "design" successfully deactivated
После этого экспортируем группу томов. Процедура экспорта запрещает доступ к группе на данной системе и готовит ее к удалению:
root@host# vgexport design
vgexport -- volume group "design" sucessfully exported
Теперь можно выключить машину, отсоединить диски, составляющие группу томов и подключить их к новой системе. Остается импортировать группу томов на новой машине и смонтировать логические тома:
root@host# pvscan
pvscan -- reading all physical volumes (this may take a while...)
pvscan -- inactive PV "/dev/sdb1" is in EXPORTED VG "design" [996 MB / 996 MB free]
pvscan -- inactive PV "/dev/sdb2" is in EXPORTED VG "design" [996 MB / 244 MB free]
pvscan -- total: 2 [1.95 GB] / in use: 2 [1.95 GB] / in no VG: 0 [0]
root@host# vgimport design /dev/sdb1 /dev/sdb2
vgimport -- doing automatic backup of volume group "design"
vgimport -- volume group "design" successfully imported and activated
root@host# mkdir -p /mnt/design/users
root@host# mount /dev/design/users /mnt/design/users
Группа томов готова к использованию на новой системе.