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