LVM2

Материал из sysadm
Перейти к навигации Перейти к поиску

LVM (Logical Volume Management) - Менеджер логических томов

Обзор

Для чего нужен LVM

  • LVM позволяет абстрагироваться от физического размещения данных на дисках. У логических томов (разделов) логического диска нет привязки к физическому размещению, нет начальных секторов, есть только размер. Можно разбить физический диск на небольшие равные разделы и объединить в один логический диск, потом создать на логическом диске логические тома, оставив свободным место равное одному физическому разделу. Когда потребуется освободить любой из физических разделов, достаточно одной командой перенести с него данные в свободное место логического диска и вывести раздел из группы. При достаточном свободном месте даже не потребуется уменьшать размеры файловой системы. Если потребуется больше места, то можно уменьшить размер любого логического тома (естественно предварительно уменьшив размер его файловой системы).
  • LVM позволяет делать снепшоты и программные рейды

Когда LVM не нужен

  • У вас небольшой диск и вы уверены что вам не придется двигать разделы, либо для вас это не является проблемой

Как не стоит использовать LVM

  • Не стоит объединять в один логический диск несколько физических без обеспечения отказоустойчивости. Как и в случае с RAID0 вероятность потери данных увеличится кратно количеству дисков. Это допустимо только если вам нужно много места под размещение временных данных которые не страшно потерять.

Основные термины

  • PV (Phisical Volume) - физический том (может быть разделом или целым диском)
  • VG (Volume Group) - группа томов (логический диск объединяющий несколько PV)
  • LV (Logical Volume) - логический том (раздел на логическом диске VG)

Динамический LVM

  • место под LV выделяется динамически по мере заполнения данными
  • размер LV является виртуальным
  • сумма размеров LV может превышать размер VG (нужно проверить)
  • по умолчанию, размер таблиц размещения блоков не велик и при переполнении том отключится, необходимо следить за размерами таблиц и вовремя расширять

Примеры

Операции с физическими томами (PV)

Создание PV на диске (/dev/sdb)

# если диск /dev/sdb имеет какую либо таблицу разделов, то ее необходим счистить до разметки диска под PV
dd if=/dev/zero of=/dev/sdb bs=1M count=1
blockdev --rereadpt /dev/sdb

# создание PV на диске (/dev/sdb)
pvcreate /dev/sdb

Создание PV на разделах

   pvcreate /dev/sdс1
   pvcreate /dev/sdс2
   pvcreate /dev/sdс3

Если размер раздела был увеличен после создания PV, то расширить PV до новой границы раздела можно так (осторожно, не проверял)

pvresize /dev/sdc3

Перемещение данных с PV (/dev/sdb) на PV (/dev/sdc1)

pvmove /dev/sdb /dev/sdc1

Перемещение данных с PV (/dev/sdb) на остальные PV группы (суммарное свободное место остальных PV группы должно превышать размер переносимого PV)

pvmove /dev/sdb

Зачистка физического тома от структур LVM и удаление из списка PV (предварительно PV необходимо вывести из группы томов VG)

pvremove /dev/sdb


Просмотр информации о физических томах PV

pvdisplay

Операции с группами физических томов (VG)

Создание VG с именем mydisk на нескольких PV

vgcreate mydisk /dev/sdb /dev/sdc2 /dev/sdc3

Переименование VG

Если есть системные тома, то см. здесь

Если нет системных томов

  • проверьте /etc/fstab
  • если есть приязки к имени VG, то
    • размонтируйте связанные тома
    • скорректируйте /etc/fstab
    • перегрузите конфигурацию systemd systemctl daemon-reload
    • измените имя VG vgrename -v oldname newname
    • смонтируйте все тома mount -a
  • если нет привязок, то просто измените имя VG vgrename -v oldname newname

Активация / Деактивация VG (разобраться, некоторые утверждают что после каждой перезагрузки все VG не активны)

# активация VG (mydisk)
vgchange -a y mydisk

# деактивация VG (mydisk)
vgchange -a n mydisk

(НЕ ПРОВЕРЕНО) перенос LV в другой VG

# перенос LV размещенного на разных PV
vgsplit --name <имя_LV> <vg_name_src> <vg_name_dst>

# перенос LV, если он размещен на PV не содержащих других LV
vgsplit <vg_name_src> <vg_name_dst> <PV> ...


Просмотр информации о логических дисках VG, в том числе размер еще не занятой логическими томами области

vgs
vgdisplay

Добавление PV (/dev/sdc1) к VG (mydisk)

vgextend mydisk /dev/sdc1

Удаление VG (mydisk)

vgchange -a n mydisk
vgremove mydisk

Поиск и активация VG на дисках перенесенных с другого компьютера.

vgscan
vgchange -a y

Удаление PV (/dev/sdb) из VG (mydisk) (перед удалением данные PV должны быть перенесены в другие PV группы, см. раздел "Операции с физическими томами (PV)")

vgreduce mydisk /dev/sdb

Операции с логическими томами (LV)

Создание двух LV размером 10 и 500 ГиБ с именами var и home на логическом диске mydisk

lvcreate -n var -L10G mydisk
lvcreate -n home -L500G mydisk

Увеличение LV (var) на 10 ГиБ

lvextend -L+10G /dev/mydisk/var

Увеличение LV (var) на 1000 LVM экстентов

lvextend -l +1000 /dev/mydisk/var

Увеличение LV (var) на всё свободное место

lvextend -l +100%FREE /dev/mydisk/var

Уменьшение LV (var) до заданного размера

lvreduce -L 30G /dev/mydisk/var

Удаление LV (var)

lvremove /dev/mydisk/var

Просмотр информации о логических томах LV

lvdisplay

Для примера описанного выше, в каталоге /dev будут созданы ссылки и файлы устройств

/dev/mydisk/var  -> /dev/dm-0
/dev/mydisk/home -> /dev/dm-1

/dev/mapper/mydisk-var -> /dev/dm-0
/dev/mapper/mydisk-home -> /dev/dm-1

Снепшоты

# создание снепшота
lvcreate --size 1G --snapshot --name log_snap /dev/vg_ds00/log

# lvs теперь покажет созданный снепшот как логический том
# обратите внимание  на поля
# Origin - имя оригинального тома
# %Data - процент заполнения выделенного места под снепшот

# после создания снепшота, диск работает следующим образом
# 1. изменения пишутся на оригинальный диск
# 2. перед записью исходное содержимое блока копируется в снепшот
# 3. если удаляется/переполняется/ломается снепшот, то теряется возможность отката произведенных изменений на оригинальном диске
# 4. откат происходит путем копирования исходных блоков из снепшота обратно на оригинальный диск, таким образом все изменения откатываются к моменту создания снепшота

# откат обычного тома (предварительно нужно размонтировать)
lvconvert --merge /dev/vg_ds00/log_snap
# после отката, том снепшота будет автоматически удален

# для отката root тома размонтировать файловую систему не нужно
# откат выполняется аналогично обычному тому, но фактически откат тома выполняется при следующей загрузке
# при мердже должно выдать сообщение вида
#   Merging of snapshot ... will occur on next activation of ol/root

# если нужно оставить текущее состояние диска, то достаточно удалить том снепшота
lvremove /dev/vg_data/snap_vg_data

# чтобы посмотреть состояние диска на момент снепшота (без отката), необходимо смонтировать снепшот
# при монтировании необходимо отказаться от использования идентификатора файловой системы, иначе будет ошибка т.к. на одном сервере нельзя одновременно смонтировать две файловых системы с одним UUID
mount -o nouuid /dev/vg_data/snap_vg_data /mnt2

# еще одна утилита для просмотра снепшотов
dmsetup status /dev/vg_data/snap_vg_data
0 5234688 snapshot 1065088/2097152 4160

Вложенные снепшоты

Эксперименты проводились на Oracle Linux 8.8, LVM2

Тест 1

  • На том создан snapshot1
  • На томе создан небольшой файл
  • На том snapshot1 не удалось создать snapshot2, получено сообщение
Snapshots of snapshots are not supported.

Тест 2

  • На том создан snapshot1
  • На томе создан небольшой текстовый файл 1.txt
  • На том создан snapshot2
  • На томе внесены изменения в 1.txt
  • На том скопирован большой файл
  • На snapshot1, snapshot2 одинаково увеличился % использования
  • Выполнен откат snapshot2, большой файл и изменения в 1.txt исчезли
  • Выполнен откат snapshot1, 1.txt исчез

Выводы

  • Вложенные снапшоты не поддерживаются
  • Можно создавать снапшоты в разное время на один и тот же исходынй том, но они будут работать параллельно, т.е. изменяемые блоки будут скидываться и в snapshot1 и в snapshot2, что будет существенно замедлять работу с диском. Также будет двойной расход места диска
  • Тем не менее параллельные снепшоты могут выполнять задачу отката, на момент своего создания, если будет выполняться откат в обратном порядке.

Я не проверял, что будет если откатить сначала snapshot1, а затем snapshot2. Теоретически, он не может восстановить состояние диска, т.к. в нем нет изменений произведенных между snapshot1 и snapshot2. По логике snapshot1 должен откатиться, а snapshot2 сломается и его придется просто удалить.

Ссылки по теме:

RHEL 9 и его производные

Добавлена новая фича, по умолчанию, LVM видит только устройства добавленные в специальный список. Команды vgs, vgscan, pvs, pvscan не помогут увидеть устройства не добавленные в этот список. Пока включена эта фича, фильтры заданные в файле конфигурации /etc/lvm/lvm.conf не работают ни при ручном ни при автоматическом сканировании.

Управление списком LVM устройств

# текущий список LVM устройств
lvmdevices

# добавление в список LVM устройств
lvmdevices --adddev <PV>

# файл устройств (руками нельзя менять)
/etc/lvm/devices/system.devices

# (не проверено) массовое добавление устройств в список
# данная команда выполняет сканирование по заданным фильтрам, при этом новая фича не блокирует сканирование
vgimportdevices <vg_name>
vgimportdevices --all