编辑:除非您要销毁数据,否则请不要运行它来对其进行测试。
有人可以帮助我了解我得到了什么吗?
dd if=/dev/zero of=/dev/sda bs=4096 count=4096
问:为什么要专门为4096
count
?dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr blockdev --getsz /dev/sda - 4096)
问:这到底是做什么的?
编辑:除非您要销毁数据,否则请不要运行它来对其进行测试。
有人可以帮助我了解我得到了什么吗?
dd if=/dev/zero of=/dev/sda bs=4096 count=4096
问:为什么要专门为4096 count
?
dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr blockdev --getsz /dev/sda - 4096)
问:这到底是做什么的?
Answers:
dd if = / dev / zero of = / dev / sda bs = 4096 count = 4096问:为什么4096特别用于计数器?
这会将驱动器的前16 MiB清零。16 MiB可能足以阻止任何“磁盘启动”结构,同时又足够小以至于不会花费很长时间。
dd if = / dev / zero of = / dev / sda bs = 512 count = 4096 seek = $(expr blockdev --getsz / dev / sda-4096)
问:这到底是什么?
blockdev --getsz
获取“ 512字节扇区”中块设备的大小。因此,该命令看起来像是打算将驱动器的最后2 MiB清零。
不幸的是,此命令在语法上是错误的。我希望该命令最初打算是
dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr `blockdev --getsz /dev/sda` - 4096)
人们在不同环境之间进行复制/粘贴时,反引号迷路了。
重用驱动器时,旧的分区表,LVM元数据,raid元数据等可能会导致问题。在驱动器的开头和结尾将部分清零通常可以避免这些问题,同时比将整个驱动器清零要快得多。
expr blockdev --getsz /dev/sda - 4096
的语法错误为expr
。我认为预期的命令是...seek="$(expr "$(blockdev --getsz /dev/sda)" - 4096)"
。或者更好的是...seek="$(($(blockdev --getsz /dev/sda) - 4096))"
这将擦除硬盘的第一个4096*4096=16MB
和最后一个512*4096=2MB
,其中包含对恢复有用的重要结构。我认为此代码是恶意发布的。
我从来没有遇到过明确指定count
非1
有用的情况。如果我想确保自己没有留下任何MBR痕迹,那么我已经擦除了第一块。
sda
。更有可能sdb
或sdc
。但是我当然可能错了……
这些命令将用零覆盖您的sda设备-第一个命令将使用第一个16MB(块大小为4096,计数为4096个块),第二个命令将使用后一个零覆盖最后的2MB(512个块,其中4096个块)。(从技术上讲,这并不擦除,这与我在下面的第一点有关。)
(那是其他答案中已经提到的部分,为完整起见在此包括)
值得一提的另一件事是,块大小确实有影响,但是这些影响通常仅在大容量操作中可见。执行命令的最有效(最快)方式是命令的块大小与设备的访问大小匹配,否则会浪费时间。
如果您有兴趣,可以尝试创建一个具有一百万个1块块的文件和一个具有一百万个块块的文件,然后看一下区别:
[user@host tmp]$ time dd if=/dev/zero of=/tmp/test1 bs=1 count=1000000
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB) copied, 2.44439 s, 409 kB/s
real 0m2.447s
user 0m0.177s
sys 0m2.269s
[user@host tmp]$ time dd if=/dev/zero of=/tmp/test2 bs=1000000 count=1
1+0 records in
1+0 records out
1000000 bytes (1.0 MB) copied, 0.00155357 s, 644 MB/s
real 0m0.003s
user 0m0.001s
sys 0m0.002s
[user@host tmp]$ ls -al test*
-rw-rw---- 1 user grp 1000000 Apr 8 15:51 test1
-rw-rw---- 1 user grp 1000000 Apr 8 15:51 test2
如您所见,块大小对效率有很大的影响。这可能是OP的补充工具,但我觉得它仍然很重要。
TL; DR:不要执行您在网上找到的任意代码,或者不信任的人给您的代码。它会毁了你的一天。
Don't execute arbitrary code you find on the net
线路+1
其他人已经解释了他们的工作,因此我将跳过。
在该点dd
具有独立bs
和count
的说法是,bs
控制有多少是写在一个时间。指定非常大的值bs
将需要程序中的非常大的缓冲区,而指定小于设备块大小的值将很慢,因为内核必须构建一个完整的块才能写入设备(在这种情况下,它可以可能会缓冲写入操作,直到出现一个完整的块为止,在其他情况下,它可能必须读取光盘上已存在的内容)。由于这两个命令使用的不同值bs
,这使我认为您可能已经在两个不同的站点上找到了它们。硬盘的块大小为512字节,对应于bs=512
后者的命令,但几年前(我认为是6到8),他们开始制作块大小为4096字节的bs=4096
光盘,这是现代光盘的更好选择。
bs
远高于此。单个SATA命令可以读取或写入多个扇区,因此内核在将I / O发送出去之前会对其进行合并。从bs=64k
到的任何地方bs=1024k
都是合理的(L3缓存大小通常为4-8MiB)。我经常使用bs=128k
,这是现代Intel CPU上二级缓存大小的一半。(dd
包括两个memcpy操作:在read(2)
源代码中(即使是/ dev / zero,也是如此)和write(2)
.IIRC,sdd
可以选择写入零,这样可以节省一些CPU时间。仅在目标是某种东西时才有意义而不是磁盘)。
iostat -x 4
或的输出,并记下rrqm / s(每秒合并读取请求)和wrqm / s列。