1. 概述
在进行嵌入式 Linux 系统产品开发设计时,经常会出现由于设备意外断电等引起的文件系统损坏的情况,进而最终导致设备无法正常启动。为了应对这种情况,通常会从硬件设计如采用备用电源,无论是锂电池还是超级电容等,或者从系统软件设上加以规避。本文接下来将介绍如何使用 squashfs 只读文件系统制作 Linux 系统文件,并采用 overlayfs 为用户目录增加可写权限。
Squashfs 是一种只读压缩文件系统,通常被用于数据备份或者系统资源受限的计算机系统上使用,如 Linux 发行版的 LiveCD,OpenWRT 系统也采用 squashfs。OverlayFS 一个结合其他文件系统的联合挂载,将多个挂载点叠加为一个目录。常见的应用是在一个只读的分区上叠加可读写的另一个分区。嵌入式 Linux 设备通常的功能都是被设计好的,极少需要在后期安装其他软件或更改 Linux 系统软件,更多的是更新设备应用程序和相关数据。因此基于 squashfs 的只读文件系统,结合 overlayfs 为用户应用和数据提供读写操作,能够提高嵌入式 Linux 文件系统可靠性。
本文所介绍的方式方法同样适用于其余RK平台linux(buildroot)系统产品。
2. 配置kernel支持squashfs+overlay
本部分介绍如何配置内核支持squashfs与overlay并修改bootargs以在开机启动时引导加载squashfs格式的根文件系统。
2.1 配置内核支持squashfs
2.2 配置内核支持overlayfs
2.3 修改bootargs引导squash根文件系统
3. 修改buildroot文件系统启动与挂载支持
本部分实际使用时通过rk提供的overlayfs方式()进行目标文件系统文件覆盖替换,具体overlay操作不做介绍。
3.1 修改fstab增加rootfs挂载项
注意:需要首先通过overlayfs机制提供对应的挂载点目录:/media/root-ro
3.2 添加开机启动overlay挂载脚本
/etc/init.d/S01overlay.sh
#!/bin/sh
function overlay_mount(){
mkdir -p /userdata/overlay/upper
mkdir -p /userdata/overlay/work
chmod 0755 /userdata/overlay/upper
chmod 0755 /userdata/overlay/work
mount -o noatime,lowerdir=/,upperdir=/userdata/overlay/upper,workdir=/userdata/overlay/work -t overlay "overlay:/overlay" /mnt
pivot_root /mnt /mnt/media/root-ro
mount -o noatime,move /media/root-ro/tmp /tmp
mount -o noatime,move /media/root-ro/run /run
mount -o noatime,move /media/root-ro/proc /proc
mount -o noatime,move /media/root-ro/dev /dev
mount -o noatime,move /media/root-ro/dev/pts /dev/pts
mount -o noatime,move /media/root-ro/dev/shm /dev/shm
mount -o noatime,move /media/root-ro/sys /sys
mount -o noatime,move /media/root-ro/sys/kernel/config /sys/kernel/config
mount -o noatime,move /media/root-ro/sys/kernel/debug /sys/kernel/debug
mount -o noatime,move /media/root-ro/sys/fs/pstore /sys/fs/pstore
mount -o noatime,move /media/root-ro/oem /oem
mount -o noatime,move /media/root-ro/userdata /userdata
}
case "$1" in
start|"")
overlay_mount
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop|status)
# No-op
;;
*)
echo "Usage: start" >&2
exit 3
;;
esac
: