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
Источники
- Hyper-V Architecture — корневой и дочерние разделы, VMBus, VSP и VSC, просвещённые гости;
- Hyper-V host hardware requirements — аппаратная виртуализация и SLAT;
- Should I create a generation 1 or 2 virtual machine in Hyper-V? — поколения машин и их различия;
- What's new in Windows Server 2025 — поколение 2 по умолчанию в Hyper-V Manager;
- Plan for Hyper-V scalability — лимиты процессоров и памяти машин;
- Set-VMFirmware — Secure Boot и его шаблоны;
- Upgrade virtual machine version in Hyper-V — версии конфигурации, таблица файлов машины;
- Get-VMHostSupportedVersion и Update-VMVersion — поддерживаемые версии и их обновление;
- Stop-VM и Set-VM — остановка машины и действия при перезагрузке хоста;
- Manage Hyper-V Integration Services — список служб интеграции и их включение;
- Enable-VMTPM — виртуальный TPM и защитник ключей.
Теперь понятно, что происходит под каждой командой первой части: гипервизор делит процессор и память, корневой раздел обслуживает устройства, а гость общается с ним по VMBus через службы интеграции. Машина — это конфигурация .vmcx, состояние .vmrs и .vmgs и диски.
Дальше — часть 3: настраиваем виртуальные диски. Форматы VHD и VHDX, фиксированные, динамические и разностные диски, изменение размера на ходу, сжатие и конвертация, подключение дисков к контроллерам машины и к самому хосту, физические диски напрямую и общий диск для гостевого кластера.
Оставить комментарий могут только зарегистрированные пользователи.
Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.