我有一个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
时拒绝工作),我们需要一个虚拟文件,就可以了。我们应该知道您设备的物理扇区大小并选择性地使用它。该命令可能有帮助:infile
outfile
/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
块中读取的数据。outfile
mapfile
--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)。