Windows Server 2012 R2 Hyper-VでVMの移動はめっちゃ重宝するのですが、ちょいと設定が必要です。
設定しないと、0x8009030Eエラーとなって移動ができません。(と書きつつ、拙宅環境では設定しなくても移動できてしまうんですよね... 何故なのか不明ですけど)
移動できるようにするには、Hyper-Vの設定で「ライブマイグレーション」を有効にして、高度な設定で「Kerberos」を指定します。
さらに、AciveDirectoryのユーザーとコンピューターでコンピューターオブジェクトの委任で「指定されたサービスへの委任でこのコンピューターを信頼する」-「Kerberosのみを使う」にし、相手のコンピューターを指定して「cifs」と「Microsoft Virtual System Migration Service」を追加します。
Hyper-Vが数台であればGUI設定で構わないのですが、こいつが100台とか1,000台とかのオーダーだととてもGUIで設定していられないので、PowerShellで設定したくなります。
まず、Hyper-Vの設定なのですが、こいつは以下で設定します。
# 移動の有効化
Enable-VMMigration
# 移動に使用するNIC(任意指定)
Set-VMHost -UseAnyNetworkForMigration $true
# Kerberos指定
Set-VMHost -VirtualMachineMigrationAuthenticationType Kerberos
このコマンドレットは、-ComputerNameが使えるので、リモート設定することが可能です。
リモートでSet-VMHostすると、Kerberos設定済みのときには「Set-VMHost : パラメーターが指定されていないため、ホストに対する変更は行われませんでした。」ってエラーになります。(もう少しわかりやすい実装してほしかったですね)
さて、ActiveDirectoryの設定なのです。
コンピューターアカウントを見るとmsDS-AllowedToDelegateToに「Microsoft Virtual System Migration Service」と「cifs」が設定されています。
PS C:\Users\Administrator> Get-ADObject
-Identity "CN=wsv01,CN=Computers,DC=vwnet,DC=jp" -Properties
msDS-AllowedToDelegateTo DistinguishedName : CN=wsv01,CN=Computers,DC=vwnet,DC=jp msDS-AllowedToDelegateTo : {Microsoft Virtual System Migration Service/WSV02, Microsoft Virtual System Migration Servic e/wsv02.vwnet.jp, cifs/WSV02, cifs/wsv02.vwnet.jp} Name : WSV01 ObjectClass : computer ObjectGUID : faa5af61-16c7-4cc4-a34b-a671bf7cf79b |
よく見ると、以下の4つが登録されています。
Microsoft Virtual System Migration Service/相手コンピューター名
Microsoft Virtual System Migration Service/相手FQDN
cifs/相手コンピューター名
cifs/相手FQDN
こいつをPowerShellで追加するには、以下のようにします。(wsv01.vwnet.jpとwsv02.vwnet.jp間で移動する場合の例)
### wsv01 # cifs/wsv02を登録 Set-ADObject -Identity "CN=wsv01,CN=Computers,DC=vwnet,DC=jp" -Add @{"msDS-AllowedToDelegateTo" = "cifs/wsv02.vwnet.jp" } Set-ADObject -Identity "CN=wsv01,CN=Computers,DC=vwnet,DC=jp" -Add @{"msDS-AllowedToDelegateTo" = "cifs/wsv02"} # Microsoft Virtual System Migration Service/wsv02を登録 Set-ADObject -Identity "CN=wsv01,CN=Computers,DC=vwnet,DC=jp" -Add @{"msDS-AllowedToDelegateTo" = "Microsoft Virtual System Migration Service/wsv02.vwnet.jp" } Set-ADObject -Identity "CN=wsv01,CN=Computers,DC=vwnet,DC=jp" -Add @{"msDS-AllowedToDelegateTo" = "Microsoft Virtual System Migration Service/wsv02" } ### wsv02 # cifs/wsv01を登録 Set-ADObject -Identity "CN=wsv02,CN=Computers,DC=vwnet,DC=jp" -Add @{"msDS-AllowedToDelegateTo" = "cifs/wsv01.vwnet.jp" } Set-ADObject -Identity "CN=wsv02,CN=Computers,DC=vwnet,DC=jp" -Add @{"msDS-AllowedToDelegateTo" = "cifs/wsv01"} # Microsoft Virtual System Migration Service/wsv01を登録 Set-ADObject -Identity "CN=wsv02,CN=Computers,DC=vwnet,DC=jp" -Add @{"msDS-AllowedToDelegateTo" = "Microsoft Virtual System Migration Service/wsv01.vwnet.jp" } Set-ADObject -Identity "CN=wsv02,CN=Computers,DC=vwnet,DC=jp" -Add @{"msDS-AllowedToDelegateTo" = "Microsoft Virtual System Migration Service/wsv01"} |
ここまでネタが揃えば、自動化するためにどのようにスクリプトとして組み込むかですね。
こんな感じにスクリプトにしてみました。(要管理権限)
対象のHyper-Vサーバーを「Hyper-V」OUに格納している前提です。
前回のスクリプト実行した時の状態を記録しておいて、Hyper-Vの追加/削除を認識して追加/削除設定します。
設定がおかしくなったら、「前回のサーバー一覧ファイル」を削除してスクリプト実行するとリカバリーできます。(全台新規登録動作をします)
< SetVmMigrationSetting.ps1 >
########################################### # 定数 ########################################### # スクリプトが格納されているディレクトリー $ScriptDir = $PSScriptRoot # Hyper-V Server が入っている所 $SearchBase = "OU=Hyper-V,DC=vwnet,DC=jp" # DNS サフィックス $DNSSuffix = "vwnet.jp" # 前回のサーバー一覧ファイル $OldServerFile = $ScriptDir + "\LastServerNames.dat" ########################################### # main ########################################### # 現在のサーバーリスト $NowServers = Get-ADComputer -Filter * -SearchBase $SearchBase $NowServerNames = $NowServers.Name # 前回のサーバーリスト if(test-path $OldServerFile){ $OldServerNames = Get-Content -Path $OldServerFile } # 事前処理(追加/削除/変更なしサーバーリスト作成) foreach( $NowServerName in $NowServerNames ){ if( $OldServerNames -contains $NowServerName ){ # 変更なしサーバーリスト $CurrentServerNames += @($NowServerName) } else{ # 追加されたサーバーリスト $AddServerNames += @($NowServerName) } } foreach( $OldServerName in $OldServerNames ){ if( -not ($NowServerNames -contains $OldServerName) ){ # 削除されたサーバーリスト $RemoveServerNames += @($OldServerName) } } # 追加されたサーバーに対する処理 foreach( $AddServerName in $AddServerNames ){ echo "追加されたサーバー $AddServerName の処理" echo " 移動の有効化" Enable-VMMigration -ComputerName $AddServerName echo " 移動に使用するNICは任意" Set-VMHost -ComputerName $AddServerName -UseAnyNetworkForMigration $true echo " Kerberosを指定" Set-VMHost -ComputerName $AddServerName -VirtualMachineMigrationAuthenticationType Kerberos # 現在のサーバーリストを追加する $Identity = "CN=" + $AddServerName + "," + $SearchBase foreach( $NowServerName in $NowServerNames ){ echo " $NowServerName の Microsoft Virtual System Migration Service 追加" $ServiceName = "Microsoft Virtual System Migration Service/" + $NowServerName + "." + $DNSSuffix Set-ADObject -Identity $Identity -Add @{"msDS-AllowedToDelegateTo" = $ServiceName } $ServiceName = "Microsoft Virtual System Migration Service/" + $NowServerName Set-ADObject -Identity $Identity -Add @{"msDS-AllowedToDelegateTo" = $ServiceName } echo " $NowServerName の cifs 追加" $ServiceName = "cifs/" + $NowServerName + "." + $DNSSuffix Set-ADObject -Identity $Identity -Add @{"msDS-AllowedToDelegateTo" = $ServiceName } $ServiceName = "cifs/" + $NowServerName Set-ADObject -Identity $Identity -Add @{"msDS-AllowedToDelegateTo" = $ServiceName } } } # 変更なしサーバーに対する処理 foreach( $CurrentServerName in $CurrentServerNames ){ echo "変更なしサーバー $CurrentServerName の処理" # 追加されたサーバーリストを追加をする $Identity = "CN=" + $CurrentServerName + "," + $SearchBase foreach( $AddServerName in $AddServerNames ){ echo " $AddServerName の Microsoft Virtual System Migration Service 追加" $ServiceName = "Microsoft Virtual System Migration Service/" + $AddServerName + "." + $DNSSuffix Set-ADObject -Identity $Identity -Add @{"msDS-AllowedToDelegateTo" = $ServiceName } $ServiceName = "Microsoft Virtual System Migration Service/" + $AddServerName Set-ADObject -Identity $Identity -Add @{"msDS-AllowedToDelegateTo" = $ServiceName } echo " $AddServerName の cifs 追加" $ServiceName = "cifs/" + $AddServerName + "." + $DNSSuffix Set-ADObject -Identity $Identity -Add @{"msDS-AllowedToDelegateTo" = $ServiceName } $ServiceName = "cifs/" + $AddServerName Set-ADObject -Identity $Identity -Add @{"msDS-AllowedToDelegateTo" = $ServiceName } } # 削除されたサーバーリストを削除する foreach( $RemoveServerName in $RemoveServerNames ){ echo " $RemoveServerName の Microsoft Virtual System Migration Service 削除" $ServiceName = "Microsoft Virtual System Migration Service/" + $RemoveServerName + "." + $DNSSuffix Set-ADObject -Identity $Identity -Remove @{"msDS-AllowedToDelegateTo" = $ServiceName } $ServiceName = "Microsoft Virtual System Migration Service/" + $RemoveServerName Set-ADObject -Identity $Identity -Remove @{"msDS-AllowedToDelegateTo" = $ServiceName } echo " $RemoveServerName の cifs 削除" $ServiceName = "cifs/" + $RemoveServerName + "." + $DNSSuffix Set-ADObject -Identity $Identity -Remove @{"msDS-AllowedToDelegateTo" = $ServiceName } $ServiceName = "cifs/" + $RemoveServerName Set-ADObject -Identity $Identity -Remove @{"msDS-AllowedToDelegateTo" = $ServiceName } } } # 削除されたサーバーに対する処理 foreach( $RemoveServerName in $RemoveServerNames ){ echo "削除されたサーバー $RemoveServerName の処理" $RemovedComputerInfo = $null $RemovedComputerInfo = Get-ADComputer $RemoveServerName # AD 上にサーバーが残っているのなら前回のサーバーリストを削除する if( $RemovedComputerInfo -ne $null ){ $Identity = $RemovedComputerInfo.DistinguishedName foreach( $OldServerName in $OldServerNames ){ echo " $OldServerName の Microsoft Virtual System Migration Service 削除" $ServiceName = "Microsoft Virtual System Migration Service/" + $OldServerName + "." + $DNSSuffix Set-ADObject -Identity $Identity -Remove @{"msDS-AllowedToDelegateTo" = $ServiceName } $ServiceName = "Microsoft Virtual System Migration Service/" + $OldServerName Set-ADObject -Identity $Identity -Remove @{"msDS-AllowedToDelegateTo" = $ServiceName } echo " $OldServerName の cifs 削除" $ServiceName = "cifs/" + $OldServerName + "." + $DNSSuffix Set-ADObject -Identity $Identity -Remove @{"msDS-AllowedToDelegateTo" = $ServiceName } $ServiceName = "cifs/" + $OldServerName Set-ADObject -Identity $Identity -Remove @{"msDS-AllowedToDelegateTo" = $ServiceName } } } } # 現在のサーバーリストを保存 if( $NowServerNames -ne $null ){ $NowServerNames | Set-Content $OldServerFile } |
Hyper-V server 2012 R2 の目次に戻る
http://www.vwnet.jp/Windows/etc.asp#Hyper-V_server_2012_R2
Copyright © MURA All rights reserved.