X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=proxinstall;h=de1980909d0757af25ef238e72727bdfc6f60eb3;hb=4fb6ac6041d2faecca06619e67f807d02e551a3f;hp=6d30a807a454a7d737f8e5594ca4d2804ce5d14c;hpb=303dfb2cfbb3454b4159a05585b47fad51ecb0f9;p=pve-installer.git diff --git a/proxinstall b/proxinstall index 6d30a80..de19809 100755 --- a/proxinstall +++ b/proxinstall @@ -13,11 +13,12 @@ use IO::File; use IO::Select; use Cwd 'abs_path'; use Gtk3 '-init'; -use Gtk3::WebKit; +use Gtk3::WebKit2; use Encode; use String::ShellQuote; use Data::Dumper; use File::Basename; +use File::Path; use Time::HiRes; use ProxmoxInstallerSetup; @@ -96,9 +97,7 @@ my $proxmox_libdir = $opt_testmode ? 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)"; @@ -691,6 +690,9 @@ sub get_partition_dev { if ($dev =~ m|^/dev/sd([a-h]?[a-z]\|i[a-v])$|) { return "${dev}$partnum"; + } elsif ($dev =~ m|^/dev/xvd[a-z]$|) { + # Citrix Hypervisor blockdev + return "${dev}$partnum"; } elsif ($dev =~ m|^/dev/[hxev]d[a-z]$|) { return "${dev}$partnum"; } elsif ($dev =~ m|^/dev/[^/]+/c\d+d\d+$|) { @@ -1075,6 +1077,30 @@ sub compute_swapsize { 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) = @_; @@ -1175,17 +1201,24 @@ sub extract_data { 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; } @@ -1286,6 +1319,11 @@ sub extract_data { } } + mkdir "$targetdir/mnt"; + mkdir "$targetdir/mnt/hostrun"; + syscmd("mount --bind /run $targetdir/mnt/hostrun") == 0 || + die "unable to bindmount run on $targetdir/mnt/hostrun\n"; + update_progress(1, 0.05, $maxper, "extracting base system"); my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = stat ($basefile); @@ -1315,6 +1353,8 @@ sub extract_data { die "unable to mount proc on $targetdir/proc\n"; syscmd("mount -n -t sysfs sysfs $targetdir/sys") == 0 || die "unable to mount sysfs on $targetdir/sys\n"; + syscmd("chroot $targetdir mount --bind /mnt/hostrun /run") == 0 || + die "unable to re-bindmount hostrun on /run in chroot\n"; update_progress(1, $maxper, 0.5, "configuring base system"); @@ -1407,9 +1447,10 @@ sub extract_data { # 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})) { @@ -1473,10 +1514,6 @@ _EOD 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 || @@ -1554,6 +1591,10 @@ _EOD 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"); @@ -1582,7 +1623,9 @@ _EOD 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"); @@ -1611,9 +1654,6 @@ _EOD # cleanup - # hack: remove dead.letter from sshd installation - syscmd("rm -rf $targetdir/dead.letter"); - unlink "$targetdir/usr/sbin/policy-rc.d"; diversion_remove($targetdir, "/sbin/start-stop-daemon"); @@ -1675,6 +1715,8 @@ _EOD syscmd("chroot $targetdir /usr/bin/dpkg-query -W --showformat='\${package}\n'> final.pkglist"); } + syscmd("umount $targetdir/run"); + syscmd("umount $targetdir/mnt/hostrun"); syscmd("umount $targetdir/tmp"); syscmd("umount $targetdir/proc"); syscmd("umount $targetdir/sys"); @@ -1739,13 +1781,17 @@ sub display_html { my $data = file_get_contents($path); if ($filename eq 'license.htm') { - my $license = decode('utf8', file_get_contents("${proxmox_cddir}/EULA")); + my $license = eval { decode('utf8', file_get_contents("${proxmox_cddir}/EULA")) }; + if (my $err = $@) { + die $err if !$opt_testmode; + $license = "TESTMODE: Ignore non existent EULA...\n"; + } my $title = "END USER LICENSE AGREEMENT (EULA)"; $data =~ s/__LICENSE__/$license/; $data =~ s/__LICENSE_TITLE__/$title/; } - $htmlview->load_html_string($data, $url); + $htmlview->load_html($data, $url); $last_display_change = time(); } @@ -1819,7 +1865,7 @@ sub create_main_window { my $vbox2 = Gtk3::VBox->new(0, 0); $hbox->add($vbox2); - $htmlview = Gtk3::WebKit::WebView->new(); + $htmlview = Gtk3::WebKit2::WebView->new(); my $scrolls = Gtk3::ScrolledWindow->new(); $scrolls->add($htmlview); @@ -2023,7 +2069,11 @@ sub create_ipconf_view { my $device_change_handler = sub { my $current = shift; - $ipconf->{selected} = $device_active_map->{$current->get_active()}; + + my $new = $device_active_map->{$current->get_active()}; + return if defined($ipconf->{selected}) && $new eq $ipconf->{selected}; + + $ipconf->{selected} = $new; my $iface = $ipconf->{ifaces}->{$ipconf->{selected}}; $config->{mngmt_nic} = $iface->{name}; $ipconf_entry_addr->set_text($iface->{inet}->{addr} || $iface->{inet6}->{addr}) @@ -2555,7 +2605,7 @@ sub create_country_view { my $target_hd_combo; my $target_hd_label; -my $hdopion_first_setup = 1; +my $hdoption_first_setup = 1; my $create_basic_grid = sub { my $grid = Gtk3::Grid->new(); @@ -2611,7 +2661,7 @@ my $create_raid_disk_grid = sub { }); } - if ($hdopion_first_setup) { + if ($hdoption_first_setup) { $disk_selector->set_active ($i+1) if $hds->[$i]; } else { my $hdind = 0; @@ -2776,6 +2826,12 @@ sub create_hdoption_view { $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 @@ -2834,7 +2890,7 @@ sub create_hdoption_view { $grid->attach($options_stack, 0, $row, 2, 1); $row++; - $hdopion_first_setup = 0; + $hdoption_first_setup = 0; my $switch_view = sub { my $raid = $config_options->{filesys} =~ m/zfs|btrfs/; @@ -2843,6 +2899,7 @@ sub create_hdoption_view { $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) { @@ -2864,6 +2921,10 @@ sub create_hdoption_view { &$switch_view(); }); + my $sep2 = Gtk3::HSeparator->new(); + $sep2->set_visible(1); + $contarea->pack_end($sep2, 1, 1, 10); + $dialog->show(); $dialog->run(); @@ -3031,6 +3092,7 @@ sub get_btrfs_raid_setup { return ($devlist, $mode); } +my $last_hd_selected = 0; sub create_hdsel_view { $prev_btn->set_sensitive(1); # enable previous button at this point @@ -3043,7 +3105,7 @@ sub create_hdsel_view { $vbox->pack_start($hbox, 0, 0, 10); my ($disk, $devname, $size, $model) = @{@$hds[0]}; - $target_hd = $devname; + $target_hd = $devname if !defined($target_hd); $target_hd_label = Gtk3::Label->new("Target Harddisk: "); $hbox->pack_start($target_hd_label, 0, 0, 0); @@ -3055,10 +3117,17 @@ sub create_hdsel_view { $target_hd_combo->append_text (get_device_desc($devname, $size, $model)); } - $target_hd_combo->set_active(0); + my $raid = $config_options->{filesys} =~ m/zfs|btrfs/; + if ($raid) { + $target_hd_label->set_text("Target: $config_options->{filesys} "); + $target_hd_combo->set_visible(0); + $target_hd_combo->set_no_show_all(1); + } + $target_hd_combo->set_active($last_hd_selected); $target_hd_combo->signal_connect(changed => sub { $a = shift->get_active; my ($disk, $devname) = @{@$hds[$a]}; + $last_hd_selected = $a; $target_hd = $devname; }); @@ -3075,7 +3144,6 @@ sub create_hdsel_view { set_next(undef, sub { - my $devlist; if ($config_options->{filesys} =~ m/zfs/) { my ($devlist) = eval { get_zfs_raid_setup() }; if (my $err = $@) {