Hyper-V. Часть 2: Как устроен Hyper-V?

Все части серии «Hyper-V»

В первой части мы поставили роль, создали коммутатор и машину и установили в неё систему, не задумываясь, что стоит за каждой командой. Теперь разберёмся, что произошло на самом деле: что изменилось в сервере после установки роли, как гостевая система добирается до диска и сети, что такое поколение машины и её версия конфигурации, из каких файлов машина состоит и чем отличаются её состояния.


Гипервизор и разделы

Hyper-V — гипервизор первого типа: он работает прямо на железе, а не поверх операционной системы. После установки роли загрузчик сначала запускает гипервизор, и уже он поднимает Windows Server — но не как хозяина машины, а как первую виртуальную машину с особыми правами. Документация называет её корневым (root) или родительским разделом, а все остальные машины — дочерними разделами (архитектура Hyper-V).

┌──────────────────────────┐  ┌──────────────────────────┐
│ Корневой раздел          │  │ Дочерний раздел (VM)     │
│ Windows Server           │  │ гостевая ОС              │
│                          │  │                          │
│ vmms.exe   vmwp.exe ×N   │  │ драйверы-VSC             │
│ драйверы-VSP             │  │ (службы интеграции)      │
│ драйверы устройств       │  │                          │
└────────────┬─────────────┘  └────────────┬─────────────┘
             │            VMBus            │
             └──────────────┬──────────────┘
┌───────────────────────────┴────────────────────────────┐
│ Гипервизор: процессор, память, прерывания              │
└───────────────────────────┬────────────────────────────┘
┌───────────────────────────┴────────────────────────────┐
│ Железо: CPU с VT-x/AMD-V и SLAT, память, диски, сеть   │
└────────────────────────────────────────────────────────┘

Гипервизор делит только процессор и память: раздаёт разделам виртуальные процессоры, изолирует их адресные пространства и обрабатывает прерывания. С дисками и сетевыми картами работает корневой раздел — у него настоящие драйверы устройств. Дочерний раздел видит виртуальные устройства, а запросы к ним уходят в корневой раздел по VMBus — каналу обмена между разделами. На стороне корневого раздела запросы принимают VSP (Virtualization Service Provider), на стороне гостя их отправляют VSC (Virtualization Service Consumer). Гость, который знает, что работает в виртуальной машине, и общается с VSP напрямую, называется «просвещённым» (enlightened); драйверы VSC приходят вместе со службами интеграции — в современных Windows и в ядре Linux они уже встроены.

В корневом разделе живут две части, с которыми администратор сталкивается постоянно. Служба VMMS (vmms.exe, Hyper-V Virtual Machine Management) хранит конфигурацию машин и выполняет команды PowerShell и Hyper-V Manager. Для каждой запущенной машины поднимается свой рабочий процесс vmwp.exe: он эмулирует устройства этой машины, и если машина «зависла» так, что Stop-VM -TurnOff не помогает, в крайнем случае завершают именно его.

Get-Service vmms
Get-CimInstance Win32_Process -Filter "Name = 'vmwp.exe'" | Select-Object ProcessId, CommandLine
Get-VM | Select-Object Name, Id

В командной строке каждого vmwp.exe стоит идентификатор машины — по нему процесс сопоставляют с Id из Get-VM.

Отсюда два практических следствия. Корневой раздел — тоже виртуальная машина, поэтому на хосте Hyper-V не ставят ничего лишнего: всё, что работает рядом с VMMS, отнимает у него ресурсы и расширяет поверхность атаки. И для работы Hyper-V процессору нужны аппаратная виртуализация (Intel VT-x или AMD-V) и SLAT — трансляция адресов второго уровня (Intel EPT, AMD RVI), без которой роль не ставится начиная с Windows Server 2016 (требования к оборудованию). Именно их проверял systeminfo в первой части.

Поколение машины

При создании машины выбирают поколение, и сменить его потом нельзя (поколение 1 или 2):

  • Поколение 1 эмулирует классический ПК: BIOS, загрузка с IDE-диска, эмулируемые устройства. Нужно для 32-битных систем и для готовых дисков, которые не загружаются через UEFI.
  • Поколение 2 — UEFI, загрузка с SCSI-диска или по сети, Secure Boot, виртуальный TPM, никакой эмуляции старого железа. Microsoft рекомендует его по умолчанию; в Hyper-V Manager на Windows Server 2025 оно и выбрано по умолчанию (что нового в 2025). Лимиты у него тоже выше: на Windows Server 2025 до 2048 виртуальных процессоров и 240 ТБ памяти против 64 и 1 ТБ у первого (лимиты).

Secure Boot — механизм UEFI, который при загрузке проверяет подпись загрузчика по базе доверенных сертификатов. У машин второго поколения он включён с шаблоном Microsoft Windows; для Linux нужен шаблон MicrosoftUEFICertificateAuthority, иначе загрузчик Linux не пройдёт проверку — это та строка Set-VMFirmware, которую мы выполняли для Linux в первой части (Set-VMFirmware).

Get-VMFirmware -VMName app1 | Format-List SecureBoot, SecureBootTemplate, BootOrder

Версия конфигурации

Вторая характеристика машины — версия конфигурации. Она определяет формат файлов машины, набор доступных ей функций и то, на каких хостах она запустится (версия конфигурации). Какие версии поддерживает хост и какую он даёт новым машинам по умолчанию, показывает Get-VMHostSupportedVersion (Get-VMHostSupportedVersion):

Get-VMHostSupportedVersion
Get-VMHostSupportedVersion -Default
Get-VM | Sort-Object Version | Format-Table Name, State, Version, Generation

Машина с более новой версией не запустится и не импортируется на хосте, который эту версию не знает. Если машину предстоит перенести на хост с более старой Windows Server, её создают со старой версией — New-VM … -Version 9.0, причём версия должна быть в списке Get-VMHostSupportedVersion обоих хостов.

Машина, перенесённая или импортированная на новый хост, сама не обновляется: она сохраняет старую версию и может вернуться назад. Обновление — Update-VMVersion — требует выключения и необратимо: понизить версию потом нельзя (Update-VMVersion). Когда и в каком порядке поднимать версию при переходе на новую Windows Server, разберём в частях о переносе машин и об обслуживании кластера.

Файлы машины

На диске машина — это несколько файлов в папке Virtual Machines\<GUID> внутри пути, заданного Set-VMHost -VirtualMachinePath или параметром -Path команды New-VM (таблица файлов):

Файл Что хранит
.vmcx конфигурация в двоичном формате
.vmrs состояние запущенной или сохранённой машины: содержимое памяти и устройств
.vmgs гостевое состояние: переменные UEFI, ключи TPM
.vhdx / .avhdx диски; .avhdx — разностные диски контрольных точек
Get-VM app1 | Format-List Name, Id, Path, ConfigurationLocation, SnapshotFileLocation
Get-ChildItem (Join-Path (Get-VM app1).ConfigurationLocation 'Virtual Machines') -Recurse

Правят конфигурацию только через PowerShell или Hyper-V Manager: .vmcx — двоичный файл, и ручные изменения в нём не поддерживаются. Диски — обычные файлы VHDX, им посвящена следующая часть, а файлам .avhdx — часть о контрольных точках.

Состояния машины

Get-VM | Format-Table Name, State, CPUUsage, MemoryAssigned, Uptime, Version, Generation
Stop-VM    -Name app1            # корректное завершение через службу интеграции Shutdown
Stop-VM    -Name app1 -TurnOff   # «выдернуть шнур»
Save-VM    -Name app1            # сохранить память в .vmrs и остановить
Suspend-VM -Name app1            # пауза: память остаётся в ОЗУ хоста
Resume-VM  -Name app1
Restart-VM -Name app1 -Force

Разница между остановками важна. Stop-VM без ключей просит гостя завершиться самому, как при нажатии «Завершение работы» внутри, — для этого нужна служба интеграции Shutdown. Если гость на неё не отвечает (система не загружена или служба выключена), Stop-VM спрашивает, выключить ли машину жёстко, — то же, что -TurnOff (Stop-VM). -TurnOff выключает машину мгновенно, без участия гостя, с риском потерять незаписанные данные. Save-VM записывает память и состояние устройств в .vmrs, и после Start-VM машина продолжает с того же места — как ноутбук после гибернации. Suspend-VM ничего на диск не пишет: машина замирает, но держит всю свою память на хосте.

Что делать с машиной при перезагрузке хоста, задают AutomaticStartAction и AutomaticStopAction (Set-VM):

Set-VM -Name app1 -AutomaticStartAction Start -AutomaticStartDelay 60 -AutomaticStopAction ShutDown
Get-VM | Format-Table Name, AutomaticStartAction, AutomaticStartDelay, AutomaticStopAction

AutomaticStartAction — Nothing, Start или StartIfRunning (запустить, если машина работала, когда хост выключался). Задержка старта не даёт десятку машин одновременно начать загрузку с одного тома. AutomaticStopAction — ShutDown, Save или TurnOff; Save выбран по умолчанию и оставляет на томе файл размером с память машины.

Службы интеграции

Службы интеграции — набор каналов VMBus между хостом и гостем (службы интеграции):

Служба Что делает
Shutdown хост просит гостя корректно завершить работу — это и есть Stop-VM
Heartbeat гость регулярно сообщает, что жив
Time Synchronization подводит часы гостя к часам хоста
Key-Value Pair Exchange обмен парами «ключ — значение» (в документации — Data Exchange): из них хост знает имя и адреса гостя
VSS хост делает согласованные копии дисков работающей машины
Guest Service Interface копирование файлов с хоста в гостя

Каждая служба должна быть включена с обеих сторон: в настройках машины на хосте и в самом госте. На Windows-гостях по умолчанию включены все, кроме Guest Service Interface (там же).

Get-VMIntegrationService -VMName app1
Enable-VMIntegrationService -VMName app1 -Name 'Guest Service Interface'
Copy-VMFile -Name app1 -SourcePath 'D:\dist\agent.msi' -DestinationPath 'C:\Temp\agent.msi' -CreateFullPath -FileSource Host

PrimaryStatusDescription в выводе Get-VMIntegrationService показывает, отвечает ли служба со стороны гостя. Столбец IPAddresses в Get-VMNetworkAdapter и Heartbeat в Get-VM заполняются именно через эти службы: если их нет, хост не знает, что происходит внутри.

Отдельно про синхронизацию времени: виртуальный контроллер домена не должен брать время у хоста, если хост сам берёт время у этого контроллера, — круг замыкается. Обычно у контроллеров домена отключают службу Time Synchronization и оставляют им иерархию времени домена:

Disable-VMIntegrationService -VMName dc1 -Name 'Time Synchronization'

Виртуальный TPM

Машинам второго поколения можно дать виртуальный TPM — его требуют Windows 11, BitLocker внутри гостя и некоторые средства защиты. Ключи TPM лежат в файле .vmgs и шифруются защитником ключей; на одиночном хосте это локальный защитник (Enable-VMTPM):

Set-VMKeyProtector -VMName app1 -NewLocalKeyProtector
Enable-VMTPM       -VMName app1
Get-VMSecurity     -VMName app1

Машина с локальным защитником ключей запустится только там, где есть сертификаты этого защитника: при переезде на другой хост их нужно перенести вместе с ней. В организациях, где таких машин много, эту задачу решает служба Host Guardian, но это отдельная большая тема.

Смотрим руками

Хост и его машины одной таблицей:

Get-VM | Sort-Object Name | Format-Table Name, State, Generation, Version,
    @{n='vCPU'; e={$_.ProcessorCount}},
    @{n='MemGB'; e={[math]::Round($_.MemoryAssigned/1GB, 1)}},
    @{n='Uptime'; e={$_.Uptime.ToString('d\.hh\:mm')}}

Параметры самого хоста — пути по умолчанию, число логических процессоров, память:

Get-VMHost | Format-List Name, LogicalProcessorCount, MemoryCapacity,
    VirtualMachinePath, VirtualHardDiskPath, VirtualMachineMigrationEnabled

Машины, у которых не отвечают службы интеграции, — первые кандидаты на проблемы с Stop-VM и резервным копированием:

Get-VM | Where-Object State -eq 'Running' | Get-VMIntegrationService |
    Where-Object { $_.Enabled -and $_.PrimaryStatusDescription -ne 'OK' } |
    Format-Table VMName, Name, PrimaryStatusDescription

Источники


Теперь понятно, что происходит под каждой командой первой части: гипервизор делит процессор и память, корневой раздел обслуживает устройства, а гость общается с ним по VMBus через службы интеграции. Машина — это конфигурация .vmcx, состояние .vmrs и .vmgs и диски.

Дальше — часть 3: настраиваем виртуальные диски. Форматы VHD и VHDX, фиксированные, динамические и разностные диски, изменение размера на ходу, сжатие и конвертация, подключение дисков к контроллерам машины и к самому хосту, физические диски напрямую и общий диск для гостевого кластера.

Оставить комментарий могут только зарегистрированные пользователи.

Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.