4 文件系统支持情况
存储介质 | jffs2 | squashfs | ext4 | vfat | ntfs | exfat | ubifs |
---|---|---|---|---|---|---|---|
(NFTL) nand | N | Y | Y | Y | Y | N | N |
(UBI) spinand | N | Y | Y(ro) | Y(ro) | Y(ro) | N | Y |
mmc | N | Y | Y | Y | Y | N | N |
nor | Y | Y | N | N | N | N | N |
TF 卡 | N | N | Y | Y | Y | N | N |
U 盘 | N | N | Y | Y | Y | N | N |
说明
- (ro) 表示只能实现只读: ubi 卷可通过模拟块设备,实现块文件系统的读,但不支持写。
- vfat(fat32)使用内核原生的支持,exfat 需要在Linux-5.7 后社区才正式支持,因此此处标注为不支持。
- ntfs 依赖于第三方工具ntfs-3g。
- TF 卡/U 盘等,建议使用vfat 实现Window/Linux/MacOS 的最大兼容参考文章《多平台大型文件系统比较》。
- vfat/ntfs/exfat 等Window 文件系统,不建议用做嵌入式存储,除非您能保证其掉电安全和移植文件系统修复工具。
警告 关于文件系统的选择,有以下几点需要注意:
- 全志NFTL nand 可使用块文件系统(ext4) 全志在驱动中实现磨损平衡和坏块管理,向上呈现为块设 备。因此可支持ext4,不需要且不支持常见的flash 文件系统(jffs2/yaffs/ubifs 等)。
- 为了保证掉电不变砖,根文件系统务必只读(squashfs),或者ext4 挂载为ro 模式。
- ext4/ubifs 等文件系统分区大小必须足够大,以确保能正确创建日志块,否则有掉电变砖风险分区大小 请参考章节分区大小与对齐。
4.1 ext4 与日志
4.1.1 ext4 的日志
与服务器等长期稳定供电的情况不同,嵌入式设备随时有掉电的可能。不管在任意时间掉电,文件系统都需要保持一致性,换句话说,保证文件不会因为掉电丢失。如果文件系统只读,则不需要日志。日志只是确保写的安全。
说明 什么是文件系统的一致性? 文件系统元数据块记录了有什么文件,数据块则保存了实际的文件内容。一致性则表示,元数据块记录了存在某个文件,必定存 在对应的数据块,换句话说,就是保证元数据和数据的一致。 如果出现,元数据记录文件A 存在,但文件A 的数据块是无效的,或者明明数据块是有效的,但元数据并没任何记录,导致系 统并不知道文件存在,就出现了文件系统的不一致。
警告 保证文件不丢失,只保证之前写入的文件数据正常,而非正在写,且因为掉电导致没写完整的文件。对大多数文 件系统而言,更多时候会直接丢弃这没写完整的文件以保证一致性。
ext4 通过日志的形式保证文件系统一致性。其支持3 种日志模式:
日志模式 | 原理 | 特点 |
---|---|---|
journal | 元数据与数据都写入日志 | 最安全,但性能最慢 |
writeback | 只有元数据写入日志,但不保证数据先落盘 | 性能最快,但最不安全 |
ordered | 只有元数据写入日志,且保证数据先落盘,元数据后落盘 | 折中,默认方案 |
考虑安全和性能的折中,建议使用ordered 的日志模式。系统默认使用的就是ordered 模式。我们在mount 命令中显示的挂载参数可显示使用的哪种日志。
4.1.2 分区大小与日志
有时候分区太小,系统会默认把日志功能关闭。可以通过以下方法判断:
$dumpe2fs <分区or 镜像文件>
...
Filesystem features: has_journal ...
...
Journal backup: inode blocks
Journal features: (none)
日志大小: 1024k
Journal length: 1024
Journal sequence: 0x00000001
Journal start: 0
...
在Filesystem features 中有has_journal 的标志表示支持日志。在Jorunal 片段中也详细描述了日志块的大小等信息。 如果创建的文件系统没有日志,对大多数用户而言,扩大分区大小是最简单的做法。专业的做法可以通过缩小块大小,取消预留块等方式为日志腾挪出空间。 按以往经验,对小容量(<100M) 的存储而言,在资源文件之外预留3-5M 的空间用于文件系统的元数据即可。
4.1.3 修复ext4
ext4 文件系统每次重启后,建议都进行一次修复,确保文件系统稳定。 修复可以参考以下命令:
4.1.4 修复fat
TF 卡挂载fat 文件系统,fat 文件系统不是日志型文件系统,在掉电、带电插拔等场景下不能保证文件系统数据的安全,所以建议启动都进行一次修复。修复可以参考以下命令:
如章节global 类型config中描述,如果使用procd 引导启动,在fstab 中使能check_fs,也可实现在挂载前自动修复。