编辑:除非您想破坏数据,否则不要运行它来测试它。
有人可以帮助我了解我得到了什么吗?
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)
问:这具体有什么作用?
plu*_*ash 45
dd if=/dev/zero of=/dev/sda bs=4096 count=4096 Q:为什么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)
Run Code Online (Sandbox Code Playgroud)
并且反引号在人们在不同环境之间复制/粘贴的过程中丢失了。
旧的分区表、LVM 元数据、raid 元数据等在重用驱动器时可能会导致问题。在驱动器的开始和结束处清零部分通常会避免这些问题,同时比将整个驱动器清零快得多。
o11*_*11c 17
这将擦除硬盘驱动器的第一个4096*4096=16MB
和最后一个512*4096=2MB
,其中包含对恢复有用的重要结构。我认为此代码是恶意发布的。
我从未遇到过明确指定count
其他1
有用的情况。如果我想确保我没有留下任何 MBR 的痕迹,我已经擦除了第一个块......
这些命令将用零覆盖您的 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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,块大小对效率有巨大影响。这可能是OP的一个侧边栏,但我觉得它仍然相关。
TL;DR:不要执行您在网上找到的任意代码,或者您不信任的人给您的任意代码。它会毁了你的一天。