|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v3 3/5] lib/vfscore: Automount option
Moves the option of automatically a rootfs to lib/vfscore. This
feature is not only useful for initializing devfs. Library parameters
to influence the default settings are provided.
Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
---
lib/devfs/Config.uk | 9 ++--
lib/devfs/devfs_vnops.c | 8 +---
lib/vfscore/Config.uk | 76 ++++++++++++++++++++++++++++++++
lib/vfscore/Makefile.uk | 5 +++
lib/vfscore/rootfs.c | 97 +++++++++++++++++++++++++++++++++++++++++
5 files changed, 184 insertions(+), 11 deletions(-)
create mode 100644 lib/vfscore/rootfs.c
diff --git a/lib/devfs/Config.uk b/lib/devfs/Config.uk
index e38a616e..6f21c01c 100644
--- a/lib/devfs/Config.uk
+++ b/lib/devfs/Config.uk
@@ -1,10 +1,11 @@
-config LIBDEVFS
+menuconfig LIBDEVFS
bool "devfs: devfs file system"
default n
depends on LIBVFSCORE
+
if LIBDEVFS
- config LIBDEVFS_USE_RAMFS
- bool "Use ramfs as root"
+ config LIBDEVFS_AUTOMOUNT
+ bool "Mount /dev during boot"
+ depends on LIBVFSCORE_AUTOMOUNT_ROOTFS
default n
- select LIBRAMFS
endif
diff --git a/lib/devfs/devfs_vnops.c b/lib/devfs/devfs_vnops.c
index 11a3ea05..d872e622 100644
--- a/lib/devfs/devfs_vnops.c
+++ b/lib/devfs/devfs_vnops.c
@@ -312,15 +312,9 @@ UK_FS_REGISTER(fs_devfs);
__constructor_prio(101) static void devfs_init(void)
{
-#ifdef CONFIG_LIBDEVFS_USE_RAMFS
+#ifdef CONFIG_LIBDEVFS_AUTOMOUNT
int ret;
- ret = mount("", "/", "ramfs", 0, NULL);
- if (ret != 0) {
- uk_pr_debug("Failed to mount / in %s\n", __func__);
- return;
- }
-
ret = mkdir("/dev", S_IRWXU);
if (ret != 0) {
uk_pr_debug("Failed to mkdir /dev in %s\n", __func__);
diff --git a/lib/vfscore/Config.uk b/lib/vfscore/Config.uk
index 5deb7d04..16ffe043 100644
--- a/lib/vfscore/Config.uk
+++ b/lib/vfscore/Config.uk
@@ -13,4 +13,80 @@ config LIBVFSCORE_PIPE_SIZE_ORDER
help
The size of the internal buffer for anonymous pipes is 2^order.
+menuconfig LIBVFSCORE_AUTOMOUNT_ROOTFS
+bool "Automaticaly mount a root filesysytem (/)"
+default n
+help
+ Automatically mounts '/' during boot. If `libuklibparam` is
+ compiled in, the default root filesystem and mount options can
+ be changed with the following library parameters:
+ 'vfs.rootfs', 'vfs.rootdev', 'vfs.rootflags', and 'vfs.rootopts'
+
+if LIBVFSCORE_AUTOMOUNT_ROOTFS
+ choice LIBVFSCORE_ROOTFS
+ prompt "Default root filesystem"
+ default LIBVFSCORE_ROOTFS_RAMFS
+
+ config LIBVFSCORE_ROOTFS_RAMFS
+ bool "RamFS"
+ select LIBRAMFS
+
+ config LIBVFSCORE_ROOTFS_9PFS
+ bool "9PFS"
+ select LIBUK9P
+ select LIB9PFS
+
+ config LIBVFSCORE_ROOTFS_CUSTOM
+ bool "Custom argument"
+ help
+ Please set LIBVFSCORE_ROOTFS_CUSTOM_ARG
+ to a filesystem name that should be used
+ as default.
+ endchoice
+
+ config LIBVFSCORE_ROOTFS_CUSTOM_ARG
+ string "Default custom root filesystem"
+ default ""
+ depends on LIBVFSCORE_ROOTFS_CUSTOM
+ help
+ Custom name of a filesystem to mount (e.g., ramfs,
+ 9pfs). Make sure that the specified filesystem
+ is available for libvfscore.
+
+ # Hidden configuration option that gets automatically filled
+ # with the selected filesystem name
+ config LIBVFSCORE_ROOTFS
+ string
+ default "ramfs" if LIBVFSCORE_ROOTFS_RAMFS
+ default "9pfs" if LIBVFSCORE_ROOTFS_9PFS
+ default LIBVFSCORE_ROOTFS_CUSTOM_ARG if LIBVFSCORE_ROOTFS_CUSTOM
+ default ""
+
+ # The root device option is hidden for RamFS and 9PFS
+ config LIBVFSCORE_ROOTDEV
+ string "Default root device"
+ depends on !LIBVFSCORE_ROOTFS_RAMFS && !LIBVFSCORE_ROOTFS_9PFS
+ default ""
+ help
+ Device to mount the filesystem from. Depending on the
+ selected filesystem, this option may not be required.
+
+ # The root flags is hidden for RamFS
+ config LIBVFSCORE_ROOTFLAGS
+ hex "Default root mount flags"
+ depends on !LIBVFSCORE_ROOTFS_RAMFS
+ default 0x0
+ help
+ Mount flags.
+
+ # The root options are hidden for RamFS
+ config LIBVFSCORE_ROOTOPTS
+ string "Default root mount options"
+ depends on !LIBVFSCORE_ROOTFS_RAMFS
+ default ""
+ help
+ Usually a comma-separated list of additional mount
+ options that are directly interpreted by the target
+ filesystem.
+endif
endif
diff --git a/lib/vfscore/Makefile.uk b/lib/vfscore/Makefile.uk
index 1e5fc114..87269606 100644
--- a/lib/vfscore/Makefile.uk
+++ b/lib/vfscore/Makefile.uk
@@ -1,5 +1,8 @@
$(eval $(call addlib_s,libvfscore,$(CONFIG_LIBVFSCORE)))
+# Register to uklibparam, sets "vfs" as parameter prefix (vfs.*)
+$(eval $(call addlib_paramprefix,libvfscore,vfs))
+
CINCLUDES-y += -I$(LIBVFSCORE_BASE)/include
LIBVFSCORE_CFLAGS-$(call gcc_version_ge,8,0) += -Wno-cast-function-type
@@ -19,6 +22,8 @@ LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/subr_uio.c
LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/pipe.c
LIBVFSCORE_PIPE_FLAGS-y += -Wno-cast-function-type
LIBVFSCORE_SRCS-y += $(LIBVFSCORE_BASE)/extra.ld
+LIBVFSCORE_SRCS-$(CONFIG_LIBVFSCORE_AUTOMOUNT_ROOTFS) += \
+ $(LIBVFSCORE_BASE)/rootfs.c
UK_PROVIDED_SYSCALLS-$(CONFIG_LIBVFSCORE) += writev-3
diff --git a/lib/vfscore/rootfs.c b/lib/vfscore/rootfs.c
new file mode 100644
index 00000000..ee3cff80
--- /dev/null
+++ b/lib/vfscore/rootfs.c
@@ -0,0 +1,97 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Mount VFS root
+ *
+ * Authors: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
+ *
+ *
+ * Copyright (c) 2019, NEC Laboratories Europe GmbH, NEC Corporation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
+ */
+#include <errno.h>
+#include <uk/config.h>
+#include <uk/arch/types.h>
+#include <uk/libparam.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+#include <uk/init.h>
+
+static const char *rootfs = CONFIG_LIBVFSCORE_ROOTFS;
+
+#ifndef CONFIG_LIBVFSCORE_ROOTDEV
+static const char *rootdev = "";
+#else
+static const char *rootdev = CONFIG_LIBVFSCORE_ROOTDEV;
+#endif
+
+#ifndef CONFIG_LIBVFSCORE_ROOTOPTS
+static const char *rootopts = "";
+#else
+static const char *rootopts = CONFIG_LIBVFSCORE_ROOTOPTS;
+#endif
+
+#ifndef CONFIG_LIBVFSCORE_ROOTFLAGS
+static __u64 rootflags = 0x0;
+#else
+static __u64 rootflags = (__u64) CONFIG_LIBVFSCORE_ROOTFLAGS;
+#endif
+
+UK_LIB_PARAM_STR(rootfs);
+UK_LIB_PARAM_STR(rootdev);
+UK_LIB_PARAM_STR(rootopts);
+UK_LIB_PARAM(rootflags, __u64);
+
+static int vfscore_rootfs(void)
+{
+ /*
+ * Initialization of the root filesystem '/'
+ * NOTE: Any additional sub mount points (like '/dev' with devfs)
+ * have to be mounted later.
+ */
+ if (!rootfs || rootfs[0] == '\0') {
+ uk_pr_crit("Parameter 'vfs.rootfs' is invalid\n");
+ return -1;
+ }
+
+ uk_pr_info("Mount %s to /...\n", rootfs);
+ if (mount(rootdev, "/", rootfs, rootflags, rootopts) != 0) {
+ uk_pr_crit("Failed to mount /: %d\n", errno);
+ return -1;
+ }
+
+ /*
+ * TODO: Alternatively we could extract an archive found
+ * as initrd to a ramfs '/' if we have got fsname 'initrd'
+ */
+
+ return 0;
+}
+
+uk_rootfs_initcall_prio(vfscore_rootfs, 0);
--
2.20.1
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |