[ 教学 ] 修复损坏的 superblock 和扇区

出差回来,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 的移动硬盘里了。

说到 superblock 损坏,有时候会遇到 U 盘 /SD 卡的 superblock 损坏。很讨厌这些东东多是 FAT 格式的。这时候可以使用这个叫 testdisk 的东东。装好有两个软件。一个用来修复 superblock 这类东东,一个用来帮你恢复损坏盘里的东西。

如果你像我一样懒直接用第二个软件可以在图形界面中把盘里的东西都 copy 出来然后格式化 U 盘 /SD 卡。操作非常傻瓜~~(好在 U 盘什么不会太大。。。)


补充一个一键安装 software.opensuse.org/package/testdisk

我以前有一个 U 盘坏了,一直没找到原因,今天回去试一试