use String::ShellQuote;
use Data::Dumper;
use File::Basename;
+use File::Path;
use Time::HiRes;
use ProxmoxInstallerSetup;
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])";
my $IPV4RE = "(?:(?:$IPV4OCTET\\.){3}$IPV4OCTET)";
return $swapsize;
}
+sub prepare_systemd_boot_esp {
+ my ($espdev, $targetdir) = @_;
+
+ my $espuuid = find_dev_by_uuid($espdev);
+ my $espmp = "var/tmp/$espuuid";
+ mkdir "$targetdir/$espmp";
+
+ syscmd("mount -n $espdev -t vfat $targetdir/$espmp") == 0 ||
+ die "unable to mount ESP $espdev\n";
+
+ File::Path::make_path("$targetdir/$espmp/EFI/proxmox") ||
+ die "unable to create directory $targetdir/$espmp/EFI/proxmox\n";
+
+ syscmd("chroot $targetdir bootctl --no-variables --path /$espmp install") == 0 ||
+ 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 extract_data {
my ($basefile, $targetdir) = @_;
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) =
+ my ($size, $osdev, $efidev) =
partition_bootable_disk($devname, $config_options->{hdsize}, 'BF01');
+
zfs_mirror_size_check($disksize, $size) if $disksize;
- push @$bootdevinfo, { devname => $devname, osdev => $osdev};
+
+ push @$bootdevinfo, {
+ esp => $efidev,
+ devname => $devname,
+ osdev => $osdev
+ };
$disksize = $size;
}
# 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}) {
my $efi_boot_uuid = $di->{esp};
if (my $uuid = find_dev_by_uuid ($di->{esp})) {
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 ||
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");
+ }
+
}
diversion_remove($targetdir, "/usr/sbin/update-grub");
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}) {
+ 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");
$grid->attach($sep, 0, $row, 2, 1);
$row++;
+ my $hw_raid_note = Gtk3::Label->new("Note: ZFS is not compatible with disks backed by a hardware RAID controller. For details see the reference documentation.");
+ $hw_raid_note->set_line_wrap(1);
+ $hw_raid_note->set_max_width_chars(30);
+ $hw_raid_note->set_visible(0);
+ $grid->attach($hw_raid_note, 0, $row++, 2, 1);
+
my $hdsize_labeled_widgets = [];
# size compute
$target_hd_combo->set_visible(!$raid);
$options_stack->get_child_by_name("hdsize")->set_visible(!$raid);
$options_stack->get_child_by_name("raiddisk")->set_visible($raid);
+ $hw_raid_note->set_visible($raid);
$options_stack_switcher->set_visible($enable_zfs_opts);
$options_stack->get_child_by_name("raidzfsadvanced")->set_visible($enable_zfs_opts);
if ($raid) {
&$switch_view();
});
+ my $sep2 = Gtk3::HSeparator->new();
+ $sep2->set_visible(1);
+ $contarea->pack_end($sep2, 1, 1, 10);
+
$dialog->show();
$dialog->run();