我经常需要完全擦除 SD 卡。
使用此过程可以大大加快SD 存储卡格式化器。
不幸的是,该程序似乎在 Linux 下不可用,并且替代方案(例如:dd
或shred
)需要很长时间。
AFAIK SD/MMC 卡具有用于批量擦除的特定命令,我怀疑这就是“SD 存储卡格式化程序”所使用的命令(而不是尝试通过覆盖来擦除其内容)。
有一些工具使用相同的吗?
答案1
使用blkdiscard
简而言之:
blkdiscard /dev/mmcblk0
讨论
要快速擦除整个 SD 卡,您可以使用blkdiscard
(8)命令。这会调用Linux BLKDISCARD ioctl,它又传递CMD38,与SD 存储卡格式化器。
有趣的选择
-s
,--secure
安全地丢弃块。正如其他地方所指出的,普通的 CMD38 将使某些块显示为空,但由于垃圾收集而使其他块清晰可见。-s
如果您希望更安全一点并强制擦除垃圾收集块,请使用。-z
,--zero
零填充块而不是丢弃。
无法通过 USB 工作
请注意,虽然这适用于我的笔记本电脑和 Raspberry Pi,但它不适用于 USB SD 读卡器。不同之处在于内核需要访问低级MMCUSB 将其抽象为通用“大容量存储”设备。 [我相信微软Windows也有同样的限制,但如果我错了,请在评论中纠正我。]
如果您没有可以直接与低级 SD 卡通信的设备,可以使用 Arduino 构建一个并运行SDFormatter.ino。
异常危险!
由于blkdiscard
必须以 root 身份运行,因此可以轻松破坏您的所有数据。您最好确保将其指向正确的设备,然后再次仔细检查。使用lsblk
和df
.
联机帮助页声称,为了安全起见,只有在驱动器尚未安装的情况下它才会起作用。这将是一个很好的安全功能,但截至撰写本文时,情况并非如此。如果驱动器已经格式化,则当前的实现需要-f
,--force
选项,由于 SD 卡已预先格式化,因此(几乎)总是会出现这种情况。不幸的是,使用--force
意味着全部检查(包括驱动器是否正在使用)被禁用。
希望有一天 Linux 将允许 blkdiscard 在可移动设备上运行,而不需要 root 权限,这将大大降低其危险性。
其他用途
除了快速擦除数据以保护隐私之外,据说 blkdiscard(类似于 SSD 的 fstrim)将改善磨损均衡并使某些 SD 卡一般跑得快一点。
答案2
由于最近 SD 存储卡格式化程序(CLI 版本)适用于 Linux(对于 x86_64 和 arm64):
https://www.sdcard.org/downloads/sd-memory-card-formatter-for-linux/
前段时间我需要使用官方的 SD 存储卡格式化程序,最好是在 Linux 下(作为工具链的一部分),所以我向 SD 协会发送了电子邮件询问此事。他们反应灵敏,乐于助人。最近他们给我发了一封电子邮件,告知我该格式化程序现在可用于 Linux。
答案3
只是为了说明记者的观点: https://forum.armbian.com/topic/3776-the-partition-is-not-resized-to-full-sd-card-size/?do=findComment&comment=27413
特凯撒
发表于 2017 年 3 月 13 日
关于“保留扇区”和过度配置:如果一张卡声称其容量为 n 字节,则它内部具有更大的容量。这用作保留(如果控制器检测到坏扇区,则映射保留扇区),并在卡满时允许一定程度的写入性能。在闪存介质上,您无法直接覆盖,这始终是一个非常耗时的读/删除/写周期,闪存单元可以写入的数量由其设计的编程/擦除(P/E)周期数决定因为,控制器必须处理这个问题,以便所有闪存单元均匀磨损(磨损均衡)。
由于控制器不知道哪些扇区包含真实数据,哪些扇区不包含(SD 卡不支持 TRIM)一旦你完全填满卡一次(所有空间分区),从现在起控制器就会认为每个扇区都包含有用的数据(即使你同时删除了数据——因为没有 TRIM 支持,控制器不知道什么是)无论是否为空,从现在起全部容量都被视为已使用)。现在只有“保留扇区”可用于执行读/删除/写周期,如果扇区数量很小,那么平均 SD 卡(而不是最近的三星)速度会慢很多。
只需查看解释 SSD 的文章,并记住 SD 卡的行为就像十年前的蹩脚 SSD,包含缓慢/原始的控制器,并且不支持 TRIM。
顺便说一句:这是 SD 协会的“SD 格式化程序”唯一很好的用例。该工具用于适当地格式化 SD 卡(在选择“正确”文件系统(FAT 或 exFAT)时对其进行分区),从 Armbian 的角度来看,这显然毫无用处,因为下一步刻录操作系统映像会覆盖分区表和之前存在的文件系统。那么为什么首先使用 SD Formatter 呢?由于该工具实现了 ERASE CMD38。它告诉卡的控制器卡的每个扇区/块不再包含任何实际数据,可以被认为是空的。在“普通”SD 卡上,这也可能会将极低的性能恢复到“出厂默认”性能。但较新的 SD 卡控制器,尤其是与许多保留扇区配对时,并没有受到太大影响。
(...)
编辑:关于“SD 卡不支持 TRIM”的小说明。 SD 协议定义了块擦除命令,并且像 fstrim 这样的工具应该可以完成这项工作。您的内核 + SD 卡组合是否支持,简单的“sudo fstrim -v /”可能会告诉您。不过,这是否具有预期的效果是一个不同的问题(请参阅此尝试来测试这一点 - 我不确定该方法是否足够,因为将数据段标记为已擦除的点不应涉及覆盖它们,这只是SD 卡的控制器知道特定扇区/页可以添加到磨损级别池中,因为现在标记为“空”)
因此,Linux 上没有相当于 sdcard.org SD Formatter 的工具,它仅适用于 Windows 和 Mac。
fstrim 或 dd 不是替代品。我不知道为什么我们会错过这样一个工具。通过改进的过度配置和更好的控制器,从长远来看,这可能不会成为一个大问题。也许可以问问制作 SD Formatter 的 Tuxera 是否计划推出 Android 或普通 Linux 版本。
答案4
SD 卡不需要格式化。 “格式化”是专门针对磁盘的一个老术语,在其中为实际数据准备磁道和扇区(它们不是由磁盘定义的,而是由格式化磁盘时的磁头定义的。因此格式化非常慢。
现在“格式化”不再是这么慢的过程,所以它不是真正的格式化。
通常程序只会做一种mkfs
风格格式化,所以只是创建文件系统的结构。卡和内部控制器已经定义了放置数据的位置。
不幸的是,我没有找到命令(由控制器给出)只是告诉磁盘未使用扇区。这可能会有所帮助,但可能它是mkfs
(隐藏在内核端)的一部分。但不要做不必要的事情dd
,除非是在真正的磁硬盘上:在 SD、SSD 等上,它们只会消耗设备。