语境
我正在运行带有 Micro SD 设计的 Raspberry Pi Zero。然而,对于这个特定的应用程序,我无法像通常使用 Raspberry Pi 那样使用只读系统。
客观的
密切关注 Micro SD 的健康状态(并最终以某种方式收到通知,表明需要更换 Micro SD)。
问题
- 监控 Micro SD 健康状态的最佳方法是什么(否,
fsck
因为我无法在系统运行时卸载 Micro SD)? - 就实用性和有效性而言,以下提出的方法是否是最佳解决方案?
提议的方法
我想到使用 的输出来badblocks
监视 Micro SD 的状态,并最终在适当的时候更换它。但什么时候该更换 Micro SD 呢?多少个坏块算太多?我应该查看写入错误或读取错误,还是两者都查看?
我做了以下考虑:Micro SD 卡会自动重新分配坏块之外的数据。因此,如果 Micro SD 已满 80%,则有 20% 的块可能“变坏”,但仍然保持 Micro SD 运行。添加一点置信区间,我们是否可以说,如果badblocks
输出的坏块数量低于空闲空间块的 50%,那么使用 SD 卡仍然是安全的?
澄清:
- 区块总数:100
- 可用空间(以块为单位):20
- 可接受损坏的块的最大数量(或其他):10
答案1
多少个坏块算太多?
一个。
badblocks
是错误的工具。当它报告第一个坏块时,闪存介质已经被使用到损坏的程度。就像一样fsck
,它只能检测到已经出现问题的情况——并且您可能已经丢失了数据。
在 SD 卡(通常是您可能遇到的所有闪存大容量存储设备)中,硬件中有一个闪存转换层,这使得本质上模拟、不可靠且容易磨损的实际内存看起来像简单、可靠的块- 可寻址内存。它通过两种方式做到这一点:
- 广泛的前向纠错,以对抗比特在物理介质中简单翻转的事实;页面写入的次数越多,这种情况发生的次数就越多
- 磨损均衡,使对逻辑页面的写入(如 Pi / 操作系统所见)最终尽可能分布在物理页面上,这样您就不会一直在同一页面上进行操作
这意味着磨损均衡发生在硬件中,对操作系统不可见。当文件系统驱动程序发现坏块时,就会出现纠错无法处理的不可挽回的错误。这不太可能,除非该页面已被写入很多,在这种情况下,整体写入量已经使磨损均衡达到极限。这意味着您已经写入了很多次,因此即使在将写入分布到整个介质之后,某些地方仍然会被频繁写入而导致失败。 (接下来通常发生的事情是SD卡内部的控制器告诉主机它已成为只读设备)。
所以,不。您无法通过验证 SD 卡上的数据来检查 SD 卡的状态(这是 fsck 和 badblocks 所做的),除非您等到为时已晚。
您需要的信息来自里面SD 卡估计有多少总写入“保留”。据我所知,“给我健康信息,亲爱的 SD 卡”命令没有标准回复,但“工业”标记的 SD 卡可能支持 CMD65,并且有一些 Linux 工具(sdmon)支持读取它。
简而言之:如果您需要可靠的写入存储,那么 SD 卡就不是您的最佳选择。该接口最初并不是为此设计的;相反,它假设写入大部分以线性方式发生,一次写入大量数据,并且重复写入很少(相机使用的典型情况是:写入一张完整的图像,然后更新一次 FAT)。
如果您需要在 Pi 上提供长期可靠的大容量存储,恐怕您最好的选择是购买 USB 转 M.2(通常为 SATA)转换器外壳(以及供电的 USB 集线器,如果需要),然后将其插入配备 SSD 后,将其设置为 Rpi 零。大多数这些控制器都支持 SMART 命令,因此您实际上可以使用smartctl
;来监视某些内容。确保每个属性的“归一化“ 值是多于这 ”锤石旧”值。确保您不要购买能找到的最便宜的 SSD,但每个中档 SSD 都会带来属性 177、wear-level-count
属性 195Hardware ECC Recovered
和属性 182。erase-fail-count-total
这些归一化值的减少并不一定意味着什么不好(预计会发生这种情况,否则这些指标将毫无用处),但一旦您接近阈值,您可能需要考虑更换 SSD(请注意,您的 Rpi 零可能会首先失效;在 5 之间。 € RPi Zero 和消费级 SSD,该 SSD 是专为机械、热和电气可靠性而设计的。