dd if = / dev / zero of = / dev / sda有什么作用


19

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

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

  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)

    问:这到底是做什么的?


4
您在哪里找到此恶意代码
Suici Doga

10
这不是恶意代码。
迈克尔·汉普顿

12
@MichaelHampton:s / malicious / destructive /尽管发布破坏性代码本身并不是恶意的,但在发布明确代码可能会破坏数据IS的警告的同时发布它。
Ben Voigt

1
当互联网上的某人告诉您运行这样的命令时,最好将DD视为“磁盘破坏者”。
Bobby Sacamano '16

3
实际上DD意味着数据描述
Suici Doga

Answers:


43

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元数据等可能会导致问题。在驱动器的开头和结尾将部分清零通常可以避免这些问题,同时比将整个驱动器清零要快得多。


4
谢谢。这个答案似乎最符合我的需求。这两个命令在delpart之后使用。它们用于擦拭磁盘以干净地重复使用。
JH 2016年

expr blockdev --getsz /dev/sda - 4096的语法错误为expr。我认为预期的命令是...seek="$(expr "$(blockdev --getsz /dev/sda)" - 4096)"。或者更好的是...seek="$(($(blockdev --getsz /dev/sda) - 4096))"
斯特凡Chazelas

1
我的猜测是该命令中最初有反引号,并且在某些时候被吃掉了。
plugwash

16

这将擦除硬盘的第一个4096*4096=16MB和最后一个512*4096=2MB,其中包含对恢复有用的重要结构。我认为此代码是恶意发布的。

我从来没有遇到过明确指定count1有用的情况。如果我想确保自己没有留下任何MBR痕迹,那么我已经擦除了第一块。


8
这并不是必然的恶意,我有一些糟糕的格式化程序,如果当前标签损坏了,它们会拒绝写入新标签,因此必须手动将前几个字节清零。
Shelvacu '16

1
@shelvacu如果以这种方式操作驱动器,我会感到惊讶sda。更有可能sdbsdc。但是我当然可能错了……

7
这不是恶意的。它会擦除磁盘开头的GPT,并擦除磁盘结尾的备份GPT。
迈克尔·汉普顿

2
@shelvacu:这是破坏性的。如果发布破坏性命令而没有说明其功能,则表示它是恶意的。如果他们附有解释,OP为何会在这里询问?
Ben Voigt

2
那么,谁在其完美的头脑中会复制/粘贴在任何地方都找不到其目的代码?这不是恶意的,因为我不会摇晃在地铁上可能发现的任何奇怪的设备。
玛诺C 2016年

4

这些命令将用零覆盖您的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:不要执行您在网上找到的任意代码,或者不信任的人给您的代码。它会毁了你的一天。


7
Don't execute arbitrary code you find on the net线路+1
Sergiy Kolodyazhnyy

7
“请注意,此过程非常繁琐和/或昂贵,并且需要非常特殊的设备。” 停止传播这种错误信息。从理论上讲,这甚至是最后一次可能是几十年前的技术,而现在这种技术已经被几代人淘汰了。从来没有人表现出这种对现代硬盘恢复的,即使是在回应公众的挑战与奖金,如hostjury.com/blog/view/195/...
安德鲁医学生

我删除了该部分-猜猜自从我第一次听说以来已经有一段时间了。但是,我会说,“理论上”是有效的词,但我离题了。
Tim S.

2

其他人已经解释了他们的工作,因此我将跳过。

在该点dd具有独立bscount的说法是,bs控制有多少是写在一个时间。指定非常大的值bs将需要程序中的非常大的缓冲区,而指定小于设备块大小的值将很慢,因为内核必须构建一个完整的块才能写入设备(在这种情况下,它可以可能会缓冲写入操作,直到出现一个完整的块为止,在其他情况下,它可能必须读取光盘上已存在的内容)。由于这两个命令使用的不同值bs,这使我认为您可能已经在两个不同的站点上找到了它们。硬盘的块大小为512字节,对应于bs=512后者的命令,但几年前(我认为是6到8),他们开始制作块大小为4096字节的bs=4096光盘,这是现代光盘的更好选择。


1
的最佳位置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时间。仅在目标是某种东西时才有意义而不是磁盘)。
彼得·科德斯

要查看正在发生的I / O请求合并,请查看iostat -x 4或的输出,并记下rrqm / s(每秒合并读取请求)和wrqm / s列。
彼得·科德斯

1

警告: dd if=/dev/zero of=/dev/用于在有规律地复制数据之前清洁驱动器或设备。在从取证系统中复制信息以减轻交叉污染之前,必须始终对驱动器或设备进行消毒。因此,这不是一个坏命令,最终用户必须了解该命令的用途,否则它们将破坏其数据。如果这是您想要的,请验证零写入操作dd if=/dev/sda | hexdump -C | head

来源: Darren Hayes博士撰写的《计算机取证调查实用指南》


1

我用dd if=/dev/zero of=/dev/sdX oflag=sync一个插入的USB驱动器的测试质量或MicroSD卡之前,我确实有一个磁盘映像的gparted,分区或DD使用它。我认为这是一个谨慎的主意,尤其是对于质量欠佳的MicroSD媒体。

当然,请小心使用of = sdX,因为不会意外擦除磁盘。验证X =预期目标的驱动器号。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.