morres
02-09-2011, 16:56
Возможна ситуация, когда сервер Hyper-V "умер", но файлы виртуальных машин со всеми снимками (snapshot) и виртуальными жёсткими дисками (*.vhd и *.avhd) остались. Или, например, другая ситуация: сервер резервного копирования Symantec BackUp Exec может корректно бекапить виртуальные машины, но, при попытке восстановить их на ДРУГОЙ сервер Hyper-V (штатная функция Backup Exec) регистрация виртуальной машины не выполняется, а соответственно в оснастке "Диспетчер Hyper-V" пусто.
Вобщем, пара дней гугления и вивисекций с восстановление виртуальных машин прошла успешно, чем я и решил поделиться.
Выяснилось, что помимо NTFS-безопасности на основе учеток и групп всем нам столь знакомых Hyper-V прописывает безопасность на файлы и папки виртуальных машин своими средствами. Ради интереса посмотрите свойсва папок и файлов на предмет "Безопасности" и увидите, что там прописана такая группа, как "Виртуальные машины" и на *.xml файлы прописаны группы называемые по уникальному идентификатору виртуальной машины.
Собственно, вся загвоздка в том как правильно сделать хардлинк на XML-файл виртуалки, положить его в c:\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines\ и дать на этот хардлинк правильные права.
в качестве решения этой задачи предлагаю следующий скрипт, который я наваял:
VM_HWLinks_Fix.cmd
@ECHO OFF
::---------- путь к файлам Hyper-V, где хранятся ссылки:
set HYPER-V_PATH=c:\ProgramData\Microsoft\Windows\Hyper-V
::---------- переменная содержит ID ВМ
set VM_ID=""
::---------- переменная содержит путь к ВМ
set VM_PATH=""
::---------- переменная содержит ID снимка ВМ
set SNAP_ID=""
:MAINMENU
set answer=""
cls
echo -------------------------------------------------
echo Menu
echo -------------------------------------------------
echo 1: Make Hard Links for Virtual Machine
echo 2: Make Hard Links for Virtual Machine Snapshots
echo 3: Exit
echo -------------------------------------------------
set /p answer=Enter Menu Item:
if %answer% equ 1 goto MENUVM
if %answer% equ 2 goto MENUSNAP
if %answer% equ 3 (goto :EOF) else goto MAINMENU
::----- если нажата единица, то прописываем HardLink для ВМ
:MENUVM
set /p VM_ID=Enter Virtual Machine GUID:
set /p VM_PATH=Enter path to Virtual Machine:
if exist "%VM_PATH%\Virtual Machines\%VM_ID%.xml" (
:: ----- если находим прежние хардлинки, то удаляем (необходимо, при использование Backup Exec)
if exist "%HYPER-V_PATH%\Virtual Machines\%VM_ID%.xml" del /F /Q "%HYPER-V_PATH%\Virtual Machines\%VM_ID%.xml"
:: ----- останавливаем службу "Управления виртуальными машинами Hyper-V"
net stop vmms
:: ----- создаём хардлинк на XML-файл снимка ВМ
mklink /H "%VM_ID%.xml" "%VM_PATH%\Virtual Machines\%VM_ID%.xml"
:: ----- перемещаем хардлинк туда, где он должен быть
move /Y "%VM_ID%.xml" "%HYPER-V_PATH%\Virtual Machines\"
:: ----- запускаем службу "Управления виртуальными машинами Hyper-V" (Необходимо чтобы ID ВМ зарегистрировался и icacls отработала корректно)
net start vmms
pause
:: ----- устанавливаем необходимую NTFS-безопасность
icacls "%HYPER-V_PATH%\Virtual Machines\%VM_ID%.xml" /grant "‚?ђ’“Ђ‹њЌЂџ ЊЂ??ЌЂ NT\%VM_ID%":F /T
pause
goto MAINMENU
) else (
echo ERROR: Snapshot XML-file not found! Try one more time...
pause
goto :EOF
)
::----- если нажата двойка, то прописываем HardLink для снимка ВМ (предполагается, что ВМ уже зарегистрирована иначе icacls отработает не коректно)
:MENUSNAP
if %VM_ID%=="" set /p VM_ID=Enter Virtual Machine GUID:
if %VM_PATH%=="" set /p VM_PATH=Enter path to Virtual Machine:
set /p SNAP_ID=Enter Snapshot GUID:
if exist "%VM_PATH%\Snapshots\%SNAP_ID%.xml" (
:: ----- если находим прежние хардлинки, то удаляем (необходимо, при использование Backup Exec)
if exist "%HYPER-V_PATH%\Snapshots\%SNAP_ID%.xml" del /F /Q "%HYPER-V_PATH%\Snapshots\%SNAP_ID%.xml"
:: ----- создаём хардлинк на XML-файл снимка ВМ
mklink /H "%SNAP_ID%.xml" "%VM_PATH%\Snapshots\%SNAP_ID%.xml"
:: ----- перемещаем хардлинк туда, где он должен быть
move /Y "%SNAP_ID%.xml" "%HYPER-V_PATH%\Snapshots\"
pause
:: ----- устанавливаем необходимую NTFS-безопасность
icacls "%HYPER-V_PATH%\Snapshots\%SNAP_ID%.xml" /grant "‚?ђ’“Ђ‹њЌЂџ ЊЂ??ЌЂ NT\%VM_ID%":F /T
pause
goto MAINMENU
) else (
echo ERROR: Snapshot XML-file not found! Try one more time...
pause
goto :EOF
)
условия только одно: запускайте скрипт на том же диске (можно в корне, путь не имеет значение), где расположена виртуалка иначе mklink будет ругаться, что не может создать хардлинк. Конечно, надо бы добавить проверку этого условия (например, после ввода пути к виртуальной машине), но мне лень. :) И, кстати, путь к виртуальной машине вводите без бэк-слежа в конце, т.е. не c:\VMs\виртуалка\, а c:\VMs\виртуалка.
Вобщем, пара дней гугления и вивисекций с восстановление виртуальных машин прошла успешно, чем я и решил поделиться.
Выяснилось, что помимо NTFS-безопасности на основе учеток и групп всем нам столь знакомых Hyper-V прописывает безопасность на файлы и папки виртуальных машин своими средствами. Ради интереса посмотрите свойсва папок и файлов на предмет "Безопасности" и увидите, что там прописана такая группа, как "Виртуальные машины" и на *.xml файлы прописаны группы называемые по уникальному идентификатору виртуальной машины.
Собственно, вся загвоздка в том как правильно сделать хардлинк на XML-файл виртуалки, положить его в c:\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines\ и дать на этот хардлинк правильные права.
в качестве решения этой задачи предлагаю следующий скрипт, который я наваял:
VM_HWLinks_Fix.cmd
@ECHO OFF
::---------- путь к файлам Hyper-V, где хранятся ссылки:
set HYPER-V_PATH=c:\ProgramData\Microsoft\Windows\Hyper-V
::---------- переменная содержит ID ВМ
set VM_ID=""
::---------- переменная содержит путь к ВМ
set VM_PATH=""
::---------- переменная содержит ID снимка ВМ
set SNAP_ID=""
:MAINMENU
set answer=""
cls
echo -------------------------------------------------
echo Menu
echo -------------------------------------------------
echo 1: Make Hard Links for Virtual Machine
echo 2: Make Hard Links for Virtual Machine Snapshots
echo 3: Exit
echo -------------------------------------------------
set /p answer=Enter Menu Item:
if %answer% equ 1 goto MENUVM
if %answer% equ 2 goto MENUSNAP
if %answer% equ 3 (goto :EOF) else goto MAINMENU
::----- если нажата единица, то прописываем HardLink для ВМ
:MENUVM
set /p VM_ID=Enter Virtual Machine GUID:
set /p VM_PATH=Enter path to Virtual Machine:
if exist "%VM_PATH%\Virtual Machines\%VM_ID%.xml" (
:: ----- если находим прежние хардлинки, то удаляем (необходимо, при использование Backup Exec)
if exist "%HYPER-V_PATH%\Virtual Machines\%VM_ID%.xml" del /F /Q "%HYPER-V_PATH%\Virtual Machines\%VM_ID%.xml"
:: ----- останавливаем службу "Управления виртуальными машинами Hyper-V"
net stop vmms
:: ----- создаём хардлинк на XML-файл снимка ВМ
mklink /H "%VM_ID%.xml" "%VM_PATH%\Virtual Machines\%VM_ID%.xml"
:: ----- перемещаем хардлинк туда, где он должен быть
move /Y "%VM_ID%.xml" "%HYPER-V_PATH%\Virtual Machines\"
:: ----- запускаем службу "Управления виртуальными машинами Hyper-V" (Необходимо чтобы ID ВМ зарегистрировался и icacls отработала корректно)
net start vmms
pause
:: ----- устанавливаем необходимую NTFS-безопасность
icacls "%HYPER-V_PATH%\Virtual Machines\%VM_ID%.xml" /grant "‚?ђ’“Ђ‹њЌЂџ ЊЂ??ЌЂ NT\%VM_ID%":F /T
pause
goto MAINMENU
) else (
echo ERROR: Snapshot XML-file not found! Try one more time...
pause
goto :EOF
)
::----- если нажата двойка, то прописываем HardLink для снимка ВМ (предполагается, что ВМ уже зарегистрирована иначе icacls отработает не коректно)
:MENUSNAP
if %VM_ID%=="" set /p VM_ID=Enter Virtual Machine GUID:
if %VM_PATH%=="" set /p VM_PATH=Enter path to Virtual Machine:
set /p SNAP_ID=Enter Snapshot GUID:
if exist "%VM_PATH%\Snapshots\%SNAP_ID%.xml" (
:: ----- если находим прежние хардлинки, то удаляем (необходимо, при использование Backup Exec)
if exist "%HYPER-V_PATH%\Snapshots\%SNAP_ID%.xml" del /F /Q "%HYPER-V_PATH%\Snapshots\%SNAP_ID%.xml"
:: ----- создаём хардлинк на XML-файл снимка ВМ
mklink /H "%SNAP_ID%.xml" "%VM_PATH%\Snapshots\%SNAP_ID%.xml"
:: ----- перемещаем хардлинк туда, где он должен быть
move /Y "%SNAP_ID%.xml" "%HYPER-V_PATH%\Snapshots\"
pause
:: ----- устанавливаем необходимую NTFS-безопасность
icacls "%HYPER-V_PATH%\Snapshots\%SNAP_ID%.xml" /grant "‚?ђ’“Ђ‹њЌЂџ ЊЂ??ЌЂ NT\%VM_ID%":F /T
pause
goto MAINMENU
) else (
echo ERROR: Snapshot XML-file not found! Try one more time...
pause
goto :EOF
)
условия только одно: запускайте скрипт на том же диске (можно в корне, путь не имеет значение), где расположена виртуалка иначе mklink будет ругаться, что не может создать хардлинк. Конечно, надо бы добавить проверку этого условия (например, после ввода пути к виртуальной машине), но мне лень. :) И, кстати, путь к виртуальной машине вводите без бэк-слежа в конце, т.е. не c:\VMs\виртуалка\, а c:\VMs\виртуалка.