您尚未登录。

楼主 # 2021-07-08 11:36:25

小王子&木头人
会员
注册时间: 2018-05-08
已发帖子: 72
积分: 4

分享一种emmc固件的制作方式(squashfs+overlay)

使用buildroot制作文件系统,通常使用rootfs.ext4来作为文件系统固件,这种方式需要提前预设一个固件size,而这个size在固件没有编译完成之前是无法知道它的确切大小,一般都会设置稍大点的值,但也会需要空白填充,占用固件空间。
那有没有办法不指定大小,由编译出来的文件系统大小来自动确定size?有,squashfs就是,该文件系统为压缩只读文件系统,体积小,安全,文件系统出现问题,还可以通过恢复出厂设置来还原系统,还可以防止小白删库跑路,当然防不了大神。
单单squashfs还不够,毕竟这个部分是只读,还需要overlay分区来支持读写。
下面上教程,

1. 在buildroot里面添加支持

BR2_TARGET_ROOTFS_SQUASHFS=y
BR2_TARGET_ROOTFS_SQUASHFS4_GZIP=y

这一步会最终会生成output/images/rootfs.squashfs

2. 固件打包

image boot.vfat {
	vfat {
		files = {
			"Image",
			"sun50i-h5-prince-pc2.dtb",
			"boot.scr"
		}
	}
	size = 32M
}

image sdcard.img {
	hdimage {
	}

	partition spl {
		in-partition-table = "no"
		image = "sunxi-spl.bin"
		offset = 8192
	}

	partition u-boot {
		in-partition-table = "no"
		image = "u-boot.itb"
		offset = 40K
		size = 1M # 1MB - 40K
	}

	partition boot {
		partition-type = 0xC
		bootable = "true"
		image = "boot.vfat"
	}

	partition rootfs {
		partition-type = 0x83
		image = "rootfs.squashfs"
	}

	partition overlay {
		partition-type = 0x83
		size = 16000M
	}
}

overlay 大小可以指定比TF卡大小大,第一次开机文件系统重建会校准

3. 内核支持

CONFIG_SQUASHFS=y
CONFIG_SQUASHFS_FILE_CACHE=y
# CONFIG_SQUASHFS_FILE_DIRECT is not set
CONFIG_SQUASHFS_DECOMP_SINGLE=y
# CONFIG_SQUASHFS_DECOMP_MULTI is not set
# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set
CONFIG_SQUASHFS_XATTR=y
CONFIG_SQUASHFS_ZLIB=y
# CONFIG_SQUASHFS_LZ4 is not set
# CONFIG_SQUASHFS_LZO is not set
# CONFIG_SQUASHFS_XZ is not set
# CONFIG_SQUASHFS_ZSTD is not set
# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
# CONFIG_SQUASHFS_EMBEDDED is not set
CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3

4. 重建文件系统

init_sys()
{
    mount -n -t ext4 /dev/mmcblk0p3 -o rw,noatime /overlay
    ret=$?
    echo "ret:$ret"
    if [ $ret -ne 0 ];then
        echo "Start format /dev/mmcblk0p3"
        mkfs.ext4 /dev/mmcblk0p3
        mount -n -t ext4 /dev/mmcblk0p3 -o rw,noatime /overlay
        echo "Format & mount /dev/mmcblk0p3 success"
    fi

        mkdir -p /overlay/upper /overlay/work
        mount -n -t overlay overlayfs:/overlay -o rw,noatime,lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work /mnt

        mount -n /proc -o noatime,--move /mnt/proc
        pivot_root /mnt /mnt/rom
        mount -n /rom/dev -o noatime,--move /dev
        mount -n /rom/dev/shm -o noatime,--move /dev/shm
        mount -n /rom/tmp -o noatime,--move /tmp
        mount -n /rom/sys -o noatime,--move /sys
        mount -n /rom/run -o noatime,--move /run 
        mount -n /rom/media -o noatime,--move /media
}

将以上shell命令做成脚本,放在文件系统下,比如叫/usr/bin/overlayfs,在/etc/inittab里面下添加

::sysinit:/usr/bin/overlayfs

默认文件系统要先创建/overlay和/rom两个目录


不足,这样做出来的固件确实比.ext4小了不少,但是不像openwrt的emmc固件那么简洁,后续再改进吧

离线

楼主 #1 2021-07-08 11:52:13

小王子&木头人
会员
注册时间: 2018-05-08
已发帖子: 72
积分: 4

Re: 分享一种emmc固件的制作方式(squashfs+overlay)

离线

#2 2021-07-08 11:52:49

xfdr0805
会员
注册时间: 2020-07-23
已发帖子: 291
积分: 344

Re: 分享一种emmc固件的制作方式(squashfs+overlay)

我是把rootfs.tar解压来使用的

离线

#3 2021-07-08 14:03:27

luciferseva
会员
注册时间: 2020-05-20
已发帖子: 58
积分: 51.5

Re: 分享一种emmc固件的制作方式(squashfs+overlay)

学习一下,目前编译会有重复定义的问题

离线

#4 2021-07-08 18:30:00

microxp
会员
注册时间: 2021-04-27
已发帖子: 40
积分: 21

Re: 分享一种emmc固件的制作方式(squashfs+overlay)

我记得不需要啊,br不是动态的嘛,编译完多大就是多大

离线

楼主 #5 2021-07-09 11:41:27

小王子&木头人
会员
注册时间: 2018-05-08
已发帖子: 72
积分: 4

Re: 分享一种emmc固件的制作方式(squashfs+overlay)

microxp 说:

我记得不需要啊,br不是动态的嘛,编译完多大就是多大

rootfs.ext4 需要设置好大小,设置小了会报错,rootfs.tar倒是不需要

离线

#6 2023-10-11 12:09:08

muxi01
会员
注册时间: 2020-10-24
已发帖子: 54
积分: 136

Re: 分享一种emmc固件的制作方式(squashfs+overlay)

感谢,刚好用得上。但是似乎不能执行脚本。

# ls -al overlayfs
-rwxr-xr-x    1 root     root           857 Oct 11  2023 overlayfs
# pwd
/bin
# ./overlayfs
-sh: ./overlayfs: not found
#

最近编辑记录 muxi01 (2023-10-11 13:39:10)

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn