您尚未登录。

#1 2020-04-11 18:28:07

roadgo
会员
注册时间: 2012-04-07
帖子: 380

转发:修复损坏的 superblock 和扇区

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

marguerite
Site Admin
14年6月
出差回来,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 的移动硬盘里了。
https://forum.suse.org.cn/t/superblock/2626

离线

页脚