2018年12月4日火曜日

VMDK ファイルを直接編集できる VDDK API を使ってみた

概要

VDDK (Virtual Disk Development Kit ) API は VMware さんが提供する VMDK を直接編集できる C のライブラリです
大きく 2 つの機能があります

  • The virtual disk library, a set of C function calls to manipulate VMDK files
  • The disk mount library, a set of C function calls to remote mount VMDK file systems

VMDK ファイルを操作する API と VMDK をマウントする API があります
今回はインストール方法と簡単な使い方を紹介します
先に紹介しておきますが参考サイトにある Programming Guide が一番参考になり本記事もそれを元に作成しています

環境

  • CentOS 7
  • VCSA 6.5.0 9451637
  • VDDK API 6.7.1

ライブラリダウンロード

MyVMware にログインしここからダウロードしましょう
vddk_api2.png

執筆時点では VMware-vix-disklib-6.7.1-10362358.x86_64.tar.gz というファイルがダウンロードできました
zip ファイルは Windows 用になっているので注意してください
解凍するとライブラリやドキュメントなどがあります

  • tar zvxf VMware-vix-disklib-6.7.1-10362358.x86_64.tar.gz
  • ls -1 vmware-vix-disklib-distrib/
bin64
doc
FILES
include
lib32
lib64

コンパイラインストール

  • apt -y install gcc-c++

とりあえずサンプルを動かしてみる

コンパイル

  • cd vmware-vix-disklib-distrib/doc/samples/diskLib
  • make

vix-disklib-samplevix-mntapi-sample というコマンドが作成されます
コマンドを実行するとオプションが表示されるので確認してみてください
ちなみに大本は vixDiskLibSample.cpp というコードになっているのでコマンドを動かしつつコードを確認すると実際にコーディングするときに役に立つと思います

ライブラリ配置

必要なライブラリを配置します

  • cd vmware-vix-disklib-distrib
  • mkdir /usr/lib/vmware-vix-disklib
  • cp -ipr lib64 /usr/lib/vmware-vix-disklib/
  • touch /etc/ld.so.conf.d/vmware-vix-disklib.conf
  • vim /etc/ld.so.conf.d/vmware-vix-disklib.conf
/usr/lib/vmware-vix-disklib/lib64
  • ldconfig

ディスクの情報を取得する

ではコマンドを実行してみましょう

  • ./vix-disklib-sample -create sample.vmdk
  • ./vix-disklib-sample -info sample.vmdk
Disk[0] "sample.vmdk" is opened using transport mode "file".
capacity          = 204800 sectors
number of links   = 1
adapter type      = BusLogic SCSI
BIOS geometry     = 0/0/0
physical geometry = 100/64/32
Transport modes supported by vixDiskLib: file:nbdssl:nbd
Disk[0] is closed.

こんな感じです

vCenter 配下のディスクの情報を取得する

-host, -user, -password, -vm を付与することで vCenter 配下に対して実行することができます
SSL 証明書がない (IP アドレス直の場合) は -thumb コマンドも付与しましょう

  • ./vix-disklib-sample -info -host 192.168.100.20 -user "administrator@vsphere.local" -password 'xxxxxxx' -vm "moref=vm-10" -thumb "96:09:d6:5b:e0:83:58:1b:ba:2b:cc:78:22:88:33:36:64:50:32:eb" "[datastore1] vm01/vm01.vmdk"

こんな感じです
vm-10 は vCenter から見たときの MoRef になります
ESXi から見た場合 vm- がなくかつ数字の部分も異なるので注意してください
vm-10 が持つ vmdk を指定しないとエラーになります

ESXi 配下のディスクの情報は取得できない?

vCenter 同様にやってみたのですが Error: [vixDiskLibSample.cpp:1564] 14 The command is not supported on remote objects となり取得できませんでした
やり方が悪いだけのような気もしますが、、

Tips: ハマりポイント

自分はコンパイル時に以下のエラーで半日くらいハマりました、、

vixDiskLibSample.cpp:(.text+0x564): undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream(std::_Ios_Openmode)'

原因は Ubuntu18 で作業していたためでした
Ubuntu16 でも同じエラーになったので素直に CentOS7 を使ってコンパイルするようにしてください

あと以下のエラーが出て ESXi に接続されているデータストア上にある vmdk の情報は取得できません

  • ./vix-disklib-sample -info -host 192.168.100.10 -user root -password secret "[datastore1] vm01/vm01.vmdk"
`Error: [vixDiskLibSample.cpp:1572]  3 One of the parameters was invalid`

公式のドキュメントに記載の通りに実行してコマンドがエラーになると本当に勘弁してほしいです、、
解決方法-vm moref=vm-10 のように MoRef オプションを付与することで解決できます

最後に

VDDK API を使ってみました
とりあえずサンプルの C++ コードをコンパイルして動かしてみました
が、一部ドキュメント通りに実行しても動作しなかったのはさすがに萎えました、、
VMware さんのプロダクトはドキュメントの質が悪いのが多くせっかくのプロダクトも残念な感じに思えてしまうものが多い気がします
自分の実力がないだけかもしれませんが、、

参考サイト

0 件のコメント:

コメントを投稿