今回解説するのは、Hyper-Vの目玉機能の一つ、Live Migrationです。通常のLive Migrationであれば、Hyepr-Vマネージャーから簡単に操作できますが、ここではもう少し踏み込んで、プログラムマチックにLive Migrationの実行方法をご紹介いたします。簡単におさらいとして、WidnwosServer2012R2のLive Migrationの実行方法からご説明いたします。
目次
Live Migrationの実行方法
Hyper-VマネージャーからLive Migrationを実行する仮想マシンを選択して、ウィザードを起動します。
Live Migrationにはいくつか種類があり、仮想マシンを移動する場合と、仮想マシンのディスクのみを移動する方法があります。仮想マシンを移動する場合は、ディスクごと移動することもできますし、Hyper-Vをクラスタ構成して、共有ストレージに仮想マシンのディスクを配置している場合などは、仮想マシンの構成情報のみ移動することが可能です。
共通手順
仮想マシンの移動
移動オプションの選択 詳細オプションの選択
仮想マシンのディスクのみ移動
移動オプションの選択 詳細オプションの選択
仮想マシン構成情報+ディスクの移動
詳細オプションの選択 移動する項目の選択 接続されている仮想ハードディスク
仮想マシン構成情報のみ移動
詳細オプションの選択 移動する項目の選択 接続されている仮想ハードディスク 現在の構成 チェックポイント スマートペイジング
仮想マシン構成情報のみ移動 ※共有ストレージに仮想ディスクがある場合
ウィザードに従って実行すると、簡単にLive Migrationが実行できます。
さて、以上がHyper-Vマネージャーを使って、自分自身のサーバーから他のサーバーに移動する方法です。
では、外部からサーバー間のLive Migrationを実行するにはどのような手段があるでしょうか。第3のサーバーのHyper-Vマネージャーに対象となるサーバー2つを登録して実行する方法があります。しかし、そのままLive Migrationを実行すると「0x8009030E」というアクセス権のエラーが出現してしまいます。
PowerShellやWMI経由で実行する場合も同様のエラーが発生します。プログラムから実行した場合はこのようなエラーが起こります。
「’VM001′ の仮想マシン移行操作が失敗しました。
仮想マシン管理サービスは、ホストとの仮想マシンの移行のための接続を確立できませんでした: セキュリティ パッケージで利用できる資格情報がありません (0x8009030E)。
ソース ホストで接続を認証できませんでした: 適切な資格情報がありません。」
この場合、回避するために、ドメインに参加した状態でKerberos認証 の委任設定を行う必要があります。詳細な設定方法はこちらです。
Kerberos認証 の委任設定方法
まず、ドメインコントローラーの「Active Directory ユーザーとコンピューター」から、Live Migrationを実行するサーバー2台を選択します。
サーバー名を右クリックして「プロパティ」を開きます。「委任」タブを選択します。「指定されたサービスへの委任でのみこのコンピューターを信頼する」を選択し、「Kerberos のみを使う」を選択します。
この状態で「追加」ボタンをクリックし、「サービスの追加」から「ユーザーまたはコンピューター」を選択します。「ユーザーまたはコンピューター の選択」ダイアログにて、「オブジェクトの種類」から「コンピューター」を選択します。そしてLive Migrationを実行する相手方の対象となるサーバー名を入力します。
すると「利用可能なサービス」に一覧が表示されますので、その中から「cifs」と「Microsoft Virtual System Migration Service」の2つのサービスをCtrlキーを押しながら選択して、「OK」ボタンをクリックして追加します。
サーバーのプロパティダイアログに戻り「OK」ボタンをクリックして完了します。
同様に、もう一方のサーバーのプロパティダイアログからも、「cifs」と「Microsoft Virtual System Migration Service」の2つのサービスを追加しておきます。Live Migrationを実行しようとしている2つのサーバーが、お互いに相手となるサーバーを「cifs」と「Microsoft Virtual System Migration Service」サービスに関してKerberosを使用して信頼して委任するという設定です。
この設定の後、あらためてLive Migrationを実行してみると、無事完了することができました。
また、この委任の設定ですが、委任設定を行っても、同様のアクセス権エラーが発生した場合は、委任設定の反映に時間がかかる場合があるようです。その場合、しばらく時間を置き、再度Live Migrationを実行する事をおすすめいたします。
GMO最新ネット業界レポートらしく、WMIを使ったLive Migrationのサンプルコードもご紹介いたします。
Imports System.Management
Module GMOReport
Sub Main()
Dim strUser As String = ""
Dim strPass As String = ""
Dim objManagementScope As ManagementScope = ConnectManagementScope("win2012.local", strUser, strPass)
objManagementScope.Connect()
Dim strVMName As String = "VM001"
Call MigratVM(objManagementScope, strVMName, "Dist_WinSvr2012R2", "D:\Hyper-V\VM01")
End Sub
Function ConnectManagementScope(ByVal strServer As String, ByVal strAccount As String, ByVal strPassword As String) As ManagementScope
Dim objConnectionOptions As New ConnectionOptions()
objConnectionOptions.Impersonation = ImpersonationLevel.Impersonate 'WMI への接続に使用される偽装レベルを設定
objConnectionOptions.EnablePrivileges = True 'WNI経由の操作のためにユーザー特権を有効にする
objConnectionOptions.Username = strAccount
objConnectionOptions.Password = strPassword
Dim objManagementScope As New ManagementScope("\\" + strServer + "\root\virtualization\v2", objConnectionOptions)
objManagementScope.Connect()
Return (objManagementScope)
End Function
Function MigratVM(ByVal objManagementScope As ManagementScope, strVMName As String, strDestinationHost As String, ByVal strRootPath As String) As Boolean
Dim objComputerSystem As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery( "SELECT * FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'" )).Get
objComputerSystem = objManagementObject
Next
Dim objVirtualSystemsettingData As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In objComputerSystem.GetRelated("Msvm_VirtualSystemSettingData")
If String .Compare(objManagementObject( "ElementName").ToString, strVMName, True ) = 0 Then
objVirtualSystemsettingData = objManagementObject
If Not strRootPath = "" Then
objVirtualSystemsettingData("ConfigurationDataRoot") = strRootPath
objVirtualSystemsettingData("SnapshotDataRoot") = strRootPath
objVirtualSystemsettingData("SwapFileDataRoot") = strRootPath
End If
End If
Next
Dim objVirtualSystemMigrationSettingData As New ManagementClass(objManagementScope, New ManagementPath("Msvm_VirtualSystemMigrationSettingData"), Nothing)
Dim objVirtualSystemMigrationSettingDataInstance As ManagementObject = objEthernetPortAllocationSettingData.CreateInstance
objVirtualSystemMigrationSettingDataInstance("MigrationType") = 32771 'VirtualSystem:32768 Storage:32769 Staged:32770 VirtualSystemAndStorage:32771
objVirtualSystemMigrationSettingDataInstance("TransportType") = 5 'TransportType.Tcp
objVirtualSystemMigrationSettingDataInstance("EnableCompression") = True
Dim i As Integer = 0
Dim objHardDisk As ManagementObject = Nothing
Dim strStorageAllocationSettingData() As String
For Each objManagementObject As ManagementObject = In objVirtualSystemsettingData.GetRelated("Msvm_StorageAllocationSettingData")
If objManagementObject("ResourceSubType") = "Microsoft:Hyper-V:Virtual Hard Disk" Then
objHardDisk = objManagementObject
If Not strRootPath = "" Then
Dim strVhdPath As String = objHardDisk("HostResource")(0)
objHardDisk("HostResource") = New String() {strRootPath & "\" & System.IO.Path.GetFileName(strVhdPath)}
End If
ReDim Preserve strStorageAllocationSettingData(i)
strStorageAllocationSettingData(i) = objHardDisk.GetText(TextFormat.CimDtd20)
i += 1
End If
Next
For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemMigrationService")).Get
Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("MigrateVirtualSystemToHost")
objParams("ComputerSystem") = objComputerSystem.Path.Path
objParams("DestinationHost") = strDestinationHost
objParams("MigrationSettingData") = objVirtualSystemMigrationSettingDataInstance.GetText(TextFormat.CimDtd20)
objParams("NewSystemSettingData") = objVirtualSystemsettingData.GetText(TextFormat.CimDtd20)
objParams("NewResourceSettingData") = strStorageAllocationSettingData
Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("MigrateVirtualSystemToHost", objParams, Nothing)
Return JobComplete(objManagementBaseObject, objManagementScope)
Next
End Function
Function JobComplete(ByVal objManagementBaseObject As ManagementBaseObject, ByVal objManagementScope As ManagementScope) As Boolean
'JobState New = 2 Starting = 3 Running = 4 Suspended = 5 ShuttingDown = 6 Completed = 7 Terminated = 8 Killed = 9 Exception = 10 Service = 11
If objManagementBaseObject("ReturnValue") <> 0 Then
Dim strJobPath As String= objManagementBaseObject("Job")
Dim objJob As New ManagementObject(objManagementScope, New ManagementPath(strJobPath), Nothing)
objJob.Get())
Do While objJob("JobState") = 3 Or objJob("JobState") = 4
System.Threading.Thread.Sleep(1000)
objJob.Get()
Loop
If objJob("JobState") <> 7 Then
Console.WriteLine("ErrorCode="& objJob("ErrorCode") & " JobState=" & objJob("JobState"))
Return False
Else
Return True
End If
Else
Return True
End If
End Function
End Module
今回はPowerShellのコードもご紹介いたします。
自分自身から他のサーバーへのLive Migrationは、
Move-VM -Name "VM001" -DestinationHost "Dist_WinSvr2012R2" -IncludeStorage -DestinationStoragePath "D:\Hyper-V\VM001"
(参考)外部からサーバー間のLive Migrationを実行するには
$AdminPassword = ConvertTo-SecureString "password" - AsPlainText - Force
$RremotingCreds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "DOMAIN\Administrator", $AdminPassword
$Session = New-PSSession -Authentication Credssp -Credential $remotingCreds -ComputerName " WinSvr2012R2"
Invoke-Command -Session $Session -ScriptBlock {Move-VM -Name "VM001" -DestinationHost "Dist_ WinSvr2012R2" -IncludeStorage -DestinationStoragePath "D:\hyper-V\VM001"}
以上、今回は委任設定が必要なLive Migrationをご紹介いたしました。
といったサンプルコードです。
サンプルコードをこちらからダウンロードいただけます。
→ SampleCode.zip(27KB)
*本文中に記載されている会社名および商品名・サービス名は、各社の商標 または登録商標です。
著書の紹介欄
Hyper-Vで本格的なサーバー仮想環境を構築。仮想環境を設定・操作できる!
できるPRO Windows Server 2016 Hyper-V
◇Hyper-Vのさまざまな機能がわかる ◇インストールからの操作手順を解説 ◇チェックポイントやレプリカも活用できる Windows Server 2016 Hyper-Vは、仮想化ソフトウェア基盤を提供する機能であり、クラウドの実現に不可欠のものです。 本書では、仮想化の基礎知識から、Hyper-Vでの仮想マシンや仮想スイッチの設定・操作、プライベートクラウドの構築、Azureとの連携などを解説します。
初めてのWindows Azure Pack本が発売
Windows Azure Pack プライベートクラウド構築ガイド
本書は、Windows Azure PackとHyper-Vを利用し、企業内IaaS(仮想マシン提供サービス)を構成するための、IT管理者に向けた手引書です。試用したサーバーは、最小限度の物理サーバーと仮想マシンで構成しています。Windows Azure Packに必要なコンポーネントのダウンロード、実際にプライベートクラウド構築する過程を、手順を追って解説しています。これからプライベートクラウドの構築を検討するうえで、作業負担の軽減に役立つ一冊です。
ブログの著者欄
採用情報
関連記事
KEYWORD
CATEGORY
-
技術情報(418)
-
イベント(155)
-
カルチャー(35)
-
デザイン(16)
TAG
- 5G
- Adam byGMO
- AI
- AWX
- BIT VALLEY
- blockchain
- ChatGPT
- cloudnative
- CloudStack
- CM
- CNDO
- CNDT
- CODEGYM Academy
- ConoHa
- CS
- CSS
- CTF
- DC
- Designship
- DevSecOpsThon
- Docker
- DTF
- GitLab
- GMO Developers Day
- GMO Developers Night
- GMO GPUクラウド
- GMO Hacking Night
- GMO kitaQ
- GMO SONIC
- GMOアドパートナーズ
- GMOアドマーケティング
- GMOイエラエ
- GMOグローバルサイン
- GMOデジキッズ
- GMOペイメントゲートウェイ
- GMOペパボ
- GMOリサーチ
- Go
- GTB
- Hardning
- Harvester
- HCI
- iOS
- IoT
- ISUCON
- JapanDrone
- Java
- JJUG
- K8s
- Kids VALLEY
- LLM
- MetaMask
- MySQL
- NFT
- NVIDIA
- OpenStack
- Perl
- PHP
- PHPcon
- PHPerKaigi
- QUIC
- Rancher
- RPA
- Ruby
- Selenium
- splunk
- SRE
- SSL
- Terraform
- TLS
- TypeScript
- UI/UX
- VLAN
- VS Code
- インターンシップ
- オブジェクト指向
- オンボーディング
- お名前.com
- カルチャー
- コンテナ
- スクラム
- スペシャリスト
- ソフトウェアテスト
- チームビルディング
- ドローン
- ネットワーク
- プログラミング教育
- ブロックチェーン
- ゆめみらいワーク
- リモートワーク
- 基礎
- 多拠点開発
- 大学授業
- 宮崎オフィス
- 応用
- 技育プロジェクト
- 新卒
- 暗号
- 機械学習
- 決済
PICKUP