我可以用一个命令修复硬盘上的坏块吗?

我可以用一个命令修复硬盘上的坏块吗?

我正在努力修复硬盘中的错误,可以手动执行此操作,但可能需要几个小时。

输入此命令后sudo badblocks -b 512 /dev/sda,我得到了数百个结果,我想避免手动修复它们。

有关我的错误的更多详细信息可以找到这里

那么有什么工具可以用来修复错误吗?或者你可以帮我写一个 shell 脚本吗?

答案1

嗯,有几种情况:

  1. 该磁盘是 RAID 阵列的一部分。好的。只需让 md 像这样“修复”数组即可:echo 'repair' > /sys/block/md0/md/sync_action。问题已解决且没有数据丢失。 (我猜你的情况并非如此,但你确实应该考虑改变这一点。)
  2. 您不关心磁盘上的数据(或者根本没有数据)。只需使用 dd 将整个磁盘清零即可。
  3. 坏块是磁盘上可用空间的一部分。使用eg,cat /dev/zero > tempfile用零填充可用空间。以 root 身份执行此操作(仅为 root 保留空间),可能是在单用户模式下(因此不会因为空间不足而中断)。当空间耗尽后,删除该文件 ( rm tempfile)。
  4. 坏块是磁盘上数据(文件)或元数据(文件系统结构)的一部分。您丢失了数据。fsck -fc(在未安装文件系统的情况下运行,或者如果是根文件系统,则在早期启动期间以只读方式运行最坏的情况)会告诉您哪些文件。从备份中替换它们。

也有可能badblocks -n,这必须仅有的完成于未安装的文件系统,将强制重新映射。它不应该丢失任何数据(坏块中的数据除外,这些数据已经丢失)。

如果您想根据坏块输出(其中不安全,它会让你陷入无声的腐败),这相当容易。 badblocks 输出的每一行都会根据您的块大小(示例中为 512)为您提供一个块号。对 dd 使用相同的块大小bs。块号是您的seekdd 。你的count值为 1(或更高,如果连续有几个坏块)。of是您运行坏块的分区(或磁盘)。一个好的if/dev/zero

答案2

e2fsck -c -c似乎做了同样的事情,有块大小保险。

答案3

进入单用户模式并执行以下操作fsck -yvf /dev/sda

看来,它毕竟需要 fsck。

答案4

我不确定是否可以使用单个命令来完成此操作,因为我在互联网上看到了一些脚本解决方案。

下面的脚本查找坏扇区,将坏块结果放入文本文件中,然后如果文本文件大小不为零,e2fsck将标记坏扇区(因此操作系统不会使用这些标记的扇区)。

#!/bin/sh
target=/tmp/bad-blocks.txt
for disc in `fdisk -l | grep '^/' | awk '{ print $1 }'`; do
   badblocks -v $disc > $target
   if [ -s $target ]; then
       echo "badblock(s) found on $disc"
       e2fsck -l $target $disc
   else
       echo "no badblocks on $disc"
   fi
done

相关内容