修复被破坏了的linux文件系统分区表
现 象和环境:REDHAT FC4,一块36G的SCSI硬盘(/dev/sdc)无法mount,fdisk也看不到分区信息。另外一块该盘重要数据的备份盘(9G SCSI硬盘,/dev/sdb)也是同样的现象。均为独立磁盘,没有RAID设置。(怎么这么巧?数据盘和备份盘同时坏掉了)
整个尝试修复的过程大致如下:
尝试查看分区信息 尽管事先被告知fdisk看不到分区信息,还是固执的尝试了一下:-) fdiks -l /dev/sdc 果然什么样都看不到。但是,系统启动的时候正确的列出了磁盘的相关信息(大小等),而且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. |