open atlas
↑ К треку
Linux: операционная система LIN · 07 · 02

Расширение LV и снапшоты LVM

Расширение LV онлайн требует lvextend (растит блочное устройство), затем resize2fs или xfs_growfs (растит файловую систему) — порядок важен. Снапшоты LVM — copy-on-write виды в точке времени для согласованных бэкапов. Заполненный снапшот молча становится недействительным.

LIN Senior ◷ 22 min
Уровень
ОсновыJuniorMiddleSenior

Использование диска на /data достигает 90%. С обычным разделом нужно отмонтировать, загрузиться с live-диска, использовать parted для сжатия соседнего раздела и расширения этого, затем изменить размер файловой системы — офлайн-процедура с множеством способов уничтожить данные. С LVM запускаешь две команды, пока файловая система смонтирована и трафик идёт вживую.

Но есть нюанс, который большинство документации замалчивает: порядок команд обязателен. Расширение файловой системы до блочного устройства — в лучшем случае no-op. Расширение блочного устройства без расширения файловой системы молча тратит пространство впустую. Знай порядок — и онлайн-расширение LVM станет одной из самых безопасных операций.

Цель

После этого урока ты сможешь расширить логический том LVM и его файловую систему онлайн, объяснить почему порядок (lvextend затем resize) обязателен, создавать и использовать снапшоты LVM для согласованных бэкапов и понимать, когда снапшот становится недействительным.

1

Сначала проверь, сколько пространства доступно в VG.

# Сколько свободно в VG?
sudo vgs
#   VG     #PV #LV #SN Attr   VSize    VFree
#   datavg   2   2   0 wz--n- <99.99g  30.00g
# 30 ГБ свободно — можно расширять

# Подробнее: свободные физические экстенты
sudo vgdisplay datavg | grep -E 'Free|Total|Alloc'
#   Total PE              25599
#   Alloc PE / Size       18176 / 71.00 GiB
#   Free  PE / Size        7423 / 29.00 GiB

# Какой LV расширять?
sudo lvs
#   LV      VG     Attr       LSize
#   appdata datavg -wi-ao---- 30.00g
#   logs    datavg -wi-ao---- 41.00g

# Текущее использование файловой системы (что вызвало тревогу)
df -h /mnt/appdata
# Filesystem               Size  Used Avail Use%
# /dev/mapper/datavg-appdata  30G   27G  1.4G  95%
2

Шаг 1 расширения: растим логический том (уровень блочного устройства).

# Расширить LV appdata на 20 ГБ (прибавляется к текущему размеру)
sudo lvextend -L +20G /dev/datavg/appdata
#   Size of logical volume datavg/appdata changed from 30.00 GiB to 50.00 GiB.
#   Logical volume datavg/appdata successfully resized.

# Или расширить до конкретного итогового размера
sudo lvextend -L 50G /dev/datavg/appdata

# Или занять всё оставшееся свободное пространство VG
sudo lvextend -l +100%FREE /dev/datavg/appdata

# После lvextend блочное устройство стало больше, но ФАЙЛОВАЯ СИСТЕМА ещё не знает:
df -h /mnt/appdata
# Filesystem               Size  Used Avail Use%
# /dev/mapper/datavg-appdata  30G   27G  1.4G  95%
# <-- всё ещё показывает 30 ГБ! Файловая система не получила сигнала.

lvextend только расширяет блочное устройство. Файловая система поверх имеет собственные метаданные размера — её нужно изменить отдельно.

3

Шаг 2 расширения: изменение размера файловой системы для заполнения LV.

Команда зависит от типа файловой системы:

# Для ext4: resize2fs (можно запускать на живой смонтированной ФС)
sudo resize2fs /dev/datavg/appdata
# resize2fs 1.47.0 (5-Feb-2023)
# Filesystem at /dev/datavg/appdata is mounted on /mnt/appdata; on-line resizing required
# The filesystem on /dev/datavg/appdata is now 13107200 (4k) blocks long.

# Для xfs: xfs_growfs (требует точку монтирования, НЕ путь к устройству)
sudo xfs_growfs /mnt/appdata
# meta-data=/dev/mapper/datavg-appdata isize=512    agcount=4, agsize=1966080 blks
# ...
# data blocks changed from 7864320 to 13107200

# Проверяем — файловая система теперь больше
df -h /mnt/appdata
# Filesystem               Size  Used Avail Use%
# /dev/mapper/datavg-appdata  50G   27G   21G  57%
# <-- теперь показывает 50 ГБ

Обязательный порядок: сначала lvextend, затем resize файловой системы. Если запустить resize2fs на устройстве меньше ожидаемого — ошибка. Если запустить lvextend и забыть resize2fs — ФС продолжает использовать старый размер, лишнее пространство существует, но невидимо.

Сокращение: флаг lvextend -r запускает resize2fs или xfs_growfs автоматически после расширения:

sudo lvextend -L +20G -r /dev/datavg/appdata
# Расширяет LV и изменяет размер ФС одной командой
4

Снапшоты LVM: copy-on-write виды в точке времени.

Снапшот LVM создаёт вид логического тома в конкретный момент. Он не копирует данные немедленно — использует copy-on-write (COW): блоки копируются в снапшот только когда оригинальный LV их изменяет. Создание снапшота мгновенно.

# Создать снапшот appdata на 5 ГБ (буфер COW)
# Размер снапшота — НЕ размер данных, а сколько изменений ожидается во время бэкапа
sudo lvcreate -s -L 5G -n appdata-snap /dev/datavg/appdata
#   Logical volume "appdata-snap" created.

sudo lvs
#   LV           VG     Attr       LSize Origin  Snap%  Move Log
#   appdata      datavg owi-aos---  50.00g
#   appdata-snap datavg swi-a-s---   5.00g appdata   0.00
# 'o' = origin, 's' = snapshot, Snap% = заполненность COW буфера

# Монтируем снапшот только для чтения для бэкапа
sudo mkdir /mnt/snap
sudo mount -o ro /dev/datavg/appdata-snap /mnt/snap

# Запускаем бэкап с согласованного снапшота (оригинальный LV продолжает работать)
sudo rsync -av /mnt/snap/ /backup/appdata-$(date +%Y%m%d)/

# Убираем: отмонтируем и удаляем снапшот
sudo umount /mnt/snap
sudo lvremove /dev/datavg/appdata-snap
5

Ловушка заполненного снапшота: полный снапшот становится недействительным.

# Следим за заполненностью снапшота — мониторь во время длинного бэкапа
sudo lvs /dev/datavg/appdata-snap
#   LV           Snap%
#   appdata-snap 73.41  <-- 73% использовано, ещё безопасно

# Если достигает 100%:
#   appdata-snap 100.00  <-- НЕДЕЙСТВИТЕЛЕН — данные потеряны из снапшота
# Любая попытка чтения вернёт ошибки ввода-вывода

# Настроить автоматическое расширение снапшота (/etc/lvm/lvm.conf):
# snapshot_autoextend_threshold = 80
# snapshot_autoextend_percent = 20
# (демон LVM расширит снапшот автоматически при достижении порога)

# Правило размера COW буфера:
# - Активная БД во время длинного бэкапа: 20-30% от размера origin
# - Тихая ФС во время быстрого rsync: 5-10% достаточно
# - При сомнениях — больше лучше: неиспользованный COW тратится впустую, но не опасен
Разбор примера

Production-сценарий: расширение тома данных PostgreSQL без простоя.

# Ситуация: /dev/pgvg/pgdata смонтирован в /var/lib/postgresql
# df показывает 92% — нужно добавить 50 ГБ прямо сейчас, PostgreSQL продолжает работать

# Шаг 1: убедиться что в VG есть место
sudo vgs pgvg
#   VG   #PV #LV VSize   VFree
#   pgvg   1   1 200.00g 100.00g
# 100 ГБ свободно — отлично

# Шаг 2: определить тип файловой системы (важно для команды resize)
findmnt /var/lib/postgresql
# TARGET                 SOURCE                  FSTYPE
# /var/lib/postgresql    /dev/mapper/pgvg-pgdata ext4

# Шаг 3: расширить LV и файловую систему одной командой (флаг -r)
sudo lvextend -L +50G -r /dev/pgvg/pgdata
# Extending logical volume pgvg/pgdata to 150.00 GiB
# resize2fs 1.47.0: Filesystem at /dev/pgvg/pgdata is mounted on /var/lib/postgresql
# The filesystem on /dev/pgvg/pgdata is now 39321600 (4k) blocks long.

# PostgreSQL не прерывался. Проверяем:
df -h /var/lib/postgresql
# Filesystem                  Size  Used Avail Use%
# /dev/mapper/pgvg-pgdata     150G   92G   53G  64%

# Шаг 4 (хорошая практика): снапшот перед следующей крупной миграцией схемы
sudo lvcreate -s -L 20G -n pgdata-premigration /dev/pgvg/pgdata
#   Logical volume "pgdata-premigration" created.

# Запускаем миграцию. Если что-то пошло не так:
# sudo lvconvert --merge /dev/pgvg/pgdata-premigration
# (сливает снапшот обратно — фактически откат; требует остановки и перезапуска LV)

# После успешной миграции удаляем снапшот:
sudo lvremove /dev/pgvg/pgdata-premigration
Частая ошибка

Самая опасная ошибка со снапшотами LVM: считать, что снапшот надёжен бесконечно после создания. Если origin LV имеет интенсивную запись и бэкап идёт медленно, COW буфер быстро заканчивается. При 100% заполнения снапшот молча становится недействительным — чтение возвращает ошибки ввода-вывода без ясного сообщения об ошибке. Всегда задавай COW буфер с запасом для production-томов, следи за Snap% в lvs во время бэкапа и настрой snapshot_autoextend_threshold в /etc/lvm/lvm.conf, чтобы LVM расширял буфер автоматически.

Почему это работает

Почему xfs_growfs принимает точку монтирования, а resize2fs — путь к устройству? XFS блокирует метаданные через слой VFS и требует контекста живого монтирования для ioctl расширения. resize2fs для ext4 работает на уровне блоков и не нуждается в точке монтирования — хотя для живой файловой системы также использует ioctl внутри. Практическое следствие: для XFS всегда используй путь монтирования (/mnt/appdata), никогда устройство; для ext4 можно и то, и другое.

Проверь себя
Викторина

Ты запускаешь 'sudo lvextend -L +30G /dev/myvg/data' — команда успешна. Затем 'df -h /data' всё ещё показывает старый меньший размер. Что нужно сделать и почему lvextend не исправил это?

Итог

Расширение LV онлайн требует двух шагов по порядку: сначала lvextend (расширяет блочное устройство, выделяя экстенты из свободного пула VG), затем resize2fs /dev/vg/lv для ext4 или xfs_growfs /точка-монтирования для XFS (сообщает файловой системе заполнить новое пространство). Флаг -r в lvextend делает оба шага одной командой. Снапшоты LVM — copy-on-write виды в точке времени, создаваемые через lvcreate -s; они мгновенно фиксируют состояние origin LV и позволяют запускать бэкап со снапшота, пока origin продолжает обрабатывать записи. COW буфер снапшота поглощает каждый блок, изменённый в origin с момента создания — если он заполняется до 100%, снапшот молча становится недействительным. Задавай буфер с запасом, следи за Snap% в lvs и настрой snapshot_autoextend_threshold в /etc/lvm/lvm.conf для production-томов.

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 4 завершено

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.