1. 前言
在使用嵌入式 Linux 系统的时,会出现由于设备意外断电引起文件系统损坏而最终使该设备无法启动的现象。为了应对这种情况,通常会从硬件设计如采用备用电源,无论是锂电池还是超级电容等,或者从系统软件设上加以规避。
2. 系统分区规划
秉承数据隔离的原则以及为方便进行权限控制,本系统设计将系统、板级、应用、资源、数据进行分离。
本系统设计采用 squashfs 只读文件系统作为嵌入式设备 Linux 根文件系统,文件系统只读;采用 overlayfs 为用户目录增加可写权限,相关分区可读可写主要用来进行日志以及一些用户数据的记录,是整个系统最繁忙的分区;另外,板级/应用/资源可能由不同的角色负责,因此进行拆分,为保证分区可靠性,并考虑到分区在需要时可能会进行数据写入,因此分区采用只读挂载。相关分区采用ext4文件系统格式。
图示为在 EMMC 上基本规划的分区形式,实际产品的分区在此基础上需要继续进行拓展:
- rootfs: 根文件系统分区,squash格式
- system: system分区,用于存放系统运行监控程序以及相关系统脚本。挂载点/system,正常运行时只读挂载,需要升级时,remount,rw。
- root: root分区,用于存放产品功能程序以及配置文件,php目录等。挂载点/root,正常运行时只读挂载,需要升级应用时,remount,rw。
- resource: 资源分区,用于存放本地媒体资源。挂载点/resource,正常运行时只读挂载,需要升级媒体资源时,remount,rw。
- userdata/userdata_a: 用户数据分区,用于存放程序与系统运行产生的日志/数据/媒体等,双备份,overlay挂载。
3. 使能kernel对squashfs以及overlay的支持
# 进入内核目录
$ cd $SDK/kernel/
# menuconfig配置
$ make ARCH=arm menuconfig
# 配置squashfs: File systems ---> [*] Miscellaneous filesystems --->
<*> SquashFS 4.0 - Squashed file system support
# 配置overlay: File systems --->
<*> Overlay filesystem support
# 退出并保存默认配置,会生成一个defconfig文件,替换当前板卡默认defconfig配置文件即可
$ make ARCH=arm savedefconfig
4. 修改开机挂载
4.1 分区挂载
通过overlay机制修改目标文件系统中/etc/fstab
文件,添加条目将userdata分区挂载到/media/userdata路径下。
/dev/block/by-name/system /system ext4 ro,noauto,exec, 0 1
/dev/block/by-name/root /root ext4 ro,noauto,exec, 0 1
/dev/block/by-name/resource /resource ext4 ro,noauto 0 2
/dev/block/by-name/userdata /userdata ext4 defaults,sync,noauto 0 2
/dev/block/by-name/userdata_a /media/userdata ext4 defaults,sync,noauto 0 2
4.2 overlay挂载
修改开机自启脚本,将/media/userdata(即userdata分区)通过overlay指令挂载到/xxx目标目录
/bin/mount -t overlay overlay -o lowerdir=/userdata,upperdir=/media/userdata/userdata,workdir=/media/userdata/worker /userdata