Maxim asks an interesting question which is if you’ve got a disk image, how do you mount every filesystem onto your host. Like this:
$ ./fs-mount.pl rhel-5.11.img /tmp/fs & $ cd /tmp/fs /tmp/fs$ ls dev /tmp/fs$ cd dev /tmp/fs/dev$ ls sda1 sda2 sda3 /tmp/fs/dev$ cd sda2 /tmp/fs/dev/sda2$ ls bin dev home lib64 media mnt proc sbin srv tmp var boot etc lib lost+found misc opt root selinux sys usr ... $ cd /tmp $ guestunmount /tmp/fs
The answer is this surprisingly short Perl script.
#!/usr/bin/perl
use warnings;
use strict;
use Sys::Guestfs;
die "usage: $0 disk1 [disk2 ...] mountpoint\n" if @ARGV <= 1;
my $mp = pop;
my $g = Sys::Guestfs->new ();
foreach (@ARGV) {
$g->add_drive ($_);
}
$g->launch ();
# Examine the filesystems.
my %fses = $g->list_filesystems ();
# Create the mountpoint directories (in the libguestfs namespace)
# and mount the filesystems on them.
foreach my $fs (sort keys %fses) {
# mkmountpoint is really the same as mkdir. Unfortunately there
# is no 'mkdir -p' equivalent, so we have to do this instead:
my @components = split ("/", $fs);
for (my $i = 1; $i < @components; ++$i) {
my $dir = "/" . join ("/", @components[1 .. $i]);
eval { $g->mkmountpoint ($dir) }
}
# Don't fail if the filesystem can't be mounted, eg. it's swap.
eval { $g->mount ($fs, $fs) }
}
# Export the filesystem on the host.
$g->mount_local ($mp);
$g->mount_local_run ();
# Close nicely since we mounted everything writable.
$g->shutdown ();
$g->close ();
