[OE-core] [PATCH 1/4] initramfs-module-setup-live: support union fs

Hongxu Jia hongxu.jia at windriver.com
Mon Dec 3 10:13:27 UTC 2018


Since commit [882ae0dc core-image-minimal-initramfs: use initramfs-framework
for initialization] applied. The setup-live module of initramfs-framework is
introduced to integrate the functionality of init-live.sh, but it missed to
setup union filesystem which caused the rootfs is not writable.

Refer init-live.sh, add scriptlet named `union-fs' after scriptlet `rootfs'

Here are test steps:
$ echo 'IMAGE_FSTYPES_pn-core-image-minimal_append = " live"' >> conf/local.conf
$ echo 'KERNEL_FEATURES_append = " features/overlayfs/overlayfs.scc"' >> conf/local.conf
$ bitbake core-image-minimal
$ runqemu core-image-minimal slirp iso
qemux86-64 login: root
root at qemux86-64:~# touch /abc

Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
---
 .../initrdscripts/initramfs-framework/union-fs     | 55 ++++++++++++++++++++++
 .../initramfs-module-setup-live_1.0.bb             |  9 +++-
 2 files changed, 62 insertions(+), 2 deletions(-)
 create mode 100644 meta/recipes-core/initrdscripts/initramfs-framework/union-fs

diff --git a/meta/recipes-core/initrdscripts/initramfs-framework/union-fs b/meta/recipes-core/initrdscripts/initramfs-framework/union-fs
new file mode 100644
index 0000000..2fb6241
--- /dev/null
+++ b/meta/recipes-core/initrdscripts/initramfs-framework/union-fs
@@ -0,0 +1,55 @@
+union_enabled() {
+    if touch $ROOTFS_DIR/bin 2>/dev/null; then
+        # The root image is read-write, directly return.
+        return 1
+    fi
+    return 0
+}
+
+union_run() {
+    # determine which unification filesystem to use
+    union_fs_type=""
+    if grep -q -w "overlay" /proc/filesystems; then
+        union_fs_type="overlay"
+    elif grep -q -w "aufs" /proc/filesystems; then
+        union_fs_type="aufs"
+    else
+        union_fs_type=""
+    fi
+
+    # make a union mount if possible
+    case $union_fs_type in
+        "overlay")
+            mkdir -p /rootfs.ro /rootfs.rw
+            if ! mount -n --move $ROOTFS_DIR /rootfs.ro; then
+                rm -rf /rootfs.ro /rootfs.rw
+                fatal "overlay: Could not move rootfs mount point to /rootfs.ro"
+            else
+                mount -t tmpfs -o rw,noatime,mode=755 tmpfs /rootfs.rw
+                mkdir -p /rootfs.rw/upperdir /rootfs.rw/work
+                mount -t overlay overlay -o "lowerdir=/rootfs.ro,upperdir=/rootfs.rw/upperdir,workdir=/rootfs.rw/work" $ROOTFS_DIR
+                mkdir -p $ROOTFS_DIR/rootfs.ro $ROOTFS_DIR/rootfs.rw
+                mount --move /rootfs.ro $ROOTFS_DIR/rootfs.ro
+                mount --move /rootfs.rw $ROOTFS_DIR/rootfs.rw
+            fi
+            ;;
+        "aufs")
+            mkdir -p /rootfs.ro /rootfs.rw
+            if ! mount -n --move $ROOTFS_DIR /rootfs.ro; then
+                rm -rf /rootfs.ro /rootfs.rw
+                fatal "aufs: Could not move rootfs mount point to /rootfs.ro"
+            else
+                mount -t tmpfs -o rw,noatime,mode=755 tmpfs /rootfs.rw
+                mount -t aufs -o "dirs=/rootfs.rw=rw:/rootfs.ro=ro" aufs $ROOTFS_DIR
+                mkdir -p $ROOTFS_DIR/rootfs.ro $ROOTFS_DIR/rootfs.rw
+                mount --move /rootfs.ro $ROOTFS_DIR/rootfs.ro
+                mount --move /rootfs.rw $ROOTFS_DIR/rootfs.rw
+            fi
+            ;;
+        "")
+            mount -t tmpfs -o rw,noatime,mode=755 tmpfs $ROOTFS_DIR/media
+            ;;
+    esac
+
+    debug "setup union filesystem $union_fs_type"
+}
diff --git a/meta/recipes-core/initrdscripts/initramfs-module-setup-live_1.0.bb b/meta/recipes-core/initrdscripts/initramfs-module-setup-live_1.0.bb
index 4d2fe9d..30831c2 100644
--- a/meta/recipes-core/initrdscripts/initramfs-module-setup-live_1.0.bb
+++ b/meta/recipes-core/initrdscripts/initramfs-module-setup-live_1.0.bb
@@ -8,13 +8,18 @@ PR = "r4"
 inherit allarch
 
 FILESEXTRAPATHS_prepend := "${THISDIR}/initramfs-framework:"
-SRC_URI = "file://setup-live"
+SRC_URI = "file://setup-live \
+           file://union-fs \
+"
 
 S = "${WORKDIR}"
 
 do_install() {
     install -d ${D}/init.d
     install -m 0755 ${WORKDIR}/setup-live ${D}/init.d/80-setup-live
+    install -m 0755 ${WORKDIR}/union-fs ${D}/init.d/91-union-fs
 }
 
-FILES_${PN} = "/init.d/80-setup-live"
+FILES_${PN} = "/init.d/80-setup-live \
+               /init.d/91-union-fs \
+              "
-- 
2.7.4



More information about the Openembedded-core mailing list