Поиск по сайту:

Экспорт и импорт виртуальных машин KVM в Linux

В этой статье я расскажу вам, как экспортировать диск и конфигурации виртуальной машины KVM, а затем импортировать их на тот же или другой компьютер. Я также покажу вам, как экспортировать и импортировать виртуальные машины KVM с помощью сценария Bash.

Введение

Недавно я сменил свой гипервизор с Oracle VirtualBox на KVM из-за его собственных функций и производительности. Насколько я тестировал, виртуальные машины KVM работают быстрее по сравнению с виртуальными машинами Virtualbox.

Всегда важно периодически создавать резервные копии виртуальных машин. Поэтому в случае каких-либо несоответствий вы можете использовать резервную копию для восстановления виртуальной машины. Экспорт и импорт виртуальных машин KVM — это двухэтапный процесс.

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

Определение виртуальной машины

Существует два способа получить информацию о домене виртуальной машины. Вы можете использовать либо программу Вирш, либо Вирт-менеджер.

Имя виртуальной машины можно получить из вирт-менеджера или выполнив следующую команду virsh.

virsh list --all
 Id   Name                State
------------------------------------
 -    Linux_Mint_20       shut off
 -    mxlinux             shut off
 -    popos_21_10         shut off
 -    rocky_linux_8       shut off
 -    ubuntu20.04         shut off
 -    ubuntu20.04-clone   shut off

Вы можете запустить следующую команду, чтобы просмотреть всю информацию о домене (конфигурацию виртуальной машины) о конкретной виртуальной машине. Это отобразит результат в формате XML.

virsh dumpxml vm_name | less
virsh dumpxml ubuntu20.04-clone | less

Вы также можете получить конкретную конфигурацию машины, передав ее команде grep. Допустим, если вы хотите просмотреть распределение памяти, вы можете запустить следующую команду.

virsh dumpxml ubuntu20.04-clone | grep -i "MEMORY"
  <memory unit='KiB'>5632000</memory>
  <currentMemory unit='KiB'>5632000</currentMemory>

Если вы предпочитаете Virt-manager, вы можете получить эту информацию в формате XML, нажав вкладка XML в разделе «показать виртуальное оборудование».

Показать информацию о домене в Virt Manager

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

Диски виртуальной машины создаются в формате qcow2. По умолчанию диск виртуальной машины хранится в каталоге /var/lib/libvirt/images/, если только вы явно не сохранили диск в отдельном каталоге.

Выполните следующую команду, чтобы получить путь к каталогу диска.

virsh dumpxml ubuntu20.04-clone | grep -i "source"
      <source file='/var/lib/libvirt/images/ubuntu20.04-clone.qcow2'/>

В Virt-менеджере в разделе Обзор проверьте наличие раздела <disk>.

Расположение диска

Если вы использовали разные пути для хранения образов дисков и хотите узнать все пути к дискам виртуальной машины, вы можете запустить следующий фрагмент из терминала или из сценария оболочки.

VM_NAMES=($(virsh list --all| awk '(NR>2)' | awk '{ print $2 }'))

for VM in ${VM_NAMES[@]}; do
  DISK_PATH=$(virsh dumpxml ${VM} | grep -i "<source file")
  echo "${VM} ${DISK_PATH}"
done | column -t 

Отображение путей к диску виртуальной машины с помощью сценария

Экспорт информации о домене и копирование диска

Теперь вы знаете, как получить путь к диску и информацию о домене. Пришло время экспортировать информацию о домене для виртуальной машины и скопировать образ диска в другое место.

Чтобы экспортировать информацию о домене, вы можете запустить следующую команду «virsh dumpxml» и сохранить выходные данные в файле XML.

virsh dumpxml vm-name > /path/to/xm_file.xml
virsh dumpxml ubuntu20.04-clone > ~/Documents/ubuntu.xml

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

sudo cp /var/lib/libvirt/images/ubuntu20.04-clone.qcow2 ~/Documents/

Процесс экспорта завершен. Это так просто!

Внимание! Вам следует использовать sudo или скопировать диск с пользователем root, поскольку диск принадлежит пользователю root.

Отображать информацию о владельце

Импортировать виртуальную машину KVM

Чтобы импортировать виртуальную машину KVM, вам необходимо определить домен из экспортированного XML-файла, выполнив следующую команду.

virsh define --file <path-to-xml-file>
virsh define -file ~/Documents/ubuntu.xml

Теперь можно проверить вирт-менеджер или запустить команду virsh, домен должен быть успешно создан. Вам необходимо скопировать образ диска в путь к каталогу, определенный в XML-файле. В моем случае это местоположение по умолчанию /var/lib/libvirt/images/.

sudo cp ~/Documents/ubuntu20.04-clone.qcow2 /var/lib/libvirt/images/

Процесс импорта завершен. Теперь вы можете запустить виртуальную машину.

Скрипт Bash для экспорта и импорта виртуальных машин KVM

Я создал сценарий bash, который позаботится об экспорте всей конфигурации и образов дисков. Если вам интересно, вы можете посмотреть этот скрипт в моем репозитории GitHub. Ваши предложения по улучшению этого сценария будут высоко оценены.

#!/usr/bin/env bash

----------------------------------------------------------------------------------------------------
AUTHOR   : KARTHICK S
PURPOSE  : THIS SCRIPT WILL EXPORT/IMPORT THE CONFIG AND VM DISK. 
#
usage: 
export function will take care of exporting the necessary for all VM. Run as "<scriptname.sh> export"
import function will take care of importing the necessary for all VM. Run as "<scriptname.sh> import"
#
NOTE: Do not add trailing / for the directory when giving export and import path.
#------------------------------------------------------------------------------------------------------

Trigger the script with root user or exit.
if [[ ${UID} -ne 0 ]]; then
  echo -e "[EXIT] - Run the script as root user or with sudo privilege..."
  exit
fi

function export_vm(){
  
  # Get the export location.
  read -p "Provide the directory path where disk and config files to be exported: " EXPORT_LOCATION

  # Create the destination directory if not exists.
  [[ -d ${EXPORT_LOCATION} ]] || mkdir -p ${EXPORT_LOCATION}

  # Exporting the config using virsh dumpxml command.
  VM_NAMES=($(virsh list --all| awk '(NR>2)' | awk '{ print $2 }'))
  for VM in ${VM_NAMES[@]}; do
    virsh dumpxml ${VM} > ${EXPORT_LOCATION}/${VM}.xml
  done

  # Using rsync copy the entire directory from default location.
  echo -e "\n[ Copying disk images ]\n" && sudo rsync -avxp --progress /var/lib/libvirt/images ${EXPORT_LOCATION}

  echo -e "\n[ Exported Files ] \n" && ls -lR ${EXPORT_LOCATION}

} 

function import_vm(){

  # Get the source location.
  read -p "Provide the directory path where disk and config files are stored: " SOURCE_LOCATION

  # Throws error if directory is not available and exit.
  [[ -d ${SOURCE_LOCATION} ]] || { echo "Directory not available"; exit 1 ; }

  # Copy all the files to default disk location.
  echo -e "[ Copying disk images ]\n" && sudo rsync -avxp --progress ${SOURCE_LOCATION}/images /var/lib/libvirt/

  if [[ $? -eq 0 ]]; then
    # Define VM
    echo -e "\n[ Defining VM ]\n"
    for XML_FILE in ${SOURCE_LOCATION}/*.xml; do
      virsh define --file ${XML_FILE} 
    done
    echo -e "\n[ Imported VM List ]\n" && virsh list --all
  fi

}

case $1 in
 export ) export_vm ;;
 import ) import_vm ;;
 *) echo -e "USAGE : 
kvm_export_import.sh export - Export config and disk
kvm_export_import.sh import - Define VM and copy the disk"; exit 
esac

Использование этого скрипта заключается в следующем.

Вы можете запустить следующую команду, чтобы клонировать суть из GitHub.

git clone https://gist.github.com/d6c671597592fe5634a39b7974bc8029.git

Скрипт выполняет резервное копирование (т. е. экспорт), а также восстановление (т. е. восстановление).

Давайте экспортируем виртуальную машину KVM, используя этот скрипт, как показано ниже.

sudo bash kvm_export_import.sh export

Вам необходимо указать путь к каталогу, в который нужно скопировать/экспортировать XML-файл и образ диска. Не добавляйте косую черту / при указании каталога экспорта. Сначала он скопирует образ диска (.qcow2) и запустит команду «virsh dumpxml» для экспорта всех конфигураций.

На изображении ниже показано, как работает экспорт.

Экспорт виртуальной машины KVM с помощью сценария Bash

Когда вы передаете «import» в качестве аргумента, он сначала скопирует образ диска в папку по умолчанию /var/lib/libvirt/ и запустит «virsh define» для всех экспортируемых XML-файлов.

sudo bash kvm_export_import.sh import

Импортируйте виртуальную машину KVM с помощью сценария Bash

Заключение

В этой статье я показал вам, как экспортировать виртуальную машину KVM и импортировать ее на ту же или другую машину. Создание виртуальной машины с нуля — трудоемкая задача. Итак, правильная стратегия, которой следует придерживаться, чтобы защитить изображения от потери в любой ситуации. Если у вас есть какие-либо хитрости или советы для этой статьи, мы будем рады услышать их от вас.

Статьи по данной тематике