我曾经shred
擦拭过我的外部硬盘:
sudo shred -vz /dev/sdb
我还应该补充一点,磁盘有 5 个坏扇区。
我不太熟悉dd
,但我相信这些表明它已被归零:
sudo dd if=/dev/sdb status=progress | hexdump
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
5000916670976 bytes (5.0 TB, 4.5 TiB) copied, 45754 s, 109 MB/s
9767541167+0 records in
9767541167+0 records out
5000981077504 bytes (5.0 TB, 4.5 TiB) copied, 45756.7 s, 109 MB/s
48c61b35e00
sudo dd if=/dev/sdb status=progress | od | head
5000952267264 bytes (5.0 TB, 4.5 TiB) copied, 45739 s, 109 MB/s
9767541167+0 records in
9767541167+0 records out
5000981077504 bytes (5.0 TB, 4.5 TiB) copied, 45741.1 s, 109 MB/s
0000000 000000 000000 000000 000000 000000 000000 000000 000000
*
110614154657000
但使用简单的cmp
显示一个例外:
sudo cmp /dev/zero /dev/sdb
cmp: EOF on /dev/sdb after byte 5000981077504, in line 1
磁盘已清零吗?
答案1
磁盘已清零吗?
是的。命令的输出dd
显示它已写入 5000981077504 字节。你的cmp
命令说它在 5000981077504 字节后到达 EOF(文件结尾),这是相同的。
请注意,这仅适用于硬盘。对于固态设备,磨损均衡和预留空间等功能可能会导致某些数据未被擦除。此外,您的驱动器不得有任何损坏的扇区,因为它们不会被擦除。
请注意,对于此任务来说,这cmp
不会非常有效。你会更好badblocks
:
badblocks -svt 0x00 /dev/sdb
从badblocks(8)
,该-t
选项可用于验证磁盘上的模式。如果您没有指定-w
(写入)或-n
(非破坏性写入),那么它将假设该模式已经存在:
-t test_pattern
Specify a test pattern to be read (and written) to disk blocks.
The test_pattern may either be a numeric value between 0 and
ULONG_MAX-1 inclusive, or the word "random", which specifies
that the block should be filled with a random bit pattern. For
read/write (-w) and non-destructive (-n) modes, one or more test
patterns may be specified by specifying the -t option for each
test pattern desired. For read-only mode only a single pattern
may be specified and it may not be "random". Read-only testing
with a pattern assumes that the specified pattern has previously
been written to the disk - if not, large numbers of blocks will
fail verification. If multiple patterns are specified then all
blocks will be tested with one pattern before proceeding to the
next pattern.
此外,使用dd
默认块大小(512)也不是很有效。您可以通过指定 来大大加快速度bs=256k
。这导致它以 262,144 字节而不是 512 字节的块传输数据,从而减少了需要发生的上下文切换的数量。根据系统的不同,您甚至可以加快速度更多的通过使用iflag=direct
,绕过页面缓存。在某些情况下,这可以提高块设备的读取性能。
尽管您没有询问,但应该指出shred
默认情况下使用三遍覆盖目标。这是不必要的。硬盘上需要多次覆盖的神话来自 Peter Gutmann 的旧建议。在古老的 MFM 和 RLL 硬盘驱动器上,需要特定的覆盖模式以避免理论上的数据残留问题。为了保证所有类型的磁盘都能被覆盖,他建议使用35种模式,这样至少一其中一些适合您的磁盘。在使用 EPRML 和 NPML 等现代数据编码技术的现代硬盘驱动器上,无需使用多种模式。据古特曼本人所说:
事实上,执行完整的 35 遍覆盖对于任何驱动器来说都是毫无意义的,因为它的目标是涉及所有类型(常用)编码技术的混合场景,其中涵盖了 30 多年历史的 MFM 方法的所有内容(如果您不这样做)不明白这个说法,请重新阅读论文)。如果您使用的驱动器采用编码技术 X,则只需执行特定于 X 的遍,而无需执行全部 35 遍。
站在你的立场上,我会推荐一些类似的东西:
dd if=/dev/urandom of=/dev/sdb bs=256k oflag=direct conv=fsync
完成后,只需确保在显示“设备上没有剩余空间”后已写入足够的字节即可。
您还可以使用 ATA 安全擦除来启动固件级数据擦除。我不会单独使用它,因为您将依赖固件作者来安全地实施该标准。相反,除上述之外还可以使用它,以确保dd
没有遗漏任何内容(例如坏扇区和 HPA)。 ATA 安全擦除可以通过以下命令进行管理hdparm
:
hdparm --user-master u --security-set-pass yadayada /dev/sdb
hdparm --user-master u --security-erase yadayada /dev/sdb
请注意,这并不适用于所有设备。您的外部驱动器可能不支持它。
答案2
/dev/zero
是无限的空字节流。/dev/sdb
不包含无穷空字节流,因此cmp
永远不会报告它与/dev/zero
.
cmp
逐字节比较两个文件的内容,直到发现差异或到达其中一个文件的末尾。如果达到差异,它会报告类似的内容
/dev/zero /dev/sdb differ: char 1 line 1
并以状态 1 退出。如果cmp
到达一个文件的末尾但未到达另一个文件的末尾,则报告文件大小不同并以状态 1 退出。(对于常规文件,cmp
首先检查大小,然后退出而不比较内容,如果大小不同。)仅当cmp
同时到达两个文件的末尾且没有发现不同的内容时,它才会报告文件相同并以状态 0(成功)退出。
所以来自的报告cmp
确实意味着/dev/sdb
全字节为零。
(有关擦除数据的其他建议,请参阅其他答案。但主要请记住,进行多次传递的需要很大程度上是一个传说,这在旧技术中有一定道理,但与 21 世纪媒体完全无关。简单地用零覆盖也同样好,相反,shred
不会触及保留扇区,这些扇区可以通过一些额外的努力来读取,从而绕过磁盘控制器的正常工作。如果磁盘的安全擦除功能有效,请使用它.)