磁盘末尾的 dd 命令 bs 选项

10 dd

如果我dd按如下方式使用命令:

dd if=/dev/zero of=/dev/sdX bs=16M
Run Code Online (Sandbox Code Playgroud)

如果它不是 16M 的精确倍数,那么在磁盘末尾会发生什么?这是否意味着磁盘的最后剩余部分没有归零?

我在https://www.marksanborn.net/howto/wiping-a-hard-drive-with-dd/ 中注意到,他写道美国政府使用

dd if=/dev/urandom of=/dev/sda bs=8b conv=notrunc
Run Code Online (Sandbox Code Playgroud)

conv=notrunc选项是确保擦除每个最后一个字节的方法吗?

Gil*_*il' 12

无论其大小是否是您传递给的块大小的倍数,都会擦除整个输出设备dd

notrunc当输出为设备文件时,该标志无效,因为截断设备文件无效。如果输出是一个普通文件,那么输出文件在写入之前不会被截断,这在某些文件系统上意味着旧数据被覆盖(而不是写入新数据块并保留其余数据块),但是,这没有用,因为所有文件系统都不能保证此属性,而且该命令不仅会覆盖文件,还会继续写入,直到它填满输出磁盘(或发生其他错误)。

不要使用dd和担心您是否正确使用它(碰巧,它在这种特殊情况下有效,但它很复杂有时不起作用),只需使用cat.

cat /dev/zero >/dev/sdX
Run Code Online (Sandbox Code Playgroud)

尽管网络上流行这种看法,但绝对没有什么神奇之处dd可以使它更适合写入磁盘。魔法就在/dev文件中。任何可以处理二进制数据的工具,例如任何现代的cator head,都可以完成相同的工作,dd除非您传递诸如seek或 之类的标志skip

请注意,dd和共享的一个问题cat是,在成功操作时,他们会出错并显示“设备上没有剩余空间”(ENOSPC)。如果将其放入脚本中,则需要检查错误是否为 ENOSPC 或使用不同的方法。更可靠的方法是首先确定设备的大小(例如/proc/partitions在 Linux 下使用),然后使用诸如head.

size=$(</proc/partitions awk '$4 == "sdX" {print $3}')
head -c "${size}k" /dev/zero >/dev/sdX
Run Code Online (Sandbox Code Playgroud)


fro*_*utz 8

没有问题 —dd写入到最后 ( No space left on device),除非输入用完、受 限制count=x或发生其他错误(例如坏扇区、糟糕的电缆等)。

如果覆盖整个块设备是您的目标,则更shred易于使用。

shred -v -n 1 /dev/deleteme     # pseudorandom data
shred -v -n 0 -z /dev/deleteme  # zeroes
Run Code Online (Sandbox Code Playgroud)

或者cryptsetup对于带有验证步骤的随机数据(零被加密为随机数据;随机数据被解密回零)。

或者blkdiscard对于 SSD。

或者,wipefs如果它只是从头开始,而不是强行删除您曾经存储在驱动器上的所有内容。


归档时间:

查看次数:

2775 次

最近记录:

7 年,6 月 前