我正在努力修复硬盘中的错误,可以手动执行此操作,但可能需要几个小时。
输入此命令后sudo badblocks -b 512 /dev/sda
,我得到了数百个结果,我想避免手动修复它们。
有关我的错误的更多详细信息可以找到这里
那么有什么工具可以用来修复错误吗?或者你可以帮我写一个 shell 脚本吗?
答案1
嗯,有几种情况:
- 该磁盘是 RAID 阵列的一部分。好的。只需让 md 像这样“修复”数组即可:
echo 'repair' > /sys/block/md0/md/sync_action
。问题已解决且没有数据丢失。 (我猜你的情况并非如此,但你确实应该考虑改变这一点。) - 您不关心磁盘上的数据(或者根本没有数据)。只需使用 dd 将整个磁盘清零即可。
- 坏块是磁盘上可用空间的一部分。使用eg,
cat /dev/zero > tempfile
用零填充可用空间。以 root 身份执行此操作(仅为 root 保留空间),可能是在单用户模式下(因此不会因为空间不足而中断)。当空间耗尽后,删除该文件 (rm tempfile
)。 - 坏块是磁盘上数据(文件)或元数据(文件系统结构)的一部分。您丢失了数据。
fsck -fc
(在未安装文件系统的情况下运行,或者如果是根文件系统,则在早期启动期间以只读方式运行最坏的情况)会告诉您哪些文件。从备份中替换它们。
也有可能badblocks -n
,这必须仅有的完成于未安装的文件系统,将强制重新映射。它不应该丢失任何数据(坏块中的数据除外,这些数据已经丢失)。
如果您想根据坏块输出(其中不安全,它会让你陷入无声的腐败),这相当容易。 badblocks 输出的每一行都会根据您的块大小(示例中为 512)为您提供一个块号。对 dd 使用相同的块大小bs
。块号是您的seek
dd 。你的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