SD 卡上 GNU/Linux 文件系统的选择

SD 卡上 GNU/Linux 文件系统的选择

我有一个在 SD 卡上运行的嵌入式 ARM 系统。目前使用的是 Debian GNU/Linux,使用 ext3 作为文件系统。当我准备重新安装系统时,我开始考虑是否要更改为更适合闪存的文件系统。我听说过 JFFS2、YAFFS2 和 LogFS,它们似乎都适合这项工作。您会推荐哪一个?另外,我听说 ext4 有很多改进,可以更好地适应 SSD 磁盘;我是否可以将其理解为运行 ext4 应该没问题?在这种情况下我需要特别考虑什么?

我猜系统的用途很重要。但为了通用性,假设它会执行标准的桌面操作(即使它实际上是一个基于 ARM 的小型系统)。

谢谢大家的回复。

编辑:维基百科告诉我(在“需要引用”声明中)可移动闪存卡和 USB 闪存驱动器具有内置控制器来执行磨损均衡和错误校正,因此使用特定的闪存文件系统不会带来任何好处。因此,我倾向于坚持使用 ext 文件系统。

答案1

关于的优秀文章闪存文件系统

谈论闪存文件系统时的一个重要问题是:什么是磨损均衡?维基百科文章基本上,在闪存盘上,您可以写入有限次数,直到块损坏。此后,文件系统(如果硬件上没有内置的磨损均衡管理,就像 SSD 中通常有的那样)必须将该块标记为无效,并避免再使用它。

典型的文件系统(例如 ReiserFS、NTFS、ext3 等)是为硬盘设计的,没有这样的限制。

捷福斯FS2

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

YAFFS2 文件系统

  • 唯一不同的是:成功卸载后,挂载时间较短。
  • 实现一次写入属性:一旦数据写入一个块,就无需重写。这很重要,因为它可以减少磨损。

日志文件系统

  • 不太成熟,但已包含在 Linux 内核树中。
  • 毫无问题地支持比 JFFS2/YAFFS2 更大的文件系统。

通用信息系统

  • 比 LogFS 更成熟
  • 写缓存支持
  • 关于可扩展性:文章. 在大磁盘上,性能比 JFFS2 更好

ext4

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

哪一个是最好的?

当然,这取决于使用情况和支持情况。从我在网上看到的内容来看,我推荐 UBIFS。对大型文件系统的支持良好,开发阶段成熟,性能足够好,没有太大的缺点。

答案2

我也遇到了同样的问题,也做了一些研究。最终我决定使用 ext2。

似乎有些 SDHC 卡在硬件层实现了自己的耗损均衡。如果你能拿到内置耗损均衡的 SDHC 卡。

提供磨损均衡的文件系统可能会干扰闪存级磨损均衡,因此使用它们实际上对闪存不利(上面引用的 IBM 文章讨论了 JFFS 如何做到这一点,因此很明显它不适用于闪存级 WL)。我决定不需要 ext3 的日志功能,因为我没有在上面存储关键数据,而且我通常会定期备份(cron)。

我还将 /tmp 和 /var 挂载为 tmpfs 以加快速度。如果您有足够的 RAM,您应该这样做(但一定要定期轮换或删除您的日志)

提示:使用“noatime”选项安装你的扩展 SD 卡

答案3

我不知道这是否适合您的系统配置,但是使用只读文件系统加上读写分区(或可以轻松更换的 USB 记忆棒)怎么样?这样,您将拥有一个用于操作系统的快速磁盘,并且当 rw 存储磨损时可以轻松更换它。

然后是 unionfs。据我了解,它“堆叠”了不同的文件系统(即,ro fs 位于 rw fs 之上)。如果有读取访问,unionfs 会搜索堆栈,直到找到包含我们搜索的文件的 FS。写入时,unionfs 会在堆栈上搜索第一个可写入的 FS 并使用它。

我还发现这些文章可能很有趣: http://www.linux-mag.com/id/7357/ http://www.linux-mag.com/id/7345/

另外还有两篇有关使用 SSD 的技巧的文章: http://danweinreb.org/blog/using-solid-state-disks-on-linux http://www.zdnet.com/blog/perlow/geek-sheet-a-tweakers-guide-to-solid-state-drives-ssds-and-linux/9190

答案4

作为对使用 fat (32?) 的建议的回应:我做了一些性能测试,发现 fat32 写入文件的时间非常可预测(2 GB 需要 1 GB + 偏移量的两倍,3 GB 需要 1GB + 偏移量的三倍)。ext4 的性能略优于 ext3。ext3 和 ext4 有时都很快,但有时需要一些额外的时间将日志文件写入磁盘(非线性写入时间行为)。所有测试均使用 fsync() 完成,以确保文件确实写入磁盘。我使用 sync() 执行了一些测试。它们导致非常差的写入性能。所以我回到了 fsync()。我做了一些检查 fsync() 是否足够。因此,我在没有关闭系统的情况下关闭了设备电源,或者在未卸载的情况下移除了 SD 卡。在任何情况下,写入的文件或目录结构都没有损坏。所以我们决定使用 ext4 并且只使用 fsync()。

问候,托马斯

相关内容