hidemium's blog

日々学んだことをアウトプットする。

govcを使ったvmdkイメージの移行

前回、govcを使ったフルクローンによるバックアップについて書きましたが、今回はgovcを使ってvmdkイメージの移行について試してみました。

hidemium.hatenablog.com

構成

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ファイルがあり、それを利用したい場合は、今回の方法が利用できるかもしれません。