ovftoolを使って仮想マシンの移行した

# 最初に
2022年2月末とあるお客様のサーバー・ストレージ更改案件にて仮想マシンの移行を終えました。いくつかハマってしまった箇所がありましたので備忘録として書き残しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526900/db12ecda-491a-706e-5973-2fa9d8c7cdb1.png)
【移行元】vSphere 5.5　→　【移行先】vSphere 7.0　
【移行対象】Windows 2008 R2 / Windows 2012 R2
【使用したovftoolのバージョン】4.4.0(VMware-ovftool-4.4.0-15722219-win.x86_64.msi)
【ovftoolを実行したOS】Windows 2019 
# ovftoolとは？
VMware社からCLIで仮想マシンをOVFファイルへエクスポート・インポートするツールが提供されており、それが[**ovftool**](https://developer.vmware.com/ja_JP/tool/ovf/4.1.0)です。
また、[OVF (Open Virtualization Format)](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E4%BB%AE%E6%83%B3%E5%8C%96%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88)とは仮想マシンをファイルとして記述する標準フォーマットです。
今回、ovftoolを使って仮想マシンの移行を行いハマった箇所を含め書き残します。
本文ではovftoolのインストール方法については他にも多数紹介されているので割愛します。
# なぜovftoolを使うのか？
同僚とは「仮想マシンの移行はGUIでポチポチと実行すればいいんじゃない。」と話していましたが、今回の移行環境は以下の訳がありGUIを避けてCLIで行いました。
- 移行元vSphereのバージョンが古くvSphere Client(Windows版、Web版)が使用できない。
　・移行時間を要するので移行作業はサーバー機にて実行しようとするがWindowsクライアントのインストールすらできない。
　　※用意したインストラー(VMware-viclient-all-5.5.0-1281650.exe)は途中で異常終了してしまう。
　・Webクライアントは[Flash](https://ja.wikipedia.org/wiki/Adobe_Flash)で開発されており、作業時点(2022年2月)ではもうGUI画面を見ることができない。
- 他の先駆者方々が報告しているブラウザの相性による障害を避けたい。
- 万一の障害時に備えてベンダーサポートを行けられる恩恵(安心？)を受けたかった。

ということで、ovftoolの検証を始め実行に至りました。

:::note info
**教訓メモ**
ovftoolを実行するマシンはCPU,メモリのリソースは必要としませんが、ディスクI/Oやネットワークの優れたマシンにて実行するのが時間短縮の効果が得られます。
:::

# ovftoolを使って仮想マシンのエクスポート
ovftoolをインストールした本番機へサインインしてコマンドプロンプトを起動します。
パスを設定するなりディレクトリを移るなりovftoolが実行できる場所へ移動します。
※デフォルトのインストール先はC:\Program Files\VMware\VMware OVF Toolとなります。
実行したコマンドの書式は以下の通りです。GUIに無くてCLIにある機能としてログ出力(--X:logFile、--X:logLevelオプション)とイメージを含めない(--noImageFilesオプション)が指定できます。
【書式】
ovftool --X:logFile=”ログファイル名” --X:logLevel=”ログレベル” --noImageFiles vi://"移行元ユーザー名":"移行元ユーザーパスワード”@”移行元ESXi IPアドレス”/”仮想マシン名” ”保存先フォルダパス”　
【実行例】
```
C:\Program Files\VMware\VMware OVF Tool>ovftool --X:logFile=ovftool.log --X:logLevel=verbose --noImageFiles vi://root:*****@x.x.x.x/ServerName D:\ovf
Opening VI source: vi://root@x.x.x.x:443/ServerName
Opening VI source: vi://root@x.x.x.x:443/ServerName
Opening OVF target: D:\ovf
Writing OVF package: D:\ovf\ServerName\ServerName.ovf
Transfer Completed
Completed successfully
```
Completed successfullyと表示されたらエクスポート成功です。

最初にハマった箇所です。検証機(ノートPC)では発生せず、本番機(サーバー機)ならではのエラーが発生しました。
ovftoolコマンドを実行後、以下のエラーが出力されて本番機で実行ができない。
サポートからOSの再インストールを提案されましたが半日粘って原因を追及しました。
**NICチーミング**が原因でした。解除したらエラーは出力されなくなります。

:::note alert
**どっ！ハマり**
ovftoolを実行するマシンが**NIC チーミング**している場合は**必ず解除**してください！
:::

以下のメッセージが出力されovftoolが実行できません。
```
C:\Program Files\VMware\VMware OVF Tool>ovftool --X:logFile=ovftool.log --X:logLevel=verbose --noImageFiles vi://root:*****@x.x.x.x/ServerName D:\ovf
Opening VI source: vi://root@x.x.x.x:443/ServerName
Opening VI source: vi://root@x.x.x.x:443/ServerName

Microsoft (R) Windows Debugger Version 10.0.17763.168 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.
*** wait with pending attach
Unable to add extension DLL: ntsdexts
Unable to add extension DLL: uext
Unable to add extension DLL: exts
The call to LoadLibrary(ext) failed, Win32 error 0n2
"指定されたファイルが見つかりません。"
Please check your debugger configuration and/or network access.
《中略》
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Windows\SYSTEM32\ntdll.dll -
ntdll!DbgBreakPoint:
00007ffe`39ce3400 cc              int     3
0:025> cdb: Reading initial command '.dump /ma C:\Program Files\VMware\VMware OVF Tool\Ovftool-20220131-120449-1648-5020.dmp;q'
Creating C:\Program Files\VMware\VMware OVF Tool\Ovftool-20220131-120449-1648-5020.dmp - mini user dump
Dump successfully written
quit:

Terminate process signal received - aborting operation
```
:::note warn
**ハマった**
ovftool出力先保管先フォルダの容量に注意してください！
作成される保管先フォルダは**移行元仮想マシン容量と同じぐらい確保**しておきましょう！
実際に作成されるovfファイル容量は小さくても途中で書き込みが止まってしまいます。
:::

保管先の容量が不足していると以下のメッセージが出力されて失敗します。
```
C:\Program Files\VMware\VMware OVF Tool>ovftool --X:logFile=ovftool.log --X:logLevel=verbose --noImageFiles vi://root:*****@x.x.x.x/ServerName D:\ovf
Opening VI source: vi://root@x.x.x.x/ServerName
Opening VI source: vi://root@x.x.x.x/ServerName
Opening OVF target: D:\ovf
Writing OVF package: D:\ovf\ServerName\ServerName.ovf
Disk progress: 57%
Removing temporary objects and files
Transfer Failed
Error: Execution aborted
Deleting directory tree below: D:\ovf\ServerName
Completed with errors
```
:::note info
**教訓メモ**
-X:logFileオプションで指定したovftool.logは、デフォルトではC:\Program Files\VMware\VMware OVF Tool\直下に保存されます。
:::

ログレベルをverboseに指定してovftoolを実行した場合、10分ごとにセッションが有効であるログが出力されます。
```ovftool.log
2022-02-19T06:01:20.090+09:00 verbose OVFTool[08176] [Originator@6876 sub=Default] Keeping VI session alive
2022-02-19T06:01:20.215+09:00 verbose OVFTool[08148] [Originator@6876 sub=Default] Keeping VI session alive
2022-02-19T06:01:20.527+09:00 verbose OVFTool[03948] [Originator@6876 sub=Default] Keeping VI session alive
2022-02-19T06:11:20.104+09:00 verbose OVFTool[08148] [Originator@6876 sub=Default] Keeping VI session alive
2022-02-19T06:11:20.229+09:00 verbose OVFTool[08176] [Originator@6876 sub=Default] Keeping VI session alive
2022-02-19T06:11:20.541+09:00 verbose OVFTool[08148] [Originator@6876 sub=Default] Keeping VI session alive
2022-02-19T06:21:20.103+09:00 verbose OVFTool[07992] [Originator@6876 sub=Default] Keeping VI session alive
2022-02-19T06:21:20.228+09:00 verbose OVFTool[07132] [Originator@6876 sub=Default] Keeping VI session alive
2022-02-19T06:21:20.541+09:00 verbose OVFTool[05292] [Originator@6876 sub=Default] Keeping VI session alive
2022-02-19T06:31:20.117+09:00 verbose OVFTool[07992] [Originator@6876 sub=Default] Keeping VI session alive
2022-02-19T06:31:20.242+09:00 verbose OVFTool[05292] [Originator@6876 sub=Default] Keeping VI session alive
2022-02-19T06:31:20.554+09:00 verbose OVFTool[07108] [Originator@6876 sub=Default] Keeping VI session alive
```
# ovftoolを使って仮想マシンのインポート
同じくovftoolをインストールした本番機へサインインしてコマンドプロンプトを起動します。
パスを設定するなりディレクトリを移るなりovftoolが実行できる場所へ移動します。
インポートはGUI(vSphere Client)で実行することも可能ですが、ログ出力とリモートで実行する場合に操作回数を最小限に抑えたいと思いCLI(ovftool)で実行しました。
実行したコマンドの書式は以下の通りです。移行対象の仮想マシンにはNICが2個装着されているので--netオプションを指定しています。ここの"移行元ネットワーク名=移行先ネットワーク名"の指定記述で少し迷いました。
【書式】
ovftool --X:logFile=”ログファイル名” --X:logLevel=”ログレベル” -ds=”移行先データストア名” -dm="プロビジョニングタイプ" --net:"移行元ネットワーク名1=移行先ネットワーク名1" --net:"移行元ネットワーク名2=移行先ネットワーク名2" "保存先フォルダパス"　vi://"移行先ユーザー名":"移行先ユーザーパスワード”@”移行先ESXi IPアドレス”/
【実行例】　
```
C:\Program Files\VMware\VMware OVF Tool>ovftool --X:logFile=ovftool.log --X:logLevel=verbose -ds=NewDatastore -dm=thin --net:"User Network=VM Network" --net:"User Network2=User Network2" D:¥ovf¥ServerName.ovf vi://root:******@x.x.x.x/
Opening OVF source: D:¥ovf¥ServerName¥ServerName.ovf
Opening VI target: vi://root@x.x.x.x:443/
Deploying to VI: vi://root@x.x.x.x:443/
Transfer Completed
Completed successfully
```
Completed successfullyと表示されたらインポート成功です。

:::note info
**教訓メモ**
今回の仮想マシン移動対象はWindowsサーバーのみでしたが不確実な現象としてOSのライセンス情報が消失しているマシンがありました。移行前にOSのライセンス情報を用意しておくと慌てなくて良いです。
:::

# ovftoolを使って仮想マシンのエクスポート/インポート
これまで仮想マシンのエクスポートとインポートの方法を説明してきましたが、実は1回でエクスポート/インポートも可能です。
仮想マシンエクスポート時のディスク容量不足に対応する回避策として検証を行いました。
結果としてovftoolを実行しているマシンのディスクへの書き込みは行われませんでした。
しかし、失敗した場合は中間ファイルは残らないのでエクスポートからやり直しとなります。便利そうですが数時間も費やす作業では**失敗した場合の手戻り時間**の痛手が大きいので注意してください。

実行方法はovftoolをインストールした本番機へサインインしてコマンドプロンプトを起動します。
パスを設定するなりディレクトリを移るなりovftoolが実行できる場所へ移動します。
実行したコマンドの書式は以下の通りです。移行対象の仮想マシンにはNICが2個装着されているので--netオプションを指定しています。
【書式】
ovftool --X:logFile=”ログファイル名” --X:logLevel=”ログレベル” --noImageFiles -ds=”移行先データストア名” -dm="プロビジョニングタイプ" --net:"移行元ネットワーク名1=移行先ネットワーク名1" --net:"移行元ネットワーク名2=移行先ネットワーク名2" vi://"移行元ユーザー名":"移行元ユーザーパスワード”@”移行元ESXi IPアドレス”/”仮想マシン名”　　vi://"移行先ユーザー名":"移行先ユーザーパスワード”@”移行先ESXi IPアドレス”/
【実行例】　
```
C:\Program Files\VMware\VMware OVF Tool>ovftool --X:logFile=ovftool.log --X:logLevel=verbose --noImageFiles -ds=NewDatastore -dm=thin --net:"User Network=VM Network" --net:"User Network2=User Network2"　vi://root:******@x.x.x.x/ServerName vi://root:******@y.y.y.y/
Opening VI source: vi://root@******@x.x.x.x:443/ServerName
Opening VI source: vi://root@******@x.x.x.x:443/ServerName
Opening VI target: vi://root@y.y.y.y:443/
Deploying to VI: vi://root@y.y.y.y:443/
Transfer Completed
Completed successfully
```
Completed successfullyと表示されたらエクスポート/インポート成功です。
# 最後に
ログ出力できるのは失敗した場合の原因追及やコマンド実行中であるかを確認するのにとても役に立ちました。
ちょっと入力するコマンドが長くてドン引きされている方もいると思いますが、今回、CLI(ovftool)による仮想マシンの移動を実行して良かった点をまとめます。
- ログを取得することでovftoolコマンドの**詳細な状況を把握する**ことができた。
- 移行方法をGUI→CLIにすることで**移行手順書の作成およびレビュー時間が短縮**できた。
- 事前に確認済のコマンド文字列をメモ帳に貼り付けてコピー&ペーストにて**操作ミス**を防げた。

逆にCLIにして悪かった点は…
- 呪文のようなオプションが多いコマンドはスマホ世代のエンジニアには**取っ付き難い**ことでしょうか。

最後まで読んでいただいた方、有難うございました。お役に立てたら幸いです。

# 参考文献
■エクスポートおよびデプロイするためのサンプルの ovftool コマンド構文 (1038709)
https://kb.vmware.com/s/article/1038709?lang=ja
■OVF Toolを使って仮想マシンをエクスポート・インポートする
https://tech-mmmm.blogspot.com/2020/09/ovf-tool.html