[isar-cip-core][PATCH v2] Create a generic initramfs overlay


Quirin Gylstorff
 

From: Quirin Gylstorff <quirin.gylstorff@...>

This allows the user to generate multiple overlays in a given
location.

The configuration used the following variables:
- INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL: Label of the partition to store the overlays
- INITRAMFS_OVERLAY_PATHS: space-separated list of overlay directories (lower overlay directories)
- INITRAMFS_OVERLAY_STORAGE_PATH: path on the storage partition where the upper directory is stored

e.g.:
```
INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL ??= "var"
INITRAMFS_OVERLAY_PATHS ??= "etc"
INITRAMFS_OVERLAY_STORAGE_PATH ??= "/var/local"
```
This will create an overlay for `/etc` and store it in `/var/local/etc`.

Signed-off-by: Quirin Gylstorff <quirin.gylstorff@...>
---

Changes v2:
- INITRAMFS_OVERLAY_STORAGE_PATH contains the full path
- updated copyright
- formatting
- fix typos in commit message

.../cip-core-initramfs/cip-core-initramfs.bb | 4 +-
.../files/etc-overlay.script | 36 ---------------
.../initramfs-etc-overlay-hook_0.1.bb | 30 -------------
.../files/overlay.hook} | 0
.../files/overlay.script.tmpl | 45 +++++++++++++++++++
.../initramfs-overlay-hook_0.1.bb | 40 +++++++++++++++++
6 files changed, 87 insertions(+), 68 deletions(-)
delete mode 100644 recipes-initramfs/initramfs-etc-overlay-hook/files/etc-overlay.script
delete mode 100644 recipes-initramfs/initramfs-etc-overlay-hook/initramfs-etc-overlay-hook_0.1.bb
rename recipes-initramfs/{initramfs-etc-overlay-hook/files/etc-overlay.hook => initramfs-overlay-hook/files/overlay.hook} (100%)
create mode 100644 recipes-initramfs/initramfs-overlay-hook/files/overlay.script.tmpl
create mode 100644 recipes-initramfs/initramfs-overlay-hook/initramfs-overlay-hook_0.1.bb

diff --git a/recipes-initramfs/cip-core-initramfs/cip-core-initramfs.bb b/recipes-initramfs/cip-core-initramfs/cip-core-initramfs.bb
index 9e0ee26..2935ed8 100644
--- a/recipes-initramfs/cip-core-initramfs/cip-core-initramfs.bb
+++ b/recipes-initramfs/cip-core-initramfs/cip-core-initramfs.bb
@@ -1,7 +1,7 @@
#
# CIP Core, generic profile
#
-# Copyright (c) Siemens AG, 2021
+# Copyright (c) Siemens AG, 2021 - 2023
#
# Authors:
# Quirin Gylstorff <quirin.gylstorff@...>
@@ -12,5 +12,5 @@
inherit initramfs

INITRAMFS_INSTALL += " \
- initramfs-etc-overlay-hook \
+ initramfs-overlay-hook \
"
diff --git a/recipes-initramfs/initramfs-etc-overlay-hook/files/etc-overlay.script b/recipes-initramfs/initramfs-etc-overlay-hook/files/etc-overlay.script
deleted file mode 100644
index 6e5aacd..0000000
--- a/recipes-initramfs/initramfs-etc-overlay-hook/files/etc-overlay.script
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/sh
-#
-# CIP Core, generic profile
-#
-# Copyright (c) Siemens AG, 2022
-#
-# Authors:
-# Jan Kiszka <jan.kiszka@...>
-#
-
-PREREQ=""
-
-prereqs()
-{
- echo "$PREREQ"
-}
-
-case $1 in
-# get pre-requisites
-prereqs)
- prereqs
- exit 0
- ;;
-esac
-
-. /scripts/functions
-
-if ! mount -t $(get_fstype /dev/disk/by-label/var) /dev/disk/by-label/var ${rootmnt}/var; then
- panic "Can't mount /var partition - overlay will not work!"
-fi
-
-mkdir -p ${rootmnt}/var/local/etc
-mkdir -p ${rootmnt}/var/local/.atomic
-if ! mount -t overlay -o lowerdir=${rootmnt}/etc,upperdir=${rootmnt}/var/local/etc,workdir=${rootmnt}/var/local/.atomic overlay ${rootmnt}/etc; then
- panic "Can't mount overlay!"
-fi
diff --git a/recipes-initramfs/initramfs-etc-overlay-hook/initramfs-etc-overlay-hook_0.1.bb b/recipes-initramfs/initramfs-etc-overlay-hook/initramfs-etc-overlay-hook_0.1.bb
deleted file mode 100644
index 37a04ec..0000000
--- a/recipes-initramfs/initramfs-etc-overlay-hook/initramfs-etc-overlay-hook_0.1.bb
+++ /dev/null
@@ -1,30 +0,0 @@
-#
-# CIP Core, generic profile
-#
-# Copyright (c) Siemens AG, 2022
-#
-# Authors:
-# Jan Kiszka <jan.kiszka@...>
-#
-# SPDX-License-Identifier: MIT
-#
-
-inherit dpkg-raw
-
-SRC_URI += " \
- file://etc-overlay.hook \
- file://etc-overlay.script \
- "
-
-DEBIAN_DEPENDS = "initramfs-tools"
-
-do_install[cleandirs] += " \
- ${D}/usr/share/initramfs-tools/hooks \
- ${D}/usr/share/initramfs-tools/scripts/local-bottom"
-
-do_install() {
- install -m 0755 "${WORKDIR}/etc-overlay.hook" \
- "${D}/usr/share/initramfs-tools/hooks/etc-overlay"
- install -m 0755 "${WORKDIR}/etc-overlay.script" \
- "${D}/usr/share/initramfs-tools/scripts/local-bottom/etc-overlay"
-}
diff --git a/recipes-initramfs/initramfs-etc-overlay-hook/files/etc-overlay.hook b/recipes-initramfs/initramfs-overlay-hook/files/overlay.hook
similarity index 100%
rename from recipes-initramfs/initramfs-etc-overlay-hook/files/etc-overlay.hook
rename to recipes-initramfs/initramfs-overlay-hook/files/overlay.hook
diff --git a/recipes-initramfs/initramfs-overlay-hook/files/overlay.script.tmpl b/recipes-initramfs/initramfs-overlay-hook/files/overlay.script.tmpl
new file mode 100644
index 0000000..dad14f7
--- /dev/null
+++ b/recipes-initramfs/initramfs-overlay-hook/files/overlay.script.tmpl
@@ -0,0 +1,45 @@
+#!/bin/sh
+#
+# CIP Core, generic profile
+#
+# Copyright (c) Siemens AG, 2022-2023
+#
+# Authors:
+# Jan Kiszka <jan.kiszka@...>
+# Quirin Gylstorff <quirin.gylstorff@...>
+#
+
+PREREQ=""
+
+prereqs()
+{
+ echo "$PREREQ"
+}
+
+case $1 in
+# get pre-requisites
+prereqs)
+ prereqs
+ exit 0
+ ;;
+esac
+
+. /scripts/functions
+
+ovl_partition_label=${INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL}
+ovl_storage_path=${rootmnt}${INITRAMFS_OVERLAY_STORAGE_PATH}
+ovl_lower_dirs=${INITRAMFS_OVERLAY_PATHS}
+
+if ! mount -t $(get_fstype /dev/disk/by-label/${ovl_partition_label}) /dev/disk/by-label/${ovl_partition_label} ${rootmnt}/${ovl_partition_label}; then
+ panic "Can't mount /${ovl_partition_label} partition - overlay will not work!"
+fi
+
+for ovl_lower_dir in ${ovl_lower_dirs}; do
+ ovl_atomic_dir=.${ovl_lower_dir}-atomic
+
+ mkdir -p ${ovl_storage_path}/${ovl_lower_dir}
+ mkdir -p ${ovl_storage_path}/${ovl_atomic_dir}
+ if ! mount -t overlay -o lowerdir=${rootmnt}/${ovl_lower_dir},upperdir=${ovl_storage_path}/${ovl_lower_dir},workdir=${ovl_storage_path}/${ovl_atomic_dir} overlay ${rootmnt}/${ovl_lower_dir}; then
+ panic "Can't mount overlay for '$ovl_lower_dir' !"
+ fi
+done
diff --git a/recipes-initramfs/initramfs-overlay-hook/initramfs-overlay-hook_0.1.bb b/recipes-initramfs/initramfs-overlay-hook/initramfs-overlay-hook_0.1.bb
new file mode 100644
index 0000000..25910b8
--- /dev/null
+++ b/recipes-initramfs/initramfs-overlay-hook/initramfs-overlay-hook_0.1.bb
@@ -0,0 +1,40 @@
+#
+# CIP Core, generic profile
+#
+# Copyright (c) Siemens AG, 2022 - 2023
+#
+# Authors:
+# Jan Kiszka <jan.kiszka@...>
+# Quirin Gylstorff <quirin.gylstorff@...>
+#
+# SPDX-License-Identifier: MIT
+#
+
+inherit dpkg-raw
+
+SRC_URI += " \
+ file://overlay.hook \
+ file://overlay.script.tmpl \
+ "
+
+INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL ??= "var"
+INITRAMFS_OVERLAY_PATHS ??= "etc"
+INITRAMFS_OVERLAY_STORAGE_PATH ??= "/var/local"
+
+TEMPLATE_FILES = "overlay.script.tmpl"
+TEMPLATE_VARS += "INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL \
+ INITRAMFS_OVERLAY_STORAGE_PATH \
+ INITRAMFS_OVERLAY_PATHS"
+
+DEBIAN_DEPENDS = "initramfs-tools"
+
+do_install[cleandirs] += " \
+ ${D}/usr/share/initramfs-tools/hooks \
+ ${D}/usr/share/initramfs-tools/scripts/local-bottom"
+
+do_install() {
+ install -m 0755 "${WORKDIR}/overlay.hook" \
+ "${D}/usr/share/initramfs-tools/hooks/overlay"
+ install -m 0755 "${WORKDIR}/overlay.script" \
+ "${D}/usr/share/initramfs-tools/scripts/local-bottom/overlay"
+}
--
2.39.0


Jan Kiszka
 

On 10.01.23 13:00, Quirin Gylstorff wrote:
From: Quirin Gylstorff <quirin.gylstorff@...>

This allows the user to generate multiple overlays in a given
location.

The configuration used the following variables:
- INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL: Label of the partition to store the overlays
- INITRAMFS_OVERLAY_PATHS: space-separated list of overlay directories (lower overlay directories)
- INITRAMFS_OVERLAY_STORAGE_PATH: path on the storage partition where the upper directory is stored

e.g.:
```
INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL ??= "var"
INITRAMFS_OVERLAY_PATHS ??= "etc"
INITRAMFS_OVERLAY_STORAGE_PATH ??= "/var/local"
```
This will create an overlay for `/etc` and store it in `/var/local/etc`.

Signed-off-by: Quirin Gylstorff <quirin.gylstorff@...>
---

Changes v2:
- INITRAMFS_OVERLAY_STORAGE_PATH contains the full path
- updated copyright
- formatting
- fix typos in commit message
Could you also explain why my other suggestions are not feasible or
reasonable? I would still prefer 2 over 3 variables, if possible.

Jan

--
Siemens AG, Technology
Competence Center Embedded Linux


Quirin Gylstorff
 

On 1/10/23 17:38, Jan Kiszka wrote:
On 10.01.23 13:00, Quirin Gylstorff wrote:
From: Quirin Gylstorff <quirin.gylstorff@...>

This allows the user to generate multiple overlays in a given
location.

The configuration used the following variables:
- INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL: Label of the partition to store the overlays
- INITRAMFS_OVERLAY_PATHS: space-separated list of overlay directories (lower overlay directories)
- INITRAMFS_OVERLAY_STORAGE_PATH: path on the storage partition where the upper directory is stored

e.g.:
```
INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL ??= "var"
INITRAMFS_OVERLAY_PATHS ??= "etc"
INITRAMFS_OVERLAY_STORAGE_PATH ??= "/var/local"
```
This will create an overlay for `/etc` and store it in `/var/local/etc`.

Signed-off-by: Quirin Gylstorff <quirin.gylstorff@...>
---

Changes v2:
- INITRAMFS_OVERLAY_STORAGE_PATH contains the full path
- updated copyright
- formatting
- fix typos in commit message
Could you also explain why my other suggestions are not feasible or
reasonable? I would still prefer 2 over 3 variables, if possible.
I can add the 2 variable version but in my option this makes the configuration harder to understand. As the script tries to mount
a partition which is not mentioned before.

Jan
Quirin


Jan Kiszka
 

On 10.01.23 20:01, Gylstorff Quirin wrote:


On 1/10/23 17:38, Jan Kiszka wrote:
On 10.01.23 13:00, Quirin Gylstorff wrote:
From: Quirin Gylstorff <quirin.gylstorff@...>

This allows the user to generate multiple overlays in a given
location.

The configuration used the following variables:
  - INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL: Label of the partition
to store the overlays
  - INITRAMFS_OVERLAY_PATHS: space-separated list of overlay
directories (lower overlay directories)
  - INITRAMFS_OVERLAY_STORAGE_PATH: path on the storage partition
where the upper directory is stored

e.g.:
```
INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL ??= "var"
INITRAMFS_OVERLAY_PATHS ??= "etc"
INITRAMFS_OVERLAY_STORAGE_PATH ??= "/var/local"
```
This will create an overlay for `/etc` and store it in `/var/local/etc`.

Signed-off-by: Quirin Gylstorff <quirin.gylstorff@...>
---

Changes v2:
  - INITRAMFS_OVERLAY_STORAGE_PATH contains the full path
  - updated copyright
  - formatting
  - fix typos in commit message
Could you also explain why my other suggestions are not feasible or
reasonable? I would still prefer 2 over 3 variables, if possible.
I can add the 2 variable version but in my option this makes the
configuration harder to understand. As the script tries to mount
a partition which is not mentioned before.
My suggestion only makes sense when the partition (label or whatever
identifies it) can be derived from the storage path as it is mounted
already or in an fstab that is accessible. It that true?

In any case, please make sure that INITRAMFS_OVERLAY_PATHS can be
specified absolutely ("/etc") and that subdirs also work ("/etc/foo
/etc/bar").

Jan

--
Siemens AG, Technology
Competence Center Embedded Linux