过去,我们公司将树莓派用于我们的物联网应用程序。问题是 SD 卡会磨损并损坏。
我们现在订购了带有运行 Debian 的 eMMC 存储的 Compulab SBC。
那么配置耐用的嵌入式物联网设备的最佳实践是什么?
我会说:
- 选择具有 eMMC 存储的 SBC
- 确保您有日志文件系统(
has_journal
在 EXT4 上启用) - 将日志写入 RAM 以防止存储磨损(in
/etc/systemd/journald.conf
Storage=volatile
) - 确保
fsck
在启动时运行(最后/etc/fstab
一个字段设置为 1 或 2) - 应禁用交换(运行
free
-> 总交换应为 0)
还有更多建议吗?
覆盖文件系统
Raspbian 在“raspi-config”->“性能选项”->“覆盖文件系统”中有一个选项,我问 Compulab 他们是否建议也使用它,但他们认为它已经和文件系统日志一样强大,并且fsck 在启动时运行。使用覆盖文件系统来防止写入存储是否值得花费额外的复杂性来多次重新启动设备以禁用它并在以后想要更新它时再次启用它?
答案1
我将尝试解决您关于存储设备耐用性的第一个问题,因为我对此有点熟悉。
如果您不访问系统的存储使用情况并采取措施进行改进,从 SD 切换到 eMMC 可能不会改善情况,因为 SD 和 eMMC 都使用 NAND。
您是否估算了写入存储的数据量?使用以下内容来评估您的用例 [有关详细信息,请参阅 [1]]
total bytes written throughout device life = (device capacity in bytes) * (max program/erase cycles) / (write amplification factor)
比如说
- 你每天写入 0.5GiB
- 希望您的设备运行 5 年
- 您写入数据的分区总计 4GiB(存储容量大于此,但其他分区是只读的)
- 对于多层单元 (MLC) NAND,最大编程/擦除周期为 3000
这给你一个写放大系数
4 * 3000 / (0.5 * 365 * 5) = ~13
什么是写放大
SD或eMMC中的NAND是以NAND页写入的。假设您从主机写入/修改 1KiB(两个 512 字节扇区),但假设 NAND 页为 16KiB。因此,eMMC 控制器将写入整个 NAND 页。当你想到擦除时,事情会变得更加复杂,因为 NAND 是在 NAND 块中擦除的,而一个 NAND 块由许多 NAND 页组成。
那么,您可以采取哪些措施来延长设备寿命
从上面的等式,你可以
- 增加设备容量(但这会增加成本)
- 改善编程/擦除周期:选择 SLC 或将数据写入分区从 MLC 转换为 pSLC(但这会减少容量)
- 通过改进应用程序以执行 NAND 页面对齐、从主机执行 NAND 页面大小(或倍数)写入(请参阅 eMMC EXT_CSD[265] 最佳写入大小)、启用 eMMC 缓存等来减少写入放大。
你还能做什么
您可以使用 mmc-utils 监控您的 eMMC 运行状况(https://git.kernel.org/pub/scm/utils/mmc/mmc-utils.git) 或 sysfs,并在意外失败之前采取必要的步骤。
- eMMC扩展CSD寄存器提供
- 以 10% 为步长估计 SLC 和 MLC 模块的使用寿命
(0x01 = 0-10% 器件已使用寿命,0x02 = 10-20%,..,0x0B = 寿命终止)
B 型 (MLC):EXT_CSD[268],A 型 (SLC):EXT_CSD[269]
- 用于替换坏块的备用块的状态
(0x01:正常,0x02:警告:已使用 80% 的块,0x03:紧急:已使用 90% 的块)
EOL 前信息:EXT_CSD[267]
- 供应商可能会在 EXT_CSD[301:270] 中提供专有的健康报告(但到目前为止,我在这里只看到全零)
例如
mmc-utils:
# mmc extcsd read /dev/mmcblk0
:
eMMC Life Time Estimation A [EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A]: 0x01
eMMC Life Time Estimation B [EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B]: 0x00
eMMC Pre EOL information [EXT_CSD_PRE_EOL_INFO]: 0x01
:
sysfs:
# cat /sys/block/mmcblk0/device/life_time
0x00 0x01
# cat /sys/block/mmcblk0/device/pre_eol_info
0x01
- 供应商可能会提供您可以从 mmc 通用命令 CMD56 访问的健康相关信息(使用 mmc-utils、mmc gen_cmd 读取<设备> [arg])
请参阅以下内容以获得良好的解释:
[1]https://www.kingston.com/en/embedded/emmc-embedded-flash “估计、验证和监控 eMMC 生命周期”