guestmount is the libguestfs tool for taking a disk image and mounting it under the host filesystem. This works great for Linux disk images:
$ virt-builder centos-7.2 $ mkdir /tmp/mnt $ guestmount -a centos-7.2.img -i /tmp/mnt $ ls /tmp/mnt bin dev home lib64 media opt root sbin sys usr boot etc lib lost+found mnt proc run srv tmp var $ guestunmount /tmp/mnt
Those files under /tmp/mnt
are inside the centos-7.2.img
disk image file, and you can read and write them.
guestmount is fine for Windows disk images too, except when Windows has multiple drives, C:
, D:
, etc., because in that case you’ll only “see” the contents of the C:
drive.
But guestmount is nowadays just a wrapper around the “mount-local” API in libguestfs, and you can use that API directly if you want to do anything a bit more complicated … such as exposing Windows drive letters.
Here is a Perl script which uses the mount-local API directly to do this:
#!/usr/bin/perl -w use strict; use Sys::Guestfs; $| = 1; die "usage: $0 mountpoint disk.img" if @ARGV < 2; my $mp = shift @ARGV; my $g = new Sys::Guestfs; $g->add_drive_opts ($_) foreach @ARGV; $g->launch; my @roots = $g->inspect_os; die "$0: no operating system found" if @roots != 1; my $root = $roots[0]; die "$0: not Windows" if $g->inspect_get_type ($root) ne "windows"; my %map = $g->inspect_get_drive_mappings ($root); foreach (keys %map) { $g->mkmountpoint ("/$_"); eval { $g->mount ($map{$_}, "/$_") }; warn "$@ (ignored)\n" if $@; } $g->mount_local ($mp); print "filesystem mounted on $mp\n"; $g->mount_local_run; $g->shutdown;
You can use it like this:
$ mkdir /tmp/mnt $ ./drive-letters.pl /tmp/mnt windows7.img filesystem ready on /tmp/mnt
in another window:
$ cd /tmp/mnt $ ls C D $ cd C $ ls Documents and Settings PerfLogs ProgramData Program Files [etc] $ cd ../.. $ guestunmount /tmp/mnt
(Thanks to Pino Toscano for working out the details)