[PATCH] add simple installer to isar

65 views
Skip to first unread message

Quirin Gylstorff

unread,
Jan 30, 2024, 4:11:13 AM1/30/24
to xujie...@gmail.com, isar-...@googlegroups.com, jan.k...@siemens.com
From: Quirin Gylstorff <quirin.g...@siemens.com>

This is a example to create installer image which contains another
target image. It uses a multiconfig aproach to seperate the settings
of the installer from the target settings.

Signed-off-by: Quirin Gylstorff <quirin.g...@siemens.com>
---
kas/image/Kconfig | 14 ++++
kas/image/isar-image-installer.yaml | 13 +++
.../conf/multiconfig/installer-target.conf | 6 ++
.../conf/multiconfig/isar-installer.conf | 5 ++
.../images/isar-image-installer.bb | 17 ++++
.../deploy-image/deploy-image_0.1.bb | 21 +++++
.../deploy-image/files/deploy-image-wic.sh | 83 +++++++++++++++++++
.../deploy-image/files/install.override.conf | 5 ++
.../store-target-image_0.1.bb | 19 +++++
.../lib/wic/canned-wks/installer-efi.wks.in | 9 ++
10 files changed, 192 insertions(+)
create mode 100644 kas/image/isar-image-installer.yaml
create mode 100644 meta-isar/conf/multiconfig/installer-target.conf
create mode 100644 meta-isar/conf/multiconfig/isar-installer.conf
create mode 100644 meta-isar/recipes-core/images/isar-image-installer.bb
create mode 100644 meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
create mode 100644 meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh
create mode 100644 meta-isar/recipes-installer/deploy-image/files/install.override.conf
create mode 100644 meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb
create mode 100644 meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in

diff --git a/kas/image/Kconfig b/kas/image/Kconfig
index 8e617386..be6d7019 100644
--- a/kas/image/Kconfig
+++ b/kas/image/Kconfig
@@ -22,11 +22,25 @@ config IMAGE_DEBUG
help
This image includes some tools preinstalled useful for debug.

+menuconfig IMAGE_INSTALLER
+ bool "Installer image"
+ help
+ This image contains a target image and scripts to install that target image on a device.
+
+config INSTALLER_TARGET_IMAGE
+ string "Install Base or Debug image"
+ default "isar-image-base"
+ help
+ This selects the target image of the installer:
+ - isar-image-base
+ - isar-image-debug
+ depends on IMAGE_INSTALLER
endchoice

config KAS_INCLUDE_IMAGE
string
default "kas/image/isar-image-base.yaml" if IMAGE_BASE
default "kas/image/isar-image-debug.yaml" if IMAGE_DEBUG
+ default "kas/image/isar-image-installer.yaml" if IMAGE_INSTALLER

endmenu
diff --git a/kas/image/isar-image-installer.yaml b/kas/image/isar-image-installer.yaml
new file mode 100644
index 00000000..f9a3d346
--- /dev/null
+++ b/kas/image/isar-image-installer.yaml
@@ -0,0 +1,13 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+header:
+ version: 14
+
+target: isar-image-installer
+
+local_conf_header:
+ installer_multiconfig: |
+ BBMULTICONFIG += "installer-target"
diff --git a/meta-isar/conf/multiconfig/installer-target.conf b/meta-isar/conf/multiconfig/installer-target.conf
new file mode 100644
index 00000000..254c91a6
--- /dev/null
+++ b/meta-isar/conf/multiconfig/installer-target.conf
@@ -0,0 +1,6 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+IMAGE_FSTYPES += "wic.xz"
diff --git a/meta-isar/conf/multiconfig/isar-installer.conf b/meta-isar/conf/multiconfig/isar-installer.conf
new file mode 100644
index 00000000..11afcb85
--- /dev/null
+++ b/meta-isar/conf/multiconfig/isar-installer.conf
@@ -0,0 +1,5 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
diff --git a/meta-isar/recipes-core/images/isar-image-installer.bb b/meta-isar/recipes-core/images/isar-image-installer.bb
new file mode 100644
index 00000000..27de03d5
--- /dev/null
+++ b/meta-isar/recipes-core/images/isar-image-installer.bb
@@ -0,0 +1,17 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+inherit image
+DESCRIPTION = "Example of a ISAR based Installer Image"
+
+# Use variable to switch easily to another wks
+INSTALLER_WKS_FILE ??= "installer-efi.wks.in"
+WKS_FILE = "${INSTALLER_WKS_FILE}"
+IMAGER_INSTALL:wic:append = " systemd-boot"
+
+IMAGE_INSTALL += "store-target-image"
+IMAGE_INSTALL += "deploy-image"
+
+IMAGE_INSTALL:remove = "expand-on-first-boot"
diff --git a/meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb b/meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
new file mode 100644
index 00000000..9bf25445
--- /dev/null
+++ b/meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
@@ -0,0 +1,21 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+DESCRIPTION = "add target image to rootfs"
+
+
+inherit dpkg-raw
+
+SRC_URI = "file://deploy-image-wic.sh \
+ file://install.override.conf \
+ "
+DEPENDS = "store-target-image"
+DEBIAN_DEPENDS = "store-target-image, bmap-tools, pv, dialog, util-linux, parted, fdisk, gdisk, pigz, xz-utils, pbzip2"
+do_install[cleandirs] = "${D}/usr/bin/ \
+ ${D}/etc/systemd/system/ge...@tty1.service.d/"
+do_install() {
+ install -m 0755 ${WORKDIR}/deploy-image-wic.sh ${D}/usr/bin/deploy-image-wic.sh
+ install -m 0755 ${WORKDIR}/install.override.conf ${D}/etc/systemd/system/ge...@tty1.service.d/override.conf
+}
diff --git a/meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh b/meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh
new file mode 100644
index 00000000..0d1f4ba8
--- /dev/null
+++ b/meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh
@@ -0,0 +1,83 @@
+#!/bin/bash
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+DISK_IMAGE=$(find /install -type f -iname "*.wic*" -a -not -iname "*.wic.bmap")
+DISK_BMAP=$(find /install -type f -iname "$DISK_IMAGE.bmap")
+DISK_IMAGE_SIZE=$(cat /install/*_size)
+if [ "$DISK_IMAGE_SIZE" -gt "$(( 4096 * 1024 * 1024 ))" ]; then
+ echo "IMAGE_SIZE: '$DISK_IMAGE_SIZE' is to big for vfat"
+fi
+
+# inspired by poky/meta/recipes-core/initrdscripts/files/install-efi.sh
+
+target_device_list=""
+current_root_dev=$(grep "[[:blank:]]/[[:blank:]]" /proc/mounts | awk '{print $1}')
+current_root_dev=${current_root_dev#\/dev/}
+case $current_root_dev in
+ mmcblk*)
+ ;;
+ nvme*)
+ ;;
+ *)
+ current_root_dev=${current_root_dev%%[0-9]*}
+ ;;
+esac
+
+echo "Searching for target device..."
+
+devices=$(find /sys/block/ -type b,c,f,l -not -iname "mmcblk*" -printf "%f\n") || true
+mmc_devices=$(find /sys/block/ -type b,c,f,l -iname "mmcblk[0-9]" -printf "%f\n") || true
+devices="$devices $mmc_devices"
+
+for device in $devices; do
+ case $device in
+ loop*)
+ # skip loop device
+ ;;
+ sr*)
+ # skip CDROM device
+ ;;
+ ram*)
+ # skip ram device
+ ;;
+ *)
+ case $device in
+ $current_root_dev*)
+ # skip the device we are running from
+ ;;
+ *)
+ target_device_list="$target_device_list $device"
+ ;;
+ esac
+ ;;
+ esac
+done
+
+if [ -z "${target_device_list}" ]; then
+ dialog --msgbox "You need another device (besides the live device /dev/${current_root_dev}) to install the image. Installation aborted." 7 60
+ exit 1
+fi
+
+oldIFS=${IFS}
+IFS="|"
+set -- "${target_device_list}"
+TARGET_DEVICE=$(echo "${1}" | tr -d " ")
+IFS="${oldIFS}"
+
+set -e
+bmap_options=""
+if [ -z "$DISK_BMAP" ]; then
+ bmap_options="--nobmap"
+fi
+if ! bmaptool copy "${bmap_options}" "$DISK_IMAGE" "/dev/${TARGET_DEVICE}" > /install/bmap.log 2>&1; then
+ dialog --title "ERROR bmap failed with the following output" --textbox /install/bmap.log 24 140
+ exit 1
+fi
+
+umount /install
+sync
+dialog --title "Reboot" --msgbox "Installation is successful. System will be rebooted. Please remove the USB stick." 7 60
+reboot
diff --git a/meta-isar/recipes-installer/deploy-image/files/install.override.conf b/meta-isar/recipes-installer/deploy-image/files/install.override.conf
new file mode 100644
index 00000000..53e9627f
--- /dev/null
+++ b/meta-isar/recipes-installer/deploy-image/files/install.override.conf
@@ -0,0 +1,5 @@
+[Service]
+ExecStart=
+ExecStart=/bin/sh /usr/bin/deploy-image-wic.sh
+StandardInput=tty
+StandardOutput=tty
diff --git a/meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb b/meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb
new file mode 100644
index 00000000..feb3c6d7
--- /dev/null
+++ b/meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb
@@ -0,0 +1,19 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+DESCRIPTION = "Add a given target image to rootfs"
+
+inherit dpkg-raw
+
+INSTALLER_TARGET_IMAGE ??= "isar-image-base"
+IMG_DATA_FILE ??= "${INSTALLER_TARGET_IMAGE}-${DISTRO}-${MACHINE}"
+IMG_DATA_POSTFIX ??= "wic.xz"
+do_install[mcdepends] = "mc:installer:installer-target:${INSTALLER_TARGET_IMAGE}:do_image_wic"
+do_install[cleandirs] = "${D}/install/"
+do_install() {
+ install -m 0600 ${DEPLOY_DIR_IMAGE}/${IMG_DATA_FILE}.${IMG_DATA_POSTFIX} ${D}/install/
+ install -m 0600 ${DEPLOY_DIR_IMAGE}/${IMG_DATA_FILE}.wic.bmap ${D}/install/
+ echo $(du -b ${DEPLOY_DIR_IMAGE}/${IMG_DATA_FILE}.${IMG_DATA_POSTFIX} | awk '{print $1}') > ${D}/install/${IMG_DATA_FILE}_size
+}
diff --git a/meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in b/meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in
new file mode 100644
index 00000000..6ff46176
--- /dev/null
+++ b/meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in
@@ -0,0 +1,9 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+bootloader --ptable gpt --timeout 3 --append "rootwait console=ttyS0,115200 console=tty0 earlyprintk"
+part /boot --source bootimg-efi-isar --sourceparams "loader=systemd-boot" --label efi --part-type EF00 --align 1024
+part / --source rootfs --fstype ext4 --label installroot --align 1024 --use-uuid
+part /install --source rootfs --rootfs-dir=${IMAGE_ROOTFS}/install --label INSTALLDATA --fstype=vfat --use-uuid --align 1024
--
2.43.0

John W

unread,
Feb 7, 2024, 1:00:48 PM2/7/24
to isar-users
Thanks for sharing this patch!

In the deploy-image-wic.sh script there's the following line:

+TARGET_DEVICE=$(echo "${1}" | tr -d " ")

That will cause the detected drives to merge into one string, e.g. "sda sdb" to "sdasdb" and cause installation failure.

Regards,
John

Gylstorff Quirin

unread,
Feb 8, 2024, 8:04:02 AM2/8/24
to John W, isar-users


On 2/7/24 19:00, John W wrote:
> Thanks for sharing this patch!
>
> In the deploy-image-wic.sh script there's the following line:
>
> +TARGET_DEVICE=$(echo "${1}" | tr -d " ")
>
> That will cause the detected drives to merge into one string, e.g. "sda
> sdb" to "sdasdb" and cause installation failure.

Thanks for testing I will send a v2 to avoid that issue.

Quirin
>
> Regards,
> John
>
>
>
> On Tuesday, January 30, 2024 at 1:11:13 AM UTC-8 Quirin Gylstorff wrote:
>
> From: Quirin Gylstorff <quirin.g...@siemens.com>
>
> This is a example to create installer image which contains another
> target image. It uses a multiconfig aproach to seperate the settings
> of the installer from the target settings.
>
> Signed-off-by: Quirin Gylstorff <quirin.g...@siemens.com>
> ---
> kas/image/Kconfig | 14 ++++
> kas/image/isar-image-installer.yaml | 13 +++
> .../conf/multiconfig/installer-target.conf | 6 ++
> .../conf/multiconfig/isar-installer.conf | 5 ++
> .../images/isar-image-installer.bb <http://isar-image-installer.bb>
> | 17 ++++
> .../deploy-image/deploy-image_0.1.bb <http://deploy-image_0.1.bb> |
> 21 +++++
> .../deploy-image/files/deploy-image-wic.sh | 83 +++++++++++++++++++
> .../deploy-image/files/install.override.conf | 5 ++
> .../store-target-image_0.1.bb <http://store-target-image_0.1.bb> |
> 19 +++++
> .../lib/wic/canned-wks/installer-efi.wks.in
> <http://installer-efi.wks.in> | 9 ++
> 10 files changed, 192 insertions(+)
> create mode 100644 kas/image/isar-image-installer.yaml
> create mode 100644 meta-isar/conf/multiconfig/installer-target.conf
> create mode 100644 meta-isar/conf/multiconfig/isar-installer.conf
> create mode 100644
> meta-isar/recipes-core/images/isar-image-installer.bb
> <http://isar-image-installer.bb>
> create mode 100644
> meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
> <http://deploy-image_0.1.bb>
> create mode 100644
> meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh
> create mode 100644
> meta-isar/recipes-installer/deploy-image/files/install.override.conf
> create mode 100644
> meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb <http://store-target-image_0.1.bb>
> create mode 100644
> meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in
> <http://installer-efi.wks.in>
> <http://isar-image-installer.bb>
> b/meta-isar/recipes-core/images/isar-image-installer.bb
> <http://isar-image-installer.bb>
> new file mode 100644
> index 00000000..27de03d5
> --- /dev/null
> +++ b/meta-isar/recipes-core/images/isar-image-installer.bb
> <http://isar-image-installer.bb>
> @@ -0,0 +1,17 @@
> +# This software is a part of ISAR.
> +# Copyright (C) Siemens AG, 2024
> +#
> +# SPDX-License-Identifier: MIT
> +
> +inherit image
> +DESCRIPTION = "Example of a ISAR based Installer Image"
> +
> +# Use variable to switch easily to another wks
> +INSTALLER_WKS_FILE ??= "installer-efi.wks.in
> <http://installer-efi.wks.in>"
> +WKS_FILE = "${INSTALLER_WKS_FILE}"
> +IMAGER_INSTALL:wic:append = " systemd-boot"
> +
> +IMAGE_INSTALL += "store-target-image"
> +IMAGE_INSTALL += "deploy-image"
> +
> +IMAGE_INSTALL:remove = "expand-on-first-boot"
> diff --git
> a/meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
> <http://deploy-image_0.1.bb>
> b/meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
> <http://deploy-image_0.1.bb>
> new file mode 100644
> index 00000000..9bf25445
> --- /dev/null
> +++ b/meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
> <http://deploy-image_0.1.bb>
> a/meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb <http://store-target-image_0.1.bb> b/meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb <http://store-target-image_0.1.bb>
> new file mode 100644
> index 00000000..feb3c6d7
> --- /dev/null
> +++
> b/meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb <http://store-target-image_0.1.bb>
> <http://installer-efi.wks.in>
> b/meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in
> <http://installer-efi.wks.in>
> new file mode 100644
> index 00000000..6ff46176
> --- /dev/null
> +++ b/meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in
> <http://installer-efi.wks.in>
> @@ -0,0 +1,9 @@
> +# This software is a part of ISAR.
> +# Copyright (C) Siemens AG, 2024
> +#
> +# SPDX-License-Identifier: MIT
> +
> +bootloader --ptable gpt --timeout 3 --append "rootwait
> console=ttyS0,115200 console=tty0 earlyprintk"
> +part /boot --source bootimg-efi-isar --sourceparams
> "loader=systemd-boot" --label efi --part-type EF00 --align 1024
> +part / --source rootfs --fstype ext4 --label installroot --align
> 1024 --use-uuid
> +part /install --source rootfs --rootfs-dir=${IMAGE_ROOTFS}/install
> --label INSTALLDATA --fstype=vfat --use-uuid --align 1024
> --
> 2.43.0
>
> --
> You received this message because you are subscribed to the Google
> Groups "isar-users" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to isar-users+...@googlegroups.com
> <mailto:isar-users+...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/isar-users/ec72b591-caba-49d7-a201-58c8df2fac21n%40googlegroups.com <https://groups.google.com/d/msgid/isar-users/ec72b591-caba-49d7-a201-58c8df2fac21n%40googlegroups.com?utm_medium=email&utm_source=footer>.

Quirin Gylstorff

unread,
Feb 8, 2024, 3:29:38 PM2/8/24
to xujie...@gmail.com, isar-...@googlegroups.com, jan.k...@siemens.com
From: Quirin Gylstorff <quirin.g...@siemens.com>

This is a example to create installer image which contains another
target image. It uses a multiconfig aproach to seperate the settings
of the installer from the target settings.

Signed-off-by: Quirin Gylstorff <quirin.g...@siemens.com>
---
Changes v2:
- Add dialog in case of multiple disk targets
- Add dialog before starting the installtion
This was added as there was no indication that an installation
occurs
- add `--use-uuid` for boot section in installer wic to avoid an error
if the target disk is mount as /dev/sda
- remove unnecessary /bin/sh from getty override


kas/image/Kconfig | 14 +++
kas/image/isar-image-installer.yaml | 13 +++
.../conf/multiconfig/installer-target.conf | 6 ++
.../conf/multiconfig/isar-installer.conf | 5 +
.../images/isar-image-installer.bb | 17 ++++
.../deploy-image/deploy-image_0.1.bb | 21 +++++
.../deploy-image/files/deploy-image-wic.sh | 94 +++++++++++++++++++
.../deploy-image/files/install.override.conf | 5 +
.../store-target-image_0.1.bb | 19 ++++
.../lib/wic/canned-wks/installer-efi.wks.in | 9 ++
10 files changed, 203 insertions(+)
create mode 100644 kas/image/isar-image-installer.yaml
create mode 100644 meta-isar/conf/multiconfig/installer-target.conf
create mode 100644 meta-isar/conf/multiconfig/isar-installer.conf
create mode 100644 meta-isar/recipes-core/images/isar-image-installer.bb
create mode 100644 meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
create mode 100644 meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh
create mode 100644 meta-isar/recipes-installer/deploy-image/files/install.override.conf
create mode 100644 meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb
create mode 100644 meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in
index 00000000..a2c466dd
--- /dev/null
+++ b/kas/image/isar-image-installer.yaml
@@ -0,0 +1,13 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+header:
+ version: 14
+
+target: mc:installer:isar-image-installer
+
+local_conf_header:
+ installer_multiconfig: |
+ BBMULTICONFIG += "installer installer-target"
diff --git a/meta-isar/conf/multiconfig/installer-target.conf b/meta-isar/conf/multiconfig/installer-target.conf
new file mode 100644
index 00000000..254c91a6
--- /dev/null
+++ b/meta-isar/conf/multiconfig/installer-target.conf
@@ -0,0 +1,6 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+IMAGE_FSTYPES += "wic.xz"
diff --git a/meta-isar/conf/multiconfig/isar-installer.conf b/meta-isar/conf/multiconfig/isar-installer.conf
new file mode 100644
index 00000000..11afcb85
--- /dev/null
+++ b/meta-isar/conf/multiconfig/isar-installer.conf
@@ -0,0 +1,5 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
diff --git a/meta-isar/recipes-core/images/isar-image-installer.bb b/meta-isar/recipes-core/images/isar-image-installer.bb
new file mode 100644
index 00000000..27de03d5
--- /dev/null
+++ b/meta-isar/recipes-core/images/isar-image-installer.bb
@@ -0,0 +1,17 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+inherit image
+DESCRIPTION = "Example of a ISAR based Installer Image"
+
+# Use variable to switch easily to another wks
+INSTALLER_WKS_FILE ??= "installer-efi.wks.in"
+WKS_FILE = "${INSTALLER_WKS_FILE}"
+IMAGER_INSTALL:wic:append = " systemd-boot"
+
+IMAGE_INSTALL += "store-target-image"
+IMAGE_INSTALL += "deploy-image"
+
+IMAGE_INSTALL:remove = "expand-on-first-boot"
diff --git a/meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb b/meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
new file mode 100644
index 00000000..9bf25445
--- /dev/null
+++ b/meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
@@ -0,0 +1,21 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+DESCRIPTION = "add target image to rootfs"
+
+
+inherit dpkg-raw
+
+SRC_URI = "file://deploy-image-wic.sh \
+ file://install.override.conf \
+ "
+DEPENDS = "store-target-image"
+DEBIAN_DEPENDS = "store-target-image, bmap-tools, pv, dialog, util-linux, parted, fdisk, gdisk, pigz, xz-utils, pbzip2"
+do_install[cleandirs] = "${D}/usr/bin/ \
+ ${D}/etc/systemd/system/ge...@tty1.service.d/"
+do_install() {
+ install -m 0755 ${WORKDIR}/deploy-image-wic.sh ${D}/usr/bin/deploy-image-wic.sh
+ install -m 0755 ${WORKDIR}/install.override.conf ${D}/etc/systemd/system/ge...@tty1.service.d/override.conf
+}
diff --git a/meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh b/meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh
new file mode 100644
index 00000000..6f1cf96a
--- /dev/null
+++ b/meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh
@@ -0,0 +1,94 @@
+#!/usr/bin/env bash
+ mtd*)
+if [ "$(echo "$target_device_list" | wc -w)" -gt 1 ]; then
+ array=()
+ for target in $target_device_list; do
+ array+=("$target" "/dev/$target")
+ done
+ TARGET_DEVICE=$(dialog --clear \
+ --no-tags --menu "Select device to install $DISK_IMAGE" 10 60 3 \
+ "${array[@]}" --output-fd 1)
+
+else
+ TARGET_DEVICE=$(echo "$target_device_list" | tr -d " ")
+fi
+
+dialog --msgbox "Start installing '$DISK_IMAGE' to '$TARGET_DEVICE'." 7 60
+
+set -e
+bmap_options=""
+if [ -z "$DISK_BMAP" ]; then
+ bmap_options="--nobmap"
+fi
+if ! bmaptool copy "${bmap_options}" "$DISK_IMAGE" "/dev/${TARGET_DEVICE}" > /install/bmap.log 2>&1; then
+ dialog --title "ERROR bmap failed with the following output" --textbox /install/bmap.log 24 140
+ exit 1
+fi
+
+umount /install
+sync
+dialog --title "Reboot" --msgbox "Installation is successful. System will be rebooted. Please remove the USB stick." 7 60
+reboot
diff --git a/meta-isar/recipes-installer/deploy-image/files/install.override.conf b/meta-isar/recipes-installer/deploy-image/files/install.override.conf
new file mode 100644
index 00000000..73874caa
--- /dev/null
+++ b/meta-isar/recipes-installer/deploy-image/files/install.override.conf
@@ -0,0 +1,5 @@
+[Service]
+ExecStart=
+ExecStart=/usr/bin/deploy-image-wic.sh
+StandardInput=tty
+StandardOutput=tty
diff --git a/meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb b/meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb
new file mode 100644
index 00000000..feb3c6d7
--- /dev/null
+++ b/meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb
@@ -0,0 +1,19 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+DESCRIPTION = "Add a given target image to rootfs"
+
+inherit dpkg-raw
+
+INSTALLER_TARGET_IMAGE ??= "isar-image-base"
+IMG_DATA_FILE ??= "${INSTALLER_TARGET_IMAGE}-${DISTRO}-${MACHINE}"
+IMG_DATA_POSTFIX ??= "wic.xz"
+do_install[mcdepends] = "mc:installer:installer-target:${INSTALLER_TARGET_IMAGE}:do_image_wic"
+do_install[cleandirs] = "${D}/install/"
+do_install() {
+ install -m 0600 ${DEPLOY_DIR_IMAGE}/${IMG_DATA_FILE}.${IMG_DATA_POSTFIX} ${D}/install/
+ install -m 0600 ${DEPLOY_DIR_IMAGE}/${IMG_DATA_FILE}.wic.bmap ${D}/install/
+ echo $(du -b ${DEPLOY_DIR_IMAGE}/${IMG_DATA_FILE}.${IMG_DATA_POSTFIX} | awk '{print $1}') > ${D}/install/${IMG_DATA_FILE}_size
+}
diff --git a/meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in b/meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in
new file mode 100644
index 00000000..e2be17f1
--- /dev/null
+++ b/meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in
@@ -0,0 +1,9 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+bootloader --ptable gpt --timeout 3 --append "rootwait console=ttyS0,115200 console=tty0 earlyprintk"
+part /boot --source bootimg-efi-isar --sourceparams "loader=systemd-boot" --label efi --part-type EF00 --align 1024 --use-uuid

MOESSBAUER, Felix

unread,
Feb 22, 2024, 6:46:50 AM2/22/24
to quirin.g...@siemens.com, isar-...@googlegroups.com, Kiszka, Jan, xujie...@gmail.com
On Thu, 2024-02-08 at 21:28 +0100, 'Quirin Gylstorff' via isar-users
wrote:
Currently, an image must be included. However, this installer would
also be useful without an image. Then, a user could manually copy in an
image file. Please add this option as well.
Please install to /usr/lib/systemd/...
Where does this file come from? Why not just measure the size or read
from the bmap?
Please use --change-directory=install instead of --rootfs-dir=. As we
use vfat and the installer is only able to deploy a single file, please
just use a fixed size of 4GB of that partition. By that, we can easily
manually copy in images.

Anyways, this installer would be a great addition to ISAR.

Felix

> --label INSTALLDATA --fstype=vfat --use-uuid --align 1024
> --
> 2.43.0
>

--
Siemens AG, Technology
Linux Expert Center


MOESSBAUER, Felix

unread,
Feb 22, 2024, 6:53:55 AM2/22/24
to quirin.g...@siemens.com, isar-...@googlegroups.com, Kiszka, Jan, xujie...@gmail.com
On Thu, 2024-02-08 at 21:28 +0100, 'Quirin Gylstorff' via isar-users
wrote:
>  create mode 100644 meta-isar/recipes-core/images/isar-image-
> installer.bb
>  create mode 100644 meta-isar/recipes-installer/deploy-image/deploy-
> image_0.1.bb
>  create mode 100644 meta-isar/recipes-installer/deploy-
> image/files/deploy-image-wic.sh
>  create mode 100644 meta-isar/recipes-installer/deploy-
> image/files/install.override.conf
>  create mode 100644 meta-isar/recipes-installer/store-target-
> image/store-target-image_0.1.bb
>  create mode 100644 meta-isar/scripts/lib/wic/canned-wks/installer-
> efi.wks.in
>
Please switch over to zstandard (zst), as compression and esp.
decompression is much faster and requires less memory.

Yocto also uses zst as default compression type for some time now.

Felix

> diff --git a/meta-isar/conf/multiconfig/isar-installer.conf b/meta-
> isar/conf/multiconfig/isar-installer.conf

Quirin Gylstorff

unread,
Feb 22, 2024, 9:58:40 AM2/22/24
to xujie...@gmail.com, isar-...@googlegroups.com, jan.k...@siemens.com, felix.mo...@siemens.com
From: Quirin Gylstorff <quirin.g...@siemens.com>

This is a example to create installer image which contains another
target image. It uses a multiconfig aproach to seperate the settings
of the installer from the target settings.

Signed-off-by: Quirin Gylstorff <quirin.g...@siemens.com>
---
Changes v3:
- remove disk size
- add menu to select disk image if no wic image was found
- allow empty target this will
- set INSTALLDATA partition size to 4G
- use --change-directory in wks file

Changes v2:
- Add dialog in case of multiple disk targets
- Add dialog before starting the installtion
This was added as there was no indication that an installation
occurs
- add `--use-uuid` for boot section in installer wic to avoid an
error
if the target disk is mount as /dev/sda
- remove unnecessary /bin/sh from getty override

kas/image/Kconfig | 17 +++
kas/image/isar-image-installer.yaml | 13 +++
.../conf/multiconfig/installer-target.conf | 6 +
.../conf/multiconfig/isar-installer.conf | 5 +
.../images/isar-image-installer.bb | 17 +++
.../deploy-image/deploy-image_0.1.bb | 21 ++++
.../deploy-image/files/deploy-image-wic.sh | 107 ++++++++++++++++++
.../deploy-image/files/install.override.conf | 5 +
.../store-target-image_0.1.bb | 23 ++++
.../lib/wic/canned-wks/installer-efi.wks.in | 9 ++
10 files changed, 223 insertions(+)
create mode 100644 kas/image/isar-image-installer.yaml
create mode 100644 meta-isar/conf/multiconfig/installer-target.conf
create mode 100644 meta-isar/conf/multiconfig/isar-installer.conf
create mode 100644 meta-isar/recipes-core/images/isar-image-installer.bb
create mode 100644 meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
create mode 100644 meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh
create mode 100644 meta-isar/recipes-installer/deploy-image/files/install.override.conf
create mode 100644 meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb
create mode 100644 meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in

diff --git a/kas/image/Kconfig b/kas/image/Kconfig
index 8e617386..bc789064 100644
--- a/kas/image/Kconfig
+++ b/kas/image/Kconfig
@@ -22,11 +22,28 @@ config IMAGE_DEBUG
help
This image includes some tools preinstalled useful for debug.

+menuconfig IMAGE_INSTALLER
+ bool "Installer image"
+ help
+ This image contains a target image and scripts to install the target image on a device.
+
+config INSTALLER_TARGET_IMAGE
+ string "Install Base or Debug image"
+ default "isar-image-base"
+ help
+ This selects the target image of the installer:
+ - isar-image-base
+ - isar-image-debug
+ If left empty it will generate a installer image without payload.
+ The user of that image needs then to copy a image to the partition
+ labeled INSTALLDATA.
index 00000000..d987c5d0
--- /dev/null
+++ b/meta-isar/conf/multiconfig/installer-target.conf
@@ -0,0 +1,6 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+IMAGE_FSTYPES += "wic.zst"
diff --git a/meta-isar/conf/multiconfig/isar-installer.conf b/meta-isar/conf/multiconfig/isar-installer.conf
new file mode 100644
index 00000000..ff5a9b4f
--- /dev/null
+++ b/meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
@@ -0,0 +1,21 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+DESCRIPTION = "add target image to rootfs"
+
+
+inherit dpkg-raw
+
+SRC_URI = "file://deploy-image-wic.sh \
+ file://install.override.conf \
+ "
+DEPENDS = "store-target-image"
+DEBIAN_DEPENDS = "store-target-image, bmap-tools, pv, dialog, util-linux, parted, fdisk, gdisk, pigz, xz-utils, pbzip2, zstd"
+do_install[cleandirs] = "${D}/usr/bin/ \
+ ${D}/usr/lib/systemd/system/ge...@tty1.service.d/"
+do_install() {
+ install -m 0755 ${WORKDIR}/deploy-image-wic.sh ${D}/usr/bin/deploy-image-wic.sh
+ install -m 0755 ${WORKDIR}/install.override.conf ${D}/usr/lib/systemd/system/ge...@tty1.service.d/override.conf
+}
diff --git a/meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh b/meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh
new file mode 100644
index 00000000..a3803302
--- /dev/null
+++ b/meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh
@@ -0,0 +1,107 @@
+#!/usr/bin/env bash
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+installdata=${INSTALL_DATA:-/install}
+
+DISK_IMAGE=$(find "$installdata" -type f -iname "*.wic*" -a -not -iname "*.wic.bmap")
+if [ -z "$DISK_IMAGE" ]; then
+ pushd "$installdata"
+ shopt -s nullglob
+ array=(*)
+ shopt -u nullglob
+ DISK_IMAGE=$(dialog --clear \
+ --no-tags --menu "Select image to be installed" 10 60 3 \
+ "${array[@]}" --output-fd 1)
+ popd
+fi
+if [ ! -f "$DISK_IMAGE" ]; then
+ dialog --msgbox "Could not find an image to install. Installation aborted." 7 60
+ exit 1
+fi
+DISK_BMAP=$(find "$installdata" -type f -iname "$DISK_IMAGE.bmap")
+# inspired by poky/meta/recipes-core/initrdscripts/files/install-efi.sh
+
+target_device_list=""
+current_root_dev=$(grep "[[:blank:]]/[[:blank:]]" /proc/mounts | awk '{print $1}')
+current_root_dev=${current_root_dev#\/dev/}
+case $current_root_dev in
+ mmcblk*)
+ ;;
+ nvme*)
+ ;;
+ *)
+ current_root_dev=${current_root_dev%%[0-9]*}
+ ;;
+esac
+
+echo "Searching for target device..."
+
+devices=$(find /sys/block/ -type b,c,f,l -not -iname "mmcblk*" -printf "%f\n") || true
+mmc_devices=$(find /sys/block/ -type b,c,f,l -iname "mmcblk[0-9]" -printf "%f\n") || true
+if ! bmaptool copy "${bmap_options}" "$DISK_IMAGE" "/dev/${TARGET_DEVICE}" > "$installdata"/bmap.log 2>&1; then
+ dialog --title "ERROR bmap failed with the following output" --textbox "$installdata"/bmap.log 24 140
+ exit 1
+fi
+
+# we need to umount before reboot to avoid
+# data corruption due to the use of vfat.
+umount "$installdata"
+sync
+dialog --title "Reboot" --msgbox "Installation is successful. System will be rebooted. Please remove the USB stick." 7 60
+reboot
diff --git a/meta-isar/recipes-installer/deploy-image/files/install.override.conf b/meta-isar/recipes-installer/deploy-image/files/install.override.conf
new file mode 100644
index 00000000..73874caa
--- /dev/null
+++ b/meta-isar/recipes-installer/deploy-image/files/install.override.conf
@@ -0,0 +1,5 @@
+[Service]
+ExecStart=
+ExecStart=/usr/bin/deploy-image-wic.sh
+StandardInput=tty
+StandardOutput=tty
diff --git a/meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb b/meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb
new file mode 100644
index 00000000..9150ce79
--- /dev/null
+++ b/meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb
@@ -0,0 +1,23 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+DESCRIPTION = "Add a given target image to rootfs"
+
+inherit dpkg-raw
+
+INSTALLER_TARGET_IMAGE ??= "isar-image-base"
+IMG_DATA_FILE ??= "${INSTALLER_TARGET_IMAGE}-${DISTRO}-${MACHINE}"
+IMG_DATA_POSTFIX ??= "wic.zst"
+do_install[mcdepends] = "${@ 'mc:installer:installer-target:' + d.getVar('INSTALLER_TARGET_IMAGE') + ':do_image_wic' if d.getVar('INSTALLER_TARGET_IMAGE') else ''}"
+do_install[cleandirs] = "${D}/install/"
+do_install() {
+ if [ -f ${DEPLOY_DIR_IMAGE}/${IMG_DATA_FILE}.${IMG_DATA_POSTFIX} ]; then
+ install -m 0600 ${DEPLOY_DIR_IMAGE}/${IMG_DATA_FILE}.${IMG_DATA_POSTFIX} ${D}/install/
+ install -m 0600 ${DEPLOY_DIR_IMAGE}/${IMG_DATA_FILE}.wic.bmap ${D}/install/
+ else
+ # mcopy cannot handle .keep or empty directory , therefore use visible file
+ touch ${D}/install/keep
+ fi
+}
diff --git a/meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in b/meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in
new file mode 100644
index 00000000..daaec3f6
--- /dev/null
+++ b/meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in
@@ -0,0 +1,9 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+bootloader --ptable gpt --timeout 3 --append "rootwait console=ttyS0,115200 console=tty0 earlyprintk"
+part /boot --source bootimg-efi-isar --sourceparams "loader=systemd-boot" --label efi --part-type EF00 --align 1024 --use-uuid
+part / --source rootfs --fstype ext4 --label installroot --align 1024 --use-uuid
+part /install --source rootfs --change-directory=install --label INSTALLDATA --size 4G --fstype=vfat --use-uuid --align 1024
--
2.43.0

MOESSBAUER, Felix

unread,
Mar 4, 2024, 11:32:40 AM3/4/24
to Schmidt, Adriaan, quirin.g...@siemens.com, isar-...@googlegroups.com, Kiszka, Jan, xujie...@gmail.com
>  create mode 100644 meta-isar/recipes-core/images/isar-image-
> installer.bb
>  create mode 100644 meta-isar/recipes-installer/deploy-image/deploy-
> image_0.1.bb
>  create mode 100644 meta-isar/recipes-installer/deploy-
> image/files/deploy-image-wic.sh
>  create mode 100644 meta-isar/recipes-installer/deploy-
> image/files/install.override.conf
>  create mode 100644 meta-isar/recipes-installer/store-target-
> image/store-target-image_0.1.bb
>  create mode 100644 meta-isar/scripts/lib/wic/canned-wks/installer-
> efi.wks.in
>
Do we really need to do this via a package? This requires a lot of
duplicated resources:

- re-compress potentially gigabytes of data with gz
- upload this package into the apt cache and to sstate

IMHO it would be better to deploy directly into the rootfs.

+ Adriaan

Felix

MOESSBAUER, Felix

unread,
Mar 5, 2024, 3:24:24 AM3/5/24
to quirin.g...@siemens.com, isar-...@googlegroups.com, Kiszka, Jan, xujie...@gmail.com
On Thu, 2024-02-22 at 15:58 +0100, Quirin Gylstorff wrote:
>  create mode 100644 meta-isar/recipes-core/images/isar-image-
> installer.bb
>  create mode 100644 meta-isar/recipes-installer/deploy-image/deploy-
> image_0.1.bb
>  create mode 100644 meta-isar/recipes-installer/deploy-
> image/files/deploy-image-wic.sh
>  create mode 100644 meta-isar/recipes-installer/deploy-
> image/files/install.override.conf
>  create mode 100644 meta-isar/recipes-installer/store-target-
> image/store-target-image_0.1.bb
>  create mode 100644 meta-isar/scripts/lib/wic/canned-wks/installer-
> efi.wks.in
>
Please also enable this on the ttyS0:

+ install -m 0755 ${WORKDIR}/install.override.conf
${D}/usr/lib/systemd/system/serial...@ttyS0.service.d/override.conf

> +}
> diff --git a/meta-isar/recipes-installer/deploy-image/files/deploy-
> image-wic.sh b/meta-isar/recipes-installer/deploy-image/files/deploy-
> image-wic.sh
This information is useless, as the user cannot know how the devices
are enumerated. At least the device size and maybe vendor should be
shown to let the user select the correct device.

Please also add an exit button if the user does not want to install
(instead of forcing him to run CTRL-C).

> +
> +else
> +    TARGET_DEVICE=$(echo "$target_device_list" | tr -d " ")
> +fi
> +
> +dialog --msgbox "Start installing '$DISK_IMAGE' to
> '$TARGET_DEVICE'." 7 60
> +
> +set -e
> +bmap_options=""
> +if [ -z "$DISK_BMAP" ]; then
> +    bmap_options="--nobmap"
> +fi
> +if ! bmaptool copy "${bmap_options}" "$DISK_IMAGE"
> "/dev/${TARGET_DEVICE}" > "$installdata"/bmap.log 2>&1; then
> +    dialog --title "ERROR bmap failed with the following output" --
> textbox "$installdata"/bmap.log 24 140
> +    exit 1
> +fi

By this no progress is shown. I played around with --psplash-pipe and
dialog --gauge, but unfortunately this is broken till 3.7 (due to a bug
in bmap-tools). How about leaving the dialog and just showing the
output of the bmaptool?

Felix

MOESSBAUER, Felix

unread,
Mar 6, 2024, 7:20:41 AM3/6/24
to quirin.g...@siemens.com, isar-...@googlegroups.com, Kiszka, Jan, xujie...@gmail.com
On Thu, 2024-02-22 at 15:58 +0100, Quirin Gylstorff wrote:
>  create mode 100644 meta-isar/recipes-core/images/isar-image-
> installer.bb
>  create mode 100644 meta-isar/recipes-installer/deploy-image/deploy-
> image_0.1.bb
>  create mode 100644 meta-isar/recipes-installer/deploy-
> image/files/deploy-image-wic.sh
>  create mode 100644 meta-isar/recipes-installer/deploy-
> image/files/install.override.conf
>  create mode 100644 meta-isar/recipes-installer/store-target-
> image/store-target-image_0.1.bb
>  create mode 100644 meta-isar/scripts/lib/wic/canned-wks/installer-
> efi.wks.in
>
"installer" does not exist. Should it be "isar-installer"?

> diff --git a/meta-isar/conf/multiconfig/installer-target.conf b/meta-
> isar/conf/multiconfig/installer-target.conf
> new file mode 100644
> index 00000000..d987c5d0
> --- /dev/null
> +++ b/meta-isar/conf/multiconfig/installer-target.conf
> @@ -0,0 +1,6 @@
> +# This software is a part of ISAR.
> +# Copyright (C) Siemens AG, 2024
> +#
> +# SPDX-License-Identifier: MIT
> +
> +IMAGE_FSTYPES += "wic.zst"

This only works for a >=bookworm installer, which is sometimes tricky
to achieve if a BSP is needed for the machine. E.g. for some arm
machines, we still have bullseye only BSPs.
In case zstd is not supported by bmaptool, a completely misleading
error message is printed, as reported in [1].

We better use the following:

TARGET_IMAGE_FSTYPE = "wic.zst"
TARGET_IMAGE_FSTYPE:buster = "wic.xz"
TARGET_IMAGE_FSTYPE:bullseye = "wic.xz"

IMAGE_FSTYPES += "${TARGET_IMAGE_FSTYPE}"

[1] https://github.com/intel/bmap-tools/issues/132

Felix

> diff --git a/meta-isar/conf/multiconfig/isar-installer.conf b/meta-
> isar/conf/multiconfig/isar-installer.conf

MOESSBAUER, Felix

unread,
Mar 7, 2024, 5:44:31 AM3/7/24
to quirin.g...@siemens.com, isar-...@googlegroups.com, Kiszka, Jan, xujie...@gmail.com
On Thu, 2024-02-22 at 15:58 +0100, Quirin Gylstorff wrote:
>  create mode 100644 meta-isar/recipes-core/images/isar-image-
> installer.bb
>  create mode 100644 meta-isar/recipes-installer/deploy-image/deploy-
> image_0.1.bb
>  create mode 100644 meta-isar/recipes-installer/deploy-
> image/files/deploy-image-wic.sh
>  create mode 100644 meta-isar/recipes-installer/deploy-
> image/files/install.override.conf
>  create mode 100644 meta-isar/recipes-installer/store-target-
> image/store-target-image_0.1.bb
>  create mode 100644 meta-isar/scripts/lib/wic/canned-wks/installer-
> efi.wks.in
>
We need to exclude the /install folder here, otherwise the installer
will contain the payload twice.

Felix

> +part /install --source rootfs --change-directory=install --label
> INSTALLDATA --size 4G --fstype=vfat --use-uuid --align 1024

--

Quirin Gylstorff

unread,
Mar 11, 2024, 9:33:15 AM3/11/24
to felix.mo...@siemens.com, isar-...@googlegroups.com, jan.k...@siemens.com
From: Quirin Gylstorff <quirin.g...@siemens.com>

This is a example to create installer image which contains another
target image. It uses a multiconfig aproach to seperate the settings
of the installer from the target settings.

Signed-off-by: Quirin Gylstorff <quirin.g...@siemens.com>
---
Changes v4:
- rebase onto next
- add serial console output
- add missing isar-installer
- fixed fstye
- exclude /install from rootfs
- show raw bmaptool progress

Changes v3:
- remove disk size
- add menu to select disk image if no wic image was found
- allow empty target this will
- set INSTALLDATA partition size to 4G
- use --change-directory in wks file

Changes v2:
- Add dialog in case of multiple disk targets
- Add dialog before starting the installtion
This was added as there was no indication that an installation
occurs
- add `--use-uuid` for boot section in installer wic to avoid an
error
if the target disk is mount as /dev/sda
- remove unnecessary /bin/sh from getty override

kas/image/Kconfig | 17 +++
kas/image/isar-image-installer.yaml | 13 +++
.../conf/multiconfig/installer-target.conf | 10 ++
.../conf/multiconfig/isar-installer.conf | 5 +
.../images/isar-image-installer.bb | 17 +++
.../deploy-image/deploy-image_0.1.bb | 23 ++++
.../deploy-image/files/deploy-image-wic.sh | 107 ++++++++++++++++++
.../deploy-image/files/install.override.conf | 5 +
.../store-target-image_0.1.bb | 25 ++++
.../lib/wic/canned-wks/installer-efi.wks.in | 9 ++
10 files changed, 231 insertions(+)
create mode 100644 kas/image/isar-image-installer.yaml
create mode 100644 meta-isar/conf/multiconfig/installer-target.conf
create mode 100644 meta-isar/conf/multiconfig/isar-installer.conf
create mode 100644 meta-isar/recipes-core/images/isar-image-installer.bb
create mode 100644 meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
create mode 100644 meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh
create mode 100644 meta-isar/recipes-installer/deploy-image/files/install.override.conf
create mode 100644 meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb
create mode 100644 meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in

index 00000000..970e0a89
--- /dev/null
+++ b/kas/image/isar-image-installer.yaml
@@ -0,0 +1,13 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+header:
+ version: 14
+
+target: mc:isar-installer:isar-image-installer
+
+local_conf_header:
+ installer_multiconfig: |
+ BBMULTICONFIG += "isar-installer installer-target"
diff --git a/meta-isar/conf/multiconfig/installer-target.conf b/meta-isar/conf/multiconfig/installer-target.conf
new file mode 100644
index 00000000..3b53b58f
--- /dev/null
+++ b/meta-isar/conf/multiconfig/installer-target.conf
@@ -0,0 +1,10 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+TARGET_IMAGE_FSTYPE = "wic.zst"
+TARGET_IMAGE_FSTYPE:buster = "wic.xz"
+TARGET_IMAGE_FSTYPE:bullseye = "wic.xz"
+
+IMAGE_FSTYPES += "${TARGET_IMAGE_FSTYPE}"
diff --git a/meta-isar/conf/multiconfig/isar-installer.conf b/meta-isar/conf/multiconfig/isar-installer.conf
new file mode 100644
index 00000000..ea047849
--- /dev/null
+++ b/meta-isar/recipes-installer/deploy-image/deploy-image_0.1.bb
@@ -0,0 +1,23 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+DESCRIPTION = "add target image to rootfs"
+
+
+inherit dpkg-raw
+
+SRC_URI = "file://deploy-image-wic.sh \
+ file://install.override.conf \
+ "
+DEPENDS = "store-target-image"
+DEBIAN_DEPENDS = "store-target-image, bmap-tools, pv, dialog, util-linux, parted, fdisk, gdisk, pigz, xz-utils, pbzip2, zstd"
+do_install[cleandirs] = "${D}/usr/bin/ \
+ ${D}/usr/lib/systemd/system/ge...@tty1.service.d/ \
+ ${D}/usr/lib/systemd/system/serial...@ttyS0.service.d/"
+do_install() {
+ install -m 0755 ${WORKDIR}/deploy-image-wic.sh ${D}/usr/bin/deploy-image-wic.sh
+ install -m 0600 ${WORKDIR}/install.override.conf ${D}/usr/lib/systemd/system/ge...@tty1.service.d/override.conf
+ install -m 0600 ${WORKDIR}/install.override.conf ${D}/usr/lib/systemd/system/serial...@ttyS0.service.d/override.conf
+}
diff --git a/meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh b/meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh
new file mode 100644
index 00000000..6a28f6ef
--- /dev/null
+++ b/meta-isar/recipes-installer/deploy-image/files/deploy-image-wic.sh
@@ -0,0 +1,107 @@
+#!/usr/bin/env bash
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+installdata=${INSTALL_DATA:-/install}
+
+DISK_IMAGE=$(find "$installdata" -type f -iname "*.wic*" -a -not -iname "*.wic.bmap")
+devices=$(find /sys/block/ -type b,c,f,l -not -iname "mmcblk*" -printf "%f\n") || true
+mmc_devices=$(find /sys/block/ -type b,c,f,l -iname "mmcblk[0-9]" -printf "%f\n") || true
+clear
+if ! bmaptool copy "${bmap_options}" "$DISK_IMAGE" "/dev/${TARGET_DEVICE}"; then
+ exit 1
+fi
+
+# we need to umount before reboot to avoid
+# data corruption due to the use of vfat.
+umount "$installdata"
+sync
+dialog --title "Reboot" --msgbox "Installation is successful. System will be rebooted. Please remove the USB stick." 7 60
+reboot
diff --git a/meta-isar/recipes-installer/deploy-image/files/install.override.conf b/meta-isar/recipes-installer/deploy-image/files/install.override.conf
new file mode 100644
index 00000000..73874caa
--- /dev/null
+++ b/meta-isar/recipes-installer/deploy-image/files/install.override.conf
@@ -0,0 +1,5 @@
+[Service]
+ExecStart=
+ExecStart=/usr/bin/deploy-image-wic.sh
+StandardInput=tty
+StandardOutput=tty
diff --git a/meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb b/meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb
new file mode 100644
index 00000000..2f72412b
--- /dev/null
+++ b/meta-isar/recipes-installer/store-target-image/store-target-image_0.1.bb
@@ -0,0 +1,25 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+DESCRIPTION = "Add a given target image to rootfs"
+
+inherit dpkg-raw
+
+INSTALLER_TARGET_IMAGE ??= "isar-image-base"
+IMG_DATA_FILE ??= "${INSTALLER_TARGET_IMAGE}-${DISTRO}-${MACHINE}"
+IMG_DATA_POSTFIX ??= "wic.zst"
+IMG_DATA_POSTFIX:buster ??= "wic.xz"
+IMG_DATA_POSTFIX:bullseye ??= "wic.xz"
+do_install[mcdepends] = "${@ 'mc:isar-installer:installer-target:' + d.getVar('INSTALLER_TARGET_IMAGE') + ':do_image_wic' if d.getVar('INSTALLER_TARGET_IMAGE') else ''}"
+do_install[cleandirs] = "${D}/install/"
+do_install() {
+ if [ -f ${DEPLOY_DIR_IMAGE}/${IMG_DATA_FILE}.${IMG_DATA_POSTFIX} ]; then
+ install -m 0600 ${DEPLOY_DIR_IMAGE}/${IMG_DATA_FILE}.${IMG_DATA_POSTFIX} ${D}/install/
+ install -m 0600 ${DEPLOY_DIR_IMAGE}/${IMG_DATA_FILE}.wic.bmap ${D}/install/
+ else
+ # mcopy cannot handle .keep or empty directory , therefore use visible file
+ touch ${D}/install/keep
+ fi
+}
diff --git a/meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in b/meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in
new file mode 100644
index 00000000..62c045b6
--- /dev/null
+++ b/meta-isar/scripts/lib/wic/canned-wks/installer-efi.wks.in
@@ -0,0 +1,9 @@
+# This software is a part of ISAR.
+# Copyright (C) Siemens AG, 2024
+#
+# SPDX-License-Identifier: MIT
+
+bootloader --ptable gpt --timeout 3 --append "rootwait console=ttyS0,115200 console=tty0 earlyprintk"
+part /boot --source bootimg-efi-isar --sourceparams "loader=systemd-boot" --label efi --part-type EF00 --align 1024 --use-uuid
+part / --source rootfs --fstype ext4 --exclude-path=install --label installroot --align 1024 --use-uuid
+part /install --source rootfs --change-directory=install --label INSTALLDATA --size 4G --fstype=vfat --use-uuid --align 1024
--
2.43.0

Uladzimir Bely

unread,
Mar 15, 2024, 8:59:41 AM3/15/24
to Quirin Gylstorff, felix.mo...@siemens.com, isar-...@googlegroups.com, jan.k...@siemens.com
On Mon, 2024-03-11 at 14:32 +0100, 'Quirin Gylstorff' via isar-users
wrote:
Applied to next, thanks.

Anton Mikanovich

unread,
Apr 2, 2024, 11:04:38 AM4/2/24
to Quirin Gylstorff, isar-...@googlegroups.com, felix.mo...@siemens.com, jan.k...@siemens.com, Baurzhan Ismagulov
11/03/2024 15:32, 'Quirin Gylstorff' via isar-users wrote:
> From: Quirin Gylstorff <quirin.g...@siemens.com>
>
> This is a example to create installer image which contains another
> target image. It uses a multiconfig aproach to seperate the settings
> of the installer from the target settings.
>
> Signed-off-by: Quirin Gylstorff <quirin.g...@siemens.com>

Hello Quirin,

This part of functionality is not covered by CI but definitely should be.
Would you like to add some test cases?

Reply all
Reply to author
Forward
0 new messages