背景:
我们在一家小型办公室使用 Windows 2008 R2 在 Hyper-V 中运行了几个虚拟服务器。我们只有 1 个物理主机(并且我们近期不打算改变这一点)。我们打算迁移到 Hyper-V Server 2012。
目前,我们有一个小型 UPS,可以让服务器运行大约 20 分钟,然后向 Windows 2008 发送关机消息。UPS 通过 USB 连接。Windows 2008 将 UPS 识别为电池,并且我们还使用 Eaton 的软件来监控电池。当 Windows 关闭时,它也会正确关闭 VM。
我们不想花费大量时间运行 Server 2012 的完整版本,只是为了让 UPS 关闭服务器,但我们也不希望 Active Directory 和 Exchange 突然关闭。
当 UPS 断电时,我们可以让 Hyper-V Server 2012 正常关闭虚拟机吗?
答案1
Hyper-V Server 至少在这些方面与作为“Server Core”安装的 Windows Server 相同,也就是说,没有图形用户界面。您的 UPS 监控设备是否能在该环境中工作取决于 Eaton 的软件是否可以在没有 GUI 的环境中运行,以及您是否愿意使用命令行工具配置这些设备。
我建议打电话给伊顿询问他们。
答案2
我最终选择的解决方案是创建一个在启动时运行的 VBScript(使用 cscript 和任务计划程序)。
剧本:
set wmi = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}!\\.\root\cimv2")
set batteryColl = wmi.ExecQuery("select * from Win32_Battery")
set osColl = wmi.ExecQuery("select * from Win32_OperatingSystem")
while true
for each battery in batteryColl
battery.Refresh_
if battery.batteryStatus = 1 and battery.EstimatedChargeRemaining <= 25 then
for each os in osColl
os.Win32Shutdown 5
next
end if
next
wscript.Sleep 15000
wend
答案3
我发现每次断电都会发生一次事件。可以将关机脚本附加到该事件上。
我的脚本
$continue = $true
while($continue){
$batt = (Get-CimInstance -ClassName Win32_Battery)
if ($batt.BatteryStatus -eq 2){
$continue = $false
} elseif ($batt.BatteryStatus -eq 1 -and $batt.EstimatedChargeRemaining -le 70){
$continue = $false
& "C:\Windows\System32\shutdown.exe" /s /t 60 /d u:6:12
} else {
Start-Sleep -s 60
}
}