]> git.proxmox.com Git - pve-installer.git/blobdiff - Proxmox/Install.pm
also skip proxmox-grub if not booted in EFI mode
[pve-installer.git] / Proxmox / Install.pm
index 8825699416475b1934527531db4fbb40e9473ce8..6ad9d17be45a5f1371c9cb6d43478f267124a627 100644 (file)
@@ -15,7 +15,7 @@ use Proxmox::Install::StorageConfig;
 
 use Proxmox::Sys::Block qw(get_cached_disks wipe_disk partition_bootable_disk);
 use Proxmox::Sys::Command qw(run_command syscmd);
-use Proxmox::Sys::File qw(file_read_all file_read_firstline file_write_all);
+use Proxmox::Sys::File qw(file_read_firstline file_write_all);
 use Proxmox::UI;
 
 # TODO: move somewhere better?
@@ -121,6 +121,7 @@ sub create_filesystem {
        } elsif ($line =~ m/Writing superblocks and filesystem.*done/) {
            update_progress(1, $rs, $re);
        }
+       return;
     });
 }
 
@@ -195,7 +196,7 @@ sub zfs_create_rpool {
     syscmd("zfs set atime=on relatime=on $pool_name") == 0 || die "unable to set zfs properties\n";
 
     my $value = $zfs_opts->{compress} // 'on';
-    syscmd("zfs set compression=$value $pool_name") if defined($value) && $value ne 'off';
+    syscmd("zfs set compression=$value $pool_name");
 
     $value = $zfs_opts->{checksum} // 'on';
     syscmd("zfs set checksum=$value $pool_name") if defined($value) && $value ne 'on';
@@ -358,6 +359,7 @@ sub get_pv_list_from_vgname {
        } else {
            $res->{$vg_uuid}->{pvs} .= ", $pv";
        }
+       return;
     };
     run_command("pvs --noheadings -o pv_name,vg_uuid -S vg_name='$vgname'", $parser, undef, 1);
 
@@ -372,8 +374,6 @@ sub ask_existing_vg_rename_or_abort {
     my $duplicate_vgs = get_pv_list_from_vgname($vgname);
     return if !$duplicate_vgs;
 
-    my $message = "Detected existing '$vgname' Volume Group(s)! Do you want to:\n";
-
     for my $vg_uuid (keys %$duplicate_vgs) {
        my $vg = $duplicate_vgs->{$vg_uuid};
 
@@ -382,12 +382,20 @@ sub ask_existing_vg_rename_or_abort {
        # we have a disk with both a "$vgname" and "$vgname-old"...
        my $short_uid = sprintf "%08X", rand(0xffffffff);
        $vg->{new_vgname} = "$vgname-OLD-$short_uid";
-
-       $message .= "rename VG backed by PV '$vg->{pvs}' to '$vg->{new_vgname}'\n";
     }
-    $message .= "or cancel the installation?";
 
-    my $response_ok = Proxmox::UI::prompt($message);
+    my $response_ok = Proxmox::Install::Config::get_lvm_auto_rename();
+    if (!$response_ok) {
+       my $message = "Detected existing '$vgname' Volume Group(s)! Do you want to:\n";
+
+       for my $vg_uuid (keys %$duplicate_vgs) {
+           my $vg = $duplicate_vgs->{$vg_uuid};
+           $message .= "rename VG backed by PV '$vg->{pvs}' to '$vg->{new_vgname}'\n";
+       }
+       $message .= "or cancel the installation?";
+
+       $response_ok = Proxmox::UI::prompt($message);
+    }
 
     if ($response_ok) {
        for my $vg_uuid (keys %$duplicate_vgs) {
@@ -568,20 +576,12 @@ my sub chroot_chmod {
 }
 
 sub prepare_proxmox_boot_esp {
-    my ($espdev, $targetdir) = @_;
+    my ($espdev, $targetdir, $secureboot) = @_;
 
     my $mode = '';
 
-    # detect secure boot being enabled and switch to grub-on-ESP if it is
-    if (-d "/sys/firmware/efi") {
-       my $content = eval { file_read_all("/sys/firmware/efi/efivars/SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8c") };
-       if ($@) {
-           warn "Failed to read secure boot state: $@\n";
-       } else {
-           my @secureboot = unpack("CCCCC", $content);
-           $mode = 'grub' if $secureboot[4] == 1;
-       }
-    }
+    # if secure boot is enabled switch to grub-on-ESP
+    $mode = 'grub' if $secureboot;
 
     syscmd("chroot $targetdir proxmox-boot-tool init $espdev $mode") == 0 ||
        die "unable to init ESP and install proxmox-boot loader on '$espdev'\n";
@@ -605,8 +605,10 @@ sub prepare_grub_efi_boot_esp {
        }
        # 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 ||
+       syscmd("cp $targetdir/boot/efi/EFI/proxmox/*.efi $targetdir/boot/efi/EFI/BOOT/") == 0 ||
            die "unable to copy efi boot loader\n";
+       syscmd("mv $targetdir/boot/efi/EFI/BOOT/shimx64.efi $targetdir/boot/efi/EFI/BOOT/BOOTx64.efi") == 0 ||
+           die "unable to setup default efi boot loader\n";
     };
     my $err = $@;
 
@@ -822,8 +824,8 @@ sub extract_data {
                die "unable to set zfs properties\n";
        }
 
-       update_progress(0.04, 0, $maxper, "create swap space");
        if ($swapfile) {
+           update_progress(0.04, 0, $maxper, "create swap space");
            syscmd("mkswap -f $swapfile") == 0 ||
                die "unable to create swap space\n";
        }
@@ -846,11 +848,12 @@ sub extract_data {
            create_filesystem($rootdev, 'root', $filesys, 0.05, $maxper, 0, 1);
        }
 
-       update_progress(1, 0.05, $maxper, "mounting target $rootdev");
 
        if ($use_zfs) {
            # do nothing
        } else {
+           update_progress(1, 0.05, $maxper, "mounting target $rootdev");
+
            my $mount_opts = 'noatime';
            $mount_opts .= ',nobarrier'
                if $use_btrfs || $filesys =~ /^ext\d$/;
@@ -901,6 +904,7 @@ sub extract_data {
                my $frac = $per > 100 ? 1 : $per/100;
                update_progress($frac, $maxper, 0.5);
            }
+           return;
        });
 
        syscmd("mount -n -t tmpfs tmpfs $targetdir/tmp") == 0 || die "unable to mount tmpfs on $targetdir/tmp\n";
@@ -977,6 +981,8 @@ sub extract_data {
            $ifaces .= "\niface $name $ntype manual\n";
        }
 
+       $ifaces .= "\n\nsource /etc/network/interfaces.d/*\n";
+
        file_write_all("$targetdir/etc/network/interfaces", $ifaces);
 
        # configure dns
@@ -1000,6 +1006,7 @@ sub extract_data {
                if ($line =~ m/^UUID=([A-Fa-f0-9\-]+)$/) {
                    $fsuuid = $1;
                }
+               return;
            });
 
            die "unable to detect FS UUID" if !defined($fsuuid);
@@ -1092,9 +1099,11 @@ _EOD
            # upon upgrade - and conflict with each other - install the fitting one only
            next if ($deb =~ /grub-pc_/ && $run_env->{boot_type} ne 'bios');
            next if ($deb =~ /grub-efi-amd64_/ && $run_env->{boot_type} ne 'efi');
+           next if ($deb =~ /^proxmox-grub/ && $run_env->{boot_type} ne 'efi');
+           next if ($deb =~ /^proxmox-secure-boot-support_/ && !$run_env->{secure_boot});
 
            update_progress($count/$pkg_count, 0.5, 0.75, "extracting $deb");
-           print STDERR "extracting: $deb\n";
+
            syscmd("chroot $targetdir dpkg $dpkg_opts --force-depends --no-triggers --unpack /tmp/pkg/$deb") == 0
                || die "installation of package $deb failed\n";
            update_progress((++$count)/$pkg_count, 0.5, 0.75);
@@ -1110,6 +1119,7 @@ _EOD
            if ($line =~ m/Setting up\s+(\S+)/) {
                update_progress((++$count)/$pkg_count, 0.75, 0.95, "configuring $1");
            }
+           return;
        });
 
        unlink "$targetdir/etc/mailname";
@@ -1159,7 +1169,7 @@ _EOD
            # on-access scanner (blocks file access if it thinks file is bad) needs to be explicit
            # configured by the user, otherwise it fails, and it doesn't make sense for most users.
            unlink "$targetdir/etc/systemd/system/multi-user.target.wants/clamav-clamonacc.service"
-               or warn "failed to disable clamav-clamonacc.service - $!";
+               or $!{ENOENT} or warn "failed to disable clamav-clamonacc.service - $!\n";
        }
 
        if ($iso_env->{product} eq 'pve') {
@@ -1222,7 +1232,7 @@ _EOD
                foreach my $di (@$bootdevinfo) {
                    my $dev = $di->{devname};
                    if ($use_zfs) {
-                       prepare_proxmox_boot_esp($di->{esp}, $targetdir);
+                       prepare_proxmox_boot_esp($di->{esp}, $targetdir, $run_env->{secure_boot});
                    } else {
                        if (!$native_4k_disk_bootable) {
                            eval {
@@ -1263,6 +1273,13 @@ _EOD
        my $octets = encode("utf-8", Proxmox::Install::Config::get_password());
        run_command("chroot $targetdir /usr/sbin/chpasswd", undef, "root:$octets\n");
 
+       # set root ssh keys
+       my $ssh_keys = Proxmox::Install::Config::get_root_ssh_keys();
+       if (scalar(@$ssh_keys) > 0) {
+           mkdir "$targetdir/root/.ssh";
+           file_write_all("$targetdir/root/.ssh/authorized_keys", join("\n", @$ssh_keys));
+       }
+
        my $mailto = Proxmox::Install::Config::get_mailto();
        if ($iso_env->{product} eq 'pmg') {
            # save admin email