现象和环境:REDHAT FC4,一块36G的SCSI硬盘(/dev/sdc)无法mount,fdisk也看不到分区信息。另外一块该盘重要数据的备份盘(9G SCSI硬盘,/dev/sdb)也是同样的现象。均为独立磁盘,没有RAID设置。(怎么这么巧?数据盘和备份盘同时坏掉了)

整个尝试修复的过程大致如下:

尝试查看分区信息

尽管事先被告知fdisk看不到分区信息,还是固执的尝试了一下:-)

fdiks -l /dev/sdc
cat /proc/partitions

果然什么样都看不到。但是,系统启动的时 候正确的列出了磁盘的相关信息(大小等),而且fdisk也能够列出磁盘大小等相关物理信息,只是没有分区信息。因此初步判断,是磁盘的分区表丢失,不一定是磁盘物理损坏。

尝试使用parted查看和恢复分区信息

parted /dev/sdc
print自然也列不出分区信息,好在管理员还有一块分区完全一致的硬盘(是早先通过dd完全复制的),于是挂上这块clone盘,获得了sdc的分区信息,记录下来(注:这里可以有更好的处理方法,见下面的gpart部分),尝试使用parted恢复分区信息:

rescue
start? 0
end ? 4G

上面是parted尝试根据给出起始尺寸和结束尺寸,在这个范围内寻找分区标志符,以决定是否重新写入分区表。可是奇怪的是,总共6个分区,parted只能按照这个办法找回一个分区,其他的都宣告一个提示,大致的意思是“分区结束符位于开始符之前”。

也尝试使用parted的mkpart重新创建分区表,但是失败,提示不能创建更多的主分区(难道分区信息没有丢失吗?为什么不允许创建分区信息呢?)

使用gpart尝试找回分区信息

parted没有成功的找回分区信息,于是转而尝试gpart:

gpart /dev/sdc

可喜的是,gpart经过一段时间的搜寻,列出了看起来有道理的分区信息!但是,按照管理员提供的clone盘,应该是找到6个分区(包括swap)才对,但是gpart只找到了4个。经过分析发现, gpart原来只是找到了主分区分析,扩展分区和逻辑分区没有找到。

尝试通过

gpart -W /dev/sdc /dev/sdc

将分区信息重新写入到损坏盘中。虽然fdisk, parted可以列出分区信息,但是还是无法mount。于是怀疑文件系统也遭到了损坏。

使用reiserfsck/e2fsck修复文件系统

管理员告知,/dev/sdc的文件系统应该是reiserfs,于是尝试使用reiserfsck检查和修复文件系统(事后证明,这是一个严重的错误!)

reiserfsck --check /dev/sdc1
reiserfsck --fix-fixable /dev/sdc1
reiserfsck --rebuild-sb /dev/sdc1
reiserfsck --rebuild-tree /dev/sdc1


但 是,一番修复之后,发现仍然无法mount!对比clone盘(早就应该比对了,失策!),才发现原来文件系统是ext3!这一番使用 reiserfsck的折腾,估计/dev/sdc1是彻底完蛋了。好在知道/dev/sdc1是一个没有重要数据的分区,可以把用来试验。

于是,又使用e2fsck(fsck.ext3)尝试修复数据:

fsck.ext3 /dev/sdc1

告知找不到superblock,于是:

fsck.ext3 -b 8193 /dev/sdc1

尝试找回superblock,但是失败!于是在另外几个保存superblock的地方继续尝试:

fsck.ext3 -b 24577 /dev/sdc1
fsck.ext3 -b 40961 /dev/sdc1
fsck.ext3 -b 57345 /dev/sdc1
fsck.ext3 -b 73729 /dev/sdc1


但是,均告失败!没有找回superblock,极度失望!

小技巧:如何知道superblock存储的位置?

dd if=/dev/zero of=/tmp/test bs=1024  count=160000
160000+0 records in
160000+0 records out
163840000 bytes (164 MB) copied, 4.35857 seconds, 37.6 MB/s

mke2fs /tmp/test
/tmp/test is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
40000 inodes, 160000 blocks
8000 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
20 block groups
8192 blocks per group, 8192 fragments per group
2000 inodes per group
Superblock backups stored on blocks:
       8193, 24577, 40961, 57345, 73729

Writing inode tables: done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 35 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.


尝试live cd

万般无奈,下载knoppix live cd,启动起来,居然认出并成功加载了/dev/sdb (备份盘)!于是把备份数据先弄下来再说。

但是,knoppix没有认出/dev/sdc。