diff --git a/debian/changelog b/debian/changelog index 0ebdecf4..70326fb2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,14 @@ +livecd-rootfs (2.678) groovy; urgency=medium + + [ David Krauser ] + * Add mechanism to detect initrdless boot fallback + + [ Dimitri John Ledkov ] + * auto/build: use setup|teardown_mountpoint to reduce duplication + * functions: provide nss_systemd-less nsswitch.conf in chroots. + + -- Dimitri John Ledkov Fri, 24 Jul 2020 21:08:07 +0100 + livecd-rootfs (2.677) groovy; urgency=medium * Avoid rbind /sys for chroot snap pre-seeding (cgroups fail to unmount) diff --git a/live-build/auto/build b/live-build/auto/build index 4cd879bd..12b96a5b 100755 --- a/live-build/auto/build +++ b/live-build/auto/build @@ -106,33 +106,17 @@ fi Setup_cleanup preinstall_snaps() { - lb chroot_resolv install + setup_mountpoint chroot + snap_prepare chroot for snap in "$@"; do SNAP_NO_VALIDATE_SEED=1 snap_preseed chroot "${snap}" done - if [ ! -c /dev/mem ]; then - mknod -m 660 /dev/mem c 1 1 - chown root:kmem /dev/mem - fi - - mount --rbind /dev chroot/dev - mount --bind /sys chroot/sys - mount --bind /sys/kernel/security chroot/sys/kernel/security - mount --bind /proc chroot/proc - # Provide more up to date apparmor features, matching target kernel - mount -o bind /usr/share/livecd-rootfs/live-build/apparmor/generic chroot/sys/kernel/security/apparmor/features - mount -o bind /usr/share/livecd-rootfs/live-build/seccomp/generic.actions_avail chroot/proc/sys/kernel/seccomp/actions_avail - snap_validate_seed chroot - umount --recursive chroot/proc - umount --recursive chroot/sys - umount --recursive chroot/dev - - lb chroot_resolv remove + teardown_mountpoint chroot } rm -f binary.success diff --git a/live-build/functions b/live-build/functions index 483fc807..e4b90425 100644 --- a/live-build/functions +++ b/live-build/functions @@ -107,6 +107,8 @@ setup_mountpoint() { mount -t tmpfs none "$mountpoint/var/cache/apt" mv "$mountpoint/etc/resolv.conf" resolv.conf.tmp cp /etc/resolv.conf "$mountpoint/etc/resolv.conf" + mv "$mountpoint/etc/nsswitch.conf" nsswitch.conf.tmp + sed 's/systemd//g' nsswitch.conf.tmp > "$mountpoint/etc/nsswitch.conf" chroot "$mountpoint" apt-get update } @@ -124,6 +126,7 @@ teardown_mountpoint() { umount $submount done mv resolv.conf.tmp "$mountpoint/etc/resolv.conf" + mv nsswitch.conf.tmp "$mountpoint/etc/nsswitch.conf" } mount_partition() { @@ -962,6 +965,32 @@ replace_kernel () { 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 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 9b59117a..910f67a9 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 @@ -133,6 +133,7 @@ install_grub() { chroot mountpoint dpkg-query -W > binary/boot/filesystem.packages 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 d0e4e228..8998df68 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