dd 命令 bs 选项位于磁盘末尾

dd 命令 bs 选项位于磁盘末尾

如果我要使用dd以下命令:

dd if=/dev/zero of=/dev/sdX bs=16M

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

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

dd if=/dev/urandom of=/dev/sda bs=8b conv=notrunc

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

答案1

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

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

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

cat /dev/zero >/dev/sdX

尽管网络上普遍相信,但绝对没有什么魔力dd可以使其更适合写入磁盘。魔法就在/dev文件中。任何可以处理二进制数据的工具(例如任何现代的cathead)都可以完成相同的工作,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

答案2

没有问题 —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

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

或者blkdiscard对于SSD。

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

相关内容