背景

在Debian 系统中,可以使用 badblocks 命令检测和修复磁盘坏道,检测时需在非挂载的、单用户模式下运行,并且需要root 权限。 对于物理坏道,是永久性损伤,只能通过 badblocks 命令进行屏蔽,避免数据读写。 对于逻辑坏道,通常通过格式化来修复,或使用 fsck 命令检查和修复文件系统错误。** **

识别坏道类型

  • 物理坏道​:

    由磁盘物理损伤引起,例如磁头划伤,通常是不可修复的。** **

  • 逻辑坏道​:

    由软件或文件系统错误引起,通常可以通过格式化或修复文件系统来解决

检测磁盘坏道

  1. 卸载目标分区​:在检测前,必须卸载要检测的分区,以确保数据安全,避免检测过程中的读写操作造成进一步损坏。
1
sudo umount /dev/sdXn # 将 sdXn 替换为你的分区名称,例如 /dev/sda1
  1. 执行 badblocks 命令进行只读检测:: 使用 -v (verbose) 和 -n (non-destructive read-test) 参数,执行只读检测,检查出存在问题的块。
1
sudo badblocks -v -n /dev/sdXn
  1. 执行 badblocks 命令进行读写检测(谨慎使用):: 如果确定要对整个磁盘进行彻底检测,可以使用 -w 参数进行读写测试,但这会擦除磁盘上的数据

    1
    sudo badblocks -w -s -v -o badblocks.txt /dev/sdXn
  • -w: 进行写测试,这会擦除磁盘数据。
  • -s: 显示进度。
  • -v: 显示详细信息。
  • -o badblocks.txt: 将检测到的坏块列表保存到badblocks.txt 文件。

修复坏道

如果不介意全部擦除就可以用上述命令

1
sudo badblocks -w -s -v -o badblocks.txt /dev/sdXn

否则就先备份数据,再局部修复

  1. 先用dd命令对坏道数据进行备份
1
dd if=/dev/vda skip=417334708 of=/tmp/417334708-417334711.dat count=4
  1. 再对坏道读写修复
1
sudo badblocks -s -w /dev/vda 417334711 417334708
  1. 检测下坏道是否已经修复
1
sudo badblocks -w -s -v -o badblocks.txt /dev/vda
  1. 如果未检测出坏道,可以对备份数据进行回写
1
dd if=/tmp/417334708-417334711.dat of=/dev/vda seek=417334708 count=4
  1. 如果坏道经过读写修复依然存在,那么只能通过屏蔽,使系统不再使用
1
sudo mkfs -l badblocks.txt /dev/vda