Previously if you wanted to mount a disk image on the host from libguestfs, you had to use a separate program called guestmount.
A couple of months ago, we added FUSE support directly into the libguestfs API, and rewrote guestmount to use it. This also means you can use FUSE from your own libguestfs programs.
Yesterday I wrote a short example of using the mount-local API from C. This program creates a new disk image, formats it etc using libguestfs, then gives you a subshell so you can copy your own files, directories etc. in. When you quit the subshell, the disk image is synced and closed, and you end up with a virtual disk image containing all the files you just added. (Nothing that you couldn’t easily do before, but a nice little demonstration anyway).
Here it is in use:
$ gcc -Wall mount_local.c -o mount_local -lguestfs
$ ./mount_local /tmp/test.img
This is the 'mount-local' demonstration program. Follow the
instructions on screen.
Creating and formatting the disk image, please wait a moment ...
The _current directory_ is a FUSE filesystem backed by the disk
image which is managed by libguestfs. Any files or directories
you copy into here (up to 512 MB) will be saved into the disk
image. You can also delete files, create certain special files
and so on.
When you have finished adding files, hit ^D or exit to exit the
shell and return to the mount-local program.
mount-local-shell> ls
lost+found PUT_FILES_AND_DIRECTORIES_HERE
From the subshell, I copy in some files:
mount-local-shell> cp -a /usr/share/doc/libguestfs-devel-1.17.40/ .
mount-local-shell> ls
libguestfs-devel-1.17.40 lost+found PUT_FILES_AND_DIRECTORIES_HERE
mount-local-shell> ls libguestfs-devel-1.17.40/
AUTHORS example-ubuntu.xml
BUGS example-windows-2003-x64-cd.xml
ChangeLog example-windows-2003-x86-cd.xml
copy_over.c example-windows.xml
create_disk.c example-windows-xp-cd.xml
display_icon.c HACKING
example-debian-netinst-cd.xml inspect_vm.c
example-debian.xml README
example-fedora-dvd.xml RELEASE-NOTES
example-fedora-netinst-cd.xml ROADMAP
example-fedora.xml TODO
example-rhel-6-dvd.xml virt-dhcp-address.c
example-rhel-6-netinst-cd.xml virt-inspector.rng
example-ubuntu-live-cd.xml
After copying in my files, I exit from the subshell:
mount-local-shell> exit
Any files or directories that you copied in have been saved into
the disk image called '/tmp/test.img'.
Try opening the disk image with guestfish to see those files:
guestfish -a /tmp/test.img -m /dev/sda1
Here is the disk image that was created (note it is sparse, so it’s not really so large as it appears):
$ ll /tmp/test.img
-rw-r--r--. 1 rjones rjones 536870912 May 14 12:03 /tmp/test.img
$ du -sh /tmp/test.img
18M /tmp/test.img
We can use guestfish to look inside it:
$ guestfish -a /tmp/test.img -m /dev/sda1
Welcome to guestfish, the libguestfs filesystem interactive shell for
editing virtual machine filesystems.
Type: 'help' for help on commands
'man' to read the manual
'quit' to quit the shell
><fs> ll /
total 18
drwxr-xr-x 4 root root 1024 May 14 12:03 .
drwxr-xr-x 23 1000 1000 4096 May 14 12:18 ..
-rw-r--r-- 1 root root 0 May 14 12:03 PUT_FILES_AND_DIRECTORIES_HERE
drwxr-xr-x 2 root root 1024 May 14 08:37 libguestfs-devel-1.17.40
drwx------ 2 root root 12288 May 14 12:03 lost+found
Download the test program here: https://github.com/libguestfs/libguestfs/blob/master/examples/mount_local.c