libguestfsのperl binding Sys::Guestfs で仮想マシン image のデータにアクセスする

Sys::Guestfs はcpanにはないので、libguestfsのとこからとってくる or package からinstallする。ちなみに↑のURLのsynopsys は間違っている(古い内容?) なのでinstallした後のperldoc Sys::Guestfs を見たほうが良い。

install

rhel6系ならperl-Sys-Guestfs というpackageを入れる。

# yum install perl-Sys-Guestfs.x86_64

Sys::Guestfs を使う

guestfish と同じなので(当然だけど)、guestfishを使ったことがあれば大体わかる。

次の例は空の/tmp/hogehoge をtouchして、httpd自動起動にする(chkconfig)。

use Sys::Guestfs;
	
my $h = Sys::Guestfs->new();
$h->add_drive_opts ('guest.img', format => 'qcow2')
$h->launch();
$h->mount_options ('', '/dev/vda1', '/');
$h->touch('/tmp/hogehoge');
$h->command( [qw(chkconfig httpd on)] );
$h->sync();
$h->close();


ちなみにguestfish だと

# guestfish -a disk.img
> run
> list-filesystems
> mount /dev/vda1 /
> touch /tmp/hogehoge
> command "chkconfig httpd on"
> sync
> quit


追記

よく使いそうなメソッドとguestfish との対比

  • $h->add_drive_opts('guest.img', format => 'qcow2');

guestifsh コマンドそのものと同じで、disk imageを開く

# guestfish -a guest.img

  • $h->launch();

guestfish でimage を指定したあとのlaunch (run でもいい)

> launch
  • $h->list_filesystems();

list_filesystems を実行するとdevice とfile system typeを返す

> list_filesystems


$h->list_filesystems() はハッシュを返す。

my %fs = $h->list_filesystems();
for my $dev ( keys %fs ){
  print "$dev: $fs{$dev}\n";
}

このlist_filesystemの結果を使って、mountする。

  • $h->mount('/dev/sda1', '/');
> mount /dev/sda /

mount option 指定したい場合はmount_options で。

mount 後に実行

  • @listing = $h->ls ($directory);
> ls /path/to/directory

ファイル一覧を表示 (返す)

  • $content = $h->cat($path);
> cat /path/to/file

catは引数のファイルを表示する (返す)

  • $h->write($path, $content);
> write /path/to/file "content"

新規作成

  • $h->write_append($path, $content);
> write-append /path/to/file "content"

追加。ファイルがなければ新規作成

  • $output = $h->command (\@arguments); (@lines = $h->command_lines (\@arguments))
> command "command arg1 arg"

commandは実行結果をスカラーで、command_lines は配列で返す。

  • $h->sync();
> sync

変更内容をflushする。close する前にsync しなさいと書いている。(man guestfish, perldoc Sys::Guestfs)

  • $h->close();
> close

file handle 閉じる

sample