Расширение LV и снапшоты LVM
Расширение LV онлайн требует lvextend (растит блочное устройство), затем resize2fs или xfs_growfs (растит файловую систему) — порядок важен. Снапшоты LVM — copy-on-write виды в точке времени для согласованных бэкапов. Заполненный снапшот молча становится недействительным.
Использование диска на /data достигает 90%. С обычным разделом нужно отмонтировать, загрузиться с live-диска, использовать parted для сжатия соседнего раздела и расширения этого, затем изменить размер файловой системы — офлайн-процедура с множеством способов уничтожить данные. С LVM запускаешь две команды, пока файловая система смонтирована и трафик идёт вживую.
Но есть нюанс, который большинство документации замалчивает: порядок команд обязателен. Расширение файловой системы до блочного устройства — в лучшем случае no-op. Расширение блочного устройства без расширения файловой системы молча тратит пространство впустую. Знай порядок — и онлайн-расширение LVM станет одной из самых безопасных операций.
После этого урока ты сможешь расширить логический том LVM и его файловую систему онлайн, объяснить почему порядок (lvextend затем resize) обязателен, создавать и использовать снапшоты LVM для согласованных бэкапов и понимать, когда снапшот становится недействительным.
Сначала проверь, сколько пространства доступно в 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%Шаг 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 только расширяет блочное устройство. Файловая система поверх имеет собственные метаданные размера — её нужно изменить отдельно.
Шаг 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 и изменяет размер ФС одной командойСнапшоты 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Ловушка заполненного снапшота: полный снапшот становится недействительным.
# Следим за заполненностью снапшота — мониторь во время длинного бэкапа
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-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.