如何使用 dd 用 1 填充驱动器

lin*_*fix 12 dd

用 /dev/urandom 填充驱动器似乎很慢,所以我创建了一个用 FF 填充的文件:

dd if=/dev/zero ibs=1k count=1000 | tr "\000" "\377" >ff.bin
Run Code Online (Sandbox Code Playgroud)

我想用此文件的副本填充驱动器,但以下命令只写入一次:

dd if=ff.bin of=/dev/sdb count=10000
Run Code Online (Sandbox Code Playgroud)

如何用文件的副本填充驱动器,或者是否有更快的方法用 1 填充驱动器?

Sté*_*las 13

简单地做:

tr '\0' '\377' < /dev/zero > /dev/sdb
Run Code Online (Sandbox Code Playgroud)

当驱动器已满时,它将因错误而中止。

dd在这里使用没有意义。您dd用来确保读取和写入具有特定大小。没有理由在这里这样做。tr将进行 4 或 8 kiB 的读/写,这应该足够了。

  • @mikeserv,实际上,使用`tee - - -` 确实在我的测试中显着增加了吞吐量。这从 tr 的 800MiB/s(stdbuf 的 950MiB/s)到 tee 的 2.3GiB/s,就像你说的那样,无论如何都高于任何当前驱动器可以承受的速率。 (4认同)

fro*_*utz 5

对于更快的/dev/urandom替代方案,有shred -v -n 1(如果伪随机是可以的),或者使用cryptsetup随机密钥并将其归零(对于加密的零)。即使没有 AES 加速,它也很容易超越/dev/urandom速度。

不知道有多快tr,否则你可以dd if= | tr | dd of=

可以像这样使用文件作为模式源:

(while [ 1 ]; do cat file; done) | dd of=...
Run Code Online (Sandbox Code Playgroud)

虽然文件应该相当大,以便远程高效。

如果count=对您很重要,请添加iflag=fullblockdd命令中。部分读取是可能的,这将导致部分块被计为完整块。这在使用较大的块大小(如bs=1M)时尤其如此,如果您想要速度,则应该这样做。