В жизни бывает такая ситуация, когда необходимо переместить виртуалку в другую локацию, при этом, как можно быстрее и с сохранением для неё всего дерева снапшотов (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 комментариев:
(переместить конечно можем через Экспорт/Импорт, но это долго и снапшоты не сохраняются)
-------------
Странное заявление честно говоря. Только что сделал экспорт витруалки со снапшетами и ее импорт на другом сервере, все присутствует на месте. Да долго. Но снепшеты ни куда не деваются.
Да, был не прав... Не проверенное заявление. Исправил!
Отлично, что поправили. Так же хочу добавить, экспорт/импорт. ДА и снепшеты лучше делать на выключенных виртуалках. Это немного ускоряет экспорт.
А где же обещанные картинки ;) ?
Мне показалось или мой текст, написанный почти три года назад, опубликован как есть, без малейшей правки, не считая небольшого форматирования :) ?
Stanky, конечно же твой текст, и конечно же "как есть", я же не могу править цитаты мастера ;)
А насчет "небольшого форматирования" - пришлось сделать, ведь ты же 3 года назад в блокноте писал ;)
Вообще-то, я не в блокноте писал, а в 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/ с картинками -)
Если Вы тормозите службу гипервизора, чем это в корне отличается от сценария экспорта-импорта?
Денис, спасибо за интересную ссылку, да ещё и с картинками, как я люблю ;)
Дёня, в своё время, мне нужно было перелопатить пути для десятка виртуалок с огромной пачкой Snapshot'ов - одно только копирование всей этой массы заняло бы часов десять, да и свободное место на дисках тоже не резиновое! Достаточный пример отличия от экспорта ;) ?
Ну а стопорится только служба управления.
А картинки, между прочим, кое кто обещал "нарисовать", перед тем как опубликовать текст ;) .
Отправить комментарий