X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=proxinstall;h=b9e96fa99747947df9c370639da9fdd07f83be26;hb=754abb4437f8b6a1b5a4cb17ce1bf0d2d539615d;hp=db8e638296d006b567951aed29942ef1be5e2adb;hpb=d8c697d4580e1d5c7a967ccb1c64306f27b08a4d;p=pve-installer.git diff --git a/proxinstall b/proxinstall index db8e638..b9e96fa 100755 --- a/proxinstall +++ b/proxinstall @@ -623,7 +623,9 @@ sub hd_size { sub get_partition_dev { my ($dev, $partnum) = @_; - if ($dev =~ m|^/dev/[hxsev]d[a-z]$|) { + if ($dev =~ m|^/dev/sd([a-h]?[a-z]\|i[a-v])$|) { + return "${dev}$partnum"; + } elsif ($dev =~ m|^/dev/[hxev]d[a-z]$|) { return "${dev}$partnum"; } elsif ($dev =~ m|^/dev/[^/]+/c\d+d\d+$|) { return "${dev}p$partnum"; @@ -812,36 +814,6 @@ sub zfs_create_rpool { if defined($value) && $value != 1; } -sub zfs_create_swap { - my ($swapsize) = @_; - - my $cmd = "zfs create -V ${swapsize}K -b 4K"; - - $cmd .= " -o com.sun:auto-snapshot=false"; - - # copies for swap does not make sense - $cmd .= " -o copies=1"; - - # reduces memory pressure - $cmd .= " -o sync=always"; - - # cheapest compression to drop zero pages - $cmd .= " -o compression=zle"; - - # skip log devices - $cmd .= " -o logbias=throughput"; - # only cache metadata in RAM (caching swap content does not make sense) - $cmd .= " -o primarycache=metadata"; - # don't cache anything in L2ARC - $cmd .= " -o secondarycache=none"; - - $cmd .= " $zfspoolname/swap"; - syscmd ($cmd) == 0 || - die "unable to create zfs swap device\n"; - - return "/dev/zvol/$zfspoolname/swap"; -} - my $udevadm_trigger_block = sub { my ($nowait) = @_; @@ -865,27 +837,30 @@ my $clean_disk = sub { }; sub partition_bootable_disk { - my ($target_dev, $maxhdsize, $ptype) = @_; + my ($target_dev, $maxhdsizegb, $ptype) = @_; die "too dangerous" if $opt_testmode; die "unknown partition type '$ptype'" - if !($ptype eq '8E00' || $ptype eq '8300'); + if !($ptype eq '8E00' || $ptype eq '8300' || $ptype eq 'BF01'); syscmd("sgdisk -Z ${target_dev}"); my $hdsize = hd_size($target_dev); # size in KB (1024 bytes) my $restricted_hdsize_mb = 0; # 0 ==> end of partition - if ($maxhdsize && ($maxhdsize < $hdsize)) { - $hdsize = $maxhdsize; - $restricted_hdsize_mb = int($hdsize/1024) . 'M'; + if ($maxhdsizegb) { + my $maxhdsize = $maxhdsizegb * 1024 * 1024; + if ($maxhdsize < $hdsize) { + $hdsize = $maxhdsize; + $restricted_hdsize_mb = int($hdsize/1024) . 'M'; + } } my $hdgb = int($hdsize/(1024*1024)); - die "hardisk '$target_dev' too small (${hdsize}GB)\n" if $hdgb < 8; + die "hardisk '$target_dev' too small (${hdgb}GB)\n" if $hdgb < 8; # 1 - BIOS boot partition (Grub Stage2): first free 1M - # 2 - EFI ESP: next free 256M + # 2 - EFI ESP: next free 512M # 3 - OS/Data partition: rest, up to $maxhdsize in MB my $grubbootdev = get_partition_dev($target_dev, 1); @@ -894,22 +869,25 @@ sub partition_bootable_disk { my $pcmd = ['sgdisk']; - my $pnum = 1; - push @$pcmd, "-n${pnum}:1M:+1M", "-t$pnum:EF02"; - - $pnum = 2; - push @$pcmd, "-n${pnum}:2M:+256M", "-t$pnum:EF00"; + my $pnum = 2; + push @$pcmd, "-n${pnum}:1M:+512M", "-t$pnum:EF00"; $pnum = 3; - push @$pcmd, "-n${pnum}:258M:${restricted_hdsize_mb}", "-t$pnum:$ptype"; + push @$pcmd, "-n${pnum}:513M:${restricted_hdsize_mb}", "-t$pnum:$ptype"; push @$pcmd, $target_dev; - my $os_size = $hdsize - 258*1024; # 256M + 1M + 1M alignment + my $os_size = $hdsize - 513*1024; # 512M efi + 1M bios_boot + 1M alignment 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]; + + syscmd($pcmd) == 0 || + die "unable to create bios_boot partition '${target_dev}'\n"; + &$udevadm_trigger_block(); foreach my $part ($efibootdev, $osdev) { @@ -919,57 +897,6 @@ sub partition_bootable_disk { return ($os_size, $osdev, $efibootdev); } -# ZFS has this use_whole_disk concept, so we try to partition the same -# way as zfs does by default. There is room at start of disk to insert -# a grub boot partition. But adding a EFI ESP is not possible. -# -# Note: zfs people think this is just a waste of space an not -# required. Instead, you should put the ESP on another disk (log, -# ..). - -sub partition_bootable_zfs_disk { - my ($target_dev) = @_; - - die "too dangerous" if $opt_testmode; - - syscmd("sgdisk -Z ${target_dev}"); - my $hdsize = hd_size($target_dev); # size in blocks (1024 bytes) - - my $hdgb = int($hdsize/(1024*1024)); - die "hardisk '$target_dev' too small (${hdsize}GB)\n" if $hdgb < 8; - - # 1 - GRUB boot partition: 1M - # 2 - OS/Data partition - # 9 - ZFS reserved partition - - my $grubbootdev = get_partition_dev($target_dev, 1); - my $osdev = get_partition_dev ($target_dev, 2); - - my $pcmd = ['sgdisk', '-a1']; - - my $pnum = 1; - push @$pcmd, "-n$pnum:34:2047", "-t$pnum:EF02"; - - $pnum = 9; - push @$pcmd, "-n$pnum:-8M:0", "-t$pnum:BF07"; - - $pnum = 2; - push @$pcmd, "-n$pnum:2048:0", "-t$pnum:BF01", '-c', "$pnum:zfs"; - - push @$pcmd, $target_dev; - - my $os_size = $hdsize - 1024 - 1024*8; - - syscmd($pcmd) == 0 || - die "unable to partition harddisk '${target_dev}'\n"; - - &$udevadm_trigger_block(); - - syscmd("dd if=/dev/zero of=$osdev bs=1M count=16") if -b $osdev; - - return ($os_size, $osdev); -} - sub create_lvm_volumes { my ($lvmdev, $os_size, $swap_size) = @_; @@ -1188,8 +1115,9 @@ sub extract_data { } foreach my $hd (@$bootdevlist) { my $devname = @$hd[1]; + my ($size, $osdev) = - partition_bootable_zfs_disk($devname); + partition_bootable_disk($devname, $config_options->{hdsize}, 'BF01'); zfs_mirror_size_check($disksize, $size) if $disksize; push @$bootdevinfo, { devname => $devname, osdev => $osdev}; $disksize = $size; @@ -1211,24 +1139,15 @@ sub extract_data { zfs_create_rpool($vdev); - my $swap_size = compute_swapsize($disksize); - $swapfile = zfs_create_swap($swap_size) if $swap_size; - } else { die "target '$target_hd' is not a valid block device\n" if ! -b $target_hd; - my $maxhdsize; - if ($config_options->{hdsize}) { - # max hdsize passed on cmdline (GB) - $maxhdsize = $config_options->{hdsize}*1024*1024; - } - &$clean_disk($target_hd); my ($os_size, $osdev, $efidev); ($os_size, $osdev, $efidev) = - partition_bootable_disk($target_hd, $maxhdsize, '8E00'); + partition_bootable_disk($target_hd, $config_options->{hdsize}, '8E00'); &$udevadm_trigger_block(); @@ -1337,7 +1256,7 @@ sub extract_data { my $hosts = "127.0.0.1 localhost.localdomain localhost\n" . - "$ipaddress $hostname.$domain $hostname pvelocalhost\n\n" . + "$ipaddress $hostname.$domain $hostname\n\n" . "# The following lines are desirable for IPv6 capable hosts\n\n" . "::1 ip6-localhost ip6-loopback\n" . "fe00::0 ip6-localnet\n" . @@ -2575,6 +2494,27 @@ my $create_raid_disk_grid = sub { # &$create_label_widget_grid($disk_labeled_widgets) }; +# shared between different ui parts (e.g., ZFS and "normal" single disk FS) +my $hdsize_size_adj; +my $hdsize_entry_buffer; + +my $get_hdsize_spinbtn = sub { + my $hdsize = shift; + + if (!defined($hdsize_size_adj)) { + die "called get_hdsize_spinbtn with \$hdsize_size_adj not defined but did not pass hdsize!\n" + if !defined($hdsize); + $hdsize_size_adj = Gtk3::Adjustment->new($config_options->{hdsize} || $hdsize, 0, $hdsize+1, 1, 1, 1); + $hdsize_entry_buffer = Gtk3::EntryBuffer->new(undef, 1); + } + + my $spinbutton_hdsize = Gtk3::SpinButton->new($hdsize_size_adj, 1, 1); + $spinbutton_hdsize->set_buffer($hdsize_entry_buffer); + $spinbutton_hdsize->set_adjustment($hdsize_size_adj); + $spinbutton_hdsize->set_tooltip_text("only use specified size (GB) of the harddisk (rest left unpartitioned)"); + return $spinbutton_hdsize; +}; + my $create_raid_advanced_grid = sub { my $labeled_widgets = []; my $spinbutton_ashift = Gtk3::SpinButton->new_with_range(9,13,1); @@ -2629,6 +2569,7 @@ my $create_raid_advanced_grid = sub { $spinbutton_copies->set_value($config_options->{copies}); push @$labeled_widgets, "copies", $spinbutton_copies; + push @$labeled_widgets, "hdsize", $get_hdsize_spinbtn->(); return &$create_label_widget_grid($labeled_widgets);; }; @@ -2698,9 +2639,7 @@ sub create_hdoption_view { $hdsize = int((-s $target_hd) / (1024*1024*1024.0)); } - my $hdsize_size_adj = Gtk3::Adjustment->new($config_options->{hdsize} || $hdsize, 0, $hdsize+1, 1, 1, 1); - my $spinbutton_hdsize = Gtk3::SpinButton->new($hdsize_size_adj, 1, 1); - $spinbutton_hdsize->set_tooltip_text("only use specified size (GB) of the harddisk (rest left unpartitioned)"); + my $spinbutton_hdsize = $get_hdsize_spinbtn->($hdsize); push @$hdsize_labeled_widgets, "hdsize", $spinbutton_hdsize; my $entry_swapsize = Gtk3::Entry->new();