[linux-lvm] Fixing corrupted LVM PV headers?
Andreas Dilger
adilger at turbolabs.com
Thu Jan 3 15:25:01 UTC 2002
On Jan 04, 2002 04:30 +1100, timshel at pobox.com wrote:
> I've been using LVM on my home system for quite some time now, and I
> have just recently install Windows XP, which totally stuffed up my
> partitioning for some reason. Anyway, in the process of fixing the
> stuff up I've managed to corrupt the first 3 sectors or so (at least, I
> hope it's only 3 sectors) of one of the physical volumes that make up
> my main volume group. So I've effectively lost my entire Linux system.
>
> I'd rather not have to reinstall from scratch, as there was quite a bit
> of stuff on some of the filesystems that would take me some time to
> replace, so I'm wondering if there is any way of resurrecting the PV.
> I've got the UUID of the PV (from running pvdisplay on the other PV's
> in the group and working out which one was missing) ... If it's not
> possible to recover the filesystem(s) that were on that particular PV,
> would it be at all possible to recover filesystems that are entirely on
> the other PV's?
>
> My setup is the following:
>
> hda6: 8Gb PV (This is the stuffed one)
> hda7: 8Gb PV
> hda8: 8Gb PV
> hdb6: 8Gb PV
> hdc: 3Gb PV
>
> There were 5 different LV's on the VG, all with XFS filesystems except
> for a swap volume.
>
> /usr ~4Gb LV
> /home ~2Gb LV
> /var: ~1.3Gb LV
> /var/share ~7Gb LV
> /var/chroot ~1Gb LV
>
> If anyone has any suggestions on possibilites for fixing this, please
> let me know ...
Well, this seems to become my specialty:
- Look in include/linux/lvm.h for descriptions of the LVM metadata (see
pv_disk_t, lv_disk_t, vg_disk_t, etc)
- You need to re-create the pv_disk_t struct at the start of the disk,
and also maybe the vg_disk_t (it starts at 1kB or 4kB offset normally).
- You need to have all of the data for the pv_disk_t. Some of it can be
found from the other PVs, some of it you will have to calculate.
- The majority of fields _should_ be the same as that on another PV of
_exactly_ the same size, assuming you added them with the same version
of LVM user tools. To start with, I would just do something like the
following to give you the basics, and allow you to just change specific
fields. You _need_ to have the exact same partition sizes for this to
work correctly, if you don't you need to do more work:
dd if=/dev/hda7 bs=1k count=1 of=/dev/hda6
- The vg_disk_t starts with the VG UUID, so if you find it at 4kB offset,
you are OK with that part. If not, you should be able copy the vg_disk_t
directly from another PV in the same VG. The offset will depend on what
version of tools you used to create your PV/VG, so it needs to be at the
value of vg_on_disk.base (either 1kB or 4kB offset into the PV):
dd if=/dev/hda7 bs=1k count=1 seek=<1k/4k> skip=<1k/4k> of=/dev/hda6
- Note that pv_uuidlist_on_disk.base and .size were changed (6kB or 8kB), so
you _should_ be able to determine the start of the UUID list by looking at
the disk with "od -Ax -tx4 /dev/hda6" and comparing the output to the UUIDs
on another PV.
- At this stage, running "pvdata -avP /dev/hda6" should give you reasonable
values back for the VG, LV, PE, and UUID data.
- You need to fix the fields pv_uuid, pv_number and pe_allocated, assuming
the original PV is exactly the same size. Normally I do this by either
echo -en "<value(s)>" | dd of=/dev/hda6 bs=1 count=M seek=N
where I echo things like "\0\0\0\001" (the latter being an octal number),
and M and N are appropriate byte offsets into the struct (per lvm.h). You
need to specify M (normally 4) because echo may append a trailing newline.
- If the PV sizes do not match, you also need to fix pe_on_disk.size, pv_size,
pe_total, and pe_start (maybe). I can tell you how to do this also, but
it is complicated so I'd rather not unless needed.
- At this point, vgscan should be able to detect the whole VG. If the
pe_on_disk.size value (and/or pe_start) is wrong, then you will get
misaligned data for your filesystems that have data on that PV, and you
have to work out the correct value.
Cheers, Andreas
--
Andreas Dilger
http://sourceforge.net/projects/ext2resize/
http://www-mddsp.enel.ucalgary.ca/People/adilger/
More information about the linux-lvm
mailing list