Export и Import виртуальных машин VirtualBox


Подготовка к Export’у виртуальной машины

Делаю: 17.09.2023

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


// Задаю переменную с именем виртуальной машины:
$ vboxmanage list vms
"Notes" {2e04338d-4bd9-415c-967c-65364490bcb4}


// Выключить виртуальную машину, при необходимости
$ VBoxManage controlvm ${VM} poweroff


$ export VM=Notes
$ export VM_HOME=${HOME}/machines
$ export VM_BACKUPS=${VM_HOME}/backups
$ echo ${VM}
$ echo ${VM_HOME}
$ echo ${VM_BACKUPS}


Команды Export’a виртуальной машины

// Создать каталог для backup
$ mkdir -p ${VM_BACKUPS}/${VM}


// Экспортировать виртуальную машину
$ VBoxManage export ${VM} -o ${VM_BACKUPS}/${VM}/${VM}.ovf


Подготовка к Import виртуальной машины

Делаю: 17.09.2023


$ vboxmanage --version
7.0.4r154605


Задаем переменную с именем импортируемой виртуальной машины.

$ export vm=notes

Создаем каталоги для виртуальной машины и для snapshots


$ mkdir -p ${VM_HOME}/${vm}/snapshots

Определяем каталог, куда следует выполнить импорт


$ VBoxManage setproperty machinefolder ${VM_HOME}/${vm}

Посмотреть переменные

$ vboxmanage list systemproperties | grep folder


Import виртуальной машины


Переходим в каталог с бекапами виртуальных машинам

$ cd ${VM_BACKUPS}

$ cd <machine>

$ VBoxManage import ./Notes.ovf


***
    0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Successfully imported the appliance.


Посмотреть список виртуальных машин

$ vboxmanage list vms

Наверное, следует переименовать импортированную виртуальную машину

$ VBoxManage modifyvm vm_centos_jboss_postgresql_1 --name ${vm}

Определяем каталог для снапшотов

$ VBoxManage modifyvm ${vm} --snapshotfolder ${VM_HOME}/${vm}/snapshots

Посмотреть еще раз список виртуальных машин в системе и убедиться, что все ОК:


$ vboxmanage list vms


Запустить импортированную виртуальную машину

Нужно проверить, что создана виртуальная сеть. В моем случае.

File -> Network Manager -> Host-only Networks -> Create -> ip 192.168.56.1 -> DHCP Server (Disabled)


$ vm=Notes
$ vboxmanage startvm ${vm} -type headless &


$ ifconfig
vboxnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.56.1  netmask 255.255.255.0  broadcast 192.168.56.255
        inet6 fe80::800:27ff:fe00:0  prefixlen 64  scopeid 0x20<link>
        ether 0a:00:27:00:00:00  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 47  bytes 6931 (6.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


Дополнительно по настройке сети после импорта

Иногда после импорта отсутствуют сетевые адаптеры в системе. По крайней мере в Centos 6.

Нужно как-то зайти в виртуалку и отредактировать файл /etc/udev/rules.d/70-persistent-net.rules

Достаточно удалить (рекомендую скопировать конфиг) или правильно настроить соответствие между устройствами и том, какие имена им будут присвоены в системе.

После следует перезагрузить виртуальную машину. (Или попробовать применить правила udev без перезагрузки).


Если host-only. Создать глобальный host-only адаптер, работающий на ip 192.168.56.1.

Моя конфигурация.


# vi /etc/sysconfig/network-scripts/ifcfg-eth0


DEVICE="eth0"
BOOTPROTO="static"
ONBOOT="yes"
IPADDR=192.168.56.11
NETMASK=255.255.255.0
GATEWAY=192.168.56.1


# service network restart


Как подключиться без консоли VirtubalBox

Установить Extension Packs (Там присутствуют какие-то лицензионные огранчения).


$ VBoxManage controlvm ${vm} poweroff


$ VBoxManage modifyvm ${vm} \
    --vrde on \
    --vrdemulticon on \
    --vrdeauthtype null \
    --vrdeaddress 192.168.1.101 \
    --vrdeport 3389


192.168.1.101 - хост на котором запущен virtualbox


$ vboxmanage startvm ${vm} -type headless &


$ sudo apt-get install -y rdesktop


$ rdesktop \
-r sound:local \
-k common  \
-g  1600x1024 \
10.20.65.225:3389


Login

$ su - root
# rm /etc/udev/rules.d/70-persistent-net.rules
# reboot


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


Progress state: NS_ERROR_INVALID_ARG
VBoxManage: error: Appliance import failed
VBoxManage: error: Code NS_ERROR_INVALID_ARG (0x80070057) - Invalid argument value (extended info not available)
VBoxManage: error: Context: "RTEXITCODE handleImportAppliance(HandlerArg*)" at line 1379 of file VBoxManageAppliance.cpp


ХЗ что делать. В UI пепесоздавал. Был экспорт из 6.1 в последнюю 6.1.


Ошибока при запуске импортированной машины

$ Waiting for VM "my_vm_name" to power on...
VBoxManage: error: Nonexistent host networking interface, name 'enp4s0' (VERR_INTERNAL_ERROR)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component ConsoleWrap, interface IConsole

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


$ cd ${VM_HOME}/${vm}
$ cd ${vm}
$ cp ${vm}.vbox ${vm}.vbox.original


$ ifconfig


Есть у меня enp7s1. Его и прописываю.


$ vi ${vm}.vbox


Мдя, еще 1 ошибка - NS_ERROR_FAILURE (0x80004005), component SessionMachine, interface ISession

$ Waiting for VM "my_vm_name" to power on...
VBoxManage: error: The VM session was aborted
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component SessionMachine, interface ISession


Потыкал в GUI. (Скопировал на хост и запустил).

Угадал. Ткнул пальцем и угадал. Заменив контроллер LsiLogicSas на IntelAHCI запустилось.


$ VBoxManage showvminfo ${vm}

***
Storage Controller Name (0):            SAS Controller
Storage Controller Type (0):            LsiLogicSas
***


// Удаляю контроллер
$ VBoxManage storagectl ${vm} \
    --name "SAS Controller" \
    --remove


// Добавляю контроллер
$ VBoxManage storagectl ${vm} \
    --name "SATA Controller" \
    --add sata \
    --controller IntelAhci


// Подключаю диск
$ VBoxManage storageattach ${vm} \
--storagectl "SATA Controller" \
--port 0 \
--type hdd \
--medium ${vm}-disk001.vmdk