Короткий ответ

До патча, добавления NIC, правки CorpNet или замены СХД снимите проверяемый baseline с HV01: роль Hyper-V, память, Get-VM, коммутаторы, CSV C:\ClusterStorage\Volume1, кворум, реплика, свободное место, leftover checkpoint. Красный CSV, Failed VM, Critical Replica, нет кворума — окно отменяется, чинится первопричина.

Этот текст не лечит аварию. Нашли сбой — уходите в тематическую статью.

Симптомы и как отличить

Нужен чеклист, если:

  • предстоит cumulative update хоста;
  • drain узла кластера;
  • «в Hyper-V Manager всё Running», а кластер не смотрели;
  • нет списка VM и путей дисков в заявке.

Не замена диагностики: если VM-APP01 уже не стартует — старт VM, не этот чеклист как лечение.

Что видноКуда
Нет кворумаquorum
CSV Offline/RedirectedCSV
Нужны счётчики latencyпроизводительность
Нет стратегии копийрезервирование

Возможные причины

  1. VM Saved/Failed, checkpoint старше суток.
  2. CSV redirected на этом узле.
  3. Replica Critical.
  4. Available RAM впритык, Dynamic Memory в давлении.
  5. Backup job сейчас держит VSS.
  6. Другой админ уже Drain HV02, вы Drain HV01 — некуда ехать.

Диагностика

Создайте каталог и снимайте команды ниже. Плейсхолдеры: HV01, VM-APP01, CorpNet, C:\ClusterStorage\Volume1.

1. Хост и роль

New-Item -ItemType Directory -Force C:\Temp\hv01-health | Out-Null
$ts = Get-Date -Format 'yyyyMMdd-HHmm'
hostname
Get-ComputerInfo | Select-Object WindowsProductName, WindowsVersion, OsVersion
Get-VMHost | Format-List ComputerName, LogicalProcessorCount, MemoryCapacity, VirtualMachinePath, VirtualHardDiskPath, VirtualMachineMigrationEnabled, EnableEnhancedSessionMode
Get-WindowsFeature Hyper-V, Failover-Clustering, RSAT-Hyper-V-Tools | Format-Table Name, Installed
Get-Service vmms, vmcompute, clussvc -ErrorAction SilentlyContinue | Format-Table Name, Status, StartType

2. VM

Get-VM | Format-Table Name, State, CPUUsage, MemoryAssigned, MemoryDemand, MemoryStatus, Version, Generation, Path, Uptime -AutoSize
Get-VM | Get-VMCheckpoint | Format-Table VMName, Name, CreationTime, SnapshotType
Get-VM | Get-VMHardDiskDrive | Format-Table VMName, Path
Get-VM | ForEach-Object {
  $_.Name; Get-VMHardDiskDrive -VM $_ | ForEach-Object { Get-VHD -Path $_.Path | Select-Object Path, VhdType, FileSize, Size, ParentPath }
}

Любой ParentPath / checkpoint на прод — риск merge во время патча. Heartbeat Lost — не drain, пока не поняли гостя.

3. Сеть

Get-VMSwitch | Format-Table Name, SwitchType, AllowManagementOS, EmbeddedTeamingEnabled, NetAdapterInterfaceDescription
Get-NetAdapter | Format-Table Name, Status, LinkSpeed, MacAddress
Get-VMNetworkAdapter -VMName * | Format-Table VMName, SwitchName, Connected, MacAddress
Test-NetConnection -ComputerName 10.0.10.10 -InformationLevel Quiet

Нет CorpNet или NIC Down — не трогайте vSwitch «заодно с патчем».

4. Кластер и CSV

Get-ClusterNode -ErrorAction SilentlyContinue | Format-Table Name, State, DrainStatus
Get-ClusterQuorum -ErrorAction SilentlyContinue | Format-List
Get-ClusterSharedVolume -ErrorAction SilentlyContinue | Format-Table Name, State, OwnerNode, FriendlyVolumeName
Get-ClusterSharedVolumeState -ErrorAction SilentlyContinue | Format-Table Node, StateInfo, VolumeFriendlyName
Get-ClusterGroup | Format-Table Name, State, OwnerNode, GroupType

5. Реплика, backup leftover, место

Get-VMReplication -ErrorAction SilentlyContinue | Format-Table VMName, Health, State, ReplicaServer, LastReplicationTime
Get-Volume | Format-Table DriveLetter, FileSystemLabel, FileSystem, @{N='FreeGB';E={[math]::Round($_.SizeRemaining/1GB,1)}}, @{N='SizeGB';E={[math]::Round($_.Size/1GB,1)}}
Get-StorageJob -ErrorAction SilentlyContinue

6. Журналы (кратко)

Get-WinEvent -FilterHashtable @{ LogName = 'Microsoft-Windows-Hyper-V-VMMS-Admin'; StartTime = (Get-Date).AddHours(-24) } |
  Where-Object LevelDisplayName -in 'Error','Warning' | Measure-Object
Get-WinEvent -FilterHashtable @{ LogName = 'System'; Id = 5120,5142,1177,1135,1069; StartTime = (Get-Date).AddDays(-2) } -ErrorAction SilentlyContinue |
  Format-Table TimeCreated, Id, Message -Wrap

Критерий «можно патчить»: нет Error за окно без известной причины, CSV Direct, VM Running или сознательно Off, есть куда мигрировать.

Решение

Здесь решение — идти/не идти в изменение, не «починить всё».

Сценарий A. Зелёный чеклист

Drain HV01 (кластер) или Live Migration VM, патч, reboot, проверка Get-VM на другом узле, Resume. После возврата — повтор этого же набора команд, сравнить имена VM.

Сценарий B. Есть Failed VM

Стоп. Статья старта / диск / CSV. Патч хоста не оживит битый ParentPath.

Сценарий C. Redirected CSV только на HV01

Сначала storage/сеть. Патч может превратить redirected в Offline.

Сценарий D. Одиночный хост без кластера

Простой гостей: Shutdown (не Saved, если мало места под .bin). Backup свежий. Консоль BMC.

Сверьте время хоста (w32tm /query /status) и свободный pagefile/dump: полный диск C: хоста валит VMMS так же, как полный CSV. Get-Volume C:.

Список VM сравните с CMDB/заявкой, не с памятью. Лишняя Running test-VM съест RAM во время drain. Лишняя забытая VM на локальном диске не уедет с кластером — обнаружите на reboot HV01.

Get-VM | Where-Object Path -notlike 'C:\ClusterStorage*' | Format-Table Name, Path, State

Любая clustered-по-смыслу VM с локальным Path — стоп-фактор патча этого узла, пока не перенесёте storage или не примете простой.

Повторите health после reboot до Resume больших ролей, если сомневаетесь в драйвере HBA: сначала CSV state, потом VM.

Как проверить, что проблема устранена

После работ: тот же скрипт, VM на ожидаемых узлах, Heartbeat OK, CSV Direct, Replica Health не хуже baseline, место не ушло в ноль из-за Saved State. Пользовательский smoke: RDP/Test-NetConnection к VM-APP01.

Get-VM | Format-Table Name, State, Heartbeat, ComputerName
Get-ClusterSharedVolumeState -ErrorAction SilentlyContinue | Format-Table Node, StateInfo

Заявку закройте с приложенными двумя дампами: до и после.

Если не помогло

  • После патча нет vSwitch: статья коммутатора, BMC.
  • Часть VM Saved: места не хватило на состояние — Delete Saved только с пониманием.
  • Кластер не собрался: quorum.
  • Производительность просела: статья счётчиков, не повторный патч.

Профилактика

  • Этот чеклист — обязательный вложение заявки Change.
  • Мониторинг CSV/Replica/Heartbeat постоянно, не только в пятницу.
  • Два узла не патчить в один день без drain-теста.
  • Эталон вывода Get-VM в wiki площадки.
  • BMC и второй путь управления, не один RDP на CorpNet.

FAQ

Достаточно ли Hyper-V Manager «все Running»?

Нет. Не видно CSV redirected, leftover avhdx, Replica lag, Owners.

Test-Cluster каждый раз?

Полезен в плановое окно, не за 5 минут до патча как сюрприз из 40 предупреждений. Держите известный baseline Test-Cluster.

Нужен ли BPA?

Best Practices Analyzer — доп.сигнал, не стоп-фактор сам по себе. Читайте каждую рекомендацию.

Одиночный HV без кластера — этот же чеклист?

Да, минус CSV/quorum, плюс акцент на backup и BMC.

Сколько хранить дампы health?

Пока не закроете change и не пройдёт первый бизнес-пик после.

Можно ли патчить, если одна test-VM Failed?

Да, если изолирована и не на том же CSV-риске. Задокументируйте исключение. Прод-Failed — нет.