我做了一些研究,听说过 SD 卡报废行为(不太确定该怎么称呼它),即 SD 卡和 microSD 卡将自己设置为只读以避免数据丢失。当我第一次听说它时,我认为这非常聪明。现在我不太确定了。
背景:我有一张 microSD,在大量使用 Raspberry Pi 两年后,它进入了写保护模式。我使用 dd 将整个操作系统和文件系统移到了我的替换卡上。使用几天后,我意识到这张卡也进入了写保护模式。我以为我的运气不好,直到我的第二张备份卡几乎立即进入了同样的状态。
这让我很困扰,所以我从此就不再使用我的树莓派了。但我开始怀疑 SD 卡是如何知道要对自身进行写保护的。如果它记录了写入次数,并且我使用 dd 制作了整个磁盘的映像,那么我可能通过欺骗 SD 卡让它们认为它们已经很旧而损坏了它们。但我找不到任何地方实现这种报废行为的方法。有人知道它是如何工作的吗?我想尝试撤消它,但写保护似乎是在非常低的级别上实现的。我甚至无法使用 sudo 访问 /dev/sdX。
如果我没记错的话,它会记录某种写入周期,这可就有点令人沮丧了。这意味着 SD 卡实际上并没有坏掉——这只是一种预防措施。虽然这很好,但我想一直用到它坏掉为止,因为我要定期备份。
有了这些冗长的背景知识,是否有人知道生命终结行为是如何实现的,有没有什么方法可以消除意外触发的行为?
答案1
大多数制造商不公布他们的磨损均衡机制,这使得无法确定最佳和最差的预期寿命情况(可能这就是原因,因为有了这些知识,人们可能会在短时间内毁掉这样的卡)。
SanDisk 确实在很久以前就提供了一些见解(https://web.archive.org/web/20150326122100/http://ugweb.cs.ualberta.ca/~c274/resources/hardware/SDcards/WPaperWearLevelv1.0.pdf)。虽然这可能已经改变或改进,但基本原则仍然适用:
每个内存芯片被分成多个块。块是按扇区组织的内存单元阵列。(...) 写入或读取操作的最小单位是页面(或扇区)。擦除操作的最小单位是块。物理块在逻辑上被分组为区域。(...) 磨损均衡在区域内完成。当前固件不会将磨损分散到卡的整个容量中。每个区域都有大约 3% 的额外“备用块”,超出了为满足闪存卡的逻辑容量而分配的块。这组块通常称为“擦除池”。
即使磨损遍布整张卡片,其原理依然保持不变。
当卡检测到某个块已达到其使用寿命时,它会将该块从可用于写入操作的块中移除。结果是擦除池的大小减少。这不会影响主机看到的卡的容量。当可用于写入操作的块池因磨损而耗尽时,卡将达到其写入操作的使用寿命。
由于卡的容量没有减少,并且消费级卡上的磨损均衡不会重写存储的数据(如 SSD 中),因此某些类型的写入可能会很快磨损卡。一种类型是只写入扇区,这需要写入整个块。根据您的操作系统,dd
可能会使用默认块大小,512
该块大小可能比卡的块大小低得多,因此会导致巨大的写入放大。例如:当 SD 卡的块大小为 16kB 且一个扇区为 512 字节时,磨损量在这种情况下可能会增加 31 倍!这可能是您的第二张卡提前失效的原因。
磨损信息不会被复制,因为它是 SD 卡硬件的一部分,因此无法通过正常方式读取/恢复此信息。写保护也是如此,因为 SD 卡控制器本身可以防止这种情况发生。所以,如果我们不谈论硬件(SD 卡中的机械开关)或软件(安装只读)写保护,这个过程是不可逆的。
答案2
这些卡应该有一些额外的空间用于磨损均衡,但听起来你拥有的卡可能很笨,没有任何备用块,并且由于你已经写入了驱动器上的每个块而处于只读状态。复制文件而不是使用dd
,或使用e2image -ar
复制 ext[234] 文件系统将避免不必要地写入磁盘上每个未使用的块,这可能会有所帮助。