[pve-devel] applied: [PATCH installer] prompt user if a vgrename is OK for exisiting 'pve'/'pmg' VGs

Thomas Lamprecht t.lamprecht at proxmox.com
Tue Jul 9 22:17:00 CEST 2019


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.lamprecht at 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





More information about the pve-devel mailing list