Skip to content

Повреждение дисков виртуальной машины при миграции в Proxmox

Внезапно столкнулся с такой проблемой. Есть кластер Proxmox VE, и виртуальная машина в нем, которая работает на ноде A. Понадобилось перенести ее на ноду B. После переноса она не запускается. Операционная система ругается на повреждение системных файлов. Восстановление из бекапа и повторный перенос проходят с точно таким же результатом, т.е. это не случайный сбой. Проверка контрольных сумм файлов показывает, что на ноде B они действительно повреждены.

Много времени было убито в попытках понять вероятную причину, но оказалось вот что.

Если у вас кластер Proxmox VE и в качестве хранилища используется LVM (обычный, не thin), то при миграции между нодами содержимое дисков может быть повреждено. Схема миграции дисков на LVM простая - содержимое читается посредством dd, передается по сети и записывается в месте назначения с помощью того же dd. Запись осуществляется командной строкой вида:

dd of=/dev/pve/vm-100-disk-0 conv=sparse bs=64k

Уже догадались, да? Или нет?

Each CONV symbol may be:
...
sparse try to seek rather than write the output for NUL input blocks
...

Proxmox помешан на тонких хранилищах, где образы дисков занимают столько же места, сколько данные внутри них - LVM Thin, ZFS, разрежённые файлы. Похоже кто-то из разработчиков забыл, что с простым LVM такое не работает. Если на виртуальном диске есть нулевые блоки, то после переноса диска на другую ноду вместо них окажутся неопределенные данные, а именно - то, что было ранее записано на этом месте на диске хост-машины.

Хорошо, что удалось заметить эту проблему по порче системного файла, а не какой-нибудь важной базы данных, например.

Все сказанное актуально для последней на текущий момент версии:

proxmox-ve: 5.3-1 (running kernel: 4.15.18-9-pve)
pve-manager: 5.3-6 (running version: 5.3-6/37b3c8df)

Судя по коммитам в git, могу предположить, что этой проблеме возможно не менее полутора лет. Неужели до сих пор никто не заметил такой критический баг с повреждением данных? Что, никто не использует кластер с локальным LVM хранилищем? Все сидят на ZFS, LVM Thin или NAS/SAN хранилищах?

Отправлено в багтрекер разработчиков: https://bugzilla.proxmox.com/show_bug.cgi?id=2050