|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 5/5] lib/vfscore: Add support to mount initramfs to root
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>
---
lib/vfscore/Config.uk | 12 ++++++++++++
lib/vfscore/rootfs.c | 32 ++++++++++++++++++++++++++------
2 files changed, 38 insertions(+), 6 deletions(-)
diff --git a/lib/vfscore/Config.uk b/lib/vfscore/Config.uk
index f64810f..e3b305e 100644
--- a/lib/vfscore/Config.uk
+++ b/lib/vfscore/Config.uk
@@ -9,6 +9,18 @@ config LIBVFSCORE
if LIBVFSCORE
menu "vfscore: Configuration"
+config LIBCPIO
+ bool "cpio: general cpio archive extraction"
+ default n
+
+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
diff --git a/lib/vfscore/rootfs.c b/lib/vfscore/rootfs.c
index 4b9512a..78dbe3a 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,17 +85,32 @@ static int vfscore_rootfs(void)
return -1;
}
+#ifdef CONFIG_LIBINITRAMFS
+ struct ukplat_memregion_desc memregion_desc;
+ int initrd;
+ enum cpio_error error;
+
+ initrd = ukplat_memregion_find_initrd0(&memregion_desc);
+ if (initrd != -1) {
+ ukplat_memregion_get(initrd, &memregion_desc);
+ if (mount("", "/", "ramfs", 0, NULL) < 0)
+ return -CPIO_MOUNT_FAILED;
+
+ error =
+ cpio_extract("/", memregion_desc.base, memregion_desc.len);
+ if (error < 0)
+ uk_pr_err("Failed to mount initrd\n");
+ return error;
+ }
+ uk_pr_err("Failed to mount initrd\n");
+ return -CPIO_NO_MEMREGION;
+#else
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'
- */
-
+#endif
return 0;
}
--
2.24.0
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |