Экспорт и импорт виртуальной машины Hyper-V. Конвертируем виртуальные машины VMWare в Hyper-V и обратно

11.02.2012 - 18:26

Рассмотрим скрипт по экспортированию ВМ на сервере Hyper-V.
Задача стоит в автоматизации процесса с максимальной логикой не в ущерб производительности. В результате, мною был написан скрипт, который я подавал раннем . Ситуация менялась с каждым днём, система уже работала в продуктиве, поэтому нужно было сократить риск что-то поломать до минимального. В результате, я доработал скрипт, концепция которого не изменилась:

  1. Находим ВМ
  2. Выключаем ВМ
  3. Экспортируем ВМ
  4. Включаем ВМ

Добавились только "рюшечки" и "вензеля".
Основное требование - сохранение 2-х копий ВМ, текущей и предыдущей. При формировании новой копии, предыдущая удаляется, а текущая переименовывается в предыдущую. Все реализовано на примере каталогов Today и Yesterday.

Основные возможности скрипта:

  1. Проверяет наличие нужной ВМ среди списка ВМ. Все действия записываются в log-файл.
  2. Если ВМ найдена - Удаляет каталог с прошлой записью, текущий каталог переименовывает в прошлый, создаёт каталог для текущей записи.
  3. Проверяет состояние ВМ. Если ВМ запущена - Останавливает ВМ. Экспортирует ВМ в назначенный каталог. Запускает.
  4. Если ВМ остановлена - экспортирует ВМ в назначенный каталог.
  5. Если ВМ в другом состоянии - пишет в лог.
  6. Если ВМ не найдена - пишет в лог.
  7. Позле экспорта - снимает всю информацию про VHD, тестирует VHD. Пишет в лог.
  8. Отправляет e-mail адресатам о проведённых операциях с установкой важности письма при неудаче.

Есть парочка особенностей:

  1. При отправке письма, лог, который планируется отправить вложением, не может находиться по UNC пути. Другими словами, если требуется отправить лог во вложении, нужно его разместить на локальном диске либо сетевой каталог подключить отдельным диском.
  2. Скрипт дополнительными функциями собирает информацию про VHD диск. Для успешной отработки функций аудита, диск не должен располагаться по UNC пути, опять придётся подключать сетевой диск.
  3. Для контроля выполнения экспорта машин по графику, было предпринято внедрить параметр "Имя ВМ".

Для успешной работы скрипта, нужно установить данный модуль . Я думаю, сложностей не возникнет.
Скрипт:

param ($VM ) # Входящий параметр Виртуальной Машины (ВМ)

if (! (Get-Module -Name hyperv) )
{
# Включить модуль
import-module hyperv
}
if ($VM -eq $null )
{
Write-Host "Введите имя виртуальной машины."
}

# ==== Начальные параметры
$ComputerName = Get-Content env:COMPUTERNAME
# Подключаем диск R: для получения информации про VHD
Invoke-Expression -Command "net use R: \\Server /y"
# Обнуляем счётчики
$count = $false # Триггер найденной ВМ
$export_count = $false # Счётчик успешного экспорта ВМ
# Определяем имя\адрес лог-файла
$log = "\\Server\backup\Logs\$ VM\" + (Get-Date -Format " yyy-MM") +" .log"
# Определяем путь к папке с РК
$BackupDir = "
\\Server\backup\" +$VM
# Путь к папке с РК для снятия информации с VHD
$InfoDir = "R:\backup\" +$VM
# Данные для email
$Sender = "
BackupOperator@ contoso.com"
$SMTP = " smtp.contoso.com"
$Recipients = @(" backup_monitoring@ contoso.com") # группа рассылки с адресатами, которые мониторят резервное копирование
$AttachePath = "
R:\backup\Logs\$VM \" + (Get-Date -Format "yyy-MM" ) +".log"

# Функция оптравки сообщения, на момент написания я не знал про функцию Send-MailMessage и написал свою функцию. Переделывать не хочу, "Работает - не трогай!"
function SendEmail($Subject ,$Body ,$Priority )
{
$Message = New-Object System.Net.Mail.MailMessage
$Server = New-Object System.Net.Mail.SMTPClient
$Attache = New-Object System.Net.Mail.Attachment($AttachePath )
# ==== Message
$Recipients | ForEach-Object { $Message .To.Add($_ ) }
$Message .From = $Sender
$Message .Subject = $Subject
$Message .Body = $Body
$Message .Attachments.Add($Attache )
$Message .Priority = [ System.Net.Mail.MailPriority] ::$Priority
# ==== Sending
$Server .Host = $SMTP
$Server .Send($Message )
}

# =========================================
# Начинаем запись лога
(Get-Date) + " `r` n Начало работы скрипта экспорта ВМ " +$VM + " сервер: " + $ComputerName + "`r` n Получение списка Виртуальных машин... `r` n"

# Получаем список ВМ
$VMArray = Get-VM | Select-Object -Property VMElementName
foreach($element in $VMArray )
{
# Ищем заданную ВМ
if ($VM -eq $element .VMElementName)
{
$log_string = $log_string + "Виртуальная машина найдена. Выполняю заданные действия... `r` n"
$count = $true
# ========== Операции с папками ===============

# Удаляем папку Yesterday
Remove-Item -Path ($BackupDir + "\Yesterday" ) -Recurse -ErrorVariable err
if ($err )
{
# Если ошибка удаления - останавливаем выполнение.
`r` n"
" Удаление каталога Yesterday не удалось, экспорт $VM прерван. Ошибка: " + $err
}
else
{
$log_string = $log_string + "Удаление каталога Yesterday проведено успешно. `r` n"
# Переименовываем папку Today
Rename-Item -Path ($BackupDir + "\T oday" ) -NewName ($BackupDir + "\Yesterday" ) -Force -ErrorVariable err
if ($err )
{
# Если ошибка переименовывания - останавливаем выполнение.
$log_string = $log_string + $err + "`r` n"
" Переименование каталога Yesterday не удалось, экспорт $VM прерван. Ошибка: " + $err
}
else
{
$log_string = $log_string + "Переименование папок проведено успешно. `r` n"
# Создаём папку Today
New-Item -Path ($BackupDir + "\T oday" ) -ItemType Directory -Force -ErrorVariable err
if ($err )
{
# Если ошибка создания - останавливаем выполнение.
$log_string = $log_string + $err + "`r` n"
$MailBody = $Mailbody + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + "Создание каталога Yesterday не удалось, экспорт $VM прерван. Ошибка: " + $err
}
else
{
$log_string = $log_string + "Создание папки Today проведено успешно. `r` n"
#========== Конец работы с папками

#========== Работа с ВМ
# Если состояние машины - "Работает", то
if ((Get-VMSummary $VM ) .enabledstate -eq "Running" )
{
# Запустить выключение
$log_string = $log_string + ((Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + " Виртуальная машина запущена. Выполняю остановку. `r` n" )
invoke-vmshutdown -VM $VM -Reason "Export VM." -Force -ErrorVariable err
if ($err )
{
$log_string = $log_string + $err + "`r` n"
$MailBody = $Mailbody + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + " Остановка ВМ не произведена, экспорт $VM прерван. Ошибка: " + $err
}
else
{

" Виртуальная машина остановлена. Выполняю экспорт.`r` n"
$MailBody = $MailBody + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + " Виртуальная машина остановлена.`r` n"
$MailBody = $MailBody + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + " Выполняю экспорт виртуальной машины.`r` n"
\T oday"
if ($err )
{
$log_string = $log_string + $err + "`r` n"
$MailBody = $Mailbody + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + " Экспорт ВМ завершён с ошибкой, экспорт $VM прерван. Ошибка: " + $err
}
else
{
$log_string = $log_string + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + " Виртуальная машина успешно экспортирована. Выполняю запуск.`r` n"
$MailBody = $MailBody + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) +
$export_count = $true
}
# Запуск ВМ потверждением включения на протяжении 300с перед выполнением следующей команды
Start-VM -vm $VM -HeartBeatTimeOut 300 -ErrorVariable err
if ($err )
{
$log_string = $log_string + $err + "`r` n"
$MailBody = $Mailbody + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + " Запуск ВМ не произведен. Ошибка: " + $err
}
else
{
$log_string = $log_string + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) +
$MailBody = $MailBody + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + " Виртуальная машина запущена.`r` n"
}
}
}
elseif((Get-VMSummary $VM ) .enabledstate -eq "Stopped" )
{
# Экспорт ВМ без подтверждения со всеми файлами (xml, vhd и т.д.) и подождать, пока не выполнится
$log_string = $log_string + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + " Виртуальная машина находится в режиме Остановлена. Выполняю экспорт.`r` n"
$MailBody = $MailBody + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + " Виртуальная машина находится в режиме Остановлена.`r` n"
export-VM -VM $VM -path ($backupDir + "\T oday" ) -force -copystate -wait -ErrorVariable err
if ($err )
{
$log_string = $log_string + $err + "`r` n"
$MailBody = $Mailbody + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + " Экспорт ВМ не произведен, экспорт $VM прерван. Ошибка: " + $err
}
else
{
$log_string = $log_string + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + " Виртуальная машина успешно экспортирована.`r` n"
$MailBody = $MailBody + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + " Виртуальная машина успешно экспортирована.`r` n"
$export_count = $true
}
}
else
{
$vm_state = (Get-VMSummary -VM $VM ) .EnabledState
$log_string = $log_string + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) +
$MailBody = $MailBody + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + " Экспорт виртуальной машины не произведён, состояние $VM = $vm_state .`r` n"
}
}
}
}
}
}
if ($count ) # Если ВМ найдена
{
if (! ($export_count ) ) # Если ВМ не экспортирована
{
$log_string = $log_string + "Экспорт виртуальной машины $VM выполнен с ошибками. Процесс прерван. `r` n"
$MailBody = $MailBody + "Экспорт виртуальной машины $VM выполнен с ошибками. Процесс прерван.`r` n"
}
else # Если ВМ экспортирована
{
$log_string = $log_string + "Провожу поиск *.VHD для $VM ... `r` n"
# Проводим поиск *.vhd в заданном каталоге
if (Get-Item -Path ($InfoDir + "\T oday\" + $VM + " \Virtual Hard Disks\* ") -Include *.*vhd | Select-Object -Property Name)
{
#$VHDInfo = "
VHD Info:` r` n"
foreach($element in (Get-Item -Path ($InfoDir + " \Today\" + $VM + "\V irtual Hard Disks\*" ) -Include * .* vhd | Select-Object -Property Name) )
{
# Для каждого найденного элемента получаем информацию и пишем в лог и строку для письма
$log_string = $log_string + "Информация для " + $element .Name + ":`r` n"
$SomeVHDInfo = Get-VHDInfo -VHDPaths ($InfoDir + "\T oday\" + $VM + " \Virtual Hard Disks\" + $element .Name)
$log_string = $log_string + "Путь: " + $SomeVHDInfo .Path + "`r` n"
$log_string = $log_string + "Объём файла: " + ([ System.Math] ::Round(($SomeVHDInfo .FileSize/ 1Gb) ,2 ) ) + "Gb`r` n"
$log_string = $log_string + "Привязка к VM: " + $SomeVHDInfo .InSavedState + "`r` n"
$log_string = $log_string + "Смонтирован: " + $SomeVHDInfo .InUse + "`r` n"
$log_string = $log_string + "Максимальный объём файла: " + ([ System.Math] ::Round(($SomeVHDInfo .MaxInternalSize/ 1Gb) ,2 ) ) + "Gb`r` n"
$log_string = $log_string + "Тип образа: " + $SomeVHDInfo .TypeName + "`r` n"
# Проводим валидацию VHD ВМ
$TestVHD = "VHD: " + $element .Name + ": " + (Test-VHD -VHDPaths ($InfoDir + "\T oday\" + $VM + " \Virtual Hard Disks\" + $element .Name) )
$log_string = $log_string + $TestVHD + "`r` n"
$MailBody = $Mailbody + $TestVHD + "`r` n"
}
}
else # Вдруг VHD нет в этом каталоге О_О
{
$log_string = $log_string + "*.VHD для $VM не найдены.`r` n"
$MailBody = $MailBody + "*.VHD для $VM не найдены.`r` n"
}
}
}
else # ВМ не найдена на сервере
{
$log_string = $log_string +
$MailBody = $MailBody + "Виртуальная машина $VM не найдена. Процесс завершён.`r` n"
}

$log_string = $log_string + (Get-Date -Format "(yyyy-MM-dd) hh:mm:ss" ) + " Работа над $VM окончена.`r` n"
$log_string = $log_string + "======================== `r` n"

$MailSubject = "$VM export report."
# Отправляем письмо:
SendEmail -Subject $MailSubject -Body $MailBody -Priority $MailPriority

#net use R: /delete /y Данную функцию запускать не обязательно.

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

Симптомы проблемы

В случае, если Вы хотите перенести виртуальную машину с сервера Hyper-V 2008 R2 на сервер Hyper-V 2012 R2, у Вас возникнут проблемы: после экспорта виртуальной машины из Hyper-V 2008 R2 и копирования файлов на новый сервер, при попытке импорта в Hyper-V 2012 R2 Вы получите сообщение вида:
Hyper-V did Not Find virtual machines to import from location d:\..
или
Hyper-V не удалось найти виртуальные машины для импорта из расположения d:\..

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

Hyper-V в 2012 R2 использует новую версию WMI 2.0 , которая не поддерживает.EXP файлы, полученные после экспорта машины Hyper-V 2008 R2, в котором используется WMI 1.0. Поэтому и решение в данном случае: копирование+импорт, т.к. импорт без экспорта виртуальной машины поддерживается на уровне Server 2012 R2 и этих.exp при импорте просто нет, поэтому всё проходит гладко).
@The namespace for version 1.0 of WMI is deprecated. Prepare to adapt scripts for a revised namespace.@
@The WMI root\virtualization namespace is deprecated. The new namespace is root\virtualization\v2.@
http://technet.microsoft.com/en-us/library/hh831568.aspx

Решение проблемы

Необходимо использовать не экспорт+импорт, а копирование+импорт. Сделайте следующее:

  1. Остановите виртуальную машину (ВМ), которую необходимо перенести.
  2. Скопируйте.XML файл, содержащий конфигурацию виртуальной машины, а также.VHD или.VHDX файлы жестких дисков виртуальной машины на новый сервер.
  3. Импортируйте виртуальную машину в Hyper-V 2012 R2
  4. Если Вы уже сделали экспорт виртуальной машины, просто удалите (или переименуйте) файл с расширением.EXP, находящейся в папке с экспортированной ВМ.
  1. Когда делаете экспорт (или подготавливаете виртуальную машину к переносу), выключив виртуальную машину, зайдите в ее конфигурацию, и переключите MAC адрес сетевой карты с динамического в статический. При этом по умолчанию в качестве статического MAC адреса будет предложен старый MAC сетевой карты.
    Это позволит не перенастраивать параметры TCP/IP в виртуальной машине после переноса, поскольку MAC адрес карты не изменится и операционная система будет считать, что сетевая карта та же самая.
  2. Вы можете (это рекомендуется Microsoft) сменить (на время переноса виртуальной машины) тип использования оперативной памяти: назначить статическое выделение RAM. После импорта виртуальной машины (на новом сервере) можно снова поставить динамическое выделение RAM.
  3. Если у Вас несколько виртуальных машин на одном хосте, то иногда бывает сложно выяснить, какой.XML файл принадлежит нужной виртуальной машине: все XML файлы могут оказаться в одной папке. Ничего страшного! Скопируйте их все! При импорте виртуальной машины укажите папку с этими XML файлами, и Hyper-V 2012 R2 попросит Вас выбрать нужную виртуальную машину для импорта.
  4. При импорте (если Вы именно переносите виртуальную машину - т.е. на старом сервере она в результате будет удалена, а на новом должна быть запущена та же ВМ) выберите, каким способом производить импорт:
    1. Register the virtual machine in-place — зарегистрировать ВМ по месту с тем-же ID;
    2. Restore the virtual machine — скопировать ВМ в другую папку, ID оставить без изменения;
      Для переноса ВМ выберите этот вариант .
    3. Copy the virtual machine — скопировать ВМ в другую папку и сгенерировать для нее новый ID.
  5. Поскольку импорт (помимо всего прочего) требует копирования файлов жестких дисков, в случае больших файлов VHD(X) этот процесс хочется ускорить. С этой целью скопируйте (или переместите) VHD файл сразу в ту папку, где он должен будет находиться после импорта виртуальной машины. Затем в процессе импорта Hyper-V 2012 R2 запросит Вас, в какой папке взять файлы жестких дисков импортируемой виртуальной машины, а также куда их копировать в процессе импорта. На оба этих вопроса укажите папку, в которую Вы положили VHD файл импортируемой ВМ. То есть у Вас будет указана одинаковая папка "откуда копировать виртуальный диск" и "куда сохранять виртуальный диск".

При подготовке статьи использовались материалы.

3 июня 2011 в 20:40

PowerShell+Hyper-V

  • Виртуализация

Не могу уже через gui...

Примерно так начинался мой разговор с другом которому в течение короткого промежутка времени пришлось несколько раз подряд экспортировать виртуальные машины из Hyper-V. Обычно для этого используется Hyper-V Manager (HVM), который устанавливается вместе с ролью Hyper-V под Windows Server 2008 R2. Я должен признаться что интерфейс этой программы не вызывает у меня каких-либо негативных эмоций. Среди всех программ для управления, которые Microsoft поставляет к Server эта мне кажется наиболее удобной и понятной (сравниваю например с IIS Manager, который вызывает недоумение у новых пользователей и бурное негодование у тех кто использовал IIS 6 в 2003 Server). Однако если нужно экспортировать или импортировать виртуальную машину в количестве N-штук в промежуток t-времени то используя Hyper-V Manager можно сломать кнопку у мыши и жутко возненавидеть Hyper-V. Тут на помощь и приходит PowerShell.
Import-Module HyperV
… И по умолчанию такого модуля в PowerShell конечно нет. Microsoft решила что писать командлеты для управления Hyper-V ни кто не будет (действительно дикая затея). С другой стороны этот мир полон людей умеющих и готовых упрощать жизнь себе и другим пользователям. Так на свет и появился PowerShell management Library for Hyper-V.
Первое что нужно сделать- это скачать этот модуль + документация, по вкусу. (Оба доступны по:http://pshyperv.codeplex.com/releases)
Потом необходимо этот модуль установить. Процесс не сложный (запускаемый файл install выдает себя с головой).
Теперь можно работать. Запускаем PowerShell, импортируем модуль (то что написано в подзаголовке).
И нам доступны все функции которые мы могли использовать через HVM, вот некоторые из них:

Подключение к виртуальной машине
New-VMConnectSession

Манипулирование состоянием виртуальных машин
Get-VMState, Set-VMState, Convert-VmState,
Ping-VM, Test-VMHeartBeat, Shutdown-VM, Start-VM, Stop-VM, Suspend-VM
Get-VMKVP, Add-KVP, Remove-KVP, Get-VMJPEG

Возможность делать бэкапы, экспорт виртуальных машин и снятие снэпшотов
Export-VM, Import-VM, Get-VMSnapshot, Choose-VMSnapshot, Apply-VMSnapshot, New-VMSnapshot ,Remove-VMSnapshot, Rename-VMSnapShot, Update-VMSnapshot, Get-VMSnapshotTree, Get-VmBackupScript

Добавление и удаление вирт. машин, настройка их свойств
New-VM, Remove-VM, Set-VM, Get-VMCPUCount, Set-VMCPUCount, Get-VMMemory, Set-VMMemory, Set-VMSerialPort

Управление дисковыми контроллерами
Get-VMDiskController
Add-VMSCSIController, Remove-VMSCSIcontroller
Get-VMDriveByController, Add-VMDRIVE, Remove-VMdrive
Get-VMDiskByDrive, Add-VMDISK, Set-VMDisk, Get-VMDisk
Get-VMFloppyDisk, Add-VMFloppyDisk
Add-VMNewHardDisk

Управление сетевыми интерфейсами
Get-VMNic, List-VMNic, Choose-VMNIC, Add-VMNIC, Remove-VMNIC, Set-VMNICAddress, Set-VMNICConnection, Get-VMNicport,
Get-VMnicSwitch, Choose-VMSwitch, New-VMSwitchPort, Get-VMByMACaddress, Choose-VMExternalEthernet,
New-VMExternalSwitch, New-VMInternalSwitch,New-VmPrivateSwitch

Работа с VHD файлами
Get-VHDDefaultPath, Get-VHDInfo, New-VHD, Compact-VHD, Test-VHD,Convert-VHD,Merge-VHD,Mount-VHD, Unmount-VHD

Все приведенные команды говорят сами за себя.
Например чтобы получить состояние виртуальной машины достаточно ввести:
List-VMState имя вирт. машины
и в результате:

В моем примере всего одна виртуальная машина => я не указывал параметров, но если у вас их много, то наверное следует явно указать ее имя, если не хочется потом пробираться сквозь консольный вывод.
Так же просто например узнать об используемых сетевых интерфейсах для виртуальных машин, достаточно лишь ввести:
Get-VMNic
и получаем:

Ну и самое, то что и было необходимо моему другу- возможность делать экспорт в фоне, по расписанию. Для этого можно написать командлет который потом запихнуть в Scheduler. У меня например этот командлет останавливает виртуальную машину, делает ее экспорт, запускает снова и посылает мне письмо об ошибке или успехе выполнения командлета. После этого управление передается другому скрипту который архивирует и посылает backup на удаленный ftp.
Экспорт: export-vm -vm MyVM1 -path D:\backups\VM -copystate -wait -force
Параметр -copystate говорит что нужно скопировать все (включая виртуальный диск => размер экспорта на выходе может получиться очень большим)

Вместо заключения
Как видно управление своими виртуальными машинами из PowerShell может быть очень удобным и ненапряжным. Достаточно лишь прочитать параметры тех команд которые вам необходимы и написать свой скрипт.

P.S. Совершенно не претендую на «открытие Америки» просто решил что кому-нибудь информация об этом полезном модуле окажется полезной. Я описал лишь наиболее простые варианты для которых можно использовать PowerShell management library for Hyper-V. Если кто-то знает или написал собственные более удобные инструменты для оптимизации работы с Hyper-V буду только рад узнать о них.

Аннотация: Целью данной практической работы является подробное рассмотрение процессов экспорта и импорта виртуальных машин стандартными средствами Hyper-V и понятие снимок виртуальной машиной.

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

Примечание. Материал практики основан на разделе "Local Desktop Virtualization" книги "Understanding Microsoft Virtualizations Solutions" M. Tulloch (Chapter 2).

Процесс экспорта виртуальной машины средствами Hyper-V не составляет труда. Единственный параметр , который необходимо определить - путь сохранения файлов виртуальной машины. Для экспорта ВМ необходимо:

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

На следующем рисунке представлено содержимое папки экспортированной виртуальной машины:


Рис. 10.3.

Config.xml - файл , содержащий информацию об исходном местоположении файлов виртуальных жестких дисков экспортируемой машины.

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

В папке Virtual Hard Disks находятся файлы виртуальных жестких дисков экспортированной машины.

В папке Snapshots содержит сведения о моментальных снимках виртуальной машины (.avhd , .vsv , .bin ).

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

Отметим особенности импорта виртуальных машин Hyper - V:

  1. Импортировать в Hyper-V можно только виртуальные машины другого Hyper-V сервера. Импорт виртуальных машин Virtual PC или Virtual Server невозможен, поскольку конфигурация виртуальных машин, создаваемых этими решениями отличается от Hyper-V, несмотря на то, что все решения используют .vhd - файлы виртуальных жестких дисков.
  2. Виртуальную машину можно экспортировать только один раз. Как уже отмечалось, создаваемый при экспорте .exp - файл сведений о виртуальной машине, в процессе импорта преобразуется в xml - файл конфигурации. В связи с этим, при возникновении ошибок импорта единственным способом продолжения работы с импортируемой виртуальной машиной является создание новой с аналогичной конфигурацией на основе уже имеющихся файлов виртуальных жестких дисков.

Для импорта виртуальной машины необходимо:

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

Снимки виртуальной машины (snapshot)

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

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

Для создания снимка необходимо выбрать пункт Снимок выпадающего меню .


Рис. 10.7.

После создания снимка появится соответствующий значок на панели "Снимки" диспетчера Hyper-V.

Для возврата виртуальной машины к состоянию снимка, необходимо применить его к виртуальной машине (см. рис. 10.9).


Рис. 10.9.

Как показано на рис. 10.9 , доступны следующие действия работы со снимками:

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

Краткие итоги.

В рамках данной практики были рассмотрены возможности Hyper-V для экспорта и импорта виртуальных машин, а также по созданию снимков состояния виртуальной машины. Функции экспорта и импорта используются для переноса виртуальной машины с одного Hyper-V сервера на другой.

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

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

Любая виртуальная машина, вне зависимости от платформы, состоит из двух основных частей: собственно, виртуальной машины - текстового или XML-файла с описанием ее конфигурации и виртуального жесткого диска. Переносить саму виртуальную машину не имеет никакого смысла, мы же не переносим железо, если нам надо запустить систему на другом ПК, достаточно перенести виртуальный диск.

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

Рассмотрим процесс на реальном примере. Один наш клиент приобрел коробочную версию "Мегаплан", который разработчики распространяют весьма оригинальным способом: в виде образа виртуальной машины формата Open Virtualization Format (OVF) , который поддерживают VMWare и VirtualBox . Собственно, внутри виртуалки содержится Ubuntu 12.04 с настроенным веб-сервером, СУБД и прочими компонентами необходимыми для работы "Мегаплана", который представляет собой обычное веб-приложение. При этом лицензионное соглашение запрещает доступ к гостевой ОС.

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

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

Теперь можно приступать к конвертации виртуального диска. Для этого воспользуемся бесплатной утилитой StarWind V2V Converter . Ее интерфейс и использование предельно просты. Выберем исходный виртуальный диск (файл с расширением vmdk ).

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

Конвертация Hyper-V виртуальных машин в VMWare производится аналогичным образом. Конвертируем виртуальный диск в VMDK, если использовался диск формата VHDX, то предварительно его следует преобразовать в VHD средствами Hyper-V аналогично тому как мы делали выше. Затем создаем в VMWare виртуальную машину для используемой гостевой системы с идентичными параметрами и в настройках диска указываем использовать сконвертитрованый нами VMDK диск. После запуска виртуальной машины не забываем установить пакет VMWare Tools необходимый для полноценной работы гостевой системы.

  • Теги:

Please enable JavaScript to view the