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

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

填充驱动器/dev/urandom似乎非常慢,所以我创建了一个包含以下内容的文件FF

dd if=/dev/zero ibs=1k count=1000 | tr "\000" "\377" >ff.bin

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

dd if=ff.bin of=/dev/sdb count=10000

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

答案1

只需执行以下操作:

tr '\0' '\377' < /dev/zero > /dev/sdb

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

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

答案2

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

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

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

(while [ 1 ]; do cat file; done) | dd of=...

尽管该文件应该相当大才能远程高效。

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

答案3

坏块-v -w -s -b物理块大小-t 0xff /dev/装置

ff将所有内容写入4K 本机 HDD/dev/sdb并读回以验证ff是否确实写入了每个块的示例:

$ sudo badblocks -v -w -s -b 4096 -t 0xff /dev/sdb

答案4

为了测试 SSD 速度,我编写了一个 Perl 小程序,将“零”、“一”或字母数字写入命令行上给出的块设备。它不会调用dd傀儡,只是直接写入和同步。在这里可能有帮助:

https://github.com/dtonhofer/wild_block_device_filler

只需运行它作为

wildly_fill_block_device.pl --dev=sdX1 --fillpat 1 --chunksize=1024P --sync

它会将 0xFF 写入 /dev/sdX1(无缓冲,使用 Perl 的 syswrite())(在本例中)“1024 个物理块”的块中,同时在每次写入后使用 fdatasync() 将数据同步到磁盘。在我的 SSD 上,运行速度约为 70 MiB/s。

在继续攻击分区或磁盘之前,它会询问您是否确定。

相关内容