diff mbox series

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

Message ID 20230110120055.463166-1-Quirin.Gylstorff@siemens.com (mailing list archive)
State Superseded
Headers show
Series [isar-cip-core,v2] Create a generic initramfs overlay | expand

Commit Message

Gylstorff Quirin Jan. 10, 2023, noon UTC
From: Quirin Gylstorff <quirin.gylstorff@siemens.com>

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@siemens.com>
---

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

Comments

Jan Kiszka Jan. 10, 2023, 4:38 p.m. UTC | #1
On 10.01.23 13:00, Quirin Gylstorff wrote:
> From: Quirin Gylstorff <quirin.gylstorff@siemens.com>
> 
> 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@siemens.com>
> ---
> 
> 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
Gylstorff Quirin Jan. 10, 2023, 7:01 p.m. UTC | #2
On 1/10/23 17:38, Jan Kiszka wrote:
> On 10.01.23 13:00, Quirin Gylstorff wrote:
>> From: Quirin Gylstorff <quirin.gylstorff@siemens.com>
>>
>> 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@siemens.com>
>> ---
>>
>> 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 Jan. 11, 2023, 6:34 a.m. UTC | #3
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@siemens.com>
>>>
>>> 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@siemens.com>
>>> ---
>>>
>>> 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
diff mbox series

Patch

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@siemens.com>
@@ -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@siemens.com>
-#
-
-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@siemens.com>
-#
-# 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@siemens.com>
+#  Quirin Gylstorff <quirin.gylstorff@siemens.com>
+#
+
+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@siemens.com>
+#  Quirin Gylstorff <quirin.gylstorff@siemens.com>
+#
+# 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"
+}