April 27, 2016

VMForkをmobから実行する

現状ではPowerCLI Extensionを使わないとVMForkは実行できませんが、PowerCLIを使って実行できるということはAPIがあるということです。

mobを探検したところ、VMFork関連のAPIが見つかり、実行方法もわかったので書いておきます。

この記事の内容はVMware非公式で、私を含め、誰もサポートしていません。試すときは自己責任でお願いします。

VMFork関連の非公開のAPI

VirtualMachineに下記のメソッドがあります。

  • CreateForkChild_Task
  • EnableForkParent_Task
  • DisableForkParent_Task
  • RetrieveForkChildren_Task
  • RetrieveForkParent_Task

また、プロパティにはconfig.forkconfiginforuntime.quiescedforkparentがあります。

これらは、mobでVMを開き、ページのソースを見ると見つかります。

今回はVMForkするところまでなので、EnableForkParent_TaskCreateForkChild_Taskを使います。

mobからVMForkを実行する方法

1. mobを開く

https://<vcenter_ip_or_hostname>/mob/

2. 親VMのページを開く

rootFolderからたどるなり、searchIndexを使うなりして、親にするVMを開きます。URLは下記のようになっているはずです。

https://<vcenter_ip_or_hostname>/mob/?moid=vm-111

3. EnableForkParent_Taskを実行する

標準で実行できるメソッドであれば、ページ下方にリンクがありますが、非公開APIの場合、リンクはありません。

そこで、下記のようにURLに直接入れます。

https://<vcenter_ip_or_hostname>/mob/?moid=vm-111&method=enableForkParent

開けばわかりますが、パラメータはありませんので、Invoke Methodをクリックするだけです。

4. 親VMをquiesced状態にする

これは親VM内から実行する必要があります。

親VMにコンソールやSSHで入るなりして、下記のコマンドを実行します。

vmtoolsd --cmd 'vmfork-begin -1 -1'

自動でやる場合には、APIのGuestOperationsManagerのProcessManagerを使えば良いと思います。

PowerCLIのEnable-InstantCloneVMではここまでの操作と一緒に、PreQuiesceScriptとPostCloneScriptのアップロードを行っています。

PowerCLIを使わない場合、PreQuiesceScriptとPostCloneScriptのアップロードはやはりGuestOperationsManagerを使うことになります。

子VMがForkされたときにPostCloneScriptが自動で実行されているようなので、CustomizationSpec辺りを使っているのかなと思っていますが、CustomizationGuiRunOnceはWindowsでしか使えなかった気がしていたり、vCloud Directorではstart up scriptをLinuxでも登録できたような気がしていたりして、どうやるのかはっきりとはわかっていません。

PreQuiesceScriptとPostCloneScriptの実行もGuestOperationsManagerでやってるみたいです。下記のような雰囲気です。

$prescript_path;vmtoolsd --cmd 'vmfork-begin -1 -1';$postscript_path

5. VMForkする

APIとしてはCreateForkChild_Taskです。PowerCLIのNew-InstantCloneVMにあたります。

URLは下記の通りです。

https://<vcenter_ip_or_hostname>/mob/?moid=vm-111&method=createForkChild

パラメータはnamespecがあるので、nameに子VMの名前を入れ、specにはVirtualMachineCreateChildSpecを入れます。

VirtualMachineCreateChildSpecはググったらConverterのSDKのドキュメントに載っているものと同じだったのでそれを参考にします。

最小のspecは下記の通りで、これを入れてInvoke Methodします。

<spec>
    <persistent>false</persistent>
</spec>

そうすると一瞬で子VMができると思います。

ここまでわかるとgovmomiなどに機能追加できそうなので、時間があったら追加して試してみたいです。

参考

© Yuya Kusakabe 2011-2022

Powered by Hugo & Kiss.