Add mechanism to detect initrdless boot fallback

In v2.672 the default boot behavior of cloud images changed:

- Prior to v2.672, cloud images with the linux-generic kernel attempt
  to boot without an initramfs, would fail, and then retry with an
  initramfs.

- After v2.672, cloud images with the linux-generic kernel boot with
  an initramfs on the first try.

While the behavior is different between the two, they both result in
an instance that has booted with an initramfs. To ensure the changes
in v2.672 do not regress, we need an automated way to check if we are
attempting to boot without an initramfs and failing.

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.
raspi-desktop-1
David Krauser 4 years ago
parent 2edabc31c2
commit 83499f1a95

6
debian/changelog vendored

@ -1,3 +1,9 @@
livecd-rootfs (2.678) UNRELEASED; urgency=medium
* Add mechanism to detect initrdless boot fallback
-- David Krauser <david.krauser@canonical.com> Wed, 22 Jul 2020 14:43:09 -0400
livecd-rootfs (2.677) groovy; urgency=medium livecd-rootfs (2.677) groovy; urgency=medium
* Avoid rbind /sys for chroot snap pre-seeding (cgroups fail to unmount) * Avoid rbind /sys for chroot snap pre-seeding (cgroups fail to unmount)

@ -962,6 +962,32 @@ replace_kernel () {
force_boot_without_initramfs ${mountpoint} force_boot_without_initramfs ${mountpoint}
} }
track_initramfs_boot_fallback() {
mountpoint=$1
cat <<END > "${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() { force_boot_without_initramfs() {
mountpoint=$1 mountpoint=$1

@ -133,6 +133,7 @@ install_grub() {
chroot mountpoint dpkg-query -W > binary/boot/filesystem.packages chroot mountpoint dpkg-query -W > binary/boot/filesystem.packages
divert_grub mountpoint divert_grub mountpoint
track_initramfs_boot_fallback mountpoint
chroot mountpoint update-grub chroot mountpoint update-grub
replace_grub_root_with_label mountpoint replace_grub_root_with_label mountpoint
undivert_grub mountpoint undivert_grub mountpoint

@ -119,6 +119,11 @@ if [ "${should_install_grub}" -eq 1 ]; then
--device-map=/tmp/device.map \ --device-map=/tmp/device.map \
${loop_device} ${loop_device}
divert_grub mountpoint
track_initramfs_boot_fallback mountpoint
chroot mountpoint update-grub
undivert_grub mountpoint
rm mountpoint/tmp/device.map rm mountpoint/tmp/device.map
fi fi

Loading…
Cancel
Save