guestfs-perl(3) Virtualization Support guestfs-perl(3)
NAME
guestfs-perl - How to use libguestfs from Perl
SYNOPSIS
use Sys::Guestfs;
my $h = Sys::Guestfs->new ();
$h->add_drive_opts ('guest.img', format => 'raw');
$h->launch ();
$h->mount_options ('', '/dev/sda1', '/');
$h->touch ('/hello');
$h->sync ();
DESCRIPTION
This manual page documents how to call libguestfs from the Perl programming language. This page just documents the differences from the C
API and gives some examples. If you are not familiar with using libguestfs, you also need to read guestfs(3). To read the full Perl API,
see Sys::Guestfs(3).
ERRORS
Errors from libguestfs functions turn into calls to "croak" (see Carp(3)).
EXAMPLE 1: CREATE A DISK IMAGE
#!/usr/bin/perl -w
# Example showing how to create a disk image.
use strict;
use Sys::Guestfs;
my $output = "disk.img";
my $g = new Sys::Guestfs ();
# Create a raw-format sparse disk image, 512 MB in size.
open FILE, ">$output" or die "$output: $!";
truncate FILE, 512 * 1024 * 1024 or die "$output: truncate: $!";
close FILE or die "$output: $!";
# Set the trace flag so that we can see each libguestfs call.
$g->set_trace (1);
# Set the autosync flag so that the disk will be synchronized
# automatically when the libguestfs handle is closed.
$g->set_autosync (1);
# Attach the disk image to libguestfs.
$g->add_drive_opts ($output, format => "raw", readonly => 0);
# Run the libguestfs back-end.
$g->launch ();
# Get the list of devices. Because we only added one drive
# above, we expect that this list should contain a single
# element.
my @devices = $g->list_devices ();
if (@devices != 1) {
die "error: expected a single device from list-devices";
}
# Partition the disk as one single MBR partition.
$g->part_disk ($devices[0], "mbr");
# Get the list of partitions. We expect a single element, which
# is the partition we have just created.
my @partitions = $g->list_partitions ();
if (@partitions != 1) {
die "error: expected a single partition from list-partitions";
}
# Create a filesystem on the partition.
$g->mkfs ("ext4", $partitions[0]);
# Now mount the filesystem so that we can add files.
$g->mount_options ("", $partitions[0], "/");
# Create some files and directories.
$g->touch ("/empty");
my $message = "Hello, world
";
$g->write ("/hello", $message);
$g->mkdir ("/foo");
# This one uploads the local file /etc/resolv.conf into
# the disk image.
$g->upload ("/etc/resolv.conf", "/foo/resolv.conf");
# Because 'autosync' was set (above) we can just exit here
# and the disk contents will be synchronized. You can also do
# this manually by calling $g->umount_all and $g->sync.
exit 0
EXAMPLE 2: INSPECT A VIRTUAL MACHINE DISK IMAGE
#!/usr/bin/perl -w
# Example showing how to inspect a virtual machine disk.
use strict;
use Sys::Guestfs;
if (@ARGV < 1) {
die "usage: inspect_vm disk.img"
}
my $disk = $ARGV[0];
my $g = new Sys::Guestfs ();
# Attach the disk image read-only to libguestfs.
# You could also add an optional format => ... argument here. This is
# advisable since automatic format detection is insecure.
$g->add_drive_opts ($disk, readonly => 1);
# Run the libguestfs back-end.
$g->launch ();
# Ask libguestfs to inspect for operating systems.
my @roots = $g->inspect_os ();
if (@roots == 0) {
die "inspect_vm: no operating systems found";
}
for my $root (@roots) {
printf "Root device: %s
", $root;
# Print basic information about the operating system.
printf " Product name: %s
", $g->inspect_get_product_name ($root);
printf " Version: %d.%d
",
$g->inspect_get_major_version ($root),
$g->inspect_get_minor_version ($root);
printf " Type: %s
", $g->inspect_get_type ($root);
printf " Distro: %s
", $g->inspect_get_distro ($root);
# Mount up the disks, like guestfish -i.
#
# Sort keys by length, shortest first, so that we end up
# mounting the filesystems in the correct order.
my %mps = $g->inspect_get_mountpoints ($root);
my @mps = sort { length $a <=> length $b } (keys %mps);
for my $mp (@mps) {
eval { $g->mount_ro ($mps{$mp}, $mp) };
if ($@) {
print "$@ (ignored)
"
}
}
# If /etc/issue.net file exists, print up to 3 lines.
my $filename = "/etc/issue.net";
if ($g->is_file ($filename)) {
printf "--- %s ---
", $filename;
my @lines = $g->head_n (3, $filename);
print "$_
" foreach @lines;
}
# Unmount everything.
$g->umount_all ()
}
SEE ALSO
Sys::Guestfs(3), guestfs(3), guestfs-examples(3), guestfs-erlang(3), guestfs-java(3), guestfs-ocaml(3), guestfs-python(3),
guestfs-recipes(1), guestfs-ruby(3), <http://libguestfs.org/>.
AUTHORS
Richard W.M. Jones ("rjones at redhat dot com")
COPYRIGHT
Copyright (C) 2011 Red Hat Inc. <http://libguestfs.org/>
The examples in this manual page may be freely copied, modified and distributed without any restrictions.
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
libguestfs-1.18.1 2013-12-07 guestfs-perl(3)