[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel,v2,1/5] lib/vfscore: Add support to mount initramfs to root



From: Robert Hrusecky <roberth@xxxxxxxxxxxxx>

Modify vfscore boot operation to run cpio extraction algorithm on initrd
memory region and mount the resulting filesystem at root.

Signed-off-by: Robert Hrusecky <roberth@xxxxxxxxxxxxx>
Signed-off-by: Omar Jamil <omarj2898@xxxxxxxxx>
Signed-off-by: Sachin Beldona <sachinbeldona@xxxxxxxxxx>
Signed-off-by: Gabriel Mocanu <gabi.mocanu98@xxxxxxxxx>
---
 lib/Makefile.uk       |  2 +-
 lib/vfscore/Config.uk | 23 +++++++++++++++++++----
 lib/vfscore/rootfs.c  | 39 ++++++++++++++++++++++++++++++---------
 3 files changed, 50 insertions(+), 14 deletions(-)

diff --git a/lib/Makefile.uk b/lib/Makefile.uk
index ff69dfa..7c90723 100644
--- a/lib/Makefile.uk
+++ b/lib/Makefile.uk
@@ -21,7 +21,7 @@ $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/fdt))
 $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/syscall_shim))
 $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/vfscore))
 $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/ramfs))
-$(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/cpio))
+$(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/ukcpio))
 $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/devfs))
 $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/9pfs))
 $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/uklock))
diff --git a/lib/vfscore/Config.uk b/lib/vfscore/Config.uk
index 212575c..9938b12 100644
--- a/lib/vfscore/Config.uk
+++ b/lib/vfscore/Config.uk
@@ -9,6 +9,15 @@ config LIBVFSCORE
 if LIBVFSCORE
 menu "vfscore: Configuration"
 
+
+config LIBINITRAMFS
+    bool "initramfs: extract the given cpio file to /"
+    default n
+    select LIBRAMFS
+    select LIBUKLIBPARAM
+    select LIBVFSCORE_AUTOMOUNT_ROOTFS
+    select LIBCPIO
+
 config LIBVFSCORE_PIPE_SIZE_ORDER
        int "Pipe size order"
        default 16
@@ -38,6 +47,11 @@ if LIBVFSCORE_AUTOMOUNT_ROOTFS
                select LIBUK9P
                select LIB9PFS
 
+    config LIBVFSCORE_ROOTFS_INITRD
+    bool "InitRD"
+    select LIBRAMFS
+    select LIBUKCPIO
+
                config LIBVFSCORE_ROOTFS_CUSTOM
                bool "Custom argument"
                help
@@ -61,13 +75,14 @@ if LIBVFSCORE_AUTOMOUNT_ROOTFS
        string
        default "ramfs" if LIBVFSCORE_ROOTFS_RAMFS
        default "9pfs" if LIBVFSCORE_ROOTFS_9PFS
-       default LIBVFSCORE_ROOTFS_CUSTOM_ARG if LIBVFSCORE_ROOTFS_CUSTOM
+       default "initrd" if LIBVFSCORE_ROOTFS_INITRD
+  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
+       depends on !LIBVFSCORE_ROOTFS_RAMFS && !LIBVFSCORE_ROOTFS_INITRD
        default "rootfs" if LIBVFSCORE_ROOTFS_9PFS
        default ""
        help
@@ -78,7 +93,7 @@ if LIBVFSCORE_AUTOMOUNT_ROOTFS
        # The root flags is hidden for RamFS
        config LIBVFSCORE_ROOTFLAGS
        hex "Default root mount flags"
-       depends on !LIBVFSCORE_ROOTFS_RAMFS
+       depends on !LIBVFSCORE_ROOTFS_RAMFS && !LIBVFSCORE_ROOTFS_INITRD
        default 0x0
        help
                Mount flags.
@@ -86,7 +101,7 @@ if LIBVFSCORE_AUTOMOUNT_ROOTFS
        # The root options are hidden for RamFS
        config LIBVFSCORE_ROOTOPTS
        string "Default root mount options"
-       depends on !LIBVFSCORE_ROOTFS_RAMFS
+       depends on !LIBVFSCORE_ROOTFS_RAMFS && !LIBVFSCORE_ROOTFS_INITRD
        default ""
        help
                Usually a comma-separated list of additional mount
diff --git a/lib/vfscore/rootfs.c b/lib/vfscore/rootfs.c
index 4b9512a..e83eec8 100644
--- a/lib/vfscore/rootfs.c
+++ b/lib/vfscore/rootfs.c
@@ -42,6 +42,11 @@
 #include <sys/stat.h>
 #include <sys/mount.h>
 #include <uk/init.h>
+#ifdef CONFIG_LIBINITRAMFS
+#include <uk/plat/memory.h>
+#include <uk/cpio.h>
+#include <string.h>
+#endif
 
 static const char *rootfs   = CONFIG_LIBVFSCORE_ROOTFS;
 
@@ -80,16 +85,32 @@ static int vfscore_rootfs(void)
                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;
-       }
+#if CONFIG_LIBUKCPIO && CONFIG_LIBRAMFS
+       if (strncmp(rootfs, "initrd", 5) == 0) {
+               struct ukplat_memregion_desc initrd;
+               enum ukcpio_error error;
 
-       /*
-        * TODO: Alternatively we could extract an archive found
-        * as initrd to a ramfs '/' if we have got fsname 'initrd'
-        */
+               if (ukplat_memregion_find_initrd0(&initrd) < 0){
+                       uk_pr_crit("Could not find an initrd!\n");
+                       return -1;
+               }
+
+               if (mount("", "/", "ramfs", 0, NULL) != 0) {
+                       uk_pr_crit("Failed to mount ramfs to /: %d\n",
+                                  errno);
+                       return -1;
+               }
+
+               error = ukcpio_extract("/", initrd.base, initrd.len);
+               if (error < 0) {
+                       uk_pr_crit("Failed to extract cpio archive to /: %d\n",
+                                  error);
+                       return -1;
+               }
+
+               return 0;
+       }
+#endif
 
        return 0;
 }
-- 
2.17.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.