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?
} elsif ($line =~ m/Writing superblocks and filesystem.*done/) {
update_progress(1, $rs, $re);
}
+ return;
});
}
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';
} else {
$res->{$vg_uuid}->{pvs} .= ", $pv";
}
+ return;
};
run_command("pvs --noheadings -o pv_name,vg_uuid -S vg_name='$vgname'", $parser, undef, 1);
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};
# 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) {
}
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";
}
# 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 = $@;
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";
}
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$/;
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";
$ifaces .= "\niface $name $ntype manual\n";
}
+ $ifaces .= "\n\nsource /etc/network/interfaces.d/*\n";
+
file_write_all("$targetdir/etc/network/interfaces", $ifaces);
# configure dns
if ($line =~ m/^UUID=([A-Fa-f0-9\-]+)$/) {
$fsuuid = $1;
}
+ return;
});
die "unable to detect FS UUID" if !defined($fsuuid);
# 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);
if ($line =~ m/Setting up\s+(\S+)/) {
update_progress((++$count)/$pkg_count, 0.75, 0.95, "configuring $1");
}
+ return;
});
unlink "$targetdir/etc/mailname";
# 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') {
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 {
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