为什么 dd 在对磁盘进行零写入结束时会给出错误?

为什么 dd 在对磁盘进行零写入结束时会给出错误?

我在 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 个扇区之外的所有内容:

在此处输入图片描述

相关内容