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

Slo*_*lok 6 security dd

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

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

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

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

Kam*_*ski 5

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

检测零扇区--generate-mode很有用。

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

[…]

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

[…]

ddrescue --generate-mode infile outfile mapfile
Run Code Online (Sandbox Code Playgroud)

来源

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

lsblk -o NAME,PHY-SeC /dev/FLASH
Run Code Online (Sandbox Code Playgroud)

在这里,我假设它是512.

ddrescue -b 512 --generate-mode /dev/zero /dev/FLASH flash.map
Run Code Online (Sandbox Code Playgroud)

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

ddrescue使用--fill-mode选项调用时,它以“填充模式”运行,这与默认的“救援模式”不同。也就是说,如果您使用该--fill-mode选项,ddrescue则不会挽救任何东西。它只填充从infile块中读取的数据,该块的outfile状态字符来自mapfile与指定为--fill-mode选项参数的类型字符之一重合。

来源

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

ddrescue -b 512 --force --fill-mode=+ /dev/zero /dev/FLASH flash.map
Run Code Online (Sandbox Code Playgroud)

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

ddrescue结束,调用sync。现在/dev/FLASH充满了零。