From mboxrd@z Thu Jan 1 00:00:00 1970 X-GM-THRID: 7329816413997105152 X-Forwarded-Encrypted: i=2; AJvYcCX63YouCXBXVsQPcQnIWmfHOkRlrdfxur2d9m+dH0RqE+AZ5wpjrLc2vAJZVj/yfIrKs/SQvOCvWOq4xZ8Ze5l9tqoBG+J5WxOFfz4= X-Received: by 2002:a17:90b:3b82:b0:29c:687:810d with SMTP id pc2-20020a17090b3b8200b0029c0687810dmr1993171pjb.46.1710163995039; Mon, 11 Mar 2024 06:33:15 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com Received: by 2002:a17:90a:c387:b0:29b:e0ee:9070 with SMTP id h7-20020a17090ac38700b0029be0ee9070ls896543pjt.1.-pod-prod-08-us; Mon, 11 Mar 2024 06:33:13 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUO6CE+E6epnR5Yeo8xtyfUAy8zY41as93CnByBmHWpk7eUcaqIWPRuMdUEwDwnlXsZmo7JtnVoxu5xwsliAz2tGPDlNghQU7PiD9g= X-Google-Smtp-Source: AGHT+IGJULtssRFoHwaHxnHEJEP5ajVBkhT/Z06RHH7zETdXF2Of5TuhVoUO5a9TKRU6yknlpaLl X-Received: by 2002:a17:90a:fd92:b0:29b:bd2c:7238 with SMTP id cx18-20020a17090afd9200b0029bbd2c7238mr4927116pjb.7.1710163993626; Mon, 11 Mar 2024 06:33:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1710163993; cv=none; d=google.com; s=arc-20160816; b=aH3lCrWM7HA85ZuMik9POENroYpFpwdL6XSKFfY/u5X7mxzrznl/8yhNBfMvYCXOrd y4aZ3CP4OnLyWssXZEEzHm7Bl5MzesEVCh3uLbHN0GLhgAhbuggKbWHRT2x7x4YurK9N eVxfxDyY2l7Y17eYIjGbR6v699EafeCzdj69E2MqakyfTSqJvdqp2M/B2j38dTsDI9lF Ob50kEjoj/srBOZ39zPTJz9buPFlOpBIIlKjzZZCjiGJW3tMGcD8X5fbCu4n4j72W+7v BZP7WZpB8B3xMAPkKZQmDFWTDw9ez8m0v6A3DgbkkHDXvuCrZSJrWdqnsgyWC6sN3/kL WCkA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=feedback-id:content-transfer-encoding:mime-version:message-id:date :subject:to:from:dkim-signature; bh=wksRvIx/velJopYn1by9oMMU35bYAM5pVUUTsGoqZik=; fh=Jq2zqfuvFtwAjgHfuadW1i31L6IMRIKMCRCFNbvS4Mo=; b=ERy8ZOpwNLzkdueS4IPtruxEEdLVheavgnxJJGztJ8lLRf66x1ZccD7uiXNIL3UdmB Z6Yu95biaWohQeKr/20dCn2N+Hrv/xUKWfN7cWtS4r8jeOGjTV4FLwyMyhebmPNheSbF UBG4bpNVFJ0cNer6pjjfvbA1LqNRKnzVR56ychv56TE52FD3SiRNzeJlj48bHV1boc0n QE/RWrX5W/1dSb3e5HBzfTOgwBIllLvPlQTylqptW2BK/fM+p7qcV0dUapXKO518XQgd ukRmVJ1UmTyLz+KUW4EPaHKam0niYp8h62scZd/hNNKdADT1lHiaALONfIYIgeKAEroR Ur4Q==; dara=google.com ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b="Lvm/vB6G"; spf=pass (google.com: domain of fm-51332-202403111333106999cc3f18059f6700-paibnw@rts-flowmailer.siemens.com designates 185.136.64.226 as permitted sender) smtp.mailfrom=fm-51332-202403111333106999cc3f18059f6700-paIBnw@rts-flowmailer.siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com Return-Path: Received: from mta-64-226.siemens.flowmailer.net (mta-64-226.siemens.flowmailer.net. [185.136.64.226]) by gmr-mx.google.com with ESMTPS id l4-20020a17090a72c400b0029b9bc543d6si395073pjk.0.2024.03.11.06.33.13 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Mar 2024 06:33:13 -0700 (PDT) Received-SPF: pass (google.com: domain of fm-51332-202403111333106999cc3f18059f6700-paibnw@rts-flowmailer.siemens.com designates 185.136.64.226 as permitted sender) client-ip=185.136.64.226; Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b="Lvm/vB6G"; spf=pass (google.com: domain of fm-51332-202403111333106999cc3f18059f6700-paibnw@rts-flowmailer.siemens.com designates 185.136.64.226 as permitted sender) smtp.mailfrom=fm-51332-202403111333106999cc3f18059f6700-paIBnw@rts-flowmailer.siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com Received: by mta-64-226.siemens.flowmailer.net with ESMTPSA id 202403111333106999cc3f18059f6700 for ; Mon, 11 Mar 2024 14:33:11 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm1; d=siemens.com; i=Quirin.Gylstorff@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding; bh=wksRvIx/velJopYn1by9oMMU35bYAM5pVUUTsGoqZik=; b=Lvm/vB6GgDFZ4ceFyWB1zCKqF1xEYdMKjI8B5CZnzkHIDpA0thF+jotUW8gGHfqy5Y8jdf Zaq7+jJrmyqbABie/nO+bY12UYnPocRfLHgBI2zkbeK5MpTbfsdJkQ/juFOzl8UpELxGS8+Z AzbHOsuBZAYd3qibxQ+CEIqhSTWxo=; From: Quirin Gylstorff To: felix.moessbauer@siemens.com, isar-users@googlegroups.com, jan.kiszka@siemens.com Subject: [PATCH v4] add simple installer to isar Date: Mon, 11 Mar 2024 14:32:56 +0100 Message-ID: <20240311133310.1995709-1-Quirin.Gylstorff@siemens.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-51332:519-21489:flowmailer X-TUID: KK4l8Bh9Bv2E From: Quirin Gylstorff 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 --- 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 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. + 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..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..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..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/getty@tty1.service.d/ \ + ${D}/usr/lib/systemd/system/serial-getty@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/getty@tty1.service.d/override.conf + install -m 0600 ${WORKDIR}/install.override.conf ${D}/usr/lib/systemd/system/serial-getty@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") +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 +devices="$devices $mmc_devices" + +for device in $devices; do + case $device in + loop*) + # skip loop device + ;; + mtd*) + ;; + 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 + +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 +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