воскресенье, 28 апреля 2019 г.

Windows 2008: Hyper-V и дилетанты

Предположим, возникла ситуация: жил-был Windows2008-сервер с Hyper-V, на котором работала виртуальная машина, и этот сервер в один не очень прекрасный момент приказал долго жить. К счастью, виртуальная машина лежала на отдельном диске и не пострадала. Возникает две задачи: 1) как добраться до файлов на виртуальном жестком диске и 2) как эту виртуальную машину поднять на другом сервере?

Тут надо сделать небольшой экскурс в структуру файлов, в которых хранится виртуальная машина (пусть её имя QUQU). Выглядит эта структура примерно так:
C:
└─ProgramData
  └─Microsoft
    └─Windows
      └─Hyper-V
        ├─Snapshots
        │ └─22222222-2222-2222-2222-222222222222.xml   <- символическая ссылка на конфигурацию фотографии ВМ
        └─Virtual Machines
          └─11111111-1111-1111-1111-11111111111.xml    <- символическая ссылка на конфигурацию ВМ
...
D:                                                     <- диск для хранения виртуальных машин
└─QUQU
  ├─Snapshots                                          <- папка для хранения фотографий ВМ
  │ ├─22222222-2222-2222-2222-222222222222             <- фотография виртуальной машины
  │ │ ├─22222222-2222-2222-2222-222222222222.bin
  │ │ └─22222222-2222-2222-2222-222222222222.vsv
  │ └─22222222-2222-2222-2222-222222222222.xml         <- конфигурация фотографии ВМ
  ├─Virtual Machines
  │ ├─11111111-1111-1111-1111-11111111111              <- пустая папка, не знаю, зачем
  │ └─11111111-1111-1111-1111-11111111111.xml          <- конфигурация ВМ
  ├─QUQU-c.vhd                                         <- образ диска С: виртуальной машины
  └─QUQU-c_33333333-3333-3333-3333-333333333333.avhd   <- изменения на диске С: виртуальной машины

Насколько я понял, система функционирует следующим образом. До создания фотографий виртуальная машина работает с образом диска - файлом QUQU-c.vhd. При создании фотографии этот файл "замораживается", и создается файл *.avhd, в котором накапливаются дифференциальные изменения диска С: виртуальной машины. И так далее.

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

Оказывается, к решению первой задачи (доступ к файлам ВМ) приводит следующая последовательность действий:

1. Чтобы не порушить структуру ВМ, копируем все QUQU-c.vhd и QUQU-c_33333333-3333-3333-3333-333333333333.avhd в какую-нибудь папку (например, D:\temp)

2. Запускаем с правами администратора утилиту DISKPART.

3. В командной строке diskpart-а выполняем команду:
select vdisk file=D:\temp\QUQU-c_33333333-3333-3333-3333-333333333333.avhd
эта команда нацелит diskpart на последний файл дифференциального накопления.

4. В командной строке diskpart-а выполняем команду:
merge vdisk depth=1
эта команда скомбинирует файлы дифференциального накопления (тут у нас один файл, поэтому depth=1) с исходным файлом и выдаст в QUQU-c.vhd самый свежий образ диска C: виртуальной машины.

5. Этот образ при помощи оснастки "Управление дисками" (например, так: с правами администратора команда mmc -> меню "Файл" - > пункт "Добавить или удалить оснастку...") подцепляем к системе: меню "Действие" -> пункт "Присоединить виртуальный жесткий диск".

Вторая задача (по переносу виртуальной машины) решается тоже несложно:

1. Останавливаем сервис Hyper-V:
net stop vmms

2. Создаём символические ссылки на конфигурацию виртуальной машины и всех её фотографий в рабочей папке Hyper-V нового сервера:
mklink "C:\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines\11111111-1111-1111-1111-11111111111.xml" "D:\QUQU\Virtual Machines\11111111-1111-1111-1111-11111111111.xml"

mklink "C:\ProgramData\Microsoft\Windows\Hyper-V\Snapshots\22222222-2222-2222-2222-222222222222.xml" "D:\QUQU\Snapshots\22222222-2222-2222-2222-222222222222.xml"

3. Раздаём этим символическим ссылкам нужные права:
icacls "C:\ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines\11111111-1111-1111-1111-11111111111.xml" /grant "ВИРТУАЛЬНАЯ МАШИНА NT\11111111-1111-1111-1111-11111111111":F /T /L

icacls "C:\ProgramData\Microsoft\Windows\Hyper-V\Snapshots\22222222-2222-2222-2222-222222222222.xml" /grant "ВИРТУАЛЬНАЯ МАШИНА NT\11111111-1111-1111-1111-11111111111":F /T /L
(если операционная система англоязычная, то "ВИРТУАЛЬНАЯ МАШИНА NT" меняем на "NT VIRTUAL MACHINE").

4. Запускаем сервис Hyper-V:
net start vmms
и отправляемся настраивать сетевые адаптеры на восстановленной виртуальной машине.

Литература:

http://itexpertclub.blogspot.com/2015/02/how-to-merge-vhd-and-avdh-files-using.html

http://pyatilistnik.org/kak-vosstanovit-virtualnyie-mashinyi-hyper-v-pri-kopirovanii-na-drugoy-host-v-windows-server-2008r2/

http://forum.oszone.net/thread-214658.html