先日、お客様のところで10年近く使っているWindowsのPCを仮想化(P2V)したいというご相談をいただきました。
業務システム上の都合でリプレイスすることが難しいPCだったのですが、年季が入っていていつ壊れてもおかしくない状態でした。
しかし、これが壊れてしまうと業務に差し障ってしまいます。
そのため、PCをそのまま仮想化することになりました。
仮想化の流れと構成
物理マシンの仮想化は次のような流れで行います。
- 仮想ハードディスクを作成
- 仮想マシンを作成
- バックアップ
また、最終的な構成は下図のようになります。
今回仮想化する古い物理マシンはWindows10のPC(図のPC1)で、仮想環境として新しいWindows11のPC(図のPC2)にHyper-Vを構成しました。
Windowsライセンスについて
先にWindowsのライセンスについて触れておきます。
Windowsの物理マシンを仮想化すると、仮想マシンの方でWindowsライセンスの再認証が必要になる可能性があります。
Windowsはハードウェア構成の大幅な変更(マザーボード交換など)があると、ライセンス認証ができなくなることがあります。
今回の案件でも、仮想マシンに移行後、実際にWindowsライセンスの再認証が必要でした。
そのため、ライセンス再認証に備えて、事前にマイクロソフトアカウントに元の物理マシンを関連付けておくとスムーズに移行できます。
仮想ハードディスクを作成
Windowsの場合、物理マシンを仮想マシンに移行するためのツール「Disk2vhd」をMicrosoftが公開しています。
これを使って物理マシンからVHD(仮想ハードディスク)を作成することができます。
作成したVHDを仮想マシンのディスクとして読み込ませれば仮想化ができます。
Disk2vhdでVHD作成
作成されたVHDのファイル
仮想マシンを作成
Disk2vhdを使用してVHDを作成したら、それを扱う仮想マシンを用意します。
今回は新しい別のPC上に、Hyper-Vを使用した仮想環境を用意して仮想マシンを作成しました。
ちなみに、仮想環境は他にもVirtualBoxやCitrixなどがありますが、自分が試した限り、これらでは上手くいきませんでした。
仮想マシン作成時に、作成したVHDを指定
仮想マシンを作成、起動できたら、ライセンスの再認証など必要な作業を行います。
Windows自体もそうですが、その他サードパーティ製ソフトウェアもライセンス移行が必要だったりするので、事前に必要な情報などを整理しておくと吉です。
バックアップ
仮想マシンになったことで故障の心配はかなり少なくなりましたが、仮想環境を提供しているPC自体が故障する可能性もあります。
そうなっては元の木阿弥ですので、その対策を用意することにしました。
多くの仮想環境では、下図のように仮想マシンをそのままエクスポートして、別の物理マシン上の同じ仮想環境に乗り換える、ということができます。
Hyper-Vでもこれができるので、最初の図のように仮想マシンを定期的に外部ストレージなどにエクスポートしておくことで、万が一PCが故障しても別のPC上に復元することができます。
ただ、Hyper-V自体には仮想マシンのエクスポートをスケジュール実行するような機能はありません。
そこで、こちらのサイトで紹介されているスクリプトを参考に、PowerShellスクリプトを作成して、タスクスケジューラで定期的に実行することにしました。
スクリプト(backup.ps1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$TragetVM = "[仮想マシン名]" $ExportPath = "[最初にエクスポートする先のパス(ローカルディスク上の場所を指定)]" $DestinationFolder = "[最終的なデータ保存先のパス]" $CheckCode = 0 $ErrorActionPreference = "stop" echo "Start $TragetVM export" Try { Export-VM -Name $TragetVM -Path $ExportPath -ErrorVariable ExportError | Out-Null }Catch{ echo $ExportError | Out-File $ExportPath\ExportErrorCode-$TragetVM.txt $CheckCode = 1 } Out-Null if ( $CheckCode -eq 0 ) { echo "Moving export data..." $SourceFolder = "$ExportPath\$TragetVM" robocopy $SourceFolder $DestinationFolder\$TragetVM /e /move /is /it /r:0 /w:0 } else { exit } |
このスクリプトでは、「ExportPath」で指定したパスに仮想マシンをエクスポートした後、「DestinationFolder」で指定したパスにエクスポートしたデータを移動させています。
当初はPCに外付けHDDを接続して、そちらにエクスポートさせる予定でしたが、お客様の希望でファイルサーバにデータをエクスポートすることになりました。
しかし、仮想マシンのエクスポート先にネットワークフォルダを指定するにはAD(アクティブディレクトリ)環境が必要で、今回の環境では不可能でした。
そのため、一旦ローカルディスク上にデータをエクスポートしてから、ファイルサーバに移動させる方法を取りました。
あとはこのスクリプトを実行するための下記のようなバッチファイルを作成して、バッチファイルをタスクスケジューラで実行させればOKです。
なお、管理者権限が必要なので「最上位の特権」で実行させます。
また、バッチファイルは文字コードを「ANSI」もしくは「SJIS」にする必要があります。
バッチファイルの内容(backup.bat)
1 |
powershell -ExecutionPolicy RemoteSigned -File [スクリプトファイルのパス] |
これで万が一仮想環境を提供しているPCが故障しても、別のPCで仮想マシンを復元できる環境が整いました。
まとめ
今回古いWindowsPCを仮想化したことで、お客様からはひとつ心配事が減ったと喜んでいただけました。
故障対策というのが主な目的でしたが、古いだけに動作が遅かったのが仮想化したことで改善するという副作用もありました。
あらゆるケースで当てはまるとは思いませんが、何らかの事情でリプレイスが難しいPCなどは、仮想化するというのも考えてみても良いかもしれません。