If one has a 'pve' VG on a disks not selected as install target (e.g., on re-installation to different disk or if putting a used disk into another server where PVE was installed on) the vgcreate call errored out, as for creation the VG names must be unique.
Cope with that by asking the users if a rename to a '<vgname>-OLD-<short-uid>' name is OK in this case. It ensures that no data is lost and that we can safely continue with the installation. The admin can then later on wipe the renamed VG if it was really decommissioned or save data from it (or actually use it) This can cope (tested) with: * a single 'pve' VG on another device * a single 'pve' VG spanning multiple devices * multiple 'pve' VGs spanning different sets of devices This is achieved by using the VG UUID for rename, and by recording all PVs with said UUID as index. Note, while this commit message talks mostly about 'pve' VG the patch itself is actually agnostic of the specific name, works for 'pmg' and possible (future) other VG names too. Signed-off-by: Thomas Lamprecht <t.lampre...@proxmox.com> --- proxinstall | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/proxinstall b/proxinstall index b256c6e..aff6c4c 100755 --- a/proxinstall +++ b/proxinstall @@ -972,11 +972,78 @@ sub partition_bootable_disk { return ($os_size, $osdev, $efibootdev); } +sub get_pv_list_from_vgname { + my ($vgname) = @_; + + my $res; + + my $parser = sub { + my $line = shift; + $line =~ s/^\s+//; + $line =~ s/\s+$//; + return if !$line; + my ($pv, $vg_uuid) = split(/\s+/, $line); + + if (!defined($res->{$vg_uuid}->{pvs})) { + $res->{$vg_uuid}->{pvs} = "$pv"; + } else { + $res->{$vg_uuid}->{pvs} .= ", $pv"; + } + }; + run_command("pvs --noheadings -o pv_name,vg_uuid -S vg_name='$vgname'", $parser, undef, 1); + + return $res; +} + +sub ask_existing_vg_rename_or_abort { + my ($vgname) = @_; + + # this normally only happens if one put a disk with a PVE installation in + # this server and that disk is not the installation target. + my $duplicate_vgs = get_pv_list_from_vgname($vgname); + return if !$duplicate_vgs; + + my $message = "Detected existing '$vgname' Volume Group(s)! Do you want to:\n"; + + for my $vg_uuid (keys %$duplicate_vgs) { + my $vg = $duplicate_vgs->{$vg_uuid}; + + # no high randomnes properties, but this is only for the cases where + # we either have multiple "$vgname" vgs from multiple old PVE disks, or + # we have a disk with both a "$vgname" and "$vgname-old"... + my $short_uid = sprintf "%08X", rand(0xffffffff); + $vg->{new_vgname} = "$vgname-OLD-$short_uid"; + + $message .= "rename VG backed by PV '$vg->{pvs}' to '$vg->{new_vgname}'\n"; + } + $message .= "or cancel the installation?"; + + my $dialog = Gtk3::MessageDialog->new($window, 'modal', 'question', 'ok-cancel', $message); + my $response = $dialog->run(); + $dialog->destroy(); + + if ($response eq 'ok') { + for my $vg_uuid (keys %$duplicate_vgs) { + my $vg = $duplicate_vgs->{$vg_uuid}; + my $new_vgname = $vg->{new_vgname}; + + syscmd("vgrename $vg_uuid $new_vgname") == 0 || + die "could not rename VG from '$vg->{pvs}' ($vg_uuid) to '$new_vgname'!\n"; + } + } else { + set_next("_Reboot", sub { exit (0); } ); + display_html("fail.htm"); + die "Cancled installation by user, due to already existing volume group '$vgname'\n"; + } +} + sub create_lvm_volumes { my ($lvmdev, $os_size, $swap_size) = @_; my $vgname = $setup->{product}; + ask_existing_vg_rename_or_abort($vgname); + my $rootdev = "/dev/$vgname/root"; my $datadev = "/dev/$vgname/data"; my $swapfile; -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel