如何在 Linux 中使用 shell 命令用随机数据覆盖非常大的硬盘 (18TB)

Ján*_*ský 8 hard-drive bad-blocks large-data

我想用随机字节覆盖一个非常大的硬盘驱动器(18TB),然后检查智能数据是否有重新分配的扇区或其他错误。

由于 badblocks 对单次运行中使用的块数量有一些限制,我尝试了 archlinux wiki 上描述的“cryptsetup 方法”:

https://wiki.archlinux.org/title/Badblocks#Finding_bad_sectors

我在整个驱动器上设置了一个加密的逻辑设备字段,然后使用命令“shred”将零写入打开的字段设备:

cryptsetup open /dev/device eld --type plain --cipher aes-xts-plain64
shred -v -n 0 -z /dev/mapper/eld
Run Code Online (Sandbox Code Playgroud)

它继续打印诸如

shred: /dev/mapper/eld: pass 1/1 (000000)...870MiB/17TiB 0%
shred: /dev/mapper/eld: pass 1/1 (000000)...1.7GiB/17TiB 0%
...
shred: /dev/mapper/eld: pass 1/1 (000000)...4.1TiB/17TiB 24%
Run Code Online (Sandbox Code Playgroud)

但随后它停止在 4.1TiB/17TiB 写入。我已经用 hexdump 验证了这一点,零没有写入到字节地址 0x428249b0000 (4570459340800 ~ 4.156 TiB) 之外:

hexdump -C  --skip 0x428249a0000 /dev/mapper/eld | head
428249a0000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
428249b0000  b3 cd d0 34 72 15 f2 2c  f6 32 90 fb 69 24 1f ec  |...4r..,.2..i$..|
428249b0010  a0 f4 88 a5 56 e7 13 82  94 e5 e0 f5 37 da c3 59  |....V.......7..Y|
428249b0020  9b 55 9f d8 39 a1 41 dc  52 ca 7b 3a 95 f5 59 e2  |.U..9.A.R.{:..Y.|
Run Code Online (Sandbox Code Playgroud)

许多标准命令似乎在高容量磁盘上存在问题,因为涉及的数字对于 32 位数据类型来说太大了。Linux 上哪些读/写工具能够可靠地读/写超出这些 2TiB、4TiB 假想边界?

Ter*_*nen 12

编辑:根据评论更新

我会简单地使用

dd if=/dev/urandom of=/dev/sdX bs=1M status=progress iflag=fullblock oflag=fullblock
Run Code Online (Sandbox Code Playgroud)

/dev/sdX是硬盘的设备。

  • 虽然用随机数据覆盖似乎是合理的,但使用“/dev/zero”作为输入应该可以对抗除最坚定的攻击者之外的任何攻击者。 (7认同)
  • 另外,/dev/urandom 非常慢。使用 openssl rc4 之类的东西来生成伪随机数据可能更接近较低 cpu 下的 I/O 速度。或者 /dev/zero,这应该足够了。或者确实是诸如切碎之类的工具。 (5认同)
  • [`dd` 通常是无用的](https://unix.stackexchange.com/questions/12532/dd-vs-cat-is-dd-still-relevant-these-days)(是的,存在例外),由于块大小不理想(是的,“1M”不是最佳),它可能会更慢,并且[潜在危险](https://unix.stackexchange.com/questions/17295/when-is-dd-suitable-用于复制数据或部分读取和写入时)。_不要使用`dd`。_如果您想要进度指示器,只需使用`cat`或`pv`。这些工具更简单、更快,而且不存在陷阱。 (5认同)
  • 这看起来并不可靠,因为从 urandom 读取可能会在块中间失败,然后 dd 将写入少于完整数据块的数据。有一种方法可以使用 iflag=fullblock oflag=fullblock 来解决此问题,请参阅https://unix.stackexchange.com/a/121888/90056 (4认同)
  • 不过,“urandom”很慢,至少在我上次测试时是这样。我认为它使用的算法在某个时候被更改了(更改为 ChaCha20 或类似的?),所以现在可能会更快。我想我使用了类似`openssl enc -aes-128-ctr -nosalt -pass file:/dev/urandom < /dev/zero | pv > ...` 在某个时刻。 (2认同)