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