填充驱动器/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=fullblock
到dd
命令中。部分读取是可能的,这将导致部分块被计为完整块。尤其是在使用较大的块大小(例如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。
在继续攻击分区或磁盘之前,它会询问您是否确定。