![为什么 dd 在对磁盘进行零写入结束时会给出错误?](https://linux22.com/image/1610553/%E4%B8%BA%E4%BB%80%E4%B9%88%20dd%20%E5%9C%A8%E5%AF%B9%E7%A3%81%E7%9B%98%E8%BF%9B%E8%A1%8C%E9%9B%B6%E5%86%99%E5%85%A5%E7%BB%93%E6%9D%9F%E6%97%B6%E4%BC%9A%E7%BB%99%E5%87%BA%E9%94%99%E8%AF%AF%EF%BC%9F.png)
我在 Windows 7 上运行 Cygwin。
我使用以下dd
命令安全地擦除 1TB 机械磁盘:
dd if=/dev/zero of=/dev/sde bs=4M status=progress
擦除大约进行了 2 个半小时,大约在我预计完成的时间,成功将大约 930GB(或更可能是 GiB)写入磁盘后,我收到了错误:
dd:写入‘/dev/sde’时出错:输入/输出错误
我再次运行该命令,seek
尝试通过将文件的最后几 GB 写入零来重现错误:
dd if=/dev/zero of=/dev/sde bs=4M status=progress seek=231100
...果然我遇到了同样的错误:
dd: error writing '/dev/sde': Input/output error
7368+0 records in
7367+0 records out
35196174335 bytes (35 GB, 33 GiB) copied, 405.703 s, 86.8 MB/s
看起来擦除操作已成功运行,但如果是这样,那么为什么会产生错误?
这是正常的吗?如果不正常,我该如何避免?
答案1
我猜是坏扇区。据我所知,这是可能导致 I/O 错误的情况之一。
无论如何,出现错误的原因不太可能是dd
试图写入驱动器末尾。即使我对你另一个问题的回答,你仍然会看到No space left on device
:
需要说明的是,由于 Cygwin 错误,35196174335
实际写入的字节数不太可能是 。相反,应该是35196174335 - 4294967295 = 30901207040
。(您可以尝试“模式“这些数字是反对的512
。”)
在这种情况下,已成功写入的字节数 / 扇区数应为231100 * 4 * 1024 ^ 2 + 30901207040 = 1000204861440
/ 1953525120
。根据您在问题中提供的其他信息,这不太可能是整个驱动器的大小。(值得一提的是,30901207040
字节数也不是“ 4M
”(4 * 1024 ^ 2
)可整除的。)
答案2
经过进一步调查,这似乎是一个 Cygwin 错误,导致无法擦除驱动器的最后 48 个扇区,尽管这个错误可能与错误消息完全无关。
我首先通过以下方式进行测试:将一次写入整个磁盘:
badblocks -t "1" -vws /dev/sda
我通过运行以下命令验证了此操作在磁盘上是否成功:
od /dev/sda
然后我做了:
dd if=/dev/zero of=/dev/sda bs=4M status=progress
...整个磁盘。此操作失败,出现典型的 I/O 错误。使用十六进制编辑器检查磁盘显示,除最后 48 个扇区外,整个驱动器已成功清零:
我计算出 1953525168 个扇区 - 48 = 1953525120 个扇区,并结合此数字seek
擦除磁盘的最后 48 个扇区:
$ dd if=/dev/zero of=/dev/sda seek=1953525120
dd: writing to '/dev/sda': Input/output error
49+0 records in
48+1 records out
4294991871 bytes (4.3 GB, 4.0 GiB) copied, 0.230269 s, 18.7 GB/s
这成功地将磁盘从第 48 扇区一直清零到末尾,我再次使用十六进制编辑器和 确认了这一点od /dev/sda
。请注意,当它到达末尾时,I/O 错误仍然存在,这表明错误并不一定表示擦除错误。
最后,我从可启动 USB 启动了 Linux Kali,并使用相同的命令擦除了整个磁盘:
dd if=/dev/zero of=/dev/sda bs=4M status=progress
再次使用十六进制编辑器检查已擦除的磁盘,确认该命令擦除了整个磁盘,并且没有剩余非零字符。
综上所述:
在 Cygwin 中运行
dd
整个磁盘可防止擦除最后 48 个扇区使用
seek
选择性擦除磁盘会擦除整个磁盘,但仍会导致 I/O 错误从可启动的 Linux 系统擦除整个磁盘会擦除整个磁盘,而不会出现 I/O 错误
为了确认这个错误,我还在dd
我唯一可用的其他备用驱动器(128GB SSD)上运行了相同的命令,这里它也擦除了除最后 48 个扇区之外的所有内容: