]> git.proxmox.com Git - pve-installer.git/blobdiff - proxinstall
followup: refword, coding style and do not die
[pve-installer.git] / proxinstall
index d8c456fa6418d0445d094769e5258a288a9cef03..d3f9fd7cd245b8c9b8f8b553c57d526dd81695e5 100755 (executable)
@@ -97,9 +97,6 @@ my $proxmox_libdir = $opt_testmode ?
 my $proxmox_cddir = $opt_testmode ? "../pve-cd-builder/tmp/data-gz/" : "/cdrom";
 my $proxmox_pkgdir = "${proxmox_cddir}/proxmox/packages/";
 
-my $grub_plattform = "pc"; # pc, efi-amd64 or efi-ia32
-
-$grub_plattform = "efi-amd64" if -d "/sys/firmware/efi";
 my $boot_type = -d '/sys/firmware/efi' ? 'efi' : 'bios';
 
 my $IPV4OCTET = "(?:25[0-5]|(?:2[0-4]|1[0-9]|[1-9])?[0-9])";
@@ -903,6 +900,7 @@ my $clean_disk = sub {
        next if $part eq $disk;
        next if $part !~ /^\Q$disk\E/;
        eval { syscmd("pvremove -ff -y $part"); };
+       eval { syscmd("zpool labelclear -f $part"); };
        eval { syscmd("dd if=/dev/zero of=$part bs=1M count=16"); };
     }
 };
@@ -1097,14 +1095,35 @@ sub prepare_systemd_boot_esp {
        die "unable to install systemd-boot loader\n";
     write_config("timeout 3\ndefault proxmox-*\n",
        "$targetdir/$espmp/loader/loader.conf");
-    syscmd("chroot $targetdir /etc/kernel/postinst.d/zz-pve-efiboot") == 0 ||
-       die "unable to generate systemd-boot config\n";
 
     syscmd("umount $targetdir/$espmp") == 0 ||
        die "unable to umount ESP $targetdir/$espmp\n";
 
 }
 
+sub prepare_grub_efi_boot_esp {
+    my ($dev, $espdev, $targetdir) = @_;
+
+    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";
+       }
+    }
+    # 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";
+
+    syscmd("umount $targetdir/boot/efi") == 0 ||
+       die "unable to umount $targetdir/boot/efi\n";
+}
+
 sub extract_data {
     my ($basefile, $targetdir) = @_;
 
@@ -1204,18 +1223,24 @@ sub extract_data {
 
            my ($devlist, $bootdevlist, $vdev) = get_zfs_raid_setup();
 
-           my $disksize;
            foreach my $hd (@$devlist) {
                &$clean_disk(@$hd[1]);
            }
+
+           my $disksize;
            foreach my $hd (@$bootdevlist) {
                my $devname = @$hd[1];
 
                my ($size, $osdev, $efidev) =
                    partition_bootable_disk($devname, $config_options->{hdsize}, 'BF01');
+
                zfs_mirror_size_check($disksize, $size) if $disksize;
-               push @$bootdevinfo, { esp => $efidev, devname => $devname,
-                                       osdev => $osdev};
+
+               push @$bootdevinfo, {
+                   esp => $efidev,
+                   devname => $devname,
+                   osdev => $osdev
+               };
                $disksize = $size;
            }
 
@@ -1225,11 +1250,8 @@ sub extract_data {
                my $devname = $di->{devname};
                $di->{by_id} = find_stable_path ("/dev/disk/by-id", $devname);
 
-               # Note: using /dev/disk/by-id/ does not work for unknown reason, we get
-               # cannot create 'rpool': no such pool or dataset
-               #my $osdev = find_stable_path ("/dev/disk/by-id", $di->{osdev}) || $di->{osdev};
+               my $osdev = find_stable_path ("/dev/disk/by-id", $di->{osdev}) || $di->{osdev};
 
-               my $osdev = $di->{osdev};
                $vdev =~ s/ $devname/ $osdev/;
            }
 
@@ -1444,10 +1466,11 @@ sub extract_data {
        # Note: this is required by current grub, but really dangerous, because
        # vfat does not have journaling, so it triggers manual fsck after each crash
        # so we only mount /boot/efi if really required (efi systems).
-       if ($grub_plattform =~ m/^efi-/) {
+       if ($boot_type eq 'efi' && !$use_zfs) {
            if (scalar(@$bootdevinfo)) {
                my $di = @$bootdevinfo[0]; # simply use first disk
-               if ($di->{esp} && ! $use_zfs) {
+
+               if ($di->{esp}) {
                    my $efi_boot_uuid = $di->{esp};
                    if (my $uuid = find_dev_by_uuid ($di->{esp})) {
                        $efi_boot_uuid = "UUID=$uuid";
@@ -1510,10 +1533,6 @@ _EOD
            chomp;
            my $path = $_;
            my ($deb) = $path =~ m/${proxmox_pkgdir}\/(.*\.deb)/;
-#          if ($deb =~ m/^grub-efi-/ && $deb !~ m/^grub-${grub_plattform}/) {
-#              $count++;
-#              next;
-#          }
            update_progress($count/$pkg_count, 0.5, 0.75, "extracting $deb");
            print "extracting: $deb\n";
            syscmd("cp $path $targetdir/tmp/$deb") == 0 ||
@@ -1590,6 +1609,7 @@ _EOD
        if ($use_zfs) {
            syscmd("sed -i -e 's/^GRUB_CMDLINE_LINUX=.*/GRUB_CMDLINE_LINUX=\"root=ZFS=$zfspoolname\\/ROOT\\/$zfsrootvolname boot=zfs\"/' $targetdir/etc/default/grub") == 0 ||
                die "unable to update /etc/default/grub\n";
+
            if ($boot_type eq 'efi') {
                write_config("root=ZFS=$zfspoolname/ROOT/$zfsrootvolname boot=zfs", "$targetdir/etc/kernel/cmdline");
            }
@@ -1622,32 +1642,23 @@ _EOD
                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 ($di->{esp} && $use_zfs) {
-                       prepare_systemd_boot_esp($di->{esp}, $targetdir);
-               } elsif ($di->{esp}) {
-                   syscmd("mount -n $di->{esp} -t vfat $targetdir/boot/efi") == 0 ||
-                       die "unable to mount $di->{esp}\n";
-                   my $rc = syscmd("chroot $targetdir /usr/sbin/grub-install --target x86_64-efi --no-floppy --bootloader-id='proxmox' $dev");
-                   if ($rc != 0) {
-                       if (-d '/sys/firmware/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";
-                       }
+               if (my $esp = $di->{esp}) {
+                   if ($use_zfs) {
+                       prepare_systemd_boot_esp($esp, $targetdir);
+                   } else {
+                       prepare_grub_efi_boot_esp($dev, $esp, $targetdir);
                    }
-                   # 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";
-
-                   syscmd("umount $targetdir/boot/efi") == 0 ||
-                       die "unable to umount $targetdir/boot/efi\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";
+           }
+
            syscmd("umount $targetdir/dev");
        }
 
@@ -3221,11 +3232,15 @@ sub create_intro_view {
 
     cleanup_view();
 
+    if (int($total_memory) < 1024) {
+       display_error("Less than 1 GiB memory detected, installation will probably fail.\n");
+    }
+
     if ($setup->{product} eq 'pve') {
        eval {
            my $cpuinfo = file_get_contents('/proc/cpuinfo');
            if ($cpuinfo && !($cpuinfo =~ /^flags\s*:.*(vmx|svm)/m)) {
-               display_error("No support for KVM virtualisation detected.\n\n" .
+               display_error("No support for KVM virtualization detected.\n\n" .
                              "Check BIOS settings for Intel VT / AMD-V / SVM.")
            }
        };