`dd if=/dev/zero of=/dev/sda` 的作用是什么

`dd if=/dev/zero of=/dev/sda` 的作用是什么

编辑:除非您想销毁数据,否则不要运行它来测试它。

有人可以帮助我理解我得到了什么吗?

  1. dd if=/dev/zero of=/dev/sda bs=4096 count=4096

    问:为什么专门为 4096 count

  2. 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和争论的要点countbs控制写入的量一次。指定非常大的值bs将需要在程序中使用非常大的缓冲区,并且指定小于设备块大小的值会很慢,因为内核必须构建整个块才能写入设备(在这种情况下,它可以可能会缓冲写入,直到有一个完整的块,在其他情况下,它可能必须读取光盘上已有的内容)。由于这两个命令使用不同的值bs,这让我认为您可能在两个不同的站点上找到了它们。硬盘过去的块大小为 512 字节,对应于bs=512后一个命令,但大约(我认为是 6-8)年前,他们开始制作块大小为 4096 字节的光盘,bs=4096为现代光盘提供了更好的选择。

相关内容