Как безопасно расширить LUKS + LVM раздел в виртуальной машине QEMU с qcow2
Статья описывает реальный рабочий сценарий:
виртуальная машина Debian, диск в формате qcow2, разметка msdos, схема
extended → logical → LUKS → LVM → root.
Мы увеличиваем диск и расширяем root-раздел, не повреждая данные.
Исходные условия
* Виртуализация: QEMU/KVM
* Диск: qcow2
* Разметка: msdos
* Шифрование: LUKS
* Управление томами: LVM
* Корневой раздел находится внутри LUKS
0️⃣ Исходная разметка (реальные значения)
Проверка внутри ВМ
☯
Terminal:
⌕
≡
✕
lsblk
☯
Terminal:
⌕
≡
✕
vda 35G
├─vda1 966M /boot
├─vda2 19.1G extended
└─vda5 19.1G logical
└─vda5_crypt 19G crypt
├─debian--vg-root 18G /
└─debian--vg-swap 1G [SWAP]Таблица разделов
☯
Terminal:
⌕
≡
✕
fdisk -l /dev/vda
☯
Terminal:
⌕
≡
✕
Device Start End Type /dev/vda1 2048 1980415 primary /dev/vda2 1982462 41940991 extended /dev/vda5 1982464 41940991 logical
? КРИТИЧЕСКИ ВАЖНО
LUKS-заголовок начинается строго с сектора 1982464.
Этот номер нельзя менять ни при каких обстоятельствах.
1️⃣ Snapshot qcow2 (обязательно)
Создание snapshot
☯
Terminal:
⌕
≡
✕
qemu-img snapshot -c before_resize /var/lib/libvirt/images/debian13.qcow2
? Snapshot вшивается внутрь файла qcow2, отдельного файла не создаётся.
Проверка:
☯
Terminal:
⌕
≡
✕
qemu-img snapshot -l /var/lib/libvirt/images/debian13.qcow2
Откат (если что-то пошло не так)
⚠️ ВМ должна быть выключена.
☯
Terminal:
⌕
≡
✕
virsh shutdown debian13 qemu-img snapshot -a before_resize /var/lib/libvirt/images/debian13.qcow2
2️⃣ Увеличиваем размер qcow2
На хосте:
☯
Terminal:
⌕
≡
✕
qemu-img resize /var/lib/libvirt/images/debian13.qcow2 +20G
Важно понимать:
* QEMU НЕ меняет partition table
* extended и logical остаются старого размера
* всё новое место — неразмечено
3️⃣ Почему нужен Live CD / Rescue
Нельзя менять logical-раздел с корнем из запущенной системы.
Загружаемся с Live ISO:
- Скачиваем Debian Live ISO:
☯
Terminal:
⌕
≡
✕
wget https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-13.0.0-amd64-standard.iso
Чтобы безопасно редактировать логический раздел /dev/vda5, раздел не должен быть смонтирован. подключаем порядок загрузки с cdrom так:
☯
Terminal:
⌕
≡
✕
sudo qemu-system-x86_64 \ -enable-kvm \ -m 2048 -smp 2 \ -machine pc-q35-7.2 \ -cpu host \ -drive file=debian-live-13.0.0-amd64-standard.iso,media=cdrom \ -drive file=/var/lib/libvirt/images/debian13.qcow2,if=virtio,format=qcow2 \ -boot order=d \ -netdev bridge,br=virbr0,id=net0 \ -device virtio-net-pci,netdev=net0 \ -vga qxl \ -device virtio-tablet \ -spice port=5930,disable-ticketing=on \ -device intel-hda -device hda-duplex \ -monitor stdio
4️⃣ Определяем новый конец диска (off-by-one!)
В Live-системе:
☯
Terminal:
⌕
≡
✕
parted /dev/vda
☯
Terminal:
⌕
≡
✕
unit s print
Пример вывода:
☯
Terminal:
⌕
≡
✕
Disk /dev/vda: 73400320s
⚠️ Это количество секторов, а не последний сектор
Правило
☯
Terminal:
⌕
≡
✕
LAST_SECTOR = Disk_size - 1
В нашем случае:
☯
Terminal:
⌕
≡
✕
73400320 - 1 = 73400319
? 73400319 — последний допустимый сектор
5️⃣ ПРАВИЛЬНАЯ последовательность (КРИТИЧНО)
Нарушение порядка = потеря данных.
5.1️⃣ Расширяем extended (`vda2`)
☯
Terminal:
⌕
≡
✕
resizepart 2 100%
(или эквивалентно resizepart 2 73400319)
Проверка:
☯
Terminal:
⌕
≡
✕
Теперь /dev/vda2 заканчивается в конце диска.
5.2️⃣ Пересоздаём logical (`vda5`)
☯
Terminal:
⌕
≡
✕
rm 5 mkpart logical 1982464 100%
? Здесь происходит НЕ создание нового раздела,
а восстановление записи о существующих данных.
* start строго прежний
* end — конец extended
5.3️⃣ Завершение работы с parted
☯
Terminal:
⌕
≡
✕
print quit
⚠️ В parted изменения применяются сразу, команды w нет.
Если появилось сообщение о kernel — просто перезагрузитесь.
6️⃣ Почему fdisk здесь НЕ подходит
fdisk может сказать:
☯
Terminal:
⌕
≡
✕
First sector (1984510-...) Value out of range
Почему это нормально
* fdisk считает, что вы создаёте новый пустой раздел
* он навязывает alignment
* он не умеет восстанавливать существующие данные
? parted работает на уровне секторов и подходит для этой задачи
❌ ФАТАЛЬНАЯ ОШИБКА (НИКОГДА ТАК НЕ ДЕЛАТЬ)
☯
Terminal:
⌕
≡
✕
mkpart logical 1984512 100%
Это:
* сдвигает начало LUKS
* уничтожает заголовок
* = полная потеря данных
7️⃣ Расширяем LUKS
После загрузки в обычную систему:
☯
Terminal:
⌕
≡
✕
cryptsetup resize vda5_crypt
8️⃣ Расширяем LVM (важный нюанс с именами)
Проверяем реальные имена
☯
Terminal:
⌕
≡
✕
vgs lvs
Пример:
☯
Terminal:
⌕
≡
✕
VG VSize VFree debian-vg 38G 20G
⚠️ debian--vg — это device-mapper alias,
реальное имя VG — debian-vg.
Последовательность команд
☯
Terminal:
⌕
≡
✕
pvresize /dev/mapper/vda5_crypt lvextend -l +100%FREE debian-vg/root
9️⃣ Расширяем файловую систему
ext4
☯
Terminal:
⌕
≡
✕
resize2fs /dev/debian-vg/root
xfs
☯
Terminal:
⌕
≡
✕
xfs_growfs /
? Проверка результата
☯
Terminal:
⌕
≡
✕
lsblk df -h pvs vgs lvs
Ожидаемый результат:
* диск увеличен
* extended и logical растянуты
* LUKS использует весь раздел
* LVM использует всё пространство
* данные полностью сохранены
Итоговое правило (запомнить)
> **Если раздел уже содержал данные —
> start берётся из старой таблицы,
> даже если инструмент говорит “out of range”.**
Краткое резюме
* qemu-img resize не меняет разметку
* extended и logical нужно расширять вручную
* fdisk не подходит для восстановления logical
* parted — правильный инструмент
* start LUKS менять нельзя никогда
-
Создано 08.01.2026 15:15:39
-
Roman Sakhno

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.