У житті буває така ситуація, коли необхідно перемістити виртуалку в іншу локацію, при цьому, як можна швидше і з збереженням для неї всього дерева снапшотов (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 і не забудьте спочатку потренуватися на тестових віртуалкою