]> git.proxmox.com Git - pve-installer.git/blobdiff - proxinstall
fixup: readd unnecessarily remove line
[pve-installer.git] / proxinstall
index e40e09733e1a4d561cac55d25fa8d020df244eef..b9e96fa99747947df9c370639da9fdd07f83be26 100755 (executable)
@@ -72,6 +72,11 @@ lvmthin: local-lvm
        content rootdir,images
 __EOD__
 
+my $storage_cfg_local = <<__EOD__;
+dir: local
+       path /var/lib/vz
+       content iso,vztmpl,backup,rootdir,images
+__EOD__
 
 sub file_read_firstline {
     my ($filename) = @_;
@@ -618,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";
@@ -807,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) = @_;
 
@@ -860,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);
@@ -889,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) {
@@ -914,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) = @_;
 
@@ -972,7 +904,7 @@ sub create_lvm_volumes {
 
     my $rootdev = "/dev/$vgname/root";
     my $datadev = "/dev/$vgname/data";
-    my $swapfile = "/dev/$vgname/swap";
+    my $swapfile;
 
     # we use --metadatasize 250k, which results in "pe_start = 512"
     # so pe_start is aligned on a 128k boundary (advantage for SSDs)
@@ -1001,7 +933,7 @@ sub create_lvm_volumes {
        my $rest = $os_size - $swap_size - $rootsize; # in KB
 
        my $minfree;
-       if ($config_options->{minfree}) {
+       if (defined($config_options->{minfree})) {
            $minfree = (($config_options->{minfree}*1024*1024) >= $rest ) ? $space :
                $config_options->{minfree}*1024*1024 ;
        } else {
@@ -1010,7 +942,7 @@ sub create_lvm_volumes {
 
        $rest = $rest - $minfree;
 
-       if ($config_options->{maxvz}) {
+       if (defined($config_options->{maxvz})) {
            $rest = (($config_options->{maxvz}*1024*1024) <= $rest) ?
                $config_options->{maxvz}*1024*1024 : $rest;
        }
@@ -1018,12 +950,16 @@ sub create_lvm_volumes {
        $datasize = $rest;
 
     } else {
-       my $minfree = $config_options->{minfree} ? $config_options->{minfree}*1024*1024 : $space;
+       my $minfree = defined($config_options->{minfree}) ? $config_options->{minfree}*1024*1024 : $space;
        $rootsize = $os_size - $minfree - $swap_size; # in KB
     }
 
-    syscmd ("/sbin/lvcreate -L${swap_size}K -nswap $vgname") == 0 ||
-       die "unable to create swap volume\n";
+    if ($swap_size) {
+       syscmd ("/sbin/lvcreate -L${swap_size}K -nswap $vgname") == 0 ||
+           die "unable to create swap volume\n";
+
+       $swapfile = "/dev/$vgname/swap";
+    }
 
     syscmd ("/sbin/lvcreate -L${rootsize}K -nroot $vgname") == 0 ||
        die "unable to create root volume\n";
@@ -1060,7 +996,7 @@ sub compute_swapsize {
     my $hdgb = int($hdsize/(1024*1024));
 
     my $swapsize;
-    if ($config_options->{swapsize}) {
+    if (defined($config_options->{swapsize})) {
        $swapsize = $config_options->{swapsize}*1024*1024;
     } else {
        my $ss = int ($total_memory / 1024);
@@ -1085,6 +1021,7 @@ sub extract_data {
 
     my $swapfile;
     my $rootdev;
+    my $datadev;
 
     my $use_zfs = 0;
     my $use_btrfs = 0;
@@ -1178,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;
@@ -1201,24 +1139,15 @@ sub extract_data {
 
            zfs_create_rpool($vdev);
 
-           my $swap_size = compute_swapsize($disksize);
-           $swapfile = zfs_create_swap($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();
 
@@ -1227,7 +1156,7 @@ sub extract_data {
                                  osdev => $osdev, by_id => $by_id };
 
            my $swap_size = compute_swapsize($os_size);
-           ($rootdev, $swapfile) =
+           ($rootdev, $swapfile, $datadev) =
                create_lvm_volumes($osdev, $os_size, $swap_size);
 
            # trigger udev to create /dev/disk/by-uuid
@@ -1327,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" .
@@ -1650,13 +1579,15 @@ _EOD
                          "$tmpdir/user.cfg");
 
            # write storage.cfg
-           my $strorage_cfg_fn = "$tmpdir/storage.cfg";
+           my $storage_cfg_fn = "$tmpdir/storage.cfg";
            if ($use_zfs) {
-               write_config ($storage_cfg_zfs, $strorage_cfg_fn);
+               write_config ($storage_cfg_zfs, $storage_cfg_fn);
            } elsif ($use_btrfs) {
-               write_config ($storage_cfg_btrfs, $strorage_cfg_fn);
+               write_config ($storage_cfg_btrfs, $storage_cfg_fn);
+           } elsif ($datadev) {
+               write_config ($storage_cfg_lvmthin, $storage_cfg_fn);
            } else {
-               write_config ($storage_cfg_lvmthin, $strorage_cfg_fn);
+               write_config ($storage_cfg_local, $storage_cfg_fn);
            }
 
            run_command("chroot $targetdir /usr/bin/create_pmxcfs_db /tmp/pve /var/lib/pve-cluster/config.db");
@@ -2563,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);
@@ -2617,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);;
 };
 
@@ -2686,15 +2639,13 @@ 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();
     $entry_swapsize->set_tooltip_text("maximum SWAP size (GB)");
     $entry_swapsize->signal_connect (key_press_event => \&check_float);
-    $entry_swapsize->set_text($config_options->{swapsize}) if $config_options->{swapsize};
+    $entry_swapsize->set_text($config_options->{swapsize}) if defined($config_options->{swapsize});
     push @$hdsize_labeled_widgets, "swapsize", $entry_swapsize;
 
     my $entry_maxroot = Gtk3::Entry->new();
@@ -2708,7 +2659,7 @@ sub create_hdoption_view {
     my $entry_minfree = Gtk3::Entry->new();
     $entry_minfree->set_tooltip_text("minimum free LVM space (GB, required for LVM snapshots)");
     $entry_minfree->signal_connect (key_press_event => \&check_float);
-    $entry_minfree->set_text($config_options->{minfree}) if $config_options->{minfree};
+    $entry_minfree->set_text($config_options->{minfree}) if defined($config_options->{minfree});
     push @$hdsize_labeled_widgets, "minfree", $entry_minfree;
 
     my $entry_maxvz;
@@ -2716,7 +2667,7 @@ sub create_hdoption_view {
        $entry_maxvz = Gtk3::Entry->new();
        $entry_maxvz->set_tooltip_text("maximum size (GB) for LVM data volume");
        $entry_maxvz->signal_connect (key_press_event => \&check_float);
-       $entry_maxvz->set_text($config_options->{maxvz}) if $config_options->{maxvz};
+       $entry_maxvz->set_text($config_options->{maxvz}) if defined($config_options->{maxvz});
        push @$hdsize_labeled_widgets, "maxvz", $entry_maxvz;
     }