院長のメモ帖
2013年10月 7日 月曜日
WS2012R2の再起動時にVMがオフになる その2
前回報告した、Windows Server 2012R2のVMがホスト再起動・シャットダウン時に正常シャットダウンせず電源Off状態になる不具合は、MicrosoftのWinodws Server Forumでも報告されていて、現時点で解決策はなさそうです。しょうがないので、以下のようなpowershellスクリプトを作ってしのいでいます。
# HyperVホスト再起動スクリプト
# Arg1 再起動するホスト。指定しない場合はローカルPCを再起動する。
$WaiToKillTime = 180
if (!([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
write-host "実行には管理者特権が必要です。"
exit
}
if ($args.Length -eq 0) {$comp = $env:COMPUTERNAME} else {$comp = $args}
$VmAll = Get-VM -ComputerName $comp
write-host Target:$comp
if ($VmAll.Count -eq 0)
{
Write-Host "VMが存在しないので処理をキャンセルします。"
}
else
{
#起動していないVMは、次回起動しない。
$VmAll | where state -NE Running | where AutomaticStartAction -NE Nothing | set-vm -AutomaticStartAction Nothing
$vms = $VmAll | where state -EQ Running #起動しているVM
$vms | Stop-VM -AsJob #非同期で停止
$vms | where AutomaticStartAction -NE Start | set-vm -AutomaticStartAction Start #次回起動するようマーク
#VMがすべてシャットダウンするかタイムアウトするまで待つ
for ($i = 1; $i -lt $WaiToKillTime; ++$i)
{
$vs = Get-VM -ComputerName $comp | where state -EQ Running
if ($vs.count -eq 0) { break}
$vs | select name | ft
start-sleep -s 1
}
Restart-Computer -ComputerName $comp -Force #ホストのリスタート開始
}
このスクリプトでは、現在実行中のVMの「自動開始アクション」を「常に開始に」、実行していないVMは「何もしない」に変更し、実行中のVMをシャットダウンします。
続いて、全VMがシャットダウンするかタイムアウト(180秒)するまで待ってから、ホストコンピューターを再起動させます。
とりあえず、Windows Updateを手動にしてこのスクリプトで再起動させてしのいでいますが、10/17の正式発売日には修正されているんでしょうか。今回Win8.1とWin2012R2のRTMがMSDN/TechNetにいったんは提供されないと発表されたのは、実はまだ開発中で本来のRTMの水準に達していなかったからではないかと疑ってしまいます。とにかく不振のWin8を立て直すためにWin8.1の発売を延期することは考えられなかったので、ぎりぎりまで修正を続けて、発売日には結構な数の修正プログラムがWindows Update経由で提供されるんじゃないでしょうか。
# HyperVホスト再起動スクリプト
# Arg1 再起動するホスト。指定しない場合はローカルPCを再起動する。
$WaiToKillTime = 180
if (!([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
write-host "実行には管理者特権が必要です。"
exit
}
if ($args.Length -eq 0) {$comp = $env:COMPUTERNAME} else {$comp = $args}
$VmAll = Get-VM -ComputerName $comp
write-host Target:$comp
if ($VmAll.Count -eq 0)
{
Write-Host "VMが存在しないので処理をキャンセルします。"
}
else
{
#起動していないVMは、次回起動しない。
$VmAll | where state -NE Running | where AutomaticStartAction -NE Nothing | set-vm -AutomaticStartAction Nothing
$vms = $VmAll | where state -EQ Running #起動しているVM
$vms | Stop-VM -AsJob #非同期で停止
$vms | where AutomaticStartAction -NE Start | set-vm -AutomaticStartAction Start #次回起動するようマーク
#VMがすべてシャットダウンするかタイムアウトするまで待つ
for ($i = 1; $i -lt $WaiToKillTime; ++$i)
{
$vs = Get-VM -ComputerName $comp | where state -EQ Running
if ($vs.count -eq 0) { break}
$vs | select name | ft
start-sleep -s 1
}
Restart-Computer -ComputerName $comp -Force #ホストのリスタート開始
}
このスクリプトでは、現在実行中のVMの「自動開始アクション」を「常に開始に」、実行していないVMは「何もしない」に変更し、実行中のVMをシャットダウンします。
続いて、全VMがシャットダウンするかタイムアウト(180秒)するまで待ってから、ホストコンピューターを再起動させます。
とりあえず、Windows Updateを手動にしてこのスクリプトで再起動させてしのいでいますが、10/17の正式発売日には修正されているんでしょうか。今回Win8.1とWin2012R2のRTMがMSDN/TechNetにいったんは提供されないと発表されたのは、実はまだ開発中で本来のRTMの水準に達していなかったからではないかと疑ってしまいます。とにかく不振のWin8を立て直すためにWin8.1の発売を延期することは考えられなかったので、ぎりぎりまで修正を続けて、発売日には結構な数の修正プログラムがWindows Update経由で提供されるんじゃないでしょうか。
投稿者 美濃加茂市のIT獣医師 近藤 博 | コメント(0)
コメントする