悲剧发生了, 一个硬盘上的两个分区同时坏掉了, mount挂载不上。 估计是我每次都不关机,直接待机,待机后电源又经常忽然拔掉。最后整个分区的superblock都出现问题了。这些麻烦了,一年半的资料和工程都要丢了。赶紧google一些怎么修复的。
1. google search
打开/var/log/messages 找到和磁盘 /dev/sdb1 /dev/sdb2 有关的log.
Jul 26 09:35:50 gwj-laptop kernel: [13722.459996] sd 0:0:1:0: [sdb] Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
Jul 26 09:35:50 gwj-laptop kernel: [13722.460018] sd 0:0:1:0: [sdb] CDB: Read(10): 28 00 00 e8 5f ef 00 00 08 00
Jul 26 09:35:50 gwj-laptop kernel: [13722.460166] sd 0:0:1:0: [sdb] Unhandled error code
Jul 26 09:35:50 gwj-laptop kernel: [13722.460169] sd 0:0:1:0: [sdb] Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
Jul 26 09:35:50 gwj-laptop kernel: [13722.460174] sd 0:0:1:0: [sdb] CDB: Write(10): 2a 00 00 00 00 3f 00 00 08 00
原理4天以前磁盘就已经有问题了,还不知道那。 CDB
Jul 29 14:22:48 gwj-laptop pulseaudio[1908]: ratelimit.c: 161 events suppressed
Jul 29 14:22:51 gwj-laptop kernel: [81109.810812] attempt to access beyond end of device
Jul 29 14:22:51 gwj-laptop kernel: [81109.810821] sdb1: rw=0, want=174423728, limit=72292437
Jul 29 14:22:51 gwj-laptop kernel: [81109.811115] attempt to access beyond end of device
Jul 29 14:22:51 gwj-laptop kernel: [81109.811120] sdb1: rw=0, want=174423576, limit=72292437
Jul 29 14:26:15 gwj-laptop kernel: [81313.687949] attempt to access beyond end of device
Jul 29 14:26:15 gwj-laptop kernel: [81313.687959] sdb1: rw=0, want=174423576, limit=7229243
这里29号,磁盘superblock已经坏掉了。
2. 初步修复
fsck.ext3 /de/sdb1 提示文件系统无法识别出来, 直接退出。
3. 找到一篇类似问题的博客,讲的挺详细的,动手用 备份Superblock 来修复磁盘。
dumpe2fs 仍然提示找不到备份superblock的位置,看来坏的比较彻底,不过如果备份可以找得到开机的时候运行磁盘修复工具就能过了。
想了很久,觉得应该指定一个默认的备份位置或许可以试试。
以下是从 参考[1] 复制出来可以参考的命令:
# dumpe2fs /dev/sdb1 | grep -i superblock
# fsck.ext3 -b 32768 /dev/mapper/VolGroup_ID_17253-LogVol3
# fsck.ext3 -b 98304 /dev/VolGroup_ID_17253/LogVol3
# fsck.ext3 -y -b 98304 /dev/VolGroup_ID_17253/LogVol3
fsck.ext3 -B 1024 -b 32768
fsck.ext3 -b 98304 /dev/VolGr
错误提示:
dumpe2fs 1.41.11 (14-Mar-2010)
dumpe2fs: Filesystem revision too high while trying to open /dev/sdb2
Couldn't find valid filesystem superblock.
sdb2 已经无法识别出fs信息了, 连文件系统分区类型都找不到了。
dump一个正确的分区信息
sudo dumpe2fs /dev/sda1 | grep Back
dumpe2fs 1.41.11 (14-Mar-2010)
Backup superblock at 32768, Group descriptors at 32769-32769
Backup superblock at 98304, Group descriptors at 98305-98305
Backup superblock at 163840, Group descriptors at 163841-163841
Backup superblock at 229376, Group descriptors at 229377-229377
Backup superblock at 294912, Group descriptors at 294913-294913
Backup superblock at 819200, Group descriptors at 819201-819201
Backup superblock at 884736, Group descriptors at 884737-884737
Backup superblock at 1605632, Group descriptors at 1605633-1605633
Backup superblock at 2654208, Group descriptors at 2654209-2654209
32768 , 98304 都是 superblock备份的地方,我可以直接使用这个位置试试
fsck -y -b 32768 /dev/sdb1
:) 这个命令实在是神奇了。
最后的结果是大部分文件都恢复过来了,可是ext3 文件系统识别成了ext2的了。
以后还是直接关机不搞睡眠了, 睡眠竟然也会破坏superblock。
4. 备份出来数据后把磁盘格式化成ext4的信息。 注意了一下打印信息:
mkfs.ext4 /dev/sdb1
mke2fs 1.41.11 (14-Mar-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
2260992 inodes, 9036554 blocks
451827 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
276 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624
Writing inode tables: done
Creating journal (32768 blocks): 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.
这里创建磁盘分区的时候已经就指定了备份superblock的位置,
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624
276个块group, 每个group 32768个块和分段
refer:
http://www.cnblogs.com/dancefire/archive/2011/03/09/fix-bad-superblock-in-linux.html