Привет всем 👋,

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

Создаем образ VM

Подключаемся на сервер, где расположена старая виртуальная машина. Допустим, наша VM называется - vm126340. При помощи утилит lsblk + grep находим путь к ее LVM-партици:

lsblk | grep vm126340
├─lvm0-1420_vm126340 253:53  0 14.7G 0 lvm 

Из этого вывода можно понять:

  • lvm0 - volume-группа, где размещается lvm-партиция,
  • 1420_vm126340 - название lvm-раздела,

С этими данными можно получить более детальную информацию о разделе с помощью команды:

lvdisplay /dev/lvm0/1420_vm126340 
 --- Logical volume ---
 LV Path               /dev/lvm0/1420_vm126340
 LV Name               1420_vm126340
 VG Name               lvm0
 LV Write Access       read/write
 LV Creation host, time kvm12, 2024-02-15 21:12:49 +0600
 LV Status             available
 # open                0
 LV Size               <14.65 GiB
 Current LE            3750
 Segments              1
 Allocation            inherit
 Read ahead sectors    auto
 - currently set to    8192
 Block device          253:53

Теперь создаем новую сессию в tmux. Это нужно для защиты процесса создания образа: если по какой-то причине нас выбросит с сервера, процесс не прервется, и мы сможем снова подключиться к текущей сессии.

tmux

Далее создаем образ командой:

dd if=/dev/lvm0/1420_vm126340 of=/image/lvm_vm126340.img bs=16M status=progress

Разбор аргументов:

  • if=/dev/lvm0/1420_vm126340input file, источник. В данном случае это логический том с именем 1420_vm126340, который располагается в volume-группе lvm0.
  • of=/images/lvm_vm126340.imgoutput file, файл-образ, куда будут записаны данные. Файл будет создан в каталоге /images.
  • bs=16M — размер блока копирования. Данные будут читаться и записываться блоками по 16 мегабайт, что ускоряет процесс по сравнению с умолчанием (512 байт).
  • status=progress — выводит информацию о процессе копирования в реальном времени, показывая объем обработанных данных.

После завершения создания образа копируем его на соседний KVM-хост, где будем восстанавливать.

Копируем командой:

scp /images/lvm_vm126340.img root@kvm18:/images/

Переходим к следующему этапу…

Восстановление образа

Перед восстановлением через VMmanager или консоль Shell необходимо создать виртуальную машину с аналогичными параметрами.

Допустим, мы создали VM, и её имя — vm126340_clone. Как и в примере ранее, идентифицируем диски этой виртуалки, аналогичным способом.

lsblk | grep vm126340_clone
├─lvm0-1991_vm126340_clone 253:89  0   15G 0 lvm 

На втором сервере также заходим в tmux и запускаем процесс восстановления:

dd if=/images/lvm_vm126340.img of=/dev/lvm0/1991_vm126340_clone bs=16M status=progress oflag=direct conv=fsync

Разбор параметров:

  • if=/images/lvm_vm126340.img — Файл-образ ранее сохраненного логического тома.
  • of=/dev/lvm0/1991_vm126340_clone — целевой диск/логический том, куда записываются данные.
  • bs=16M — размер блока чтения/записи (16 мегабайт).
  • status=progress — показывает процесс копирования в реальном времени (сколько данных уже записано).
  • oflag=direct — передает данные напрямую в целевой диск, минуя кеш операционной системы (ускоряет запись и снижает нагрузку на оперативную память).
  • conv=fsync — гарантирует, что данные будут сразу записаны на диск, а не останутся в кэше.

Перед запуском dd виртуальная машина должна быть выключена.

После завершения процесса подключаемся к виртуалке и настраиваем сеть. Задача выполнена — ещё один закрытый тикет ✅.