Home > Windows にまつわる e.t.c.

仮想マシンの移動設定


Windows Server 2012 R2 Hyper-VでVMの移動はめっちゃ重宝するのですが、ちょいと設定が必要です。

設定しないと、0x8009030Eエラーとなって移動ができません。(と書きつつ、拙宅環境では設定しなくても移動できてしまうんですよね... 何故なのか不明ですけど)

 

GUIで設定する

Hyper-Vの設定

移動できるようにするには、Hyper-Vの設定で「ライブマイグレーション」を有効にして、高度な設定で「Kerberos」を指定します。

 

ActiveDirectoryの設定

さらに、AciveDirectoryのユーザーとコンピューターでコンピューターオブジェクトの委任で「指定されたサービスへの委任でこのコンピューターを信頼する」-「Kerberosのみを使う」にし、相手のコンピューターを指定して「cifs」と「Microsoft Virtual System Migration Service」を追加します。

 

 

PowerShellで設定する

Hyper-Vが数台であればGUI設定で構わないのですが、こいつが100台とか1,000台とかのオーダーだととてもGUIで設定していられないので、PowerShellで設定したくなります。

Hyper-Vの設定

まず、Hyper-Vの設定なのですが、こいつは以下で設定します。

# 移動の有効化
Enable-VMMigration

# 移動に使用するNIC(任意指定)
Set-VMHost -UseAnyNetworkForMigration $true

# Kerberos指定
Set-VMHost -VirtualMachineMigrationAuthenticationType Kerberos

このコマンドレットは、-ComputerNameが使えるので、リモート設定することが可能です。

リモートでSet-VMHostすると、Kerberos設定済みのときには「Set-VMHost : パラメーターが指定されていないため、ホストに対する変更は行われませんでした。」ってエラーになります。(もう少しわかりやすい実装してほしかったですね)

ActiveDirectoryの設定

さて、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

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.