16.11. プログラミング言語からの API の使用
libguestfs API は、Red Hat Enterprise Linux 6.2 の次の言語から直接使用できます:C、C ++、Perl、Python、Java、Ruby、および OCaml。
- C バインディングおよび C++ バインディングをインストールするには、以下のコマンドを実行します。
yum install libguestfs-devel
# yum install libguestfs-devel
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Perl バインディングをインストールするには、以下のコマンドを実行します。
yum install 'perl(Sys::Guestfs)'
# yum install 'perl(Sys::Guestfs)'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Python バインディングをインストールするには、以下のコマンドを実行します。
yum install python-libguestfs
# yum install python-libguestfs
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Java バインディングをインストールするには、以下のコマンドを実行します。
yum install libguestfs-java libguestfs-java-devel libguestfs-javadoc
# yum install libguestfs-java libguestfs-java-devel libguestfs-javadoc
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Ruby バインディングをインストールするには、以下のコマンドを実行します。
yum install ruby-libguestfs
# yum install ruby-libguestfs
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - OCaml バインディングをインストールするには、以下のコマンドを実行します。
yum install ocaml-libguestfs ocaml-libguestfs-devel
# yum install ocaml-libguestfs ocaml-libguestfs-devel
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
各言語のバインディングは基本的に同じですが、構文が少し変更されています。C ステートメント:
guestfs_launch (g);
guestfs_launch (g);
Perl では、以下のように表示されます。
$g->launch ()
$g->launch ()
または、OCaml で以下のようになります。
g#launch ()
g#launch ()
本セクションでは、C の API のみを説明します。
C バインディングおよび C++ バインディングでは、エラーを手動で確認する必要があります。他のバインディングでは、エラーは例外に変換されます。以下の例で示している追加のエラーチェックは他の言語には必要ありませんが、逆に例外をキャッチするコードを追加することもできます。libguestfs API のアーキテクチャーに関する肝心な点については、以下の一覧を参照してください。
- libguestfs API は同期的です。各呼び出しは、完了するまでブロックされます。非同期で呼び出しを行う場合は、スレッドを作成する必要があります。
- libguestfs の API はスレッドセーフではありません。各ハンドルは、1 つのスレッドからのみ使用する必要があります。または、スレッド間でハンドルを共有する場合は、独自のミューテックスを実装して、2 つのスレッドが同時に 1 つのハンドルでコマンドを実行できないようにします。
- 同じディスクイメージで複数のハンドルを開くことはできません。すべてのハンドルが読み取り専用である場合は許容されますが、推奨されません。
- そのディスクイメージ (たとえば、ライブ仮想マシン) を使用するものがない場合は、書き込み用にディスクイメージを追加しないでください。これを行うと、ディスクが破損します。
- 現在使用中のディスクイメージ (ライブ VM など) で読み取り専用ハンドルを開くことができます。ただし、特にディスクイメージを読み取っているときに大量に書き込まれている場合は、結果が予測できないか、一貫性がない可能性があります。
16.11.1. C プログラムを介した API との相互作用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
C プログラムは、<guestfs.h> ヘッダーファイルをインクルードし、ハンドルを作成することから始める必要があります。
このプログラムをファイル (
test.c
) に保存します。このプログラムをコンパイルし、以下の 2 つのコマンドを実行します。
gcc -Wall test.c -o test -lguestfs ./test
gcc -Wall test.c -o test -lguestfs
./test
この段階では、出力はありません。このセクションの残りの部分では、このプログラムを拡張して新しいディスクイメージを作成し、パーティションを作成し、ext4 ファイルシステムでフォーマットして、ファイルシステムにいくつかのファイルを作成する方法を示す例を紹介します。ディスクイメージは
disk.img
と呼ばれ、現在のディレクトリーに作成されます。
このプログラムの概要は、以下のとおりです。
- ハンドルを作成します。
- ハンドルにディスクを追加します。
- libguestfs バックエンドを起動します。
- パーティション、ファイルシステム、およびファイルを作成します。
- ハンドルを閉じて、終了します。
変更したプログラムを以下に示します。
このプログラムをコンパイルして、以下の 2 つのコマンドを実行します。
gcc -Wall test.c -o test -lguestfs ./test
gcc -Wall test.c -o test -lguestfs
./test
プログラムが正常に完了すると、
disk.img
というディスクイメージが残ります。これは guestfish で調べることができます。
guestfish --ro -a disk.img -m /dev/sda1 ><fs> ll / ><fs> cat /foo/resolv.conf
guestfish --ro -a disk.img -m /dev/sda1
><fs> ll /
><fs> cat /foo/resolv.conf
デフォルトでは (C バインディングおよび C++ バインディングのみ)、libguestfs は stderr にエラーを出力します。この動作は、エラーハンドラーを設定することで変更できます。man ページの guestfs(3) では、これを詳細に説明しています。