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