出差回来,openSUSE 又不能开机了。
这次的提示是:
ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
end_request: I/O error, dev sda, sector 5237316
Buffer I/O error on device sda6, logical block 0
Buffer I/O error on device sda6, logical block 1
Buffer I/O error on device sda6, logical block 2
Buffer I/O error on device sda6, logical block 3
很明显这是我的根分区 /dev/sda6 挂载不上的原因。
于是掏出 Live USB 进行修复,先尝试挂载:
mount /dev/sda6 /mnt
mount: can't read superblock
证明是 superblock 损坏了,估计是我挂起的时间里家里停电了。至于什么是 superblock 可以自己去看百度百科。
于是开始修复:
fdisk -l
磁盘 /dev/sda:1000.2 GB, 1000204886016 字节,1953525168 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小 (逻辑 / 物理):512 字节 / 512 字节
I/O 大小 (最小 / 最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0004746f
设备 Boot Start End Blocks Id System
/dev/sda1 2048 4208639 2103296 82 Linux swap / Solaris
/dev/sda2 * 4209030 5237189 514080 83 Linux
/dev/sda3 5237190 1748723444 871743127+ 5 Extended
/dev/sda4 1748723712 1953523711 102400000 7 HPFS/NTFS/exFAT
/dev/sda5 109081413 724724279 307821433+ 83 Linux
/dev/sda6 5237316 109081349 51922017 83 Linux
Partition table entries are not in disk order
确认自己的分区是 sda6。然后查看 superblock 的备份位置
mke2fs -n /dev/sda6
在最后会看到 32768 4096000 这样的数字,这些就是 superblock 备份的位置。(为了防止 superblock 放在磁盘的一个地方在磁盘损坏时无法恢复,磁盘把 superblock 复制到了很多位置,32768 这样的东西就是位置。)
e2fsck -f -b 32768 -y /dev/sda6
是利用 32768 位置(block,-b)的 superblock 去修复 /dev/sda6,其中 -f 是 fix,-y 是对所有提问自动回复 yes(不用这个选项你手很累的)。
之后
e2fsck -f -c -y /dev/sda6
如果是成功了而不是出现类似于:
attempt to read block from file system resulted in short read while …
这样的报错,那么 superblock 就修复成功了。
如果是上面那样的报错的话,你可以 smartctl -a /dev/sda6 一下,看看磁盘有没有自动使用之前预留的扇区去替换那个损坏的 5237316 扇区(Reallocated_Sector_Ct 是不是 0)。
然后用 hdparm 去读一下那个扇区看看究竟坏没坏,我的是没坏
hdparm --read-sector 5237316 /dev/sda
要是出现 I/O error 的话,就是该扇区已损坏,你需要手动强制 reallocated 它
hdparm --write-sector 5237316 /dev/sda
会提示你说这是非常危险的,也是无法回滚的,如果你确定你的扇区真的坏了,就
hdparm --write-sector --yes-i-know-what-i-am-doing /dev/sda
接着再用
smartctl -a /dev/sda
查看会发现之前那个 Reallocated_Sector_Ct 增加了 1。这时你可以再
e2fsck -f -c -y /dev/sda6
检查。
但是我的不是这样的,是能够读取,但是报 bad missing sense data 的错误。我找了半天发现没什么有用的内容,但是这样的扇区不可能一下子出现 8 个,于是我不想再折腾了,就保留 /home 重装了 openSUSE 13.1。在这之前使用 dd_rescue 备份一下分区也是可以的
dd_rescue /dev/sda6 /mnt/sda6.img
这样就把整个分区备份成 ISO 映像放在我挂载在 /mnt 的移动硬盘里了。