From b02f991423b243236dec877244feee1438d83f8a Mon Sep 17 00:00:00 2001 From: Helmut Buchsbaum Date: Thu, 10 Nov 2022 21:12:30 +0100 Subject: [PATCH] debian: Add grub config helpers for python3-acrn-board-inspector Installing python3-acrn-board-inspector should add a separate grub menu entry (which is also set as default) to ensure the kernel is parameterized correctly for the use with ACRN board inspector. So, rebooting after install will ensure the ACRN board inspector can run within the required environment. Deinstallation completely removes the this temporyr entry again. Remark: the required GRUB configuration files are linked to /var/lib/acrn-board-inspector (handled in maintainer scripts) to keep Debian packaging from adding them as conffiles, which would not remove the on 'apt remove' according to https://www.debian.org/doc/manuals/maint-guide/dother.en.html#conffiles Tracked-On: #8262 Signed-off-by: Helmut Buchsbaum --- debian/grub/20_acrn-board-inspector | 269 +++++++++++++++++++ debian/python3-acrn-board-inspector.install | 6 + debian/python3-acrn-board-inspector.postinst | 30 +++ debian/python3-acrn-board-inspector.postrm | 44 +++ debian/python3-acrn-board-inspector.trigger | 1 + 5 files changed, 350 insertions(+) create mode 100755 debian/grub/20_acrn-board-inspector create mode 100644 debian/python3-acrn-board-inspector.install create mode 100644 debian/python3-acrn-board-inspector.postinst create mode 100644 debian/python3-acrn-board-inspector.postrm create mode 100644 debian/python3-acrn-board-inspector.trigger diff --git a/debian/grub/20_acrn-board-inspector b/debian/grub/20_acrn-board-inspector new file mode 100755 index 000000000..61bd60d55 --- /dev/null +++ b/debian/grub/20_acrn-board-inspector @@ -0,0 +1,269 @@ +#! /bin/sh +set -e + +# grub-mkconfig helper script. +# Copyright (C) 2022 TTTech Industrial Automation AG +# +# Create boot menu entry to boot default entry with kernel parameters +# add required by acrn-board-inspector +# +# GRUB is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# GRUB is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GRUB. If not, see . + +. "$pkgdatadir/grub-mkconfig_lib" + +CLASS="--class gnu-linux --class gnu --class os" + +# to be appended for acrn-board-inspector +GRUB_CMDLINE_ACRN_BOARD_INSPECTOR="iomem=relaxed intel_idle.max_cstate=0 intel_pstate=disable" + +if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then + OS=GNU/Linux +else + case ${GRUB_DISTRIBUTOR} in + Ubuntu|Kubuntu) + OS="${GRUB_DISTRIBUTOR}" + ;; + *) + OS="${GRUB_DISTRIBUTOR} GNU/Linux" + ;; + esac + CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}" +fi + +# loop-AES arranges things so that /dev/loop/X can be our root device, but +# the initrds that Linux uses don't like that. +case ${GRUB_DEVICE} in + /dev/loop/*|/dev/loop[0-9]) + GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"` + # We can't cope with devices loop-mounted from files here. + case ${GRUB_DEVICE} in + /dev/*) ;; + *) exit 0 ;; + esac + ;; +esac + +# Default to disabling partition uuid support to maintian compatibility with +# older kernels. +GRUB_DISABLE_LINUX_PARTUUID=${GRUB_DISABLE_LINUX_PARTUUID-true} + +# btrfs may reside on multiple devices. We cannot pass them as value of root= parameter +# and mounting btrfs requires user space scanning, so force UUID in this case. +if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] && [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] ) \ + || ( [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ + && [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ] ) \ + || ( ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ + && ! test -e "/dev/disk/by-partuuid/${GRUB_DEVICE_PARTUUID}" ) \ + || ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then + LINUX_ROOT_DEVICE=${GRUB_DEVICE} +elif [ "x${GRUB_DEVICE_UUID}" = "x" ] \ + || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ]; then + LINUX_ROOT_DEVICE=PARTUUID=${GRUB_DEVICE_PARTUUID} +else + LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} +fi + +case x"$GRUB_FS" in + xbtrfs) + rootsubvol="`make_system_path_relative_to_its_root /`" + rootsubvol="${rootsubvol#/}" + if [ "x${rootsubvol}" != x ]; then + GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}" + fi;; + xzfs) + rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true` + bootfs="`make_system_path_relative_to_its_root / | sed -e "s,@$,,"`" + LINUX_ROOT_DEVICE="ZFS=${rpool}${bootfs%/}" + ;; +esac + +if [ -x /lib/recovery-mode/recovery-menu ]; then + GRUB_CMDLINE_LINUX_RECOVERY=recovery +else + GRUB_CMDLINE_LINUX_RECOVERY=single +fi + +linux_entry () +{ + os="$1" + version="$2" + args="$3" + + if [ -z "$boot_device_id" ]; then + boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")" + fi + echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-acrn-board-inspector-$boot_device_id' {" + + # Use ELILO's generic "efifb" when it's known to be available. + # FIXME: We need an interface to select vesafb in case efifb can't be used. + if [ "x$GRUB_GFXPAYLOAD_LINUX" = x ]; then + echo " load_video" + else + if [ "x$GRUB_GFXPAYLOAD_LINUX" != xtext ]; then + echo " load_video" + fi + fi + if [ "x$GRUB_GFXPAYLOAD_LINUX" != x ]; then + echo " gfxmode \$linux_gfx_mode" + fi + + echo " insmod gzio" + + if [ x$dirname = x/ ]; then + if [ -z "${prepare_root_cache}" ]; then + prepare_root_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE} | grub_add_tab)" + fi + printf '%s\n' "${prepare_root_cache}" + else + if [ -z "${prepare_boot_cache}" ]; then + prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | grub_add_tab)" + fi + printf '%s\n' "${prepare_boot_cache}" + fi + message="$(gettext_printf "Loading Linux %s ..." ${version})" + cat << EOF + echo '$(echo "$message" | grub_quote)' +EOF + if test -d /sys/firmware/efi && test -e "${linux}.efi.signed"; then + cat << EOF + linux ${rel_dirname}/${basename}.efi.signed root=${linux_root_device_thisversion} ro ${args} +EOF + else + cat << EOF + linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args} +EOF + fi + if test -n "${initrd}" ; then + # TRANSLATORS: ramdisk isn't identifier. Should be translated. + message="$(gettext_printf "Loading initial ramdisk ...")" + cat << EOF + echo '$(echo "$message" | grub_quote)' +EOF + initrd_path= + for i in ${initrd}; do + initrd_path="${initrd_path} ${rel_dirname}/${i}" + done + cat << EOF + initrd $(echo $initrd_path) +EOF + fi + cat << EOF +} +EOF +} + +machine=`uname -m` +case "x$machine" in + xx86_64) + GENKERNEL_ARCH="x86" + list= + for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* ; do + if grub_file_is_not_garbage "$i" ; then list="$list $i" ; fi + done ;; + *) + list= + ;; +esac + +prepare_boot_cache= +prepare_root_cache= +boot_device_id= + +while [ "x$list" != "x" ] ; do + linux=`version_find_latest $list` + case $linux in + *.efi.signed) + # We handle these in linux_entry. + list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '` + continue + ;; + esac + gettext_printf "Found linux image: %s\n" "$linux" >&2 + basename=`basename $linux` + dirname=`dirname $linux` + rel_dirname=`make_system_path_relative_to_its_root $dirname` + version=`echo $basename | sed -e "s,^[^0-9]*-,,g"` + alt_version=`echo $version | sed -e "s,\.old$,,g"` + linux_root_device_thisversion="${LINUX_ROOT_DEVICE}" + + initrd_early= + for i in ${GRUB_EARLY_INITRD_LINUX_STOCK} \ + ${GRUB_EARLY_INITRD_LINUX_CUSTOM}; do + if test -e "${dirname}/${i}" ; then + initrd_early="${initrd_early} ${i}" + fi + done + + initrd_real= + for i in "initrd.img-${version}" "initrd-${version}.img" "initrd-${version}.gz" \ + "initrd-${version}" "initramfs-${version}.img" \ + "initrd.img-${alt_version}" "initrd-${alt_version}.img" \ + "initrd-${alt_version}" "initramfs-${alt_version}.img" \ + "initramfs-genkernel-${version}" \ + "initramfs-genkernel-${alt_version}" \ + "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \ + "initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}"; do + if test -e "${dirname}/${i}" ; then + initrd_real="${i}" + break + fi + done + + initrd= + if test -n "${initrd_early}" || test -n "${initrd_real}"; then + initrd="${initrd_early} ${initrd_real}" + + initrd_display= + for i in ${initrd}; do + initrd_display="${initrd_display} ${dirname}/${i}" + done + gettext_printf "Found initrd image: %s\n" "$(echo $initrd_display)" >&2 + fi + + config= + for i in "${dirname}/config-${version}" "${dirname}/config-${alt_version}" "/etc/kernels/kernel-config-${version}" ; do + if test -e "${i}" ; then + config="${i}" + break + fi + done + + initramfs= + if test -n "${config}" ; then + initramfs=`grep CONFIG_INITRAMFS_SOURCE= "${config}" | cut -f2 -d= | tr -d \"` + fi + + if test -z "${initramfs}" && test -z "${initrd_real}" ; then + # "UUID=" and "ZFS=" magic is parsed by initrd or initramfs. Since there's + # no initrd or builtin initramfs, it can't work here. + if [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] \ + || [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ]; then + + linux_root_device_thisversion=${GRUB_DEVICE} + else + linux_root_device_thisversion=PARTUUID=${GRUB_DEVICE_PARTUUID} + fi + fi + + linux_entry "${OS} - ACRN Board Inspector" "${version}" \ + "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} ${GRUB_CMDLINE_ACRN_BOARD_INSPECTOR}" + + if [ -z "$boot_device_id" ]; then + boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")" + fi + + list=`echo $list | tr ' ' '\n' | fgrep -vx "$linux" | tr '\n' ' '` +done + +echo "" diff --git a/debian/python3-acrn-board-inspector.install b/debian/python3-acrn-board-inspector.install new file mode 100644 index 000000000..44733b7e8 --- /dev/null +++ b/debian/python3-acrn-board-inspector.install @@ -0,0 +1,6 @@ +# keep these files from being treated as standard conffiles +# (won't get removed by apt remove), link them in maintainer +# scripts instead, see +# https://www.debian.org/doc/manuals/maint-guide/dother.en.html#conffiles + +debian/grub/20_acrn-board-inspector var/lib/acrn-board-inspector diff --git a/debian/python3-acrn-board-inspector.postinst b/debian/python3-acrn-board-inspector.postinst new file mode 100644 index 000000000..d5cae7330 --- /dev/null +++ b/debian/python3-acrn-board-inspector.postinst @@ -0,0 +1,30 @@ +#!/bin/sh +# postinst script for acrn-board-inspector +# +# see: dh_installdeb(1) + +set -e + +case "$1" in + configure|triggered) + ln -sft /etc/grub.d /var/lib/acrn-board-inspector/20_acrn-board-inspector + if command -v update-grub > /dev/null && [ -d /boot/grub ]; then + update-grub || : + fi + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/debian/python3-acrn-board-inspector.postrm b/debian/python3-acrn-board-inspector.postrm new file mode 100644 index 000000000..584225b84 --- /dev/null +++ b/debian/python3-acrn-board-inspector.postrm @@ -0,0 +1,44 @@ +#!/bin/sh +# postrm script for acrn-board-inspector +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `purge' +# * `upgrade' +# * `failed-upgrade' +# * `abort-install' +# * `abort-install' +# * `abort-upgrade' +# * `disappear' +# +# for details, see https://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + remove) + # remove links to package config files + rm -f /etc/grub.d/20_acrn-board-inspector + if command -v update-grub > /dev/null && [ -d /boot/grub ]; then + update-grub || : + fi + ;; + purge|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/debian/python3-acrn-board-inspector.trigger b/debian/python3-acrn-board-inspector.trigger new file mode 100644 index 000000000..4bfbde3e2 --- /dev/null +++ b/debian/python3-acrn-board-inspector.trigger @@ -0,0 +1 @@ +interest-await grub-acrn-update