先说说这个初始化根目录的工作原理吧。我们在内存中划分出一块16m的ramdisk作为初始化的根目录,这样在扩容真正的根文件系统时就没有挂载根文件系统,真正的根文件系统在扩容时就并非在线扩容,这样确保了在扩容时根文件系统的数据安全性。
为什么非必要呢,因为这是一般企业级(不要误会,此企业非彼企业)在使用sd卡启动的开发板系统时的解决方案,但是对于树莓派玩家如果频繁更换系统的根本没必要,也因为是企业级方案,我们也没有太多精力去完整实现,所以基于noobs的启动方式来实现,对于有需要的树莓派玩家可以仔细琢磨。
我们先编译buildroot
从github上克隆源码
git clone --depth=1 -b master https://github.com/buildroot/buildroot
现在地master分区其实是2020.02.x 分支,后期可能需要手动换成2020.02.x 分支。
然后获取配置文件,可以从github此系统的开源页面上找到,下面附文件
将文件放在buildroot命令下更名为.config
cd buildroot && wget -O .config https://github.com/chainsx/cxcore/raw/master/files/config
然后编译
make
花费时间会很久,和编译openwrt一样,还要先编译交叉编译工具链。
编译完成后在buildroot/output/images/rootfs.tar
cd .. && mkdir initroot
cp buildroot/output/images/rootfs.tar initroot
之后别忘了把buildroot文件夹删了,占用空间太大了
rm -rf ../buildroot
当然了,我这里提供了编译好的文件。
如果你需要使用我编译好的
cd initroot && wget https://github.com/chainsx/cxcore/raw/master/files/rootfs.tar.gz
gunzip rootfs.tar.gz
然后解压
tar -xvf rootfs.tar && rm rootfs.tar
接下来我们在etc/init.d下创建开机扩容脚本,
nano etc/init.d/S99flash
脚本内容如下
#!/bin/sh
BLKDEV=/dev/mmcblk0
ROOTPART_SEQ=3
dialog --title INIT-SYSTEM --infobox "Initing System, Please Wait A Moment....." 20 60
parted -s $BLKDEV -- resizepart $ROOTPART_SEQ 100%
resize.f2fs $BLKDEV"p"$ROOTPART_SEQ
cd /boot
rm *.dtb >> /dev/null
rm BUILD-DATA >> /dev/null
rm -rf defaults >> /dev/null
rm -rf overlays >> /dev/null
rm recover* >> /dev/null
rm RECOVERY_FILES_DO_NOT_EDIT >> /dev/null
rm riscos-boot.bin >> /dev/null
mv EFI-BOOT/* . >> /dev/null
rmdir EFI-BOOT >> /dev/null
sync
sleep 5
reboot
添加可执行权限
chmod +x initroot/etc/init.d/S99flash
然后编辑fstab
nano etc/fstab
内容如下
# <file system> <mount pt> <type> <options> <dump> <pass>
/dev/root / squashfs rw,noauto 0 1
/dev/mmcblk0p1 /boot vfat defaults 0 0
proc /proc proc defaults 0 0
devpts /dev/pts devpts defaults,gid=5,mode=620,ptmxmode=0666 0 0
tmpfs /dev/shm tmpfs mode=0777 0 0
tmpfs /tmp tmpfs mode=1777 0 0
tmpfs /run tmpfs mode=0755,nosuid,nodev 0 0
sysfs /sys sysfs defaults 0 0
然后制作初始化根目录为squashfs的镜像
cd ..
mksquashfs initroot recovery.rfs
删除无用文件
rm -rf initroot
前面提到过,我们需要基于noobs的启动方式,然后下载noobs lite。
mkdir noobs
wget https://mirrors.tuna.tsinghua.edu.cn/raspbian-images/NOOBS_lite/images/NOOBS_lite-2019-07-12/NOOBS_lite_v3_2.zip
解压noobs并删掉noobs的核心----recovery.rfs
unzip NOOBS_lite_v3_2.zip
rm *txt
rm NOOBS_lite_v3_2.zip
rm recovery.rfs
复制我们制作的recovery.rfs到此文件夹
cp ../recovery.rfs .
更改cmdline启动命令
nano recovery.cmdline
将里面的init=/init删除
然后初始化根目录就制作完成了,后面我们将会讲到如何使用。