вторник, 7 июня 2011 г.

Перемещение виртуальной машины Hyper-V со снапшотами

imageВ жизни бывает такая ситуация, когда необходимо переместить виртуалку в другую локацию, при этом, как можно быстрее и с сохранением для неё всего дерева снапшотов (Snapshot). Штатными средствами решить подобную задачу мы не можем (переместить конечно можем через Экспорт/Импорт, но это долго), так что придется делать все руками. Пред тем как взяться за дело, нужно вникнуть в суть происходящего. Заглянуть внутрь механизма работы Hyper-V, и понять как его можно “обмануть”, нам поможет Александр Станкевич, он же Stanky.

Поехали…

Содержимое папок "C:\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines" и "C:\ProgramData\Microsoft\Windows\Hyper-V\Snapshots" - Soft Link'и на конфигурацию наших виртуальных машин и их Snapshot'ы. Таким образом, создавая/удаляя эти ссылки (XML-файл), мы изменяем список виртуальных машин, и цепочки Snapshot'ов, отображаемые в консоли Hyper-V. Например, это можно использовать для удаления виртуальной машины из списка без выполнения её полного уничтожения, которое включает в себя Merge имеющихся Snapshot'ов (порой, крайне длительная операция). Так же можно изменить путь, где находится наша виртуальная машина - бывает полезно при исправлении ошибок в планировании. Причём создание/удаление можно производить на живой системе (без остановки служб), но учитывая последствия ;).
Для создания ссылки можно воспользоваться утилитой "mklink". Удаление ни чем не отличается от удаления обычного файла. При этом удаляется лишь ссылка, а оригинальный файл остаётся на месте. Чтобы узнать, куда ведёт ссылка, можно воспользоваться "fsutil reparsepoint query" (к выводу отнестись с улыбкой).

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

1) Остановить службу "Hyper-V Virtual Machine Management" - это позволит нам править конфигурацию виртуальной машины. При этом, все запущенные виртуальные машины продолжают работать.

2) Произвести необходимые изменения путей в конфигурации.

3) Если имеются Snapshot'ы: так как любой Snapshot файловой системы (файл с расширением AVHD) является Differencing-диском, необходимо предварительно записать цепочку (Chain), которой связаны наш виртуальный диск и его Snapshot'ы.

3.1) Находим все файлы с расширением AVHD данной виртуальной машины.

3.2) Меняем расширение на VHD (штатные утилиты работают только с ним).

3.3) Inspect Disk... -> выбираем поочерёдно переименованные файлы -> записываем соотношение строчек "File Name" и "Parent".

4) Изменяем пути в файловой системе.

5) Восстанавливаем цепочку дисков, так как пути изменились: Inspect Disk... -> выбираем поочерёдно наши Snapshot'ы -> Reconnect -> выбираем файл в соответствии с записанным значением в пункте 3.3, после чего меняем расширение у обработанного файла обратно на AVHD.

6) Удаляем старую ссылку на цепочку Shapshot'ов: C:\ProgramData\Microsoft\Windows\Hyper-V\Snapshots\%GUID%.xml.

7) Запускаем "cmd" под администратором: mklink "C:\ProgramData\Microsoft\Windows\Hyper-V\Snapshots\%GUID%.xml" "%VMSnapshotsNewPath%\%GUID%.xml".

8) Удаляем старую ссылку на конфигурацию виртуальной машины: C:\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines\%GUID%.xml.

9) Запускаем "cmd" под администратором: mklink "C:\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines\%GUID%.xml" "%VMConfigNewPath%\%GUID%.xml"

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

9.1) Как вариант, чтоб всё было совсем правильно, можно выполнить экспорт, получившегося варианта, после чего выполнить импорт.

С уважением и наилучшими пожеланиями Stanky.

PS и не забудьте сначала потренироваться на тестовых виртуалках Подмигивающая рожица

13 комментариев:

abigor комментирует...

(переместить конечно можем через Экспорт/Импорт, но это долго и снапшоты не сохраняются)
-------------
Странное заявление честно говоря. Только что сделал экспорт витруалки со снапшетами и ее импорт на другом сервере, все присутствует на месте. Да долго. Но снепшеты ни куда не деваются.

Алексей Богомолов (Alexx) комментирует...

Да, был не прав... Не проверенное заявление. Исправил!

abigor комментирует...

Отлично, что поправили. Так же хочу добавить, экспорт/импорт. ДА и снепшеты лучше делать на выключенных виртуалках. Это немного ускоряет экспорт.

Stanky комментирует...

А где же обещанные картинки ;) ?
Мне показалось или мой текст, написанный почти три года назад, опубликован как есть, без малейшей правки, не считая небольшого форматирования :) ?

Алексей Богомолов (Alexx) комментирует...

Stanky, конечно же твой текст, и конечно же "как есть", я же не могу править цитаты мастера ;)

Алексей Богомолов (Alexx) комментирует...

А насчет "небольшого форматирования" - пришлось сделать, ведь ты же 3 года назад в блокноте писал ;)

Stanky комментирует...

Вообще-то, я не в блокноте писал, а в Outlook'е, но простым текстом ;) .

Денис Дягилев комментирует...

Год назад ковырялись с Купчинецким с подобным, несколько в другом свете http://kupchynetsky.wordpress.com/2010/04/02/%d0%b2%d0%be%d1%81%d1%81%d1%82%d0%b0%d0%bd%d0%be%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b2%d0%b8%d1%80%d1%82%d1%83%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d1%85-%d0%bc%d0%b0%d1%88%d0%b8%d0%bd-hyper-v-%e2%80%93/ с картинками -)

Если Вы тормозите службу гипервизора, чем это в корне отличается от сценария экспорта-импорта?

Алексей Богомолов (Alexx) комментирует...

Денис, спасибо за интересную ссылку, да ещё и с картинками, как я люблю ;)

Stanky комментирует...

Дёня, в своё время, мне нужно было перелопатить пути для десятка виртуалок с огромной пачкой Snapshot'ов - одно только копирование всей этой массы заняло бы часов десять, да и свободное место на дисках тоже не резиновое! Достаточный пример отличия от экспорта ;) ?
Ну а стопорится только служба управления.

Stanky комментирует...

А картинки, между прочим, кое кто обещал "нарисовать", перед тем как опубликовать текст ;) .

Руслан Чекушко комментирует...
Этот комментарий был удален автором.
Руслан Чекушко комментирует...
Этот комментарий был удален автором.

Отправить комментарий