如何验证我的硬盘是否已清零/擦除?

如何验证我的硬盘是否已清零/擦除?

我曾经shred擦拭过我的外部硬盘: sudo shred -vz /dev/sdb

我还应该补充一点,磁盘有 5 个坏扇区。

我想验证磁盘是否已清零https://superuser.com/questions/1510233/is-there-a-faster-way-to-verify-that-a-drive-has-been-full-zeroed

我不太熟悉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不会触及保留扇区,这些扇区可以通过一些额外的努力来读取,从而绕过磁盘控制器的正常工作。如果磁盘的安全擦除功能有效,请使用它.)

答案3

是的,按照森林的回答。

您可以通过告诉磁盘固件自行擦除(安全擦除)来执行“皮带和大括号”操作。根据固件的未知细节,这也可能导致任何坏块无法恢复。

有关如何实现此目的的详细信息hdparm 这里

对于 SSD,此方法更为优越,dd因为它告诉驱动器所有扇区都是空闲的,而不是存储dd写入其中的任何数据。如果固件被正确写入,它也应该擦除备件。

本文解释如何擦除 PCIe SSD。您不能使用hdparm,因为它不是 SATA 设备。还没有尝试过这个(还?)。

相关内容