Rebuilding a corrupt disklabel

Doug H illusion65 at gmail.com
Thu Dec 1 07:09:04 PST 2005


I tried posting this 12 hours ago, but haven't seen it flow through the
list... reposting with updates:

One of my disks has 3 active partitions: FreeBSD 5.4-RC3, NTFS
(not-bootable), and FreeBSD 6.0-RELEASE.

I developed problems while installing FreeBSD 6.0.  Installation went well,
but when I rebooted, nothing was bootable on that disk.  I verified that the
boot record (using boot0) seems okay: slice table is fine (40G, 80G, 40G,
and 40G unused on 200G drive).

Using bsdlabel, I confirmed that slice 3 (FreeBSD 6) is fine, but for some
reason I'm not concerned with now, is unbootable.

PROBLEM: bsdlabel showed me that slice 1 (FreeBSD 5.4) is damaged and only
partition c existed and was incorrect.  I do not have & cannot find a
written copy of my disklabel for that disk (a good suggestion to *strongly
emphasize* in the installation manual for newbies!).  I did recall that
ad1s1a ('/') was 512M, so I was able to write a label and mount the root
partition from a "Fixit" shell.

QUESTIONS: How can I rederive the remaining disklabel for that disk?  Could
a copy possibly be stored somewhere on root if I didn't do it myself when
building the system?

I have not tried to boot from that root partition.  Trying several possible
labels has resulted in "incorrect super block" errors for the partitions
after 'a'.  Random guessing will be very tedious.

My research has indicated that I could binary grep the raw ad1s1c partition
to locate the magic numbers for the super blocks and derive the partitions
from that information.  I even found a little 'c' language program Peter
Dufault posted 11 years ago on this list to locate magic numbers.

My hope is that in 11 years of development, FreeBSD will have created a
clever tool to aid this process!  I've found enough entries while searching
these lists to think that the effort would be justified and much
appreciated.  I found the value of FS_UFS2_MAGIC = 0x19540119.  I presume
that's what I should search for - it's a UFS2 filesystem.  Having only a
"Fixit" shell is somewhat limiting.  I tried 'grep -ab -f pat /dev/ad1s1a'
on a FreeBSD 5.1 installation, but it crashed with a swap error.  The 'pat'
file has the 4-byte magic number.  It works with a small test file I created
using vi.

Thanks,
 Doug


More information about the freebsd-questions mailing list