overlayfs的使用

前面简单做的jffs2文件系统,没有经过压缩,体积比较大,在spi flash中放不了多少东西。

这里介绍使用overlayfs有效利用flash空间。(著名的openwrt上用的就是这一套)

squashfs 使用

squashfs是只读压缩文件系统,我们把相对固定的根文件系统部分使用squash压缩存储。

把目录文件放在rootfs下,然后执行

mksquashfs rootfs rootfs-sq.img

即可获得squashfs的根文件系统。

启动squashfs需要改动uboot的环境变量:

include/configs/sun8i.h
 #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