我有一个USB闪存驱动器usb 3,读取速度远远超过写入速度。假设 99% 的闪存已经用零填满,我想用零填充它直到 100%,通过用零覆盖所有内存闪存dd if=/dev/zero of=/dev/FLASH
。
这个过程会很长,并且会最大限度地缩短闪存驱动器的预期寿命。
我想,也许检查哪些区域是非零的会更快,并且只用零覆盖那些非 zertos 区域?
反正有这样做吗?如果有趣的话,出于安全原因,我需要所有这些。
抛开安全原因不谈,让我们去做吧。我们可以(ab)使用 GNU ddrescue
。
检测零扇区--generate-mode
很有用。
当
ddrescue
使用--generate-mode
选项调用时,它以“生成模式”运行,这与默认的“救援模式”不同。也就是说,如果您使用该--generate-mode
选项,ddrescue
则不会挽救任何东西。它只会尝试生成一个mapfile
供以后使用。[…]
ddrescue
在某些情况下可以生成一个近似的mapfile
, frominfile
和 中的(部分)副本outfile
,这几乎与精确mapfile
. 它通过简单地假设没有拯救包含全零的扇区来实现这一点。[…]
Run Code Online (Sandbox Code Playgroud)ddrescue --generate-mode infile outfile mapfile
(来源)
让我们假设您的设备outfile
来自上次ddrescue
运行。我们不能将它用作infile
(因为ddrescue
当infile
和outfile
是同一个文件时拒绝工作),我们需要一个虚拟的,/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
充满了零。