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 ();