我的硬盘里充满了零。
如何使用 bash 检查硬盘上的所有位是否为零?
答案1
od
将用 替换相同内容的运行*
,因此您可以轻松地使用它来扫描非零字节:
$ sudo od /dev/disk2 | head
0000000 000000 000000 000000 000000 000000 000000 000000 000000
*
234250000
您可以将其与dd
或结合使用pv
,以在扫描过程中显示进度:
$ sudo dd if=/dev/disk2 bs=1M status=progress | od | head
# or:
$ sudo pv /dev/disk2 | od | head
答案2
我已经编写了一个简短的 C++ 程序来实现这一点,源代码可用这里。
构建方法:
wget -O iszero.cpp https://gist.github.com/BobVul/5070989/raw/2aba8075f8ccd7eb72a718be040bb6204f70404a/iszero.cpp
g++ -o iszero iszero.cpp
运行它:
dd if=/dev/sdX 2>/dev/null | ./iszero
它将输出任何非零字节的位置和值。你可以用 将此输出重定向到文件>
,例如:
dd if=/dev/sdX 2>/dev/null | ./iszero >nonzerochars.txt
您可能想尝试更改BUFFER_SIZE
以提高效率。我不确定最佳值是多少。请注意,这也会影响打印进度的频率,这会在一定程度上影响速度(将输出打印到控制台是慢的)。添加2>/dev/null
以摆脱进度输出。
我知道这不是使用标准 bash,甚至不是内置命令,但它不应该需要任何额外的权限。@Hennes 的解决方案仍然更快(我并没有真正优化任何东西 - 这是一个幼稚的解决方案);但是,这个小程序可以让您更好地了解您的擦除器错过了多少字节以及在哪个位置。如果您禁用进度输出,它仍然比大多数消费者硬盘读取的速度更快(>150 MB/s),所以这不是一个大问题。
提供更快的版本,输出内容更少这里。但是,它仍然比@Hennes 的解决方案慢一点。但是,这个解决方案会在遇到第一个非零字符时退出,因此如果在流的开头附近有一个非零字符,它可能会快得多。
将来源添加到帖子中以使答案更加独立:
#include <cstdio>
#define BUFFER_SIZE 1024
int main() {
FILE* file = stdin;
char buffer[BUFFER_SIZE];
long long bytes_read = 0;
long long progress = 0;
long long nonzero = 0;
while (bytes_read = fread(buffer, 1, BUFFER_SIZE, file)) {
for (long long i = 0; i < bytes_read; i++) {
progress++;
if (buffer[i] != 0) {
nonzero++;
printf("%lld: %x\n", progress, buffer[i]);
}
}
fprintf(stderr, "%lld bytes processed\r", progress);
}
fprintf(stderr, "\n");
int error = 0;
if (error = ferror(file)) {
fprintf(stderr, "Error reading file, code: %d\n", error);
return -1;
}
printf("%lld nonzero characters encountered.\n", nonzero);
return nonzero;
}
答案3
扩展 Gordon 的回答,pv
可以表明该过程进行到了何种程度:
$ sudo pv -tpreb /dev/sda | od | head
0000000 000000 000000 000000 000000 000000 000000 000000 000000
*
9.76GiB 0:06:30 [25.3MiB/s] [=================> ] 59% ETA 0:04:56
答案4
仅检查,您将看到列出的任何不匹配的块
sudo badblocks -sv -t 0x00 /dev/sdX
或者使用坏块来写入它们并检查:
sudo badblocks -svw -t 0x00 /dev/sdX
默认破坏性测试是我选择的安全擦除
sudo badblocks -svw /dev/sdX
如果有人能够在用交替的 0 和 1、它们的补码、所有 1、所有 0 填充驱动器之后检索到任何东西,并且每次都验证成功,那么祝他们好运!
对新驱动器进行良好的部署前检查
man badblocks
其他选择
并不是说它很快,但它确实有效......