virt-v2vでVDDKを有効にしてみた

投稿者: | 3月 18, 2024

このページは随時更新中。Oracle Linux 8.6でやるよりもRHEL9.3でやったほうが制限事項やバグが少なくスムーズ。

 

何気に手を動かして確認する人がいない。もうあまりにも動かす人がいないので、こっちは徹底的に手を動かして、さらにドキュメントをしっかり書いて追体験できるようにしているんだが、そうするともっと手を動かす人がいなくなる。悪循環。

今回のエントリは、完全に自己責任で。どこに書いてあったんですか?誰が言っていたんですか?これはサポートされていますか?という性格の人は、

そっとこのページから離れて他のページへ行ったほうがいい

かもしれない。それくらいどこにも書いていない情報が満載になってしまった。

 

閑話休題

 

諸事情で、VMwareの環境をさまざまなKVM環境に移行してみる必要があったのだが、ほとんどのやり方が。はっきり言って、16GBのHDDですら移行に1時間以上かかるのはザラ。どうやら10M程度しか速度がでていない。(調べてみたら1MB/sも出ていない)Linux VMではなく、Windows VMだとどれくらいかかるんだろうか?移行ができるのと使えるのは違う。というか、文章だけじゃ、どれくらいかかるかもわからない。

Redditでもこんな書き込みがある。

https://www.reddit.com/r/kvm/comments/plt4iz/virtv2v_vm_conversion_from_esx_67_to_olvm_43/

OpenShift Virtualizationの移行ツールでVDDKをイメージレジストリに格納して利用したら爆速になったのを思い出した。virt-v2vでもVDDKが使えるのではないかということで調べてみた。

 

よくよく考えるとvSphereからVMを取り出すという行為には、どうやら時間がかかる形式と時間がかからない形式の2つがある。

 

時間がかかる形式

  • vSphere ClientからVMをOVFエクスポート
  • virt-v2v(VDDKなし)の利用

これらを選択することは、現実的な利用の選択肢にならない。1VMだけというケースで、そこそこ時間がかかってもいいやということであればありだが。

 

時間がかからない形式

  • ovftoolを利用したコマンドラインでのOVAエクスポート
  • virt-v2v(VDDKあり)の利用

かかる時間が全然異なる。かなり高速。

 

存在を知っているか知らないか大きく作業時間が左右する。

 

ユーザが簡単に使える形式は、VMを取り出すのに時間がかかる。APIを使えるものは、有償の製品か使い方が難しいが、高速に取り出せる。大量VMや大きいサイズのWindows VMを取り出すには、ベンダーの有償の製品か、ちょっと苦労をしてでもVDDKなどのAPI利用をしないとやってられない。

 

vSphereからVMを取り出す場合のvirt-v2vの動き

以下の赤字がVDDKの有無で時間が変わる。

  • vSphere環境からVMのデータをNBDを利用してv2v用にエクスポート(VDDKが無いと時間がかかる)
  • 手元のKVMホストで起動して、v2v変換(手元のKVMのホストにリソースがいる)
  • ディスクのコピー(VDDKが無いと時間がかかる) 
  • 移行先に登録

 

OVAファイルを経由して、vSphereからVMを取り出す場合のvirt-v2vの動き

  • OVAファイルをv2v用にエクスポート
  • 手元のKVMホストで起動して、v2v変換(手元のKVMのホストにリソースがいる)
  • ディスクのコピー
  • 移行先に登録

 

このページでいいたいのは、どうやってVMwareのVMを高速にエクスポート、コピーをするのかが議論になってくる。 結論を先に書くが、

  • virt-v2vでv2vを使うなら、必ずVDDKを有効にしてから使う。
  • VDDKを有効にしていない、できないのであれば、ESXからSSH経由で取り出したほうがよっぽど速い。

 

VDDKを使わないツールでのvCenterからの移行は、時間泥棒、給与泥棒でしかない。特に大容量のWindows VMの移行でVDDKを使わなかった場合、自分がその職についているであろう時間には完了しないかもしれない。テクノロジーだけに頼らず、事前に見当をつけてから方法を選択をするのはとても重要。POCを人やベンダー任せにするとろくなことにならない。移行は一度始めたらやり切るしか無いので。

 

事前調査

実際のパラメータはここらへんを調べた。

移行できるハイパーバイザー、移行元OSとホストOSの組み合わせ

RHEL 7、RHEL 8、および RHEL 9 の virt-v2v を使用した他のハイパーバイザーから KVM への仮想マシンの変換

https://access.redhat.com/ja/articles/1379273

 

次の v2v 機能は Red Hat でサポートされていないため、v2v 変換に使用することはお勧めしません。

  • RHV への直接出力 (-o rhv-upload オプションを使用)
  • VMware Virtual Disk Development Kit (VDDK) を使用した仮想マシンの移行。

ただし、これらの機能は、インフラストラクチャー移行ソリューション を使用する場合にサポートされることに注意してください。

 

ということは、VDDKは、Migration Toolkit for Virtualization (VMwareからOpenShift Virtualizationに移行するToolkit)だけでサポートされているということになる。

 

一方、英語版ドキュメントである、以下を確認すると、英語版のほうが新しい。

Converting virtual machines from other hypervisors to KVM with virt-v2v in RHEL 7, RHEL 8, and RHEL 9

https://access.redhat.com/articles/1351473

一部、日本語版でサポートしていたOSがサポートされていなくなっているが、vSphere8もWindows Server 2022もサポート。よくみると英語版には、RHVへのインポートやVDDKをサポートしないとは書いてはいない。

 

以下も日本語版と英語版の両方を確認すべき。多分日本語版がRHEL7の記述で、英語版はRHEL9での記述。英語版には、VMware Toolsをアンインストールしてから変換という記述はない。

VMware vCenter 環境の Windows 仮想マシンを KVM 環境用に変換する

https://access.redhat.com/ja/articles/1457533

VMware vCenter 環境上の Linux 仮想マシンを KVM 環境用に変換する

https://access.redhat.com/ja/articles/1457493

 

どうやらRHELのバージョンによってかなり制限事項などが異なっている。RHEL9より、RHEL7のほうが制限がきつい。

 

移行元のVM

移行元仮想環境

  • vSphere 7U3で、vCenter+ESXiの構成。virt-v2vは、単体ESX環境ではVDDKを使えない。単体ESX環境から移行する場合は、virt-v2v経由でSSH経由でVMXファイルでアクセスする必要がある。

移行元VM

  • rhel8-testvmというVMを移行に利用。VMはシャットダウンしてある。
    • ディスクは16GB 1つで実際の消費量は、/ で 3.2GBを利用
  • シャットダウンされているVMの移行なので、VMのオプション ctkEnabled = TRUE は不要
    • 自分の知る限り、起動中に移行ができるのは、一部のバックアップソフトや各パブリッククラウドへの移行ツール、Nutanix Move、そして、Migration Toolkit for Virtualizationでしかできないと思う。
  • VMにISOイメージが登録してあっても無視してくれる。
  • VMにはある程度空き領域が必要
  • yum /dnf updateができる状態(RHELならば、RHELのサブスクリプションを登録)にしておくと、移行後の最初の起動でQemu Guest Agentをインストールしてくれる。

変換中のOS起動に注意

virt-v2vに限った話ではないが、ハイパーバイザーの大幅な変更がある場合、変換中にドライバの登録などで何度かVMが起動される。よって、動いてはまずいサービスやネットワークアクセスは、変換前に止めておくことも検討する。変換中に動いてしまって不具合が発生してしまったり、変換中の起動で時間がかかってしまうことがあるかもしれない。

virt-v2vを動かすKVMホスト

必要なファイル

  • RHEL93のISOファイル
    • rhel-9.3-x86_64-dvd.iso

必要な環境

  • RHELのサブスクリプション
  • インターネットへ接続できる環境

OSのインストール

  • RHEL9.3でVirtualization Hostを選択して構築。
  • KVMが動作できるようにしておく(CPUの仮想化有効にしておくこと)
  •  一時領域として、デフォルトで/vat/tmpが移行時の保存先に使われるの同時移行VM数程度の容量があったほうがいいかもしれない。
  • 1移行に対して、1CPUと512MB-1GBのRAMが必要

 

実際のパラメータはここらへんを調べた。

https://libguestfs.org/virt-v2v-input-vmware.1.html

https://libguestfs.org/nbdkit-vddk-plugin.1.html

 

インストール

dnf -y install virt-v2v libguestfs-winsupport virtio-win

バージョン情報

virt-v2v --version

virt-v2v 2.3.4rhel=9,release=5.el9

nbdkit --version

nbdkit 1.34.2 (nbdkit-1.34.2-1.el9)

VDDKは、VDDK8.0.2を利用

以下からVMware-vix-disklib-8.0.2-22388865.x86_64.tar.gzをダウンロードした。

https://developer.vmware.com/web/sdk/vddk/

 

VDDKのデフォルトパス確認

どうやら、このパスのしたの/lib64を見にいくらしい。ここのパス/lib64にVDDK 8.0.2を置いた。

nbdkit vddk --dump-plugin | grep ^vddk_default_libdir

vddk_default_libdir=/usr/lib64/vmware-vix-disklib

 
ls /usr/lib64/vmware-vix-disklib/lib64/

fips.so libdiskLibPlugin.so libssoclient.so libvapi-core.so libvddkVac2.so libvixDiskLib.so libvmomi.so

libcares.so libexpat.so libstdc++.so libvapi-core.so.2 libvddkVac2.so.8 libvixDiskLib.so.8 libz.so

libcares.so.2 libgcc_s.so libstdc++.so.6 libvapi-json.so libvddkVac2.so.8.0.2 libvixDiskLib.so.8.0.2 libz.so.1

libcrypto.so libgcc_s.so.1 libvapi-authn.so libvapi-json.so.2 libvddkVimAccess.so libvixMntapi.so

libcrypto.so.3 liblookup-types.so libvapi-authn.so.2 libvapi-std-bindings.so libvddkVimAccess.so.8 libvixMntapi.so.1

libcurl.so libssl.so libvapi-cis-bindings.so libvapi-std-bindings.so.2 libvddkVimAccess.so.8.0.2 libvixMntapi.so.1.1.0

libcurl.so.4 libssl.so.3 libvapi-cis-bindings.so.2 libvddk-api-bindings.so libvim-types.so libvmacore.so

 

KVMホストからvCenterに接続確認

vCenterに接続確認

virsh -c vpx://vsphere.local%5cadministrator@vc.example.internal/Datacenter/esxi01.example.internal?no_verify=1 list --all

Enter vsphere.local\administrator’s password for vc.example.internal:

 Id Name State

———————————–

 9274 Test-WinSQL1 running

 9275 Test-WinSQL running

 9276 Test-WinSQL2 running

 – Ent2-LnxNFS1 shut off

 – Test-WinNFS1 shut off

 – rhel7-testvm shut off

 

vCenterの情報取得

vCenterのURLと、移行するVMが載っているESXiサーバ名、それぞれのクレデンシャルが必要。

あと、thumbprintというのが必要になる。

移行ツールで

  • thumbprintの入力がない。
  • vddkのコピー先がない。(基本別途インストールが必要なため)

というツールは、VDDKを使っていない確率が大。

 

thumbprintの調べ方

ssh vc.example.internal
Command> shell

# echo | openssl s_client -connect localhost:443 2>/dev/null | openssl x509 -noout -fingerprint -sha1

SHA1 Fingerprint=82:1A:XX;XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX

上記の例だと82:1Aで始まるのがthumbprintとなる。

 

 

ローカルファイルとしてVDDKで抜いてみる

export LIBGUESTFS_BACKEND=direct
virt-v2v -ic 'vpx://vsphere.local%5cadministrator@vc.example.internal/Datacenter/esxi01.example.internal?no_verify=1' -it vddk -io vddk-libdir=/usr/lib64/vmware-vix-disklib/ -io vddk-thumbprint=82:1A:XX;XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX "rhel7-testvm" -v -o local -os /var/tmp

スパースファイルでRAWで抜けた様子

ls /var/tmp/rhel7-testvm*

/var/tmp/rhel7-testvm-sda /var/tmp/rhel7-testvm.xml

ls -lh /var/tmp/rhel7-testvm*

-rw-r–r–. 1 root root 16G Mar 13 16:26 /var/tmp/rhel7-testvm-sda

-rw-r–r–. 1 root root 1.5K Mar 13 16:26 /var/tmp/rhel7-testvm.xml

file /var/tmp/rhel7-testvm-sda

/var/tmp/rhel7-testvm-sda: DOS/MBR boot sector

 

KVMホスト(単体のもの)にインポートしてみる

export LIBGUESTFS_BACKEND=direct
virt-v2v -ic 'vpx://vsphere.local%5cadministrator@vc.example.internal/Datacenter/esxi01.example.internal?no_verify=1' -it vddk -io vddk-libdir=/usr/lib64/vmware-vix-disklib/ -io vddk-thumbprint=82:1A:XX;XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX "rhel7-testvm" -v

ネットワーク周りの再設定が必要だったが、インポートできて、起動もできた。

ちなみに、vmware toolsもアンインストールされている。

Storage Poolやネットワークを設定しておけば、パラメータで指定できるはず。。。

 

RHEV(Oracle Virtualization)にインポートしてみる

https://libguestfs.org/virt-v2v-output-rhv.1.html

RHEVのマネージメントコンソールからのインポートでは、VDDKを利用することができない。

https://access.redhat.com/solutions/5851871

設定が複雑で諦めた様子。

https://bugzilla.redhat.com/show_bug.cgi?id=1933656

RHEVのKVMホストでは、読み取り専用でしか、virshにアクセスできない。

https://access.redhat.com/ja/solutions/1555753

ここに移行するためのコマンドラインがあった。

https://www.vinchin.com/vm-migration/oracle-olvm-to-vmware-vice-versa.html

あと、ovirtsdk4がいるらしい。

subscription-manager repos --enable=rhel-9-for-x86_64-baseos-rpms --enable=rhel-9-for-x86_64-appstream-rpms --enable=rhv-4-tools-for-rhel-9-x86_64-rpms
dnf -y install python3-ovirt-engine-sdk4

 

export LIBGUESTFS_BACKEND=direct
scp root@olvm1.example.internal/:/etc/pki/ovirt-engine/ca.pem .
cat << EOF> /root/ovirt-admin-password
<Virtualization Applianceのadminのパスワード>
EOF
virt-v2v -ic 'vpx://vsphere.local%5cadministrator@vc.example.internal/Datacenter/esxi01.example.internal?no_verify=1' rhel7-testvm -it vddk -io vddk-libdir=/usr/lib64/vmware-vix-disklib/ -io vddk-thumbprint=82:1A:XX;XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX -v -o rhv-upload -oc https://olvm1.example.internal//ovirt-engine/api -os hosted_storage -op /root/ovirt-admin-password -oo rhv-cafile=ca.pem -oo rhv-cluster=Default -of raw -oo rhv-direct

“`

最初、立ち上げてみたが、コンソールが開けず、シャットダウンしてCirrusにして起動したら開くことができた。

結果は、VDDKを使ったvirt-v2vは、すべてのケースで使わない場合よりも爆速だった。(時間がかかるので、VDDKを使わないケースは調べていない。)

 

イベント画面

VDDKなし:約53分

VDDKあり:5分

なんと、シャー・アズナブルも驚く10倍も速い! Windows VMを移すことを考えたらVDDKを使わないとやってられない。

 

ということで、VDDKの効果がわかった。もう一度言うが、VDDKがなければはっきり言って使い物にならない。また、Linuxのディストリビューションではサポートされないこともある。

これ、しらなきゃ、大損レベルだなぁ。ほんとうに多くの方法は利用していないので。

まぁ、商用製品しかVDDKを使ってはいないのだろうなとちょっと思った。OpenShift Virtualizationの移行ツールでVDDKを使うのも初心者には難しいし。

 

さらに余談

以下試してみたが、16接続ではおきない。vSphere 8.0U2とVDDK 8.0.2の組み合わせだと設定もできない。

詳しくは、VDDK v8 のリリースノートを参照

https://vdc-repo.vmware.com/vmwb-repository/dcr-public/47f6919c-a87c-488b-8594-310ec497c8b1/31cc1678-bf87-4732-abe2-116f76b6a851/VDDK-802b-ReleaseNotes.html

もし、複数のVMを同時に移行したい場合(移行しているVMのディスク総数が10を超える場合)は、以下の設定をしておいたほうがいいかもしれない。NBD転送だとほんと同時10接続しか転送しない。

https://libguestfs.org/virt-v2v-input-vmware.1.html に書かれている/etc/vmware/hostd/config.xml を書き換える。

<nfcsvc>
 <path>libnfcsvc.so</path>
 <enabled>true</enabled>
 <maxMemory>50331648</maxMemory>
 <maxStreamMemory>10485760</maxStreamMemory>
 </nfcsvc>

すべてがアンドキュメンテッドだぁ。

 

いずれにせよ、

どこに書いてあったんですか?誰が言っていたんですか?これはサポートされていますか?という人には1ミリも役に立たないエントリとなってしまった。地球が仮に丸くても教科書に丸いと書いていないと地球は丸くない。

コメントを残す