Skip to content
Snippets Groups Projects
flash-kernel 13.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • diff --git a/db/all.db b/db/all.db
    index 1bacc51..765fe45 100644
    --- a/db/all.db
    +++ b/db/all.db
    
    @@ -1168,6 +1168,27 @@ DTB-Id: sun7i-a20-mk808c.dtb
    
     U-Boot-Script-Name: bootscr.sunxi
     Required-Packages: u-boot-tools
    
    +Kernel-Flavors: any
    +Boot-Script-Path: /boot/boot.scr
    +DTB-Id: freescale/imx8mp-mnt-pocket-reform.dtb
    +U-Boot-Script-Name: bootscr.uboot-generic
    +Required-Packages: u-boot-tools
    
    +
    +Machine: MNT Pocket Reform with BPI-CM4 Module
    +Kernel-Flavors: any
    +Boot-Script-Path: /boot/boot.scr
    +DTB-Id: amlogic/meson-g12b-bananapi-cm4-mnt-pocket-reform.dtb
    +U-Boot-Script-Name: bootscr.uboot-generic
    +Required-Packages: u-boot-tools
    
    +
    +Machine: MNT Pocket Reform with RCORE RK3588 Module
    +Kernel-Flavors: any
    +DTB-Id: rockchip/rk3588-mnt-pocket-reform.dtb
    +Boot-Script-Path: /boot/boot.scr
    +U-Boot-Script-Name: bootscr.uboot-generic
    +Required-Packages: u-boot-tools
    
    +
     Machine: MNT Reform 2
     Kernel-Flavors: any
     Boot-Script-Path: /boot/boot.scr
    
    @@ -1185,6 +1192,48 @@ Boot-Script-Path: /boot/boot.scr
    
     U-Boot-Script-Name: bootscr.uboot-generic
     Required-Packages: u-boot-tools
    
    +Machine: MNT Reform 2 with BPI-CM4 Module
    +Kernel-Flavors: any
    +DTB-Id: amlogic/meson-g12b-bananapi-cm4-mnt-reform2.dtb
    +Boot-Script-Path: /boot/boot.scr
    +U-Boot-Script-Name: bootscr.uboot-generic
    +Required-Packages: u-boot-tools
    
    +Machine: MNT Reform 2 with i.MX8MP Module
    +Kernel-Flavors: any
    +DTB-Id: freescale/imx8mp-mnt-reform2.dtb
    +Boot-Script-Path: /boot/boot.scr
    +U-Boot-Script-Name: bootscr.uboot-generic
    +Required-Packages: u-boot-tools
    +
    
    +Machine: MNT Reform 2 with LS1028A Module
    +Kernel-Flavors: any
    +DTB-Id: freescale/fsl-ls1028a-mnt-reform2.dtb
    +Boot-Script-Path: /boot/boot.scr
    +U-Boot-Script-Name: bootscr.uboot-generic
    +Required-Packages: u-boot-tools
    
    +
    +Machine: MNT Reform 2 with RCORE RK3588 Module
    +Kernel-Flavors: any
    
    +Boot-Script-Path: /boot/boot.scr
    +U-Boot-Script-Name: bootscr.uboot-generic
    +Required-Packages: u-boot-tools
    
    +Machine: MNT Reform 2 with RCORE-DSI RK3588 Module
    +Kernel-Flavors: any
    +DTB-Id: rockchip/rk3588-mnt-reform2-dsi.dtb
    +Boot-Script-Path: /boot/boot.scr
    +U-Boot-Script-Name: bootscr.uboot-generic
    +Required-Packages: u-boot-tools
    +
    
    +Machine: MNT Reform Next with RCORE RK3588 Module
    +Kernel-Flavors: any
    +DTB-Id: rockchip/rk3588-mnt-reform-next.dtb
    +Boot-Script-Path: /boot/boot.scr
    +U-Boot-Script-Name: bootscr.uboot-generic
    +Required-Packages: u-boot-tools
    
     Machine: MSI Primo81 tablet
     Kernel-Flavors: armmp armmp-lpae
    
     Boot-Script-Path: /boot/boot.scr
    
    
    # fix https://bugs.debian.org/1102690
    patch -p1 << 'EOF'
    From ea9f0c7e91f2454c0a05d72f9ecfdb7164f89ede Mon Sep 17 00:00:00 2001
    From: Dave Jones <dave.jones@canonical.com>
    Date: Mon, 6 Mar 2023 13:53:51 +0000
    Subject: [PATCH 1/3] Always run flash-kernel
    
    When both flash-kernel and the kernel are upgraded together, it is
    possible that the f-k trigger is unconfigured when the kernel attempts
    to fire it, resulting in the invocation being lost. This change ensures
    that the f-k trigger is set during *all* maintscript operations.
    
    Related issue: LP: #1667742
    ---
     debian/flash-kernel.postinst | 16 ++++++++++++----
     1 file changed, 12 insertions(+), 4 deletions(-)
    
    diff --git a/debian/flash-kernel.postinst b/debian/flash-kernel.postinst
    index 849cf12..75d08b1 100755
    --- a/debian/flash-kernel.postinst
    +++ b/debian/flash-kernel.postinst
    @@ -34,10 +34,7 @@ case "$1" in
     			/etc/default/flash-kernel
     		ucfr flash-kernel /etc/default/flash-kernel
     		;;
    -	triggered)
    -		FLASH_KERNEL_NOTRIGGER=y flash-kernel
    -		;;
    -	abort-upgrade|abort-remove|abort-deconfigure)
    +	triggered|abort-upgrade|abort-remove|abort-deconfigure)
     		;;
     	*)
     		echo "postinst called with unknown argument \`$1'" >&2
    @@ -45,4 +42,15 @@ case "$1" in
     		;;
     esac
     
    +case "$1" in
    +	triggered)
    +		# this forces flash-kernel to run rather than setting our trigger to
    +		# cause a later run (as happens without _NOTRIGGER being set)
    +		FLASH_KERNEL_NOTRIGGER=y flash-kernel
    +		;;
    +	*)
    +		flash-kernel
    +		;;
    +esac
    +
     #DEBHELPER#
    -- 
    GitLab
    
    
    From 23379fa9bd41458b1db06a5613e559c9844369a7 Mon Sep 17 00:00:00 2001
    From: Dave Jones <dave.jones@canonical.com>
    Date: Mon, 6 Mar 2023 14:01:59 +0000
    Subject: [PATCH 2/3] Avoid a double run of handle_dtb and --force with no
     kvers
    
    The logic surrounding $kvers deals with three scenarios: kvers is blank
    (we want to flash the latest kernel), kvers is non-blank and is the
    latest kernel, and kvers is non-blank and is *not* the latest kernel.
    
    In the second case (typical during a kernel upgrade), f-k runs
    handle_dtb twice (redundantly). At the top of main() after checking
    kvers is non-blank and then later after checking for --force and whether
    kvers is not the latest version.
    
    The existing logic also permits the (rather nonsensical) case of being
    called with --force but with no kernel version specified. This commit
    re-works the logic to avoid running handle_dtb redundantly, and to error
    out with an appropriate message if called with --force but with no
    kernel version.
    ---
     functions | 41 +++++++++++++++++++++++++----------------
     1 file changed, 25 insertions(+), 16 deletions(-)
    
    diff --git a/functions b/functions
    index a2e2b31..6f75836 100644
    --- a/functions
    +++ b/functions
    @@ -727,22 +727,6 @@ if [ -n "$kvers" ] && [ "$FK_KERNEL_HOOK_SCRIPT" = "postrm.d" ]; then
     	fi
     fi
     
    -if [ "$kvers" != "$latest_version" ] && [ "x$force" = "xyes" ]; then
    -	echo "flash-kernel: forcing install of ${kvers} instead of ${latest_version}." >&2
    -	echo "flash-kernel: WARNING: Installing any new kernel package might override this." >&2
    -else
    -	if [ -n "$kvers" ] && [ "$kvers" != "$latest_version" ]; then
    -		echo "Ignoring old or unknown version $kvers (latest is $latest_version)" >&2
    -		if [ "$FK_KERNEL_HOOK_SCRIPT" = "postinst.d" ]; then
    -			exit 0
    -		fi
    -		echo "Use --force if you want version $kvers." >&2
    -	fi
    -	kvers="$latest_version"
    -	# Make sure we install the DTB for $latest_version
    -	handle_dtb
    -fi
    -
     # accumulate multiple calls in a trigger to only run flash-kernel once; the
     # trigger will just call flash-kernel again with FLASH_KERNEL_NOTRIGGER set to
     # force a real run
    @@ -759,6 +743,31 @@ if [ -z "$FLASH_KERNEL_NOTRIGGER" ] && [ -n "$DPKG_MAINTSCRIPT_PACKAGE" ] && dpk
     	# dpkg-trigger failed for some reason, proceed to a normal run
     fi
     
    +case "$kvers" in
    +	"")
    +		if [ "$force" = "yes" ]; then
    +			echo "flash-kernel: no kernel version specified with --force." >&2
    +			exit 1
    +		else
    +			kvers="$latest_version"
    +			# Make sure we install the DTB for $latest_version
    +			handle_dtb
    +		fi
    +		;;
    +	"$latest_version")
    +		# Proceed as normal; --force is basically a noop here
    +		;;
    +	*)
    +		if [ "$force" = "yes" ]; then
    +			echo "flash-kernel: forcing install of ${kvers} instead of ${latest_version}." >&2
    +			echo "flash-kernel: WARNING: Installing any new kernel package might override this." >&2
    +		else
    +			echo "Ignoring old or unknown version $kvers (latest is $latest_version)" >&2
    +			exit 0
    +		fi
    +		;;
    +esac
    +
     kfile="/boot/vmlinuz-$kvers"
     ifile="/boot/initrd.img-$kvers"
     desc="kernel $kvers"
    -- 
    GitLab
    
    
    From 894fdf593f71f3e2fa5b93a0391edb67e86eefc6 Mon Sep 17 00:00:00 2001
    From: Dave Jones <dave.jones@canonical.com>
    Date: Mon, 6 Mar 2023 15:49:20 +0000
    Subject: [PATCH 3/3] Defer if selected kernel is not fully "installed"
    
    When flash-kernel runs as part of a kernel installation, that kernel may
    not be in the fully "installed" state. If it's a newly installed kernel,
    it may also be in "triggers-pending" in which case, while the symlinks
    for vmlinuz-$ver and initrd.img-$ver exist, the initrd itself does not
    yet exist (because the initramfs-tools trigger has not yet run, so the
    initrd symlink is "dead").
    
    In this case, depending on the "method" selected for the board, the f-k
    run may crash (aborting apt), or may continue but flash a non-functional
    boot setup. In the latter case, this usually corrects itself with a
    later run of f-k but it still potentially leaves the system in an
    unbootable state for some portion of an apt run (which is not ideal).
    
    This commit adds a check on the status of the package which owns the
    kernel version requested to be installed. If it is not fully
    "installed", it defers the f-k run (under the assumption it will become
    installed at some point in the apt run). This can be overridden with
    "--force". Tests are included for the new function.
    
    Related issues: LP: #2007827, LP: #1861292, Debian bug #781742
    ---
     functions      | 35 +++++++++++++++++++
     test_functions | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++
     2 files changed, 129 insertions(+)
    
    diff --git a/functions b/functions
    index 6f75836..d541f41 100644
    --- a/functions
    +++ b/functions
    @@ -597,6 +597,23 @@ android_flash() {
     	echo "done." >&2
     }
     
    +get_kernel_status() {
    +	# get_kernel_status(query_ver)
    +	# return the dpkg package status of kernel version $query_ver
    +	local query_ver="$1"
    +	local ver path pkg
    +	linux-version list --paths | while read -r ver path; do
    +		if linux-version compare "$ver" eq "$query_ver"; then
    +			pkg=$(
    +				LANG=C.UTF-8 dpkg-query --search "$path" 2>/dev/null |
    +				awk -F ": " -v path="$path" '$2==path { print $1; }'
    +			)
    +			LANG=C.UTF-8 dpkg-query --show --showformat '${db:Status-Status}' "$pkg"
    +			break
    +		fi
    +	done
    +}
    +
     find_dtb_file() {
     	local dtb
     	case "$dtb_dir" in
    @@ -768,6 +785,24 @@ case "$kvers" in
     		;;
     esac
     
    +kstatus=$(get_kernel_status "$kvers")
    +if [ "$kstatus" != "installed" ]; then
    +	echo "flash-kernel: requested kernel ${kvers} is in state ${kstatus}." >&2
    +	if [ -n "$DPKG_RUNNING_VERSION" ]; then
    +		# We're running under dpkg; re-trigger ourselves under the assumption
    +		# that the status will resolve
    +		if dpkg-trigger --no-await flash-kernel; then
    +			echo "flash-kernel: deferring update (trigger activated)" >&2
    +			exit 0
    +		else
    +			echo "flash-kernel: deferral failed; proceeding with install" >&2
    +		fi
    +	elif [ "$force" != "yes" ]; then
    +		exit 1
    +	fi
    +	echo "flash-kernel: WARNING: Components like the initrd may be missing or require regeneration." >&2
    +fi
    +
     kfile="/boot/vmlinuz-$kvers"
     ifile="/boot/initrd.img-$kvers"
     desc="kernel $kvers"
    diff --git a/test_functions b/test_functions
    index eeea52f..5795448 100755
    --- a/test_functions
    +++ b/test_functions
    @@ -689,6 +689,100 @@ test_dtb_append_from() {
     }
     add_test test_dtb_append_from
     
    +test_get_kernel_status() {
    +    available="
    +5.15.0-1021-generic /boot/vmlinuz-5.15.0-1021-generic
    +5.15.0-1022-raspi /boot/vmlinuz-5.15.0-1022-raspi
    +5.15.0-1022-raspi-nolpae /boot/vmlinuz-5.15.0-1022-raspi-nolpae
    +5.15.0-1023-raspi /boot/vmlinuz-5.15.0-1023-raspi"
    +    (
    +        linux_version() {
    +            case "$1" in
    +                list)
    +                    if [ "$2" = "--paths" ]; then
    +                        echo "$available"
    +                    else
    +                        echo "$available" | while read -r ver path; do
    +                            echo "$ver"
    +                        done
    +                    fi
    +                    ;;
    +                compare)
    +                    case "$3" in
    +                        eq) [ "$2" = "$4" ] ;;
    +                        ne) [ "$2" != "$4" ] ;;
    +                        *)
    +                            echo "Unexpected arg in test-case"
    +                            exit 1
    +                            ;;
    +                    esac
    +                    ;;
    +            esac
    +        }
    +        dpkg_query() {
    +            case "$1" in
    +                --search)
    +                    shift
    +                    while [ -n "$1" ]; do
    +                        case "$1" in
    +                            /boot/vmlinuz-5.15.0-*)
    +                                echo "linux-image-${1#/boot/vmlinuz-}: $1"
    +                                ;;
    +                            *)
    +                                echo "Unexpected arg in test-case"
    +                                exit 1
    +                                ;;
    +                        esac
    +                        shift
    +                    done
    +                    ;;
    +                --show)
    +                    shift
    +                    while [ -n "$1" ]; do
    +                        case "$1" in
    +                            --showformat)
    +                                shift
    +                                ;;
    +                            linux-image-5.15.0-1022-raspi*)
    +                                echo -n installed
    +                                ;;
    +                            linux-image-5.15.0-1023-*)
    +                                echo -n triggers-pending
    +                                ;;
    +                            linux-image-*)
    +                                echo -n not-installed
    +                                ;;
    +                            *)
    +                                echo "Unexpected arg in test-case"
    +                                exit 1
    +                                ;;
    +                        esac
    +                        shift
    +                    done
    +                    ;;
    +            esac
    +        }
    +        # Can't define a function with a hyphen in the name but luckily, dash
    +        # does permit them in alias names
    +        alias dpkg-query=dpkg_query
    +        alias linux-version=linux_version
    +        . "$functions"
    +        if [ "$(get_kernel_status 5.15.0-1022-raspi)" != "installed" ]; then
    +            echo "get_kernel_status did not output the expected result" >&2
    +            exit 1
    +        fi
    +        if [ "$(get_kernel_status 5.15.0-1023-raspi)" != "triggers-pending" ]; then
    +            echo "get_kernel_status did not output the expected result" >&2
    +            exit 1
    +        fi
    +        if [ "$(get_kernel_status 5.15.0-1021-generic)" != "not-installed" ]; then
    +            echo "get_kernel_status did not output the expected result" >&2
    +            exit 1
    +        fi
    +    )
    +}
    +add_test test_get_kernel_status
    +
     test_main
     
     # vim:syntax=sh
    -- 
    GitLab
    EOF