Нужно переместить часть машин из инфраструктуры vSphere на KVM. Для этого понадобятся хост с linux+qemu+kvm и набр утилит libguestfs-tools (в частности - virt-v2v)
Импорт машин из vSphere в Fedora Server 25
Исполнять перенесенные машины можно на любом дистрабутиве linux, однако проще всего всего процесс миграции идет под rpm-based системой с текущей стабильной версией libguestfstools.
На данный момент такой версией дистрибутива является Fedora Server 25.
Итак ставим Fedora Server 25 с дефолтным набором ПО. А затем:
dnf -y install @virt* policycoreutils-python bridge-utils virt-v2v *guestf* echo LIBGUESTFS_BACKEND=direct > /etc/envoronment wget https://fedorapeople.org/groups/virt/virtio-win/repo/stable/virtio-win-0.1.126-2.noarch.rpm rpm -iv ./virtio-win-0.1.126-2.noarch.rpm
Обязательно перезагружаемся:
reboot
Теперь можно импортировать виртуальную машину:
virt-v2v -v -x -ic vpx://DOMAIN%5cadmin@vcenter.domain.local/Datacenter%20Name/Cluster%20Name/esx_host_name?no_verify=1 -os storage-pool-name vm-name
После импорта можно поправить конфигурацию сетевого интерфейса (установить корректный интерфейс для bridge) и диска (установить режим кеширования и режим ввода\вывода).
Cache mode: none I/O mode: native
Некоторые нюансы составления URI для virt-v2v
Формат URI такой:
_username_@_vcenter_address_/_DataCenter_Name_/_Cluster_Name_/_hostname_
Если пользователь доменный, то его в его имени в URI символ \ нужно заменять на %5c, то есть будет как-то так: DOMAIN%5cusername. Использовать экранирование \\ не получится.
Если не указывать имя пользователя, то будут ошибки на этапе скачивания диска vmdk:
curl -q --insecure --head --silent --url '....' HTTP/1.1 401 Unauthorized
При указании имени датацентра и кластера важен регистр символов!
Пробелы в названиях датацентра и кластера заменяем на %20, символ \ заменяем на %5c.
Импорт в ubuntu 16.04
sudo apt-get update -y && sudo apt-get upgrade -y && sudo apt-get install -y nano alien qemu-kvm libvirt-bin bridge-utils libguestfs-tools wget https://fedorapeople.org/groups/virt/virtio-win/repo/stable/virtio-win-0.1.126-2.noarch.rpm sudo alien -i ./virtio-win-0.1.126-2.noarch.rpm
Перезагружаемся и приступаем к импорту.
virt-v2v -v -x -ic vpx://DOMAIN%5cadmin@vcenter.domain.local/Datacenter%20Name/Cluster%20Name/esx_host_name?no_verify=1 -os storage-pool-name vm-name
Всякие ошибки virt-v2v
Однако, в Cent-OS 6.8 возникали ошибки типа:
libvirt error code: 45, message: authentication failed: Password request failed libvirt error code: 45, message: authentication failed: Username request failed
Оказалось, нужно создать файлик ~/.netrc с таким содержимым: machine vCenter_hostname login vCenter_login password vCenter_password
echo "machine vcenter.domain.local login DOMAIN%5cadmin password admin_pass" > ~/.netrc chmod 600 ~/.netrc\
Однако, это актуально для старых версий libguestfs. В новых версиях (1.28 и далее) для этой цели предусмотрена опция –password-file.
При импорте возникает ошибка:
ошибка: Не удалось определить домен на основе /tmp/v2vlibvirtbe6ed8.xml ошибка: internal error unknown disk type 'volume'
Судя по всему эта ошибка связана с устаревшей версией virt-v2v. В репозиториях CentOS 7_15.11 лежит версия 1.28, а эта ошибка поправлена в 1.30.
Сборка свежей версии libguestfs
Поэтому возвращаемся на ubuntu 14.04 и собираем текущую версию libguestfs-tools.
sudo apt-get update && sudo apt-get upgrade && sudo apt-get install nano build-essential qemu alien flex bison cd ~ wget https://fedorapeople.org/groups/virt/virtio-win/repo/stable/virtio-win-0.1.126-2.noarch.rpm sudo alien -i ./virtio-win-0.1.126-2.noarch.rpm wget http://libguestfs.org/download/supermin/supermin-5.1.17.tar.gz tar -xvf ./supermin-5.1.17.tar.gz cd supermin-5.1.17/ sudo apt-get build-dep supermin ./configure make sudo make install cd ~ wget http://libguestfs.org/download/1.34-stable/libguestfs-1.34.3.tar.gz tar -xvf ./libguestfs-1.34.3.tar.gz cd libguestfs-1.34.3/
Включаем в /etc/apt/sources.list репозитории src
sudo apt-get update && sudo apt-get build-dep libguestfs ./configure make sudo make check
ВНИМАНИЕ! Дальше make install делать не нужно. Запускаем так:
./run ./v2v/virt-v2v --version
На ubuntu 14.04 неудачно.
Вариант переноса машин непосредственно с тома vmfs
Я заменю ESXi на ubuntu+kvm, подмонтирую том VMFS с виртуальными машинами, перенесу данные на нативный том ext4 и импортирую виртуальные машины в конфигурацию libvirt. На первый диск вместо ESXi устанавливаем linux, в моем случае - Ububntu Server 16.04. После установки ставим на него все что нужно для хоста KVM и для переноса виртуальных машин.
sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils virt-goodies vmfs-tools
Теперь можно монтировать том VMFS:
sudo mkdir /mnt/vmfs sudo vmfs-fuse /dev/cciss/c0d1p1 /mnt/vmfs/
Проверяем, что том смонтировался:
sudo ls /mnt/vmfs
В выводе будет список папок с виртуальными машинами. Образы дисков VMDK поддерживаются без конвертации. Просто копируем их в новое мостоположение:
sudo rsync -avP /mnt/vmfs/ /mnt/vm_images/
Теперь нужно конвертировать файлы vmx в xml. Для этого писпользуем утилиту vmware2libvirt из пакета virt-goodies:
vmware2libvirt -f <source.vmx> > target.xml virsh -c qemu:///system define file.xml
Скрипт оказался непригоден.
Discussion