![`dd if=/dev/zero of=/dev/sda` 的作用是什么](https://linux22.com/image/87248/%60dd%20if%3D%2Fdev%2Fzero%20of%3D%2Fdev%2Fsda%60%20%E7%9A%84%E4%BD%9C%E7%94%A8%E6%98%AF%E4%BB%80%E4%B9%88.png)
编辑:除非您想销毁数据,否则不要运行它来测试它。
有人可以帮助我理解我得到了什么吗?
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)
问:这具体是做什么的?
警告;上面的代码将使一些/所有指定的设备/磁盘的数据变得无用!
答案1
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=4096eek=$(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 元数据等在重用驱动器时可能会导致问题。在驱动器的开始和结束处对部分进行清零通常可以避免这些问题,同时比对整个驱动器进行清零要快得多。
答案2
这将擦除硬盘驱动器的第一个4096*4096=16MB
和最后一个,其中包含对恢复有用的重要结构。512*4096=2MB
我认为这段代码是恶意发布的。
count
我从未遇到过显式指定其他内容1
有用的情况。我有如果我想确保没有留下 MBR 的任何痕迹,请擦除第一个块......
答案3
这些命令将用零覆盖您的 sda 设备——第一个命令将执行前 16MB(块大小为 4096,块数为 4096),第二个命令将用零覆盖最后 2MB(块大小为 512,块数为 4096)。 (从技术上讲,这不是擦除,这与我下面的第一点有关。)
(这是其他答案中已经提到的部分,为了完整性而将其包含在这里)
另一件值得一提的事情是,块大小确实有影响,但这些影响通常只在大批量操作中才会出现。执行命令最有效(最快)的方法是命令的块大小与设备的访问大小匹配,否则会浪费时间。
如果您有兴趣,可以尝试创建一个包含一百万个 1 块块的文件和一个包含 100 万个块块的文件,看看差异:
[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:不要执行您在网上找到的任意代码,或者您不信任的人给您的任意代码。它会毁了你的一天。
答案4
其他人已经解释了他们的作用,所以我将跳过它。
dd
分开bs
和争论的要点count
是bs
控制写入的量一次。指定非常大的值bs
将需要在程序中使用非常大的缓冲区,并且指定小于设备块大小的值会很慢,因为内核必须构建整个块才能写入设备(在这种情况下,它可以可能会缓冲写入,直到有一个完整的块,在其他情况下,它可能必须读取光盘上已有的内容)。由于这两个命令使用不同的值bs
,这让我认为您可能在两个不同的站点上找到了它们。硬盘过去的块大小为 512 字节,对应于bs=512
后一个命令,但大约(我认为是 6-8)年前,他们开始制作块大小为 4096 字节的光盘,bs=4096
为现代光盘提供了更好的选择。