语境
我正在运行一个带有 microSD 的树莓派零,因为它是设计的。但是,对于这个特定的应用程序,我无法像通常使用树莓派那样使用只读系统。
客观的
密切关注 microSD 的健康状态(并最终以某种方式收到通知,表明需要更换 microSD)。
问题
- 监控 microSD 健康状态的最佳方法是什么(否,
fsck
因为我无法在系统运行时卸载 microSD); - 就实用性和有效性而言,以下提出的方法是否是最佳解决方案?
提议的方法
我想使用badblocks
输出来监视 microSD 的状态,并最终在适当的时候更换它。但什么时候该更换 microSD 呢?多少个坏块算太多?我应该查看写入错误或读取错误还是两者都查看?
我做了以下考虑:microsd 卡会自动重新分配坏块之外的数据。因此,如果 microSD 已满 80%,则有 20% 的块可能会“变坏”,但仍可保持 microSD 运行。添加一点置信区间,我们是否可以说,如果badblocks
输出的坏块数量低于空闲空间块的 50%,那么使用 SD 卡仍然是安全的?
澄清:
- 区块总数:100
- 可用空间(以块为单位):20
- 接受损坏的块的最大数量(或其他):10
一个。
badblocks
是错误的工具。当它报告第一个坏块时,闪存介质已经被使用到损坏的程度。就像一样fsck
,它只能检测到事情已经出现问题的情况——并且您可能已经丢失了数据。在 SD 卡(通常是您可能遇到的所有闪存大容量存储设备)中,硬件中有一个闪存转换层,这使得本质上模拟、不可靠且容易磨损的实际内存看起来像简单、可靠的块- 可寻址内存。它通过两种方式做到这一点:
这意味着磨损均衡发生在硬件中,对操作系统不可见。当文件系统驱动程序发现坏块时,就会出现纠错无法处理的不可挽回的错误。这不太可能,除非该页面已被写入很多,在这种情况下,整体写入量已经使磨损均衡达到极限。这意味着您已经写入了很多次,因此即使在将写入分布到整个介质之后,某些地方仍然会被频繁写入而导致失败。(接下来通常发生的事情是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
和属性182erase-fail-count-total
。这些标准化值的下降并不一定意味着有什么不好的事情(这是预期会发生的,否则这些指标将毫无用处),但是一旦您接近阈值,您可能需要考虑更换 SSD。(请注意,您的 Rpi Zero 可能会先失效;在 5 欧元的 RPi Zero 和消费类 SSD 之间,SSD 是专为机械、热和电气可靠性而设计的)。