overlayfs的使用¶
前面简单做的jffs2文件系统,没有经过压缩,体积比较大,在spi flash中放不了多少东西。
这里介绍使用overlayfs有效利用flash空间。(著名的openwrt上用的就是这一套)
squashfs 使用¶
squashfs是只读压缩文件系统,我们把相对固定的根文件系统部分使用squash压缩存储。
把目录文件放在rootfs下,然后执行
mksquashfs rootfs rootfs-sq.img
即可获得squashfs的根文件系统。
启动squashfs需要改动uboot的环境变量:
#define CONFIG_BOOTARGS "console=ttyS0,115200 earlyprintk panic=5 rootwait " \
"mtdparts=spi32766.0:1M(uboot)ro,64k(dtb)ro,4M(kernel)ro,-(rootfs) root=31:03 rw rootfstype=squashfs
以及在内核编译时选上相应选项。
在启动系统后可以在/proc/filesystems 查看系统支持的文件系统:
# cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev ramfs
nodev bdev
nodev proc
nodev cgroup
nodev cgroup2
nodev tmpfs
nodev devtmpfs
nodev configfs
nodev debugfs
nodev sockfs
nodev pipefs
nodev rpc_pipefs
nodev devpts
squashfs
vfat
nodev nfs
nodev nfs4
nodev jffs2
nodev overlay
overlayfs使用¶
overlayfs 顾名思义,就是一种覆盖式的文件系统。
常见用法是,底层文件系统只读,上层文件系统可读写;著名的docker就是使用的overlayfs。
在嵌入式应用中,底层只读系统一般使用squashfs,上层使用jffs2.
首先我们重新分区:
#define CONFIG_BOOTARGS "console=ttyS0,115200 earlyprintk panic=5 rootwait " \
"mtdparts=spi32766.0:1M(uboot)ro,64k(dtb)ro,4M(kernel)ro,16M(rootfs) -(data) root=31:03 rw rootfstype=squashfs
这样就是给固定只读的rootfs划分了16M空间,剩余空间约10.9M划分给可读写的数据分区。
同时在只读根文件系统下新建overlay目录。
开机启动后,执行以下命令来挂载overlayfs:
注意需要使用正规mount命令,而不是busybox的mount命令才能挂载
mount -n -t jffs2 /dev/mtdblock4 /overlay
mount -n -t overlay overlayfs:/overlay -o lowerdir=/,upperdir=/overlay,workdir=/workdir /mnt