使用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固件那么简洁,后续再改进吧
离线
离线
我记得不需要啊,br不是动态的嘛,编译完多大就是多大
rootfs.ext4 需要设置好大小,设置小了会报错,rootfs.tar倒是不需要
离线