Короткий ответ
До патча, добавления 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/Redirected | CSV |
| Нужны счётчики latency | производительность |
| Нет стратегии копий | резервирование |
Возможные причины
- VM Saved/Failed, checkpoint старше суток.
- CSV redirected на этом узле.
- Replica Critical.
- Available RAM впритык, Dynamic Memory в давлении.
- Backup job сейчас держит VSS.
- Другой админ уже 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, StartType2. 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, GroupType5. Реплика, 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 SilentlyContinue6. Журналы (кратко)
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 — нет.