如何用零填充设备,而不覆盖已经为零的字节?

如何用零填充设备,而不覆盖已经为零的字节?

我有一个USB闪存驱动器usb 3,读取速度比写入速度快得多。假设 99% 的闪存已经充满了零,我想通过用零覆盖所有内存闪存来将其填充为零,直到 100% dd if=/dev/zero of=/dev/FLASH

这个过程将会很长,并且会最大限度地缩短闪存驱动器的预期寿命。

我想,也许检查哪些区域非零并仅用零覆盖那些非 zertos 区域会更快?

有办法这样做吗?如果有趣的话,出于安全原因我需要所有这些。

答案1

抛开安全原因不谈,我们就这么做吧。我们可以(ab)使用GNU ddrescue

检测零扇区--generate-mode是有用的。

ddrescue使用选项调用时--generate-mode,它在“生成模式”下运行,这与默认的“救援模式”不同。也就是说,如果您使用该--generate-mode选项,ddrescue则不会挽救任何内容。它只是尝试生成mapfile供以后使用。

[…]

ddrescue在某些情况下可以从 和 中生成近似mapfile,infile和 中的(部分)副本outfile,这几乎与精确的 一样好mapfile。它通过简单地假设包含全零的扇区没有被拯救来实现这一点。

[…]

ddrescue --generate-mode infile outfile mapfile

来源

让我们假设您的设备是outfile上次ddrescue运行的设备。我们不能将它用作infile(因为当和是同一个文件ddrescue时拒绝工作),我们需要一个虚拟文件,就可以了。我们应该知道您设备的物理扇区大小并选择性地使用它。该命令可能有帮助:infileoutfile/dev/zero-b

lsblk -o NAME,PHY-SEC /dev/FLASH

这里我假设是512.

ddrescue -b 512 --generate-mode /dev/zero /dev/FLASH flash.map

现在flash.map将每个扇区描述为未尝试 ( ?) 或已完成 ( +),具体取决于它是否充满零。下一步是用零填充非零扇区;--fill-mode非常适合这项工作:

ddrescue使用选项调用时--fill-mode,它在“填充模式”下运行,这与默认的“救援模式”不同。也就是说,如果您使用该--fill-mode选项,ddrescue则不会挽救任何内容。它仅填充从状态字符与指定为选项参数的类型字符之一一致的infile块中读取的数据。outfilemapfile--fill-mode

来源

我们必须使用-b与 相同的值--generate-mode,此外还要--force覆盖输出设备。这是命令:

ddrescue -b 512 --force --fill-mode=+ /dev/zero /dev/FLASH flash.map

这次/dev/zero不仅仅是一个虚拟参数,它是写入设备的实际数据源(零)。

现在/dev/FLASH已经被零填满了。请注意,在物理断开设备连接之前,您可能需要刷新缓冲区(有用的链接:1,2,3)。

相关内容