From 0775862a25ab2900fe6d08b4acd5d572dd62fe6b Mon Sep 17 00:00:00 2001 From: Pat Viafore Date: Wed, 22 Jul 2020 09:43:11 -0400 Subject: [PATCH] Add mechanism to detect initrdless boot fallback With this change, when we attempt to boot with an initramfs and fail, initrdless_boot_fallback_triggered is set to non-zero in the grubenv. This value can be checked after boot by looking in /boot/grub/grubenv or by using the grub-editenv list command. Addresses LP: #1870189 --- debian/changelog | 8 +++++ live-build/functions | 32 +++++++++++++++++++ .../hooks.d/base/disk-image-uefi.binary | 1 + .../ubuntu-cpc/hooks.d/base/disk-image.binary | 5 +++ 4 files changed, 46 insertions(+) diff --git a/debian/changelog b/debian/changelog index 93c6c544..2b9bcd05 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +livecd-rootfs (2.664.18) UNRELEASED; urgency=medium + + * Only try without initrd-less on replaced kernels, not all kernels + * Provide a mechanism to detect initrd-less fallback + + -- Patrick Viafore Tue, 09 Feb 2021 12:40:04 -0600 + + livecd-rootfs (2.664.17) focal; urgency=medium [ David Krauser ] diff --git a/live-build/functions b/live-build/functions index e18c4097..03d637d8 100644 --- a/live-build/functions +++ b/live-build/functions @@ -990,6 +990,38 @@ replace_kernel () { # If running a custom kernel, we should try to boot without an initramfs # We do this by setting GRUB_FORCE_PARTUUID, which forces initramfs-less boot + force_boot_without_initramfs ${mountpoint} +} + +track_initramfs_boot_fallback() { + mountpoint=$1 + cat < "${mountpoint}/etc/grub.d/01_track_initrdless_boot_fallback" +#! /bin/sh +# ${IMAGE_STR} +# This will detect if we attempt to boot with an initramfs and fail. +# In the case of a failure, initrdless_boot_fallback_triggered is set to +# a non-zero value in the grubenv. This value can be checked after boot +# by looking in /boot/grub/grubenv or by using the grub-editenv list command. +set -e +END + cat <<"END" >> "${mountpoint}/etc/grub.d/01_track_initrdless_boot_fallback" +cat <<"EOF" +if [ -n "${have_grubenv}" ]; then + if [ -n "${initrdfail}" ]; then + set initrdless_boot_fallback_triggered="${initrdfail}" + else + set initrdless_boot_fallback_triggered=0 + fi + save_env initrdless_boot_fallback_triggered +fi +EOF +END + chmod +x "${mountpoint}/etc/grub.d/01_track_initrdless_boot_fallback" +} + +force_boot_without_initramfs() { + mountpoint=$1 + partuuid=$(blkid -s PARTUUID -o value $(findmnt -n -o SOURCE --target "${mountpoint}")) if [ -n "${partuuid}" ]; then echo "Force booting without an initramfs..." diff --git a/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary b/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary index 19f5e15f..25035316 100755 --- a/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary +++ b/live-build/ubuntu-cpc/hooks.d/base/disk-image-uefi.binary @@ -214,6 +214,7 @@ EOF fi divert_grub mountpoint + track_initramfs_boot_fallback mountpoint chroot mountpoint update-grub replace_grub_root_with_label mountpoint undivert_grub mountpoint diff --git a/live-build/ubuntu-cpc/hooks.d/base/disk-image.binary b/live-build/ubuntu-cpc/hooks.d/base/disk-image.binary index 1b31b446..f00fbbd7 100755 --- a/live-build/ubuntu-cpc/hooks.d/base/disk-image.binary +++ b/live-build/ubuntu-cpc/hooks.d/base/disk-image.binary @@ -119,6 +119,11 @@ if [ "${should_install_grub}" -eq 1 ]; then --device-map=/tmp/device.map \ ${loop_device} + divert_grub mountpoint + track_initramfs_boot_fallback mountpoint + chroot mountpoint update-grub + undivert_grub mountpoint + rm mountpoint/tmp/device.map fi