現状ではPowerCLI Extensionを使わないとVMForkは実行できませんが、PowerCLIを使って実行できるということはAPIがあるということです。
mobを探検したところ、VMFork関連のAPIが見つかり、実行方法もわかったので書いておきます。
この記事の内容はVMware非公式で、私を含め、誰もサポートしていません。試すときは自己責任でお願いします。
VMFork関連の非公開のAPI
VirtualMachineに下記のメソッドがあります。
- CreateForkChild_Task
- EnableForkParent_Task
- DisableForkParent_Task
- RetrieveForkChildren_Task
- RetrieveForkParent_Task
また、プロパティにはconfig.forkconfiginfo
やruntime.quiescedforkparent
があります。
これらは、mobでVMを開き、ページのソースを見ると見つかります。
今回はVMForkするところまでなので、EnableForkParent_Task
とCreateForkChild_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
パラメータはname
とspec
があるので、name
に子VMの名前を入れ、spec
にはVirtualMachineCreateChildSpecを入れます。
VirtualMachineCreateChildSpecはググったらConverterのSDKのドキュメントに載っているものと同じだったのでそれを参考にします。
最小のspec
は下記の通りで、これを入れてInvoke Method
します。
<spec>
<persistent>false</persistent>
</spec>
そうすると一瞬で子VMができると思います。
ここまでわかるとgovmomiなどに機能追加できそうなので、時間があったら追加して試してみたいです。
参考
- VMware Instant Clone is now at your fingertips with the updated PowerCLI Extensions fling!
- Instant Clone PowerCLI cmdlets Best Practices & Troubleshooting
- How to VMFork aka Instant Clone Nested ESXi?
- lamw/vmfork-community-customization-scripts
- vSphere Integrated Containers
- How to browse the internal vSphere APIs