[linux-lvm] VG has wrong num of PV's; won't vgscan
Heinz J . Mauelshagen
mauelshagen at sistina.com
Sun Feb 10 12:37:02 UTC 2002
Sean,
I have attached a quick hack perl script to fix your VGDA on
/dev/ide/host0/bus1/target0/lun0/part1.
Please recognize that it *just* solves the very purpose of getting your
VG with the single PV on /dev/ide/host0/bus1/target0/lun0/part1 back!
Save your metadata before you run it by
dd if=/dev/ide/host0/bus1/target0/lun0/part1 bs=1k count=1024 of=vgda.sav
in order to be able to redi from start in case something goes badly wrong.
Regards,
Heinz -- The LVM Guy --
On Sat, Feb 09, 2002 at 04:28:14PM -0500, Sean C. McCord wrote:
> I was attempting to add another PV to my VG 'mccord', and vgextend
> segfaulted in the middle. After I rebooted (the kernel dumped its LVM
> core), there was no volume group found by vgscan.
>
> I have seen similar posts in the archives, but most of them reference a
> bug that was supposedly fixed before LVM 1.0, so this must not be it.
>
> Anyway, pvdisplay on /dev/ide/host0/bus1/target0/lun0/part1 says
> everythings's great, and that it is PV #1 of VG mccord.
>
> pvdata says VG mccord has two PVs and that both are active. The other PV,
> though, is completely trashed. pvdata also says that the LV seems to be
> fine.
>
> I have no backup of the vgdata that I can find (they are stored on the
> first PV...), so I can't do what many of the other people did to get their
> VGs back.
>
> Is there any way to change the VG info back to having only one PV, and if
> so, will that get vgscan to find the VG again? If you need the debug
> info, I can provide it.
>
> My system is using LVM 1.0.1-rc4, devfs, Reiserfs, and I have my root file
> system on that VG.
>
> Thanks for any assistance anyone can offer,
>
> Sean C. McCord
>
>
>
> _______________________________________________
> linux-lvm mailing list
> linux-lvm at sistina.com
> http://lists.sistina.com/mailman/listinfo/linux-lvm
> read the LVM HOW-TO at http://www.sistina.com/lvm/Pages/howto.html
*** Software bugs are stupid.
Nevertheless it needs not so stupid people to solve them ***
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Heinz Mauelshagen Sistina Software Inc.
Senior Consultant/Developer Am Sonnenhang 11
56242 Marienrachdorf
Germany
Mauelshagen at Sistina.com +49 2626 141200
FAX 924446
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-------------- next part --------------
#!/usr/bin/perl
#
# For Sean C. McMord to patch his metadata on
# /dev/ide/host0/bus1/target0/lun0/part1 to reflect a VG
# with just 1 PV
#
$PVNAME="/dev/ide/host0/bus1/target0/lun0/part1";
# various offsets we need to retrieve and patch members
$VG_ON_DISK_OFFSET = 12;
$PV_UUIDLIST_ON_DISK_OFFSET = 20;
$PV_MAX_OFFSET=152;
$PV_UUID_OFFSET=44;
$PV_PE_TOTAL_OFFSET=456;
$VG_PE_TOTAL_OFFSET=176;
$NAME_LEN=128;
open ( PV, "$PVNAME") || die "Error opening \"$PVNAME\" to read\n";
# get the offset of the VG structure
seek ( PV, $VG_ON_DISK_OFFSET, 0);
$vg_on_disk_base = unpack ('V', <PV>);
printf ( "VG on-disk base is at %d bytes\n", $vg_on_disk_base);
# get the PV UUID
seek ( PV, $PV_UUID_OFFSET, 0);
$pv_uuid = unpack ( "a$NAME_LEN", <PV>);
printf ( "PV UUID at offset %d is: \"%s\"\n", $PV_UUID_OFFSET, $pv_uuid);
# get the current PV and actual PV count from the VG structure
seek ( PV, $vg_on_disk_base + $PV_MAX_OFFSET, 0);
( $pv_max, $pv_cur, $pv_act) = unpack ('V3', <PV>);
printf ( "pv_max: %d pv_cur: %d pv_act: %d\n", $pv_max, $pv_cur, $pv_act);
# get the total PE count from the PV strcuture
seek ( PV, $PV_PE_TOTAL_OFFSET, 0);
( $pe_total, $pe_allocated) = unpack ('V2', <PV>);
printf ( "pe_total: %d pe_allocated: %d\n", $pe_total, $pe_allocated);
# get start of the PV UUID list
seek ( PV, $PV_UUIDLIST_ON_DISK_OFFSET, 0);
$pv_uuidlist_on_disk = unpack ( 'V', <PV>);
printf ( "PV UUIDLIST is at %d bytes\n", $pv_uuidlist_on_disk);
close ( PV);
open ( PV, ">$PVNAME") || die "Error opening \"$PVNAME\" to write\n";
# Now we've got all the parameters -> got to change them
# change the current PV and actual PV count in the VG structure
$pv_cur = $pv_act = 1;
seek ( PV, $vg_on_disk_base + $PV_MAX_OFFSET, 0);
syswrite ( PV, pack ( 'V3', $pv_max, $pv_cur, $pv_act), 12);
printf ( "Changed pv_cur and pv_act to %d in the VG structure\n", $pv_cur);
# change PE total and PE allocated in the VG structure
seek ( PV, $vg_on_disk_base + $VG_PE_TOTAL_OFFSET, 0);
syswrite ( PV, pack ( 'V2', $pe_total, $pe_allocated), 8);
print ( "Changed pv_total and pv_allocated in the VG structure\n");
# change the PV UUID list
seek ( PV, $pv_uuidlist_on_disk, 0);
syswrite ( PV, $pv_uuid, $NAME_LEN);
for ( $i = 1; $i < $pv_max; $i++) {
seek ( PV, $pv_uuidlist_on_disk + $i * $NAME_LEN, 0);
syswrite ( PV, 0, 1);
};
print ( "Changed PV UUID list\n");
close ( PV);
print ( "Done\n\n");
More information about the linux-lvm
mailing list