|
| 1 | +diff --git a/Proxmox/Install.pm b/Proxmox/Install.pm |
| 2 | +index fa2702c..636e684 100644 |
| 3 | +--- a/Proxmox/Install.pm |
| 4 | ++++ b/Proxmox/Install.pm |
| 5 | +@@ -6,6 +6,7 @@ use warnings; |
| 6 | + use Cwd 'abs_path'; |
| 7 | + use Encode; |
| 8 | + use POSIX ":sys_wait_h"; |
| 9 | ++use POSIX qw(EINTR EEXIST EOPNOTSUPP); |
| 10 | + |
| 11 | + use Proxmox::Install::ISOEnv; |
| 12 | + use Proxmox::Install::RunEnv; |
| 13 | +@@ -58,6 +59,13 @@ sub reset_last_display_change { |
| 14 | + $last_display_change = 0; |
| 15 | + } |
| 16 | + |
| 17 | ++my $host_arch; |
| 18 | ++sub get_host_arch { |
| 19 | ++ $host_arch = (POSIX::uname())[4] if !$host_arch; |
| 20 | ++ return $host_arch; |
| 21 | ++} |
| 22 | ++my $arch = get_host_arch(); |
| 23 | ++ |
| 24 | + sub display_info { |
| 25 | + my $min_display_time = 15; |
| 26 | + |
| 27 | +@@ -97,6 +105,7 @@ my $fssetup = { |
| 28 | + }, |
| 29 | + }; |
| 30 | + |
| 31 | ++ |
| 32 | + sub create_filesystem { |
| 33 | + my ($dev, $name, $type, $start, $end, $fs, $fe) = @_; |
| 34 | + |
| 35 | +@@ -625,9 +653,18 @@ sub prepare_grub_efi_boot_esp { |
| 36 | + |
| 37 | + syscmd("mount -n $espdev -t vfat $targetdir/boot/efi") == 0 || |
| 38 | + die "unable to mount $espdev\n"; |
| 39 | +- |
| 40 | ++ my $arch = get_host_arch(); |
| 41 | ++ my $rc; |
| 42 | + eval { |
| 43 | +- my $rc = syscmd("chroot $targetdir /usr/sbin/grub-install --target x86_64-efi --no-floppy --bootloader-id='proxmox' $dev"); |
| 44 | ++ if ($arch eq "aarch64"){ |
| 45 | ++ my $rc = syscmd("chroot $targetdir /usr/sbin/grub-install --target arm64-efi --no-floppy --bootloader-id='proxmox' $dev"); |
| 46 | ++ } elsif ($arch eq "loongarch64"){ |
| 47 | ++ my $rc = syscmd("chroot $targetdir /usr/sbin/grub-install --target loongarch64-efi --no-floppy --bootloader-id='proxmox' $dev"); |
| 48 | ++ } elsif ($arch eq "riscv64"){ |
| 49 | ++ my $rc = syscmd("chroot $targetdir /usr/sbin/grub-install --target riscv64-efi --no-floppy --bootloader-id='proxmox' $dev"); |
| 50 | ++ } else { |
| 51 | ++ die "unable to install grub on arch $arch\n"; |
| 52 | ++ } |
| 53 | + if ($rc != 0) { |
| 54 | + my $run_env = Proxmox::Install::RunEnv::get(); |
| 55 | + if ($run_env->{boot_type} eq 'efi') { |
| 56 | +@@ -636,12 +673,23 @@ sub prepare_grub_efi_boot_esp { |
| 57 | + warn "unable to install the EFI boot loader on '$dev', ignoring (not booted using UEFI)\n"; |
| 58 | + } |
| 59 | + } |
| 60 | ++ rockchip_dtb_setup($espdev, $targetdir , 0); |
| 61 | ++ |
| 62 | + # also install fallback boot file (OVMF does not boot without) |
| 63 | + mkdir("$targetdir/boot/efi/EFI/BOOT"); |
| 64 | +- syscmd("cp $targetdir/boot/efi/EFI/proxmox/*.efi $targetdir/boot/efi/EFI/BOOT/") == 0 || |
| 65 | ++ syscmd("cp -r $targetdir/boot/efi/EFI/proxmox/* $targetdir/boot/efi/EFI/BOOT/"); |
| 66 | ++ if ($arch eq "aarch64"){ |
| 67 | ++ syscmd("cp $targetdir/boot/efi/EFI/BOOT/grubaa64.efi $targetdir/boot/efi/EFI/BOOT/BOOTAA64.EFI ") == 0 || |
| 68 | + die "unable to copy efi boot loader\n"; |
| 69 | +- syscmd("mv $targetdir/boot/efi/EFI/BOOT/shimx64.efi $targetdir/boot/efi/EFI/BOOT/BOOTx64.efi") == 0 || |
| 70 | +- die "unable to setup default efi boot loader\n"; |
| 71 | ++ } elsif ($arch eq "loongarch64") { |
| 72 | ++ syscmd("cp $targetdir/boot/efi/EFI/BOOT/grubloongarch64.efi $targetdir/boot/efi/EFI/BOOT/BOOTLOONGARCH64.efi") == 0 || |
| 73 | ++ die "unable to copy efi boot loader\n"; |
| 74 | ++ } elsif ($arch eq "riscv64") { |
| 75 | ++ syscmd("cp $targetdir/boot/efi/EFI/BOOT/grubriscv64.efi $targetdir/boot/efi/EFI/BOOT/BOOTRISCV64.efi") == 0 || |
| 76 | ++ die "unable to copy efi boot loader\n"; |
| 77 | ++ } else { |
| 78 | ++ die "unable to opy efi boot loader on arch $arch\n"; |
| 79 | ++ } |
| 80 | + }; |
| 81 | + my $err = $@; |
| 82 | + |
| 83 | +@@ -1258,14 +1306,6 @@ _EOD |
| 84 | + diversion_remove($targetdir, "/usr/sbin/update-grub"); |
| 85 | + diversion_remove($targetdir, "/usr/sbin/update-initramfs"); |
| 86 | + |
| 87 | +- my $kapi; |
| 88 | +- foreach my $fn (<$targetdir/lib/modules/*>) { |
| 89 | +- if ($fn =~ m!/(\d+\.\d+\.\d+-\d+-pve)$!) { |
| 90 | +- die "found multiple kernels\n" if defined($kapi); |
| 91 | +- $kapi = $1; |
| 92 | +- } |
| 93 | +- } |
| 94 | +- die "unable to detect kernel version\n" if !defined($kapi); |
| 95 | + |
| 96 | + if (!is_test_mode()) { |
| 97 | + |
| 98 | +@@ -1275,7 +1315,7 @@ _EOD |
| 99 | + |
| 100 | + my $bootloader_err_list = []; |
| 101 | + eval { |
| 102 | +- syscmd("chroot $targetdir /usr/sbin/update-initramfs -c -k $kapi") == 0 || |
| 103 | ++ syscmd("chroot $targetdir /usr/sbin/update-initramfs -c -k all") == 0 || |
| 104 | + die "unable to install initramfs\n"; |
| 105 | + |
| 106 | + my $native_4k_disk_bootable = 0; |
| 107 | +@@ -1290,8 +1330,8 @@ _EOD |
| 108 | + } else { |
| 109 | + if (!$native_4k_disk_bootable) { |
| 110 | + eval { |
| 111 | +- syscmd("chroot $targetdir /usr/sbin/grub-install --target i386-pc --no-floppy --bootloader-id='proxmox' $dev") == 0 || |
| 112 | +- die "unable to install the i386-pc boot loader on '$dev'\n"; |
| 113 | ++# syscmd("chroot $targetdir /usr/sbin/grub-install --target i386-pc --no-floppy --bootloader-id='proxmox' $dev") == 0 || |
| 114 | ++ print ("not need install the i386-pc boot loader on '$dev'\n"); |
| 115 | + }; |
| 116 | + push @$bootloader_err_list, $@ if $@; |
| 117 | + } |
0 commit comments