Перенос виртуального диска между хранилищами в Proxmox VE

Пошаговый перенос виртуального диска VM между хранилищами Proxmox VE через веб-интерфейс и CLI с проверкой конфигурации и освобождением места.

Виртуальный диск можно перенести с одного хранилища Proxmox VE на другое без пересоздания виртуальной машины.

Операция полезна, если:

  • заканчивается место;
  • требуется перейти с локального storage на ZFS, LVM-thin или NFS;
  • нужно перераспределить нагрузку;
  • требуется освободить старое хранилище;
  • меняется архитектура хранения.

В этой инструкции рассматривается только перенос одного виртуального диска VM между хранилищами на одном узле.

Подходит для: Proxmox VE 8 и 9
Уровень сложности: средний
Время выполнения: зависит от размера диска и скорости storage
Требуемый доступ: права управления VM и хранилищами

Важное предупреждение

Перед переносом:

  • создайте резервную копию VM;
  • проверьте свободное место на целевом storage;
  • убедитесь, что выбран правильный диск;
  • не запускайте одновременно backup, snapshot или migration;
  • не прерывайте операцию без необходимости;
  • проверьте доступ к консоли узла.

Что будет рассмотрено

После выполнения инструкции можно будет:

  • определить текущий storage диска;
  • проверить свободное место;
  • перенести диск через веб-интерфейс;
  • перенести диск через CLI;
  • выбрать формат диска;
  • проверить конфигурацию после переноса;
  • удалить старый volume;
  • диагностировать типичные ошибки.

Проверка конфигурации VM

На узле Proxmox:

qm config VM_ID

Пример:

qm config 100

Покажите только диски:

qm config VM_ID |
grep -E '^(scsi|virtio|sata|ide)[0-9]+:'

Пример:

scsi0: local-lvm:vm-100-disk-0,size=64G

Здесь:

scsi0

— имя виртуального диска;

local-lvm

— текущее хранилище;

vm-100-disk-0

— имя тома;

64G

— размер диска.

Проверка хранилищ

pvesm status

Проверьте:

  • статус;
  • общий объём;
  • занятое место;
  • свободное место;
  • тип хранилища.

Целевой storage должен иметь статус:

active

Проверка типа целевого storage

Откройте:

Datacenter → Storage

Выберите хранилище.

Проверьте, что в Content разрешено:

Disk image

Через CLI:

cat /etc/pve/storage.cfg

Найдите нужный storage.

Проверка свободного места

Для всех storage:

pvesm status

Для файлового storage:

df -h /mnt/pve/STORAGE_ID

Для LVM-thin:

lvs -a -o+data_percent,metadata_percent

Для ZFS:

zpool list
zfs list

Свободного места должно быть достаточно для полного объёма данных и служебных операций.

Создание резервной копии

Перед переносом создайте backup:

vzdump VM_ID   --storage BACKUP_STORAGE   --mode snapshot   --compress zstd

Дождитесь:

TASK OK

Проверка активных задач

Перед началом убедитесь, что VM не участвует в других операциях.

Проверьте:

ps aux |
grep -E 'vzdump|qmigrate|qemu-img|pvesm' |
grep -v grep

В веб-интерфейсе проверьте:

Node → Tasks

Нужно ли останавливать VM

Proxmox VE может переносить некоторые диски работающей VM.

Однако возможность live move зависит от:

  • типа storage;
  • формата диска;
  • версии QEMU;
  • наличия snapshot;
  • текущей нагрузки;
  • конкретной конфигурации VM.

Для наиболее предсказуемого результата остановите VM в согласованное окно.

Корректное завершение:

qm shutdown VM_ID

Проверьте:

qm status VM_ID

Ожидаемый результат:

status: stopped

Перенос через веб-интерфейс

Выберите VM.

Откройте:

VM → Hardware

Выберите нужный диск, например:

scsi0

Нажмите:

Disk Action → Move Storage

Выбор Target Storage

В поле:

Target Storage

выберите новое хранилище.

Пример:

local-zfs

Выбор формата диска

Доступные варианты зависят от storage backend.

Возможные форматы:

raw
qcow2
vmdk

raw

Преимущества:

  • минимальные накладные расходы;
  • высокая производительность;
  • часто используется с LVM-thin, ZFS и Ceph.

qcow2

Преимущества:

  • поддержка снапшотов на файловом storage;
  • thin provisioning;
  • переносимость файла.

Недостатки:

  • дополнительные накладные расходы;
  • зависит от типа storage.

Если поле недоступно, формат определяется хранилищем автоматически.

Параметр Delete source

В форме может быть опция удаления исходного диска после успешного копирования.

Рекомендуется:

  • оставить удаление включённым при штатном переносе;
  • отключить его, если требуется дополнительная ручная проверка;
  • помнить, что сохранённый старый диск будет занимать место.

После переноса всегда проверяйте конфигурацию.

Запуск переноса

Нажмите:

Move disk

Дождитесь завершения задачи.

В журнале должно появиться:

TASK OK

Не закрывайте вкладку и не перезапускайте узел во время операции.

Перенос через CLI

Базовая команда:

qm move_disk   VM_ID   DISK   TARGET_STORAGE

Пример:

qm move_disk   100   scsi0   local-zfs

Перенос с удалением исходного тома

Обычно исходный том удаляется после успешного переноса.

Явно:

qm move_disk   100   scsi0   local-zfs   --delete 1

Перенос без удаления исходного тома

qm move_disk   100   scsi0   local-zfs   --delete 0

После операции старый том может появиться в конфигурации как:

unused0

Проверьте:

qm config 100

Указание формата

Для файлового storage:

qm move_disk   100   scsi0   directory-storage   --format qcow2

Для backend, который поддерживает только raw, формат будет выбран автоматически.

Проверка прогресса

В веб-интерфейсе:

Node → Tasks

Через CLI следите за процессами:

ps aux |
grep -E 'qemu-img|qm move_disk|pvesm' |
grep -v grep

Для storage также можно наблюдать нагрузку:

iostat -xz 1

Проверка после переноса

Покажите конфигурацию:

qm config VM_ID

Пример ожидаемой строки:

scsi0: local-zfs:vm-100-disk-0,size=64G

Проверьте, что storage изменился.

Проверка unused-дисков

qm config VM_ID |
grep '^unused'

Если старый диск не удалён, он может отображаться как:

unused0

Не удаляйте его, пока не проверена загрузка VM и данные.

Первый запуск после переноса

qm start VM_ID

Проверьте:

qm status VM_ID

Откройте консоль.

Убедитесь, что гостевая ОС загрузилась.

Проверка диска внутри Linux

lsblk
df -hT

Проверьте журнал ядра:

sudo journalctl -k -b --no-pager |
grep -iE 'I/O error|filesystem|ext4|xfs'

Проверка сервисов

systemctl --failed

Проверьте критичное приложение:

systemctl status SERVICE_NAME --no-pager

Проверьте данные приложения.

Проверка производительности

После переноса можно выполнить базовую проверку I/O.

Проверка задержки storage на узле:

iostat -xz 1

Проверка внутри VM:

dd if=/dev/zero   of=/tmp/disk-test.img   bs=1M   count=1024   conv=fdatasync

Удалите тестовый файл:

rm -f /tmp/disk-test.img

dd показывает только грубую последовательную скорость и не заменяет полноценный benchmark.

Удаление старого unused-диска

После успешной проверки:

  1. Убедитесь, что VM загружается.
  2. Проверьте приложение.
  3. Проверьте backup.
  4. Убедитесь, что unused0 относится к старому диску.

В веб-интерфейсе:

VM → Hardware → Unused Disk → Remove

Через CLI сначала посмотрите:

qm config VM_ID |
grep '^unused'

Затем удалите запись:

qm set VM_ID   --delete unused0

Важно: удаление unused0 может удалить соответствующий volume. Подтвердите его назначение до выполнения.

Освобождение места на старом storage

Проверьте:

pvesm status

Для LVM-thin:

lvs

Для ZFS:

zfs list

Для directory storage:

du -sh /path/to/storage/images/VM_ID

Перенос нескольких дисков

Если VM содержит:

scsi0
scsi1
scsi2

переносите каждый диск отдельно.

После каждого переноса:

  • проверяйте task log;
  • проверяйте qm config;
  • проверяйте свободное место;
  • не запускайте несколько тяжёлых операций одновременно без необходимости.

Перенос EFI-диска

При использовании OVMF в конфигурации может быть:

efidisk0

Его также можно перенести на целевой storage.

Пример:

qm move_disk   VM_ID   efidisk0   TARGET_STORAGE

После переноса проверьте загрузку UEFI.

Перенос TPM state

Для VM с TPM может быть:

tpmstate0

Перенесите его отдельно:

qm move_disk   VM_ID   tpmstate0   TARGET_STORAGE

Не удаляйте TPM state без необходимости.

Снапшоты и перенос

Наличие снапшотов может ограничить перенос диска между некоторыми storage backend.

Проверьте:

qm listsnapshot VM_ID

Если перенос недоступен:

  • проверьте поддержку целевого storage;
  • удалите ненужные снапшоты после backup;
  • используйте backup и restore;
  • выполните storage migration другим способом.

Альтернатива через backup и restore

Если прямой перенос не поддерживается:

  1. Создайте backup VM.
  2. Восстановите её с новым VM ID на целевой storage.
  3. Проверьте сеть и загрузку.
  4. Удалите исходную VM только после проверки.

Такой способ требует больше времени и свободного места, но часто надёжнее при сложной миграции.

Типичные проблемы

Target storage не отображается

Проверьте:

  • статус storage;
  • разрешён ли тип Disk image;
  • доступен ли storage выбранному узлу;
  • достаточно ли свободного места.

Команда:

pvesm status

Перенос завершился с ошибкой

Проверьте task log.

Частые причины:

  • недостаточно места;
  • storage стал недоступен;
  • ошибка чтения исходного диска;
  • неподдерживаемый формат;
  • активный snapshot;
  • высокая нагрузка;
  • сетевой сбой для NFS или Ceph.

После переноса VM не загружается

Проверьте:

qm config VM_ID

Убедитесь, что:

  • boot order указывает на правильный диск;
  • диск подключён под прежним bus;
  • EFI disk на месте;
  • storage active.

Старый диск остался как unused0

Это ожидаемо при --delete 0.

Проверьте VM, затем удалите unused-диск вручную.

Место на старом storage не освободилось

Проверьте:

qm config VM_ID |
grep '^unused'

Также проверьте storage backend.

Для LVM:

lvs

Для directory storage:

find /path/to/storage/images/VM_ID -maxdepth 1 -type f -ls

Перенос идёт очень медленно

Проверьте:

iostat -xz 1

Для NFS:

nfsstat -m

Для сети:

sar -n DEV 1

Скорость зависит от исходного и целевого storage, размера фактических данных и нагрузки.

Безопасный порядок переноса

  1. Проверить backup.
  2. Проверить qm config.
  3. Проверить storage и свободное место.
  4. Проверить отсутствие активных задач.
  5. При необходимости остановить VM.
  6. Перенести диск.
  7. Проверить TASK OK.
  8. Проверить новую конфигурацию.
  9. Запустить VM.
  10. Проверить ОС, файловую систему и приложение.
  11. Только после проверки удалить старый unused-диск.
  12. Повторно проверить свободное место.

Быстрый набор команд

Показать диски:

qm config VM_ID |
grep -E '^(scsi|virtio|sata|ide|efi|tpm)'

Показать storage:

pvesm status

Перенести диск:

qm move_disk   VM_ID   scsi0   TARGET_STORAGE

Проверить:

qm config VM_ID

Показать unused:

qm config VM_ID |
grep '^unused'

Итог

После выполнения инструкции:

  • определён исходный storage;
  • проверено место на целевом хранилище;
  • виртуальный диск перенесён через GUI или CLI;
  • проверены формат и конфигурация;
  • VM успешно запущена;
  • проверены файловая система и сервисы;
  • старый volume удалён только после проверки.

Перенос диска следует считать завершённым только после успешной загрузки VM и проверки данных приложения.

← Предыдущая статья Клонирование виртуальной машины в Proxmox VE Следующая статья → Миграция виртуальной машины между узлами Proxmox VE