跳转至

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

说明

  1. (ro) 表示只能实现只读: ubi 卷可通过模拟块设备,实现块文件系统的读,但不支持写。
  2. vfat(fat32)使用内核原生的支持,exfat 需要在Linux-5.7 后社区才正式支持,因此此处标注为不支持。
  3. ntfs 依赖于第三方工具ntfs-3g。
  4. TF 卡/U 盘等,建议使用vfat 实现Window/Linux/MacOS 的最大兼容参考文章《多平台大型文件系统比较》。
  5. vfat/ntfs/exfat 等Window 文件系统,不建议用做嵌入式存储,除非您能保证其掉电安全和移植文件系统修复工具。

警告 关于文件系统的选择,有以下几点需要注意:

  1. 全志NFTL nand 可使用块文件系统(ext4) 全志在驱动中实现磨损平衡和坏块管理,向上呈现为块设 备。因此可支持ext4,不需要且不支持常见的flash 文件系统(jffs2/yaffs/ubifs 等)。
  2. 为了保证掉电不变砖,根文件系统务必只读(squashfs),或者ext4 挂载为ro 模式。
  3. ext4/ubifs 等文件系统分区大小必须足够大,以确保能正确创建日志块,否则有掉电变砖风险分区大小 请参考章节分区大小与对齐。

4.1 ext4 与日志

4.1.1 ext4 的日志

与服务器等长期稳定供电的情况不同,嵌入式设备随时有掉电的可能。不管在任意时间掉电,文件系统都需要保持一致性,换句话说,保证文件不会因为掉电丢失。如果文件系统只读,则不需要日志。日志只是确保写的安全。

说明 什么是文件系统的一致性? 文件系统元数据块记录了有什么文件,数据块则保存了实际的文件内容。一致性则表示,元数据块记录了存在某个文件,必定存 在对应的数据块,换句话说,就是保证元数据和数据的一致。 如果出现,元数据记录文件A 存在,但文件A 的数据块是无效的,或者明明数据块是有效的,但元数据并没任何记录,导致系 统并不知道文件存在,就出现了文件系统的不一致。

警告 保证文件不丢失,只保证之前写入的文件数据正常,而非正在写,且因为掉电导致没写完整的文件。对大多数文 件系统而言,更多时候会直接丢弃这没写完整的文件以保证一致性。

ext4 通过日志的形式保证文件系统一致性。其支持3 种日志模式:

日志模式 原理 特点
journal 元数据与数据都写入日志 最安全,但性能最慢
writeback 只有元数据写入日志,但不保证数据先落盘 性能最快,但最不安全
ordered 只有元数据写入日志,且保证数据先落盘,元数据后落盘 折中,默认方案

考虑安全和性能的折中,建议使用ordered 的日志模式。系统默认使用的就是ordered 模式。我们在mount 命令中显示的挂载参数可显示使用的哪种日志。

$mount
/dev/by-name/UDISK on /mnt/UDISK type ext4 (rw,....,data=ordered)

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 文件系统每次重启后,建议都进行一次修复,确保文件系统稳定。 修复可以参考以下命令:

e2fsck -y <分区>

4.1.4 修复fat

TF 卡挂载fat 文件系统,fat 文件系统不是日志型文件系统,在掉电、带电插拔等场景下不能保证文件系统数据的安全,所以建议启动都进行一次修复。修复可以参考以下命令:

fsck_msdos -pfS /dev/mmcblk0p1

如章节global 类型config中描述,如果使用procd 引导启动,在fstab 中使能check_fs,也可实现在挂载前自动修复。