From: Richard W.M. Jones Date: Wed, 15 Jul 2009 22:12:02 +0000 (+0100) Subject: New commands: 'mkmountpoint' and 'rmmountpoint' X-Git-Tag: 1.0.62~16 X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=commitdiff_plain;h=7428b0a70caed014d0cb4126fe8a77432d8957c6 New commands: 'mkmountpoint' and 'rmmountpoint' These specialized commands are used to create additional mountpoints before mounting filesystems. They are only used where you want to mount several unrelated or read-only filesystems together, and need additional care to use correctly. Here is how to use these calls to unpack the "Russian doll" nest of a Fedora 11 live CD: add-ro Fedora-11-i686-Live.iso run mkmountpoint /cd mkmountpoint /squash mkmountpoint /ext3 mount /dev/sda /cd mount-loop /cd/LiveOS/squashfs.img /squash mount-loop /squash/LiveOS/ext3fs.img /ext3 The inner filesystem is now unpacked under the /ext3 mountpoint. --- diff --git a/daemon/mount.c b/daemon/mount.c index 5bbbc67..20811f1 100644 --- a/daemon/mount.c +++ b/daemon/mount.c @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include "daemon.h" #include "actions.h" @@ -349,3 +351,52 @@ do_mount_loop (char *file, char *mountpoint) return 0; } + +/* Specialized calls mkmountpoint and rmmountpoint are really + * variations on mkdir and rmdir which do no checking and (in the + * mkmountpoint case) set the root_mounted flag. + */ +int +do_mkmountpoint (char *path) +{ + int r; + + /* NEED_ROOT (-1); - we don't want this test for this call. */ + ABS_PATH (path, -1); + + CHROOT_IN; + r = mkdir (path, 0777); + CHROOT_OUT; + + if (r == -1) { + reply_with_perror ("mkmountpoint: %s", path); + return -1; + } + + /* Set the flag so that filesystems can be mounted here, + * not just on /sysroot. + */ + root_mounted = 1; + + return 0; +} + +int +do_rmmountpoint (char *path) +{ + int r; + + NEED_ROOT (-1); + ABS_PATH (path, -1); + + CHROOT_IN; + r = rmdir (path); + CHROOT_OUT; + + if (r == -1) { + reply_with_perror ("rmmountpoint: %s", path); + return -1; + } + + return 0; +} diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR index c748b56..15c44e9 100644 --- a/src/MAX_PROC_NR +++ b/src/MAX_PROC_NR @@ -1 +1 @@ -147 +149 diff --git a/src/generator.ml b/src/generator.ml index 381e0ea..adcc4ba 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -2937,6 +2937,42 @@ This call is similar to C. That call returns a list of devices. This one returns a hash table (map) of device name to directory where the device is mounted."); + ("mkmountpoint", (RErr, [String "path"]), 148, [], + [], + "create a mountpoint", + "\ +C and C are +specialized calls that can be used to create extra mountpoints +before mounting the first filesystem. + +These calls are I necessary in some very limited circumstances, +mainly the case where you want to mount a mix of unrelated and/or +read-only filesystems together. + +For example, live CDs often contain a \"Russian doll\" nest of +filesystems, an ISO outer layer, with a squashfs image inside, with +an ext2/3 image inside that. You can unpack this as follows +in guestfish: + + add-ro Fedora-11-i686-Live.iso + run + mkmountpoint /cd + mkmountpoint /squash + mkmountpoint /ext3 + mount /dev/sda /cd + mount-loop /cd/LiveOS/squashfs.img /squash + mount-loop /squash/LiveOS/ext3fs.img /ext3 + +The inner filesystem is now unpacked under the /ext3 mountpoint."); + + ("rmmountpoint", (RErr, [String "path"]), 149, [], + [], + "remove a mountpoint", + "\ +This calls removes a mountpoint that was previously created +with C. See C +for full details."); + ] let all_functions = non_daemon_functions @ daemon_functions