前回、govcを使ったフルクローンによるバックアップについて書きましたが、今回はgovcを使ってvmdkイメージの移行について試してみました。
構成
- vCenter 7.0 U3
- ESXi 7.0 Update 3
- Ubuntu 22.04 (バックアップVM)
- open-vm-tools 11.3.5
vmdkイメージのダウンロード
今回の操作は、govcを使って仮想マシンのvmdkイメージを手元にダウンロードして、vmdkイメージをアップロードして別のVMとして作成します。
ovfファイルとしてダウンロードする方法が一番シンプルですが、動作を確認するためにあえて回り道をしつつ見ていきます。
govcのインストールと環境変数は前回と同様です。
govcでvmdkイメージをダウンロードするには以下のように実行します。
$ govc datastore.download -host hostname -ds datastore "vm_name/vm_name-flat.vmdk" ./vm_name-flat.vmdk
ここでflat.vmdkファイルをしているのには理由があります。
データストアブラウザからだと、vmdkファイルしか見えませんが、ESXiにログインし、データストア内を見ると、flat.vmdkとvmdkファイルが存在することが分かります。
ls -lh -rw------- 1 root root 10.0G Jan 24 21:25 vm_name-flat.vmdk -rw------- 1 root root 527 Jan 24 21:27 vm_name.vmdk
xxx-flat.vmdkというファイルがダウンロードされますが、ファイルサイズがESXi内で見えるプロビジョニングサイズと同じサイズとなっていることが分かります。
flat.vmdkは、仮想マシンのデータ ディスクになります。実際のゲストOSのデータはこちらに格納されています。
vmdkは、ディスク記述子ファイルになります。関連するflat.vmdkに関する情報が記述されています。
VMDKフォーマットには複数の異なるサブフォーマットがあり、メタデータを外部記述子ファイルに保存するものと、メインデータとともに 1 つのファイルに埋め込むものがあります。
フラットイメージは事前にスペースを割り当てますが、スパースイメージは仮想マシンが書き込むにつれて増大するかたちになります。
次にgovcでflat.vmdkファイルをアップロードします。
$ govc import.vmdk -ds datastore -pool cluster-name/Resources ./vm_name-flat.vmdk new_vm_name govc: vmdk: invalid format (must be streamOptimized) The vmdk can be converted using one of: vmware-vdiskmanager -t 5 -r './vm_name-flat.vmdk' new.vmdk qemu-img convert -O vmdk -o subformat=streamOptimized './vm_name-flat.vmdk' new.vmdk
そうすると、streamOptimizedされたvmdkのフォーマットではないとアップロードできないと怒られます。
メッセージの通り、subformatにstreamOptimizedを指定してvmdkファイルを変換します。
$ qemu-img convert -O vmdk -o subformat=streamOptimized './vm_name-flat.vmdk' disk1.vmdk $ ls -lh -rw-r--r-- 1 user user 241M Jan 24 05:57 disk1.vmdk -rw-rw-r-- 1 user user 10G Jan 23 09:31 vm_name-flat.vmdk
vmdkファイルのサイズがもともとはプロビジョニングサイズと同じサイズでしたが、変換することで実用量のサイズに変換されました。
streamOptimizedについては、こちらに記載がありました。
govcを使って、変換したvmdkファイルをアップロードします。
govcの引数には、今後作成するVM名と同じデータストア内のフォルダ名を指定しておきます。
$ govc import.vmdk -ds datastore -pool cluster-name/Resources ./disk1.vmdk new_vm_name
アップロードしたvmdkファイルを指定して、VMを作成します。
$ govc vm.create -m 2048 -c 2 -g ubuntu64Guest -host hostname -ds datastore -net network -on=false -disk="new_vm_name/disk1.vmdk" new_vm_name
vmdkをダウンロードする際に、flat.vmdkのファイルサイズでダウンロードされるため、事前にファイルサイズを小さくするには、ovfとしてダウンロードするのが一番シンプルそうではあります。
手元にvmdkファイルがあり、それを利用したい場合は、今回の方法が利用できるかもしれません。