]> Zhao Yanbai Git Server - minix.git/commitdiff
Add VBFS: VirtualBox Shared Folder File System
authorDavid van Moolenbroek <david@minix3.org>
Mon, 9 Apr 2012 17:56:45 +0000 (19:56 +0200)
committerDavid van Moolenbroek <david@minix3.org>
Tue, 10 Apr 2012 22:27:48 +0000 (00:27 +0200)
Refer to "man vbfs" on how to mount it.

commands/profile/sprofalyze.pl
etc/system.conf
man/man8/Makefile
man/man8/hgfs.8
man/man8/vbfs.8 [new file with mode: 0644]
servers/Makefile
servers/vbfs/Makefile [new file with mode: 0644]
servers/vbfs/vbfs.c [new file with mode: 0644]

index 711f0e5fa3519e66bb504d9739a22aa246f35830..72a0b1b3297b6f99812f6fb354874991124c86d5 100755 (executable)
@@ -36,6 +36,7 @@ servers/pm/pm
 servers/procfs/procfs
 servers/rs/rs
 servers/sched/sched
+servers/vbfs/vbfs
 servers/vfs/vfs
 servers/vm/vm
 servers/sched/sched
index d77112d4a895a0cb2502b8c9b1e6f697140d80ff..b34e6b4c63f187f31f43749c6888d9b1485ced12 100644 (file)
@@ -408,6 +408,13 @@ service hgfs
        ;
 };
 
+service vbfs
+{
+       ipc
+               SYSTEM pm vfs rs vm vbox
+       ;
+};
+
 service printer
 {
        io      378:4           # LPT1
index ccc8ca6ae96ac784bcfe6bce1f343ce9efcbfd3d..83dd1087a5e6fd081ddceea286e8b9316da0ec72 100644 (file)
@@ -9,7 +9,7 @@ MAN=    add_route.8 backup.8 badblocks.8 boot.8 btrace.8 \
        rdate.8 readclock.8 reboot.8 repartition.8 \
        rshd.8  screendump.8 serial-ip.8 service.8 \
        setup.8 shutdown.8 slip.8 srccrc.8 sync.8 syslogd.8 tcpd.8 \
-       unix.8 update.8 usage.8 
+       unix.8 update.8 usage.8 vbfs.8
 
 MLINKS += httpd.8 in.httpd.8
 
index 73d44da35d59b83fae6b273302b8830eb101900f..d5da3b11307c19da3efe0f9e9afaef8d918545d2 100644 (file)
@@ -1,6 +1,6 @@
 .TH HGFS 8
 .SH NAME
-hgfs \- Host/Guest File System server
+hgfs \- VMware Host/Guest File System server
 .SH SYNOPSIS
 \fBmount \-t hgfs \fR[\fB\-r\fR] [\fB\-o \fIoptions\fR] \fBnone \fImountpoint
 .SH DESCRIPTION
@@ -71,6 +71,7 @@ of HGFS is determined largely by the host. Other file system operations
 because the file system structure as perceived by HGFS may change arbitrarily
 at any time, due to modifications on the host side.
 .SH "SEE ALSO"
-.BR mount (1)
+.BR mount (1),
+.BR vbfs (8)
 .SH AUTHOR
 David van Moolenbroek <dcvmoole@cs.vu.nl>
diff --git a/man/man8/vbfs.8 b/man/man8/vbfs.8
new file mode 100644 (file)
index 0000000..3f74317
--- /dev/null
@@ -0,0 +1,70 @@
+.TH VBFS 8
+.SH NAME
+vbfs \- VirtualBox Shared Folder File System server
+.SH SYNOPSIS
+\fBmount \-t vbfs \fR[\fB\-r\fR] \fB\-o
+\fBshare=\fIsharename\fR[\fB,\fIoptions\fR] \fBnone \fImountpoint
+.SH DESCRIPTION
+The \fBvbfs\fR server allows one to mount a VirtualBox shared folder as a file
+system. This makes it possible to access selected portions of the VirtualBox
+host file system when MINIX is run as a VirtualBox guest.
+.PP
+The above mount command will mount the vbfs file system onto the directory
+\fImountpoint\fR. The \fB\-r\fR mount option makes the file system read-only;
+note that shared folders may independently have been configured as read-only
+on the VMware host. The \fIoptions\fR field is a string consisting of
+comma-delimited \fIkey\fR or \fIkey\fB=\fIvalue\fR options.
+The vbfs server can mount only one shared folder at a time, and therefore,
+specifying a \fBshare\fR name is required.
+The other options are optional. The following options are supported.
+.TP 4
+\fBshare=\fIname\fR
+This required option specifies the share name to mount. It is currently not
+possible to list the available share names from within MINIX3.
+.TP
+\fBprefix=\fIpath\fR
+This option sets a path prefix that will be prepended to all file system
+operations on the host system. The default is the empty path, exposing the
+entire share. Leading and trailing slashes are ignored.
+.TP
+\fBuid=\fInumber\fR
+This sets the user ID used for all the files and directories in the file
+system, allowing a non-root user to be the owner. The value must be specified
+as a decimal number.
+The default is root (the number \fB0\fR).
+.TP
+\fBgid=\fInumber\fR
+Likewise, sets the group ID for all files and directories.
+The default is operator (the number \fB0\fR).
+.TP
+\fBfmask=\fInumber\fR
+This option sets the file permission mask of regular files. It is specified as
+an octal number. For example, a value of \fB600\fR makes all files readable and
+writable by the owning user (see the "\fBuid\fR" option).
+The default is \fB755\fR.
+.TP
+\fBdmask=\fInumber\fR
+Likewise, sets the file permission mask of directories.
+The default is also \fB755\fR.
+.SH EXAMPLES
+.TP 20
+.B mount \-t vbfs -o share=myshare none /usr/myshare
+# Mount the "\fImyshare\fR" shared folder on \fI/usr/myshare\fR
+.TP 20
+.B mount \-t vbfs \-o share=shared,prefix=foo/bar,uid=20,fmask=644 none /mnt
+# Mount the "\fIfoo/bar\fR" subtree from the "\fIshared\fR" shared folder on
+\fI/mnt\fR
+.SH LIMITATIONS
+VBFS has been designed to provide a convenient means to exchange files between
+the guest and the host system, not as a complete file system implementation.
+As such, it comes with many limitations. Some of these are VBFS implementation
+shortcomings; some are the result of behavioral differences between the host
+file system and the guest's expectations; some are the result of a mismatch
+between MINIX's VFS/FS protocol and the requirements from VBFS; and finally,
+some are the result of the user's ability to change the file system on the
+host system at any time.
+.SH "SEE ALSO"
+.BR mount (1),
+.BR hgfs (8)
+.SH AUTHOR
+David van Moolenbroek <david@minix3.org>
index f5e7140e7e7d4776ce02639dba3b244f61296500..2590023e2669a3ad982163545329596e0176359f 100644 (file)
@@ -10,7 +10,7 @@ SUBDIR=       ds init mfs pfs pm rs sched vfs vm
 .else
 
 SUBDIR=        ds ext2 hgfs inet init ipc is iso9660fs \
-       mfs pfs pm procfs rs sched vfs vm devman
+       mfs pfs pm procfs rs sched vbfs vfs vm devman
 
 .endif
 
diff --git a/servers/vbfs/Makefile b/servers/vbfs/Makefile
new file mode 100644 (file)
index 0000000..fd4153f
--- /dev/null
@@ -0,0 +1,12 @@
+# Makefile for VirtualBox Shared Folders File System (VBFS) server
+PROG=  vbfs
+SRCS=  vbfs.c
+
+DPADD+=        ${LIBSFFS} ${LIBVBOXFS} ${LIBSYS}
+LDADD+=        -lsffs -lvboxfs -lsys
+
+MAN=
+
+BINDIR?= /sbin
+
+.include <minix.service.mk>
diff --git a/servers/vbfs/vbfs.c b/servers/vbfs/vbfs.c
new file mode 100644 (file)
index 0000000..ae12ff2
--- /dev/null
@@ -0,0 +1,141 @@
+/* This file contains the implementation of the VBFS file system server. */
+/*
+ * The architecture of VBFS can be sketched as follows:
+ *
+ *     +-------------+
+ *     |    VBFS     |         This file
+ *     +-------------+
+ *            |
+ *     +-------------+
+ *     |   libsffs   |         Shared Folder File System library
+ *     +-------------+
+ *            |
+ *     +-------------+
+ *     |  libvboxfs  |         VirtualBox File System library
+ *     +-------------+
+ *            |
+ *     +-------------+
+ *     | libsys/vbox |         VBOX driver interfacing library
+ *     +-------------+
+ *  --------  |  --------              (process boundary)
+ *     +-------------+
+ *     | VBOX driver |         VirtualBox backdoor driver
+ *     +-------------+
+ *  ========  |  ========              (system boundary)
+ *     +-------------+
+ *     | VirtualBox  |         The host system
+ *     +-------------+
+ *
+ * The interfaces between the layers are defined in the following header files:
+ *   minix/sffs.h:     shared between VBFS, libsffs, and libvboxfs
+ *   minix/vboxfs.h:   shared between VBFS and libvboxfs
+ *   minix/vbox.h:     shared between libvboxfs and libsys/vbox
+ *   minix/vboxtype.h: shared between libvboxfs, libsys/vbox, and VBOX
+ *   minix/vboxif.h:   shared between libsys/vbox and VBOX
+ */
+
+#include <minix/drivers.h>
+#include <minix/sffs.h>
+#include <minix/vboxfs.h>
+#include <minix/optset.h>
+
+static char share[PATH_MAX];
+static struct sffs_params params;
+
+static struct optset optset_table[] = {
+       { "share",  OPT_STRING, share,               sizeof(share)           },
+       { "prefix", OPT_STRING, params.p_prefix,     sizeof(params.p_prefix) },
+       { "uid",    OPT_INT,    &params.p_uid,       10                      },
+       { "gid",    OPT_INT,    &params.p_gid,       10                      },
+       { "fmask",  OPT_INT,    &params.p_file_mask, 8                       },
+       { "dmask",  OPT_INT,    &params.p_dir_mask,  8                       },
+       { NULL,     0,          NULL,                0                       }
+};
+
+/*
+ * Initialize this file server. Called at startup time.
+ */
+static int
+init(int UNUSED(type), sef_init_info_t *UNUSED(info))
+{
+       const struct sffs_table *table;
+       int i, r, roflag;
+
+       /* Set defaults. */
+       share[0] = 0;
+       params.p_prefix[0] = 0;
+       params.p_uid = 0;
+       params.p_gid = 0;
+       params.p_file_mask = 0755;
+       params.p_dir_mask = 0755;
+       params.p_case_insens = FALSE;
+
+       /* We must have been given an options string. Parse the options. */
+       for (i = 1; i < env_argc - 1; i++)
+               if (!strcmp(env_argv[i], "-o"))
+                       optset_parse(optset_table, env_argv[++i]);
+
+       /* A share name is required. */
+       if (!share[0]) {
+               printf("VBFS: no shared folder share name specified\n");
+
+               return EINVAL;
+       }
+
+       /* Initialize the VBOXFS library. If this fails, exit immediately. */
+       r = vboxfs_init(share, &table, &params.p_case_insens, &roflag);
+
+       if (r != OK) {
+               if (r == ENOENT)
+                       printf("VBFS: the given share does not exist\n");
+               else
+                       printf("VBFS: unable to initialize VBOXFS (%d)\n", r);
+
+               return r;
+       }
+
+       /* Now initialize the SFFS library. */
+       if ((r = sffs_init("VBFS", table, &params)) != OK) {
+               vboxfs_cleanup();
+
+               return r;
+       }
+
+       return OK;
+}
+
+/*
+ * Local SEF initialization.
+ */
+static void
+sef_local_startup(void)
+{
+
+       /* Register initialization callback. */
+       sef_setcb_init_fresh(init);
+
+       /* Register signal callback. SFFS handles this. */
+       sef_setcb_signal_handler(sffs_signal);
+
+       sef_startup();
+}
+
+/*
+ * The main function of this file server.
+ */
+int
+main(int argc, char **argv)
+{
+
+       /* Start up. */
+       env_setargs(argc, argv);
+       sef_local_startup();
+
+       /* Let SFFS do the actual work. */
+       sffs_loop();
+
+       /* Clean up. */
+       vboxfs_cleanup();
+
+       return EXIT_SUCCESS;
+}