嵌入式树莓派上的本地日志记录策略?



我的公司使用Raspberry Pi 3作为产品中的嵌入式控制器。用户不会优雅地关闭电源,他们只是拨动开关。 为了避免损坏,/boot 和/root 文件系统是只读的。这似乎是无懈可击的 - 我们使用测试台一遍又一遍(2000+ 次循环)"拔掉插头",没有问题。

我们正在开发一项需要本地日志记录的新功能。为此,我们在 SD 卡上为日志文件创建了一个额外的 ext4 读/写分区(我们目前在 8GB 卡上使用大约 2GB)。为了最大程度地减少磨损,应用程序缓冲日志数据,并且每分钟仅写入一次卡。日志文件在写入之间关闭。没有其他任何内容使用该分区。当应用程序处于可能指示用户即将关闭的状态时,不会写入日志文件。

在测试中,我们发现尽管我们使用相当保守的方法,但读/写分区在重新启动后总是被标记为"脏",经常包含文件系统错误,并且经常有损坏的日志文件。我们还有许多卡遭受不可恢复的错误,导致设备无法启动。

丢失最后一组日志条目不是问题。

日志文件丢失是不希望的,但可以接受。

损坏/root 和/boot 文件系统是不可接受的,对卡的物理损坏(标准 NAND 闪存磨损除外)也是不可接受的。

除了添加UPS来正常关闭Pi之外,是否有任何方法可以安全地允许读/写操作?

是否有SD卡分区"几何形状"的配置,以确保没有两个分区重叠一个闪存擦除块?

只是几点:

脏标志:我猜你不是在卸载文件系统,对吧?这是每次不干净重新启动后看到脏标志的可能原因。另一种(可能更好的方法)是在写入后将文件系统切换到只读模式,并在写入文件之前使其读写。

顺便说一句,ext4 延迟对磁盘的写入。close()文件并不意味着文件被写入磁盘,您需要调用额外的fsync()sync(请参阅 Linux 是否保证在 close() 后将文件的内容刷新到光盘?所以最好要求系统真正写入文件。

我建议使用UBIFSJFFS2YAFFS2。它最好的实践方式。我也听说过LogFS。

所有时间挂载和写入都可能无延迟,因为此 FS 设计用于硬关机。

从 https://superuser.com/questions/248078/choice-of-filesystem-for-gnu-linux-on-an-sd-card 复制粘贴的视图

JFFS2

  • 包括压缩和优雅的磨损均衡保护。

亚夫2

  • 与众不同的一件事是:成功卸载后安装时间短。
  • 实现 write once 属性:一旦数据写入一个块,就不需要重写它。这很重要,因为它可以减少磨损。

日志FS

  • 不是很成熟,但已经包含在 Linux 内核树中。
  • 支持比 JFFS2/YAFFS2 更大的文件系统,没有问题。

乌比夫斯

  • 比 LogFS 更成熟
  • 写入缓存支持
  • 关于可扩展性:[文章][3]。在大磁盘上,性能优于 JFFS2

分机4

  • 如果没有驱动程序或卡(例如SSD驱动器确实具有内部磨损均衡,至少通常)处理磨损均衡,那么ext4不是最好的主意,因为它不适合原始闪存使用。

最新更新