syscmd($pcmd) == 0 ||
die "unable to partition harddisk '${target_dev}'\n";
- $pnum = 1;
- $pcmd = ['sgdisk', '-a1', "-n$pnum:34:2047", "-t$pnum:EF02" , $target_dev];
+ my $blocksize = logical_blocksize($target_dev);
- syscmd($pcmd) == 0 ||
- die "unable to create bios_boot partition '${target_dev}'\n";
+ if ($blocksize != 4096) {
+ $pnum = 1;
+ $pcmd = ['sgdisk', '-a1', "-n$pnum:34:2047", "-t$pnum:EF02" , $target_dev];
+
+ syscmd($pcmd) == 0 ||
+ die "unable to create bios_boot partition '${target_dev}'\n";
+ }
&$udevadm_trigger_block();
my $disksize;
foreach my $hd (@$devlist) {
my $devname = @$hd[1];
+ my $logical_bsize = @$hd[4];
+
&$clean_disk($devname);
my ($size, $osdev, $efidev) =
partition_bootable_disk($devname, undef, '8300');
devname => $devname,
osdev => $osdev,
by_id => $by_id,
+ logical_bsize => $logical_bsize,
};
push @$btrfs_partitions, $osdev;
$disksize = $size;
my $disksize;
foreach my $hd (@$bootdevlist) {
my $devname = @$hd[1];
+ my $logical_bsize = @$hd[4];
my ($size, $osdev, $efidev) =
partition_bootable_disk($devname, $config_options->{hdsize}, 'BF01');
push @$bootdevinfo, {
esp => $efidev,
devname => $devname,
- osdev => $osdev
+ osdev => $osdev,
+ logical_bsize => $logical_bsize,
};
$disksize = $size;
}
&$clean_disk($target_hd);
+ my $logical_bsize = logical_blocksize($target_hd);
+
my ($os_size, $osdev, $efidev);
($os_size, $osdev, $efidev) =
partition_bootable_disk($target_hd, $config_options->{hdsize}, '8E00');
devname => $target_hd,
osdev => $osdev,
by_id => $by_id,
+ logical_bsize => $logical_bsize,
};
my $swap_size = compute_swapsize($os_size);
foreach my $di (@$bootdevinfo) {
next if !$di->{esp};
- syscmd("mkfs.vfat -F32 $di->{esp}") == 0 ||
+ my $vfat_extra_opts = ($di->{logical_bsize} == 4096) ? '-s1' : '';
+ syscmd("mkfs.vfat $vfat_extra_opts -F32 $di->{esp}") == 0 ||
die "unable to initialize EFI ESP on device $di->{esp}\n";
}
syscmd("chroot $targetdir /usr/sbin/update-initramfs -c -k $kapi") == 0 ||
die "unable to install initramfs\n";
+ my $native_4k_disk_bootable = 0;
+ foreach my $di (@$bootdevinfo) {
+ $native_4k_disk_bootable |= ($di->{logical_bsize} == 4096);
+ }
+
foreach my $di (@$bootdevinfo) {
my $dev = $di->{devname};
- eval {
- 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";
- };
- push @$bootloader_err_list, $@ if $@;
+ if (!$native_4k_disk_bootable) {
+ eval {
+ 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";
+ };
+ push @$bootloader_err_list, $@ if $@;
+ }
eval {
if (my $esp = $di->{esp}) {
if abs($expected - $actual) > $expected / 10;
}
+sub legacy_bios_4k_check {
+ my ($lbs) = @_;
+ die "Booting from 4kn drive in legacy BIOS mode is not supported.\n"
+ if (($boot_type ne 'efi') && ($lbs == 4096));
+}
+
sub get_zfs_raid_setup {
my $filesys = $config_options->{filesys};
if ($filesys eq 'zfs (RAID0)') {
push @$bootdevlist, @$devlist[0];
foreach my $hd (@$devlist) {
+ legacy_bios_4k_check(@$hd[4]);
$cmd .= " @$hd[1]";
}
} elsif ($filesys eq 'zfs (RAID1)') {
my $expected_size = @$hd[2]; # all disks need approximately same size
foreach $hd (@$devlist) {
zfs_mirror_size_check($expected_size, @$hd[2]);
+ legacy_bios_4k_check(@$hd[4]);
$cmd .= " @$hd[1]";
push @$bootdevlist, $hd;
}
my $hd1 = @$devlist[$i];
my $hd2 = @$devlist[$i+1];
zfs_mirror_size_check(@$hd1[2], @$hd2[2]); # pairs need approximately same size
+ legacy_bios_4k_check(@$hd1[4]);
+ legacy_bios_4k_check(@$hd2[4]);
$cmd .= ' mirror ' . @$hd1[1] . ' ' . @$hd2[1];
}
$cmd .= " raidz$level";
foreach $hd (@$devlist) {
zfs_mirror_size_check($expected_size, @$hd[2]);
+ legacy_bios_4k_check(@$hd[4]);
$cmd .= " @$hd[1]";
push @$bootdevlist, $hd;
}
}
$config_options->{target_hds} = [ map { $_->[1] } @$devlist ];
} else {
+ eval { legacy_bios_4k_check(logical_blocksize($target_hd)) };
+ if (my $err = $@) {
+ display_message("Warning: $err\n");
+ return;
+ }
$config_options->{target_hds} = [ $target_hd ];
}