Message ID | 20240715135258.902008-1-clara.kowalsky@siemens.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [isar-cip-core,v4] initramfs-overlay-hook: Check file system of INITRAMFS_OVERLAY_STORAGE_DEVICE | expand |
On 15.07.24 15:52, Clara Kowalsky wrote: > In case of ext*, this detects and fixes file system errors in the > partition device before doing the partition mount. > If the partition turns out to be broken, the factory state is recovered. > > Signed-off-by: Clara Kowalsky <clara.kowalsky@siemens.com> > --- > .../initramfs-overlay-hook/files/overlay.hook | 11 +++++++++-- > .../files/overlay.script.tmpl | 11 ++++++++++- > .../files/overlay_recovery_action.script | 14 ++++++++++++++ > .../initramfs-overlay-hook_0.1.bb | 8 +++++++- > 4 files changed, 40 insertions(+), 4 deletions(-) > create mode 100644 recipes-initramfs/initramfs-overlay-hook/files/overlay_recovery_action.script > > diff --git a/recipes-initramfs/initramfs-overlay-hook/files/overlay.hook b/recipes-initramfs/initramfs-overlay-hook/files/overlay.hook > index 8b00ecf..6f634c5 100644 > --- a/recipes-initramfs/initramfs-overlay-hook/files/overlay.hook > +++ b/recipes-initramfs/initramfs-overlay-hook/files/overlay.hook > @@ -22,6 +22,13 @@ esac > > . /usr/share/initramfs-tools/hook-functions > > +hook_error() { > + echo "(ERROR): $1" >&2 > + exit 1 > +} > + > manual_add_modules overlay > -copy_exec /usr/bin/mountpoint > -copy_exec /usr/bin/awk > +copy_exec /usr/bin/mountpoint || hook_error "/usr/bin/mountpoint not found" > +copy_exec /usr/bin/awk || hook_error "/usr/bin/awk not found" > +copy_exec /usr/sbin/e2fsck || hook_error "/usr/sbin/e2fsck not found" > +copy_exec /usr/sbin/mke2fs || hook_error "/usr/sbin/mke2fs not found" > diff --git a/recipes-initramfs/initramfs-overlay-hook/files/overlay.script.tmpl b/recipes-initramfs/initramfs-overlay-hook/files/overlay.script.tmpl > index 42eb59c..deda034 100644 > --- a/recipes-initramfs/initramfs-overlay-hook/files/overlay.script.tmpl > +++ b/recipes-initramfs/initramfs-overlay-hook/files/overlay.script.tmpl > @@ -31,12 +31,21 @@ ovl_partition_device="${INITRAMFS_OVERLAY_STORAGE_DEVICE}" > ovl_storage_path="${INITRAMFS_OVERLAY_STORAGE_PATH}" > ovl_lower_dirs="${INITRAMFS_OVERLAY_PATHS}" > ovl_mount_option="${INITRAMFS_OVERLAY_MOUNT_OPTION}" > +ovl_recovery_script="/scripts/${INITRAMFS_OVERLAY_RECOVERY_SCRIPT}" > > root_mount_storage=${rootmnt}${ovl_storage_path} > storage_mount_point="$(echo "${ovl_storage_path}" | awk -F/ '{print FS$2}' )" > +partition_fstype=$(get_fstype "${ovl_partition_device}") > > if ! mountpoint -q "${rootmnt}${storage_mount_point}"; then > - if ! mount -t $(get_fstype ${ovl_partition_device}) \ > + if [ "$partition_fstype" = "ext*" ]; then This will never be true :). You want "case" so that matching on * works. > + if ! e2fsck -p -f "$ovl_partition_device"; then > + if [ -f "$ovl_recovery_script" ] && [ -x "$ovl_recovery_script" ]; then If you combine the three conditions via &&, you save two levels of indention... > + "$ovl_recovery_script" "$ovl_partition_device" "$partition_fstype" ...and this line become a bit shorter. > + fi > + fi > + fi > + if ! mount -t ${partition_fstype} \ > -o ${ovl_mount_option} \ > ${ovl_partition_device} \ > ${rootmnt}${storage_mount_point}; then > diff --git a/recipes-initramfs/initramfs-overlay-hook/files/overlay_recovery_action.script b/recipes-initramfs/initramfs-overlay-hook/files/overlay_recovery_action.script > new file mode 100644 > index 0000000..4ef0148 > --- /dev/null > +++ b/recipes-initramfs/initramfs-overlay-hook/files/overlay_recovery_action.script > @@ -0,0 +1,14 @@ > +#!/bin/sh > +# > +# CIP Core, generic profile > +# > +# Copyright (c) Siemens AG, 2024 > +# > +# Authors: > +# Clara Kowalsky <clara.kowalsky@siemens.com> > +# > + > +ovl_partition_device="$1" > +partition_fstype="$2" > + > +mke2fs -t "$partition_fstype" "$ovl_partition_device" > 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 > index 955748f..7097130 100644 > --- a/recipes-initramfs/initramfs-overlay-hook/initramfs-overlay-hook_0.1.bb > +++ b/recipes-initramfs/initramfs-overlay-hook/initramfs-overlay-hook_0.1.bb > @@ -12,9 +12,12 @@ > > inherit dpkg-raw > > +INITRAMFS_OVERLAY_RECOVERY_SCRIPT ??= "overlay_recovery_action.script" > + > SRC_URI += " \ > file://overlay.hook \ > file://overlay.script.tmpl \ > + file://${INITRAMFS_OVERLAY_RECOVERY_SCRIPT} \ > " > > # The variable INITRAMFS_OVERLAY_PATHS contains the directories which are > @@ -35,7 +38,8 @@ TEMPLATE_FILES = "overlay.script.tmpl" > TEMPLATE_VARS += " INITRAMFS_OVERLAY_STORAGE_PATH \ > INITRAMFS_OVERLAY_PATHS \ > INITRAMFS_OVERLAY_STORAGE_DEVICE \ > - INITRAMFS_OVERLAY_MOUNT_OPTION" > + INITRAMFS_OVERLAY_MOUNT_OPTION \ > + INITRAMFS_OVERLAY_RECOVERY_SCRIPT" > > DEBIAN_DEPENDS = "initramfs-tools, awk, coreutils, util-linux" > > @@ -48,4 +52,6 @@ do_install() { > "${D}/usr/share/initramfs-tools/hooks/overlay" > install -m 0755 "${WORKDIR}/overlay.script" \ > "${D}/usr/share/initramfs-tools/scripts/local-bottom/overlay" > + install -m 0755 "${WORKDIR}/${INITRAMFS_OVERLAY_RECOVERY_SCRIPT}" \ > + "${D}/usr/share/initramfs-tools/scripts" > } Jan
diff --git a/recipes-initramfs/initramfs-overlay-hook/files/overlay.hook b/recipes-initramfs/initramfs-overlay-hook/files/overlay.hook index 8b00ecf..6f634c5 100644 --- a/recipes-initramfs/initramfs-overlay-hook/files/overlay.hook +++ b/recipes-initramfs/initramfs-overlay-hook/files/overlay.hook @@ -22,6 +22,13 @@ esac . /usr/share/initramfs-tools/hook-functions +hook_error() { + echo "(ERROR): $1" >&2 + exit 1 +} + manual_add_modules overlay -copy_exec /usr/bin/mountpoint -copy_exec /usr/bin/awk +copy_exec /usr/bin/mountpoint || hook_error "/usr/bin/mountpoint not found" +copy_exec /usr/bin/awk || hook_error "/usr/bin/awk not found" +copy_exec /usr/sbin/e2fsck || hook_error "/usr/sbin/e2fsck not found" +copy_exec /usr/sbin/mke2fs || hook_error "/usr/sbin/mke2fs not found" diff --git a/recipes-initramfs/initramfs-overlay-hook/files/overlay.script.tmpl b/recipes-initramfs/initramfs-overlay-hook/files/overlay.script.tmpl index 42eb59c..deda034 100644 --- a/recipes-initramfs/initramfs-overlay-hook/files/overlay.script.tmpl +++ b/recipes-initramfs/initramfs-overlay-hook/files/overlay.script.tmpl @@ -31,12 +31,21 @@ ovl_partition_device="${INITRAMFS_OVERLAY_STORAGE_DEVICE}" ovl_storage_path="${INITRAMFS_OVERLAY_STORAGE_PATH}" ovl_lower_dirs="${INITRAMFS_OVERLAY_PATHS}" ovl_mount_option="${INITRAMFS_OVERLAY_MOUNT_OPTION}" +ovl_recovery_script="/scripts/${INITRAMFS_OVERLAY_RECOVERY_SCRIPT}" root_mount_storage=${rootmnt}${ovl_storage_path} storage_mount_point="$(echo "${ovl_storage_path}" | awk -F/ '{print FS$2}' )" +partition_fstype=$(get_fstype "${ovl_partition_device}") if ! mountpoint -q "${rootmnt}${storage_mount_point}"; then - if ! mount -t $(get_fstype ${ovl_partition_device}) \ + if [ "$partition_fstype" = "ext*" ]; then + if ! e2fsck -p -f "$ovl_partition_device"; then + if [ -f "$ovl_recovery_script" ] && [ -x "$ovl_recovery_script" ]; then + "$ovl_recovery_script" "$ovl_partition_device" "$partition_fstype" + fi + fi + fi + if ! mount -t ${partition_fstype} \ -o ${ovl_mount_option} \ ${ovl_partition_device} \ ${rootmnt}${storage_mount_point}; then diff --git a/recipes-initramfs/initramfs-overlay-hook/files/overlay_recovery_action.script b/recipes-initramfs/initramfs-overlay-hook/files/overlay_recovery_action.script new file mode 100644 index 0000000..4ef0148 --- /dev/null +++ b/recipes-initramfs/initramfs-overlay-hook/files/overlay_recovery_action.script @@ -0,0 +1,14 @@ +#!/bin/sh +# +# CIP Core, generic profile +# +# Copyright (c) Siemens AG, 2024 +# +# Authors: +# Clara Kowalsky <clara.kowalsky@siemens.com> +# + +ovl_partition_device="$1" +partition_fstype="$2" + +mke2fs -t "$partition_fstype" "$ovl_partition_device" 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 index 955748f..7097130 100644 --- a/recipes-initramfs/initramfs-overlay-hook/initramfs-overlay-hook_0.1.bb +++ b/recipes-initramfs/initramfs-overlay-hook/initramfs-overlay-hook_0.1.bb @@ -12,9 +12,12 @@ inherit dpkg-raw +INITRAMFS_OVERLAY_RECOVERY_SCRIPT ??= "overlay_recovery_action.script" + SRC_URI += " \ file://overlay.hook \ file://overlay.script.tmpl \ + file://${INITRAMFS_OVERLAY_RECOVERY_SCRIPT} \ " # The variable INITRAMFS_OVERLAY_PATHS contains the directories which are @@ -35,7 +38,8 @@ TEMPLATE_FILES = "overlay.script.tmpl" TEMPLATE_VARS += " INITRAMFS_OVERLAY_STORAGE_PATH \ INITRAMFS_OVERLAY_PATHS \ INITRAMFS_OVERLAY_STORAGE_DEVICE \ - INITRAMFS_OVERLAY_MOUNT_OPTION" + INITRAMFS_OVERLAY_MOUNT_OPTION \ + INITRAMFS_OVERLAY_RECOVERY_SCRIPT" DEBIAN_DEPENDS = "initramfs-tools, awk, coreutils, util-linux" @@ -48,4 +52,6 @@ do_install() { "${D}/usr/share/initramfs-tools/hooks/overlay" install -m 0755 "${WORKDIR}/overlay.script" \ "${D}/usr/share/initramfs-tools/scripts/local-bottom/overlay" + install -m 0755 "${WORKDIR}/${INITRAMFS_OVERLAY_RECOVERY_SCRIPT}" \ + "${D}/usr/share/initramfs-tools/scripts" }
In case of ext*, this detects and fixes file system errors in the partition device before doing the partition mount. If the partition turns out to be broken, the factory state is recovered. Signed-off-by: Clara Kowalsky <clara.kowalsky@siemens.com> --- .../initramfs-overlay-hook/files/overlay.hook | 11 +++++++++-- .../files/overlay.script.tmpl | 11 ++++++++++- .../files/overlay_recovery_action.script | 14 ++++++++++++++ .../initramfs-overlay-hook_0.1.bb | 8 +++++++- 4 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 recipes-initramfs/initramfs-overlay-hook/files/overlay_recovery_action.script