by collecting them, but proceeding with the rest of the installation. it is possible that only either legacy or EFI boot fails, and even if both do, manually fixing the bootloader setup by booting a live CD is very often possible.
still display the error screen at the end if bootloader setup was not successful, so that expectations are not set too high.. Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com> --- see https://forum.proxmox.com/threads/unable-to-unmount-zfs-after-installation.56144/#post-258894 for one scenario where this would possibly have been helpful best viewed with -w, since most of the changes are adding eval around certain blocks ;) proxinstall | 96 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 63 insertions(+), 33 deletions(-) diff --git a/proxinstall b/proxinstall index f7d6e29..fee13b6 100755 --- a/proxinstall +++ b/proxinstall @@ -1164,21 +1164,29 @@ sub prepare_grub_efi_boot_esp { syscmd("mount -n $espdev -t vfat $targetdir/boot/efi") == 0 || die "unable to mount $espdev\n"; - my $rc = syscmd("chroot $targetdir /usr/sbin/grub-install --target x86_64-efi --no-floppy --bootloader-id='proxmox' $dev"); - if ($rc != 0) { - if ($boot_type eq 'efi') { - die "unable to install the EFI boot loader on '$dev'\n"; - } else { - warn "unable to install the EFI boot loader on '$dev', ignoring (not booted using UEFI)\n"; + eval { + my $rc = syscmd("chroot $targetdir /usr/sbin/grub-install --target x86_64-efi --no-floppy --bootloader-id='proxmox' $dev"); + if ($rc != 0) { + if ($boot_type eq 'efi') { + die "unable to install the EFI boot loader on '$dev'\n"; + } else { + warn "unable to install the EFI boot loader on '$dev', ignoring (not booted using UEFI)\n"; + } } - } - # also install fallback boot file (OVMF does not boot without) - mkdir("$targetdir/boot/efi/EFI/BOOT"); - syscmd("cp $targetdir/boot/efi/EFI/proxmox/grubx64.efi $targetdir/boot/efi/EFI/BOOT/BOOTx64.EFI") == 0 || - die "unable to copy efi boot loader\n"; + # also install fallback boot file (OVMF does not boot without) + mkdir("$targetdir/boot/efi/EFI/BOOT"); + syscmd("cp $targetdir/boot/efi/EFI/proxmox/grubx64.efi $targetdir/boot/efi/EFI/BOOT/BOOTx64.EFI") == 0 || + die "unable to copy efi boot loader\n"; + }; + my $err = $@; + + eval { + syscmd("umount $targetdir/boot/efi") == 0 || + die "unable to umount $targetdir/boot/efi\n"; + }; + warn $@ if $@; - syscmd("umount $targetdir/boot/efi") == 0 || - die "unable to umount $targetdir/boot/efi\n"; + die "failed to prepare EFI boot using Grub on '$espdev': $err" if $err; } sub extract_data { @@ -1219,6 +1227,8 @@ sub extract_data { die "unable to load zfs kernel module\n" if !$i; } + my $bootloader_err; + eval { @@ -1702,29 +1712,45 @@ _EOD symlink ("/proc/mounts", "$targetdir/etc/mtab"); syscmd("mount -n --bind /dev $targetdir/dev"); - syscmd("chroot $targetdir /usr/sbin/update-initramfs -c -k $kapi") == 0 || - die "unable to install initramfs\n"; - - foreach my $di (@$bootdevinfo) { - my $dev = $di->{devname}; - syscmd("chroot $targetdir /usr/sbin/grub-install --target i386-pc --no-floppy --bootloader-id='proxmox' $dev") == 0 || - die "unable to install the i386-pc boot loader on '$dev'\n"; - - if (my $esp = $di->{esp}) { - if ($use_zfs) { - prepare_systemd_boot_esp($esp, $targetdir); - } else { - prepare_grub_efi_boot_esp($dev, $esp, $targetdir); - } + my $bootloader_err_list = []; + eval { + syscmd("chroot $targetdir /usr/sbin/update-initramfs -c -k $kapi") == 0 || + die "unable to install initramfs\n"; + + foreach my $di (@$bootdevinfo) { + my $dev = $di->{devname}; + eval { + syscmd("chroot $targetdir /usr/sbin/grub-install --target i386-pc --no-floppy --bootloader-id='proxmox' $dev") == 0 || + die "unable to install the i386-pc boot loader on '$dev'\n"; + }; + push @$bootloader_err_list, $@ if $@; + + eval { + if (my $esp = $di->{esp}) { + if ($use_zfs) { + prepare_systemd_boot_esp($esp, $targetdir); + } else { + prepare_grub_efi_boot_esp($dev, $esp, $targetdir); + } + } + }; + push @$bootloader_err_list, $@ if $@; } - } - syscmd("chroot $targetdir /usr/sbin/update-grub") == 0 || - die "unable to update boot loader config\n"; + syscmd("chroot $targetdir /usr/sbin/update-grub") == 0 || + die "unable to update boot loader config\n"; - if ($use_zfs && $boot_type eq 'efi') { - syscmd("chroot $targetdir /etc/kernel/postinst.d/zz-pve-efiboot") == 0 || - die "unable to generate systemd-boot config\n"; + if ($use_zfs && $boot_type eq 'efi') { + syscmd("chroot $targetdir /etc/kernel/postinst.d/zz-pve-efiboot") == 0 || + die "unable to generate systemd-boot config\n"; + } + }; + push @$bootloader_err_list, $@ if $@; + + if (scalar(@$bootloader_err_list) > 0) { + $bootloader_err = "bootloader setup errors:\n"; + map { $bootloader_err .= "- $_" } @$bootloader_err_list; + warn $bootloader_err; } syscmd("umount $targetdir/dev"); @@ -1819,6 +1845,10 @@ _EOD syscmd("zpool export $zfspoolname"); } + if ($bootloader_err) { + $err = $err ? "$err\n$bootloader_err" : $bootloader_err; + } + die $err if $err; } -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel