diff mbox series

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

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

Commit Message

Quirin Gylstorff Jan. 17, 2023, 1:15 p.m. UTC
From: Quirin Gylstorff <quirin.gylstorff@siemens.com>

This allows the user to generate multible 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

The script tries to mount the top directory of INITRAMFS_OVERLAY_STORAGE_PATH. If the mount fails
the boot is aborted.

e.g.:
```
INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL ??= "var"
INITRAMFS_OVERLAY_PATHS ??= "/etc /usr/share/foo /usr/share/bar/foo"
INITRAMFS_OVERLAY_STORAGE_PATH ??= "/var/local"
```
1. This will mount the partition labeled var to /var
2. This will create  the following overlays:

```
overlay on /etc type overlay (rw,relatime,lowerdir=/root/etc,upperdir=/root/var/local/etc,workdir=/root/var/local/.etc-atomic)
overlay on /usr/share/foo type overlay (rw,relatime,lowerdir=/root/usr/share/foo,upperdir=/root/var/local/usr/share/foo,workdir=/root/var/local/.usr_share_foo-atomic)
overlay on /usr/share/bar/foo type overlay (rw,relatime,lowerdir=/root/usr/share/bar/foo,upperdir=/root/var/local/usr/share/bar/foo,workdir=/root/var/local/.usr_share_bar_foo-atomic)
```

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

Changes v3:
 - add awk to generate a unique wordir name from the full overlay path
 - allow absolute paths in INITRAMFS_OVERLAY_PATHS
 - ensure that subpath, e.g. `/usr/share/bar/foo` are possible in INITRAMFS_OVERLAY_PATHS
 - adapt commit message

Should we split mounting /var in a seperate hook with a build time dependency and only check if 
INITRAMFS_OVERLAY_STORAGE_PATH is writable instead of adding the mount logic directly?

 .../cip-core-initramfs/cip-core-initramfs.bb  |  4 +-
 .../files/etc-overlay.script                  | 36 -----------
 .../initramfs-etc-overlay-hook_0.1.bb         | 30 ----------
 .../files/overlay.hook}                       |  1 +
 .../files/overlay.script.tmpl                 | 60 +++++++++++++++++++
 .../initramfs-overlay-hook_0.1.bb             | 40 +++++++++++++
 6 files changed, 103 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} (92%)
 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. 18, 2023, 6:42 a.m. UTC | #1
On 17.01.23 14:15, Quirin Gylstorff wrote:
> From: Quirin Gylstorff <quirin.gylstorff@siemens.com>
> 
> This allows the user to generate multible 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
> 
> The script tries to mount the top directory of INITRAMFS_OVERLAY_STORAGE_PATH. If the mount fails
> the boot is aborted.
> 
> e.g.:
> ```
> INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL ??= "var"
> INITRAMFS_OVERLAY_PATHS ??= "/etc /usr/share/foo /usr/share/bar/foo"
> INITRAMFS_OVERLAY_STORAGE_PATH ??= "/var/local"
> ```
> 1. This will mount the partition labeled var to /var
> 2. This will create  the following overlays:
> 
> ```
> overlay on /etc type overlay (rw,relatime,lowerdir=/root/etc,upperdir=/root/var/local/etc,workdir=/root/var/local/.etc-atomic)
> overlay on /usr/share/foo type overlay (rw,relatime,lowerdir=/root/usr/share/foo,upperdir=/root/var/local/usr/share/foo,workdir=/root/var/local/.usr_share_foo-atomic)
> overlay on /usr/share/bar/foo type overlay (rw,relatime,lowerdir=/root/usr/share/bar/foo,upperdir=/root/var/local/usr/share/bar/foo,workdir=/root/var/local/.usr_share_bar_foo-atomic)
> ```
> 
> 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
> 
> Changes v3:
>  - add awk to generate a unique wordir name from the full overlay path
>  - allow absolute paths in INITRAMFS_OVERLAY_PATHS
>  - ensure that subpath, e.g. `/usr/share/bar/foo` are possible in INITRAMFS_OVERLAY_PATHS
>  - adapt commit message
> 
> Should we split mounting /var in a seperate hook with a build time dependency and only check if 
> INITRAMFS_OVERLAY_STORAGE_PATH is writable instead of adding the mount logic directly?
> 
>  .../cip-core-initramfs/cip-core-initramfs.bb  |  4 +-
>  .../files/etc-overlay.script                  | 36 -----------
>  .../initramfs-etc-overlay-hook_0.1.bb         | 30 ----------
>  .../files/overlay.hook}                       |  1 +
>  .../files/overlay.script.tmpl                 | 60 +++++++++++++++++++
>  .../initramfs-overlay-hook_0.1.bb             | 40 +++++++++++++
>  6 files changed, 103 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} (92%)
>  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@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 92%
> rename from recipes-initramfs/initramfs-etc-overlay-hook/files/etc-overlay.hook
> rename to recipes-initramfs/initramfs-overlay-hook/files/overlay.hook
> index bfaa7b6..5bec258 100644
> --- a/recipes-initramfs/initramfs-etc-overlay-hook/files/etc-overlay.hook
> +++ b/recipes-initramfs/initramfs-overlay-hook/files/overlay.hook
> @@ -23,3 +23,4 @@ esac
>  . /usr/share/initramfs-tools/hook-functions
>  
>  manual_add_modules overlay
> +copy_exec /usr/bin/awk
> 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..9cbe537
> --- /dev/null
> +++ b/recipes-initramfs/initramfs-overlay-hook/files/overlay.script.tmpl
> @@ -0,0 +1,60 @@
> +#!/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="${INITRAMFS_OVERLAY_STORAGE_PATH}"
> +ovl_lower_dirs="${INITRAMFS_OVERLAY_PATHS}"
> +
> +root_mount_storage=${rootmnt}${ovl_storage_path}
> +
> +if ! mount -t $(get_fstype /dev/disk/by-label/${ovl_partition_label}) \
> +	/dev/disk/by-label/${ovl_partition_label} \
> +	${rootmnt}/${ovl_partition_label}; then

I indented these lines a bit more to improve readability.

> +	panic "Can't mount /${ovl_partition_label} partition - overlay will not work!"
> +fi
> +
> +for ovl_lower_dir in ${ovl_lower_dirs}; do
> +	# remove the first '/' and replace all '/' with '_'
> +	# on variable $ovl_lower_dir
> +	work_dir_name=$(awk -v var=$ovl_lower_dir \
> +		'BEGIN{subvar=substr(var,2);gsub("/","_",subvar);print subvar}')
> +
> +	lower_dir=${rootmnt}${ovl_lower_dir}
> +	upper_dir=${root_mount_storage}${ovl_lower_dir}
> +	work_dir=${root_mount_storage}/.${work_dir_name}-atomic
> +
> +	mkdir -p ${upper_dir}
> +	mkdir -p ${work_dir}
> +
> +	if ! mount -t overlay \
> +		-o lowerdir=${lower_dir},upperdir=${upper_dir},workdir=${work_dir} \
> +		overlay ${lower_dir}; then

Same here.

> +		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..78831ba
> --- /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_PATHS ??= "/etc"
> +INITRAMFS_OVERLAY_STORAGE_PATH ??= "/var/local"
> +INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL ??= "var"
> +
> +TEMPLATE_FILES = "overlay.script.tmpl"
> +TEMPLATE_VARS += " INITRAMFS_OVERLAY_STORAGE_PATH \
> +    INITRAMFS_OVERLAY_PATHS \
> +    INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL"
> +
> +DEBIAN_DEPENDS = "initramfs-tools, awk, coreutils"
> +
> +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"
> +}

Thanks, applied to next.

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 92%
rename from recipes-initramfs/initramfs-etc-overlay-hook/files/etc-overlay.hook
rename to recipes-initramfs/initramfs-overlay-hook/files/overlay.hook
index bfaa7b6..5bec258 100644
--- a/recipes-initramfs/initramfs-etc-overlay-hook/files/etc-overlay.hook
+++ b/recipes-initramfs/initramfs-overlay-hook/files/overlay.hook
@@ -23,3 +23,4 @@  esac
 . /usr/share/initramfs-tools/hook-functions
 
 manual_add_modules overlay
+copy_exec /usr/bin/awk
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..9cbe537
--- /dev/null
+++ b/recipes-initramfs/initramfs-overlay-hook/files/overlay.script.tmpl
@@ -0,0 +1,60 @@ 
+#!/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="${INITRAMFS_OVERLAY_STORAGE_PATH}"
+ovl_lower_dirs="${INITRAMFS_OVERLAY_PATHS}"
+
+root_mount_storage=${rootmnt}${ovl_storage_path}
+
+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
+	# remove the first '/' and replace all '/' with '_'
+	# on variable $ovl_lower_dir
+	work_dir_name=$(awk -v var=$ovl_lower_dir \
+		'BEGIN{subvar=substr(var,2);gsub("/","_",subvar);print subvar}')
+
+	lower_dir=${rootmnt}${ovl_lower_dir}
+	upper_dir=${root_mount_storage}${ovl_lower_dir}
+	work_dir=${root_mount_storage}/.${work_dir_name}-atomic
+
+	mkdir -p ${upper_dir}
+	mkdir -p ${work_dir}
+
+	if ! mount -t overlay \
+		-o lowerdir=${lower_dir},upperdir=${upper_dir},workdir=${work_dir} \
+		overlay ${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..78831ba
--- /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_PATHS ??= "/etc"
+INITRAMFS_OVERLAY_STORAGE_PATH ??= "/var/local"
+INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL ??= "var"
+
+TEMPLATE_FILES = "overlay.script.tmpl"
+TEMPLATE_VARS += " INITRAMFS_OVERLAY_STORAGE_PATH \
+    INITRAMFS_OVERLAY_PATHS \
+    INITRAMFS_OVERLAY_STORAGE_PARTITION_LABEL"
+
+DEBIAN_DEPENDS = "initramfs-tools, awk, coreutils"
+
+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"
+}