如果我要使用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
文件中。任何可以处理二进制数据的工具(例如任何现代的cat
或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
答案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
如果只是从头开始,而不是强行删除驱动器上存储的所有内容。