/init 脚本挂载好,而不是等系统完全跑起来再由某个“服务”去做。因此你“看不到指定当前只读层”的配置,是因为那一步被提前写进了启动脚本,在 root 切换前就完成了,后面用户空间看到的只是“已经叠好的统一视图”。
-
内核启动
root=指向的其实是initramfs 的 cpio 镜像,内核把它展开到 tmpfs 并执行/init。 -
initramfs 里的
/init脚本(BusyBox 或 systemd 都有)
a. 把真正的“只读系统分区”——通常是 squashfs/ubifs 的 /dev/mtdblockX 或 ubi0_0 ——挂到 /mnt/rom(lowerdir)。
b. 找一个可写的持久化分区(ubi 剩余卷、ext4 第三分区、USB 盘等)挂到 /mnt/overlay。
c. 建立 workdir、upperdir 目录,然后执行
~/initramfs$ cat init
#!/bin/sh
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
/bin/mount -t devtmpfs devtmpfs /dev
/bin/mount -t proc proc /proc
/bin/mount -t sysfs sysfs /sys
exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console
ROOT_DEV=$(cat /proc/sysinfo/system 2>/dev/null)
ROOT_DEV=${ROOT_DEV:-"/dev/mmcblk1p9"}
DATA_PARTITION=/dev/mmcblk1p11
while [ ! -e ${ROOT_DEV} ]
do
/bin/usleep 50000
done
if [ ! -e ${DATA_PARTITION} ];then
/usr/sbin/partition create data 0
printf "create data OK\n"
fi
/usr/sbin/veritysetup --hash-offset=324648960 create vroot ${ROOT_DEV} ${ROOT_DEV} 74211d8c6af790dabc74cc7813f0c991b807f36bc5e3faeb968d4d82d126797c
if [ $? == 0 ];then
printf "Verity OK\n"
if [[ -e ${DATA_PARTITION} ]] && [[ -d /overlay ]];then
/bin/mount -t ext4 -o rw,errors=continue ${DATA_PARTITION} /overlay
if [ $? == 0 ];then
[ -d /overlay/upper ] || /bin/mkdir -p /overlay/upper
[ -d /overlay/work ] || /bin/mkdir -p /overlay/work
if [[ -e /dev/mapper/vroot ]] && [[ -d /root ]];then
#/bin/mount t ext4 -o ro,errors=continue /dev/mapper/vroot /root
/bin/mount -t squashfs -o ro /dev/mapper/vroot /root
if [ $? == 0 ];then
/bin/mount -t overlay -o lowerdir=/root,upperdir=/overlay/upper,workdir=/overlay/work overlayfs-root /rootfs && exec /sbin/switch_root /rootfs /sbin/init
fi
fi
fi
else
if [[ -e /dev/mapper/vroot ]] && [[ -d /root ]];then
#/bin/mount -t ext4 -o ro,errors=continue /dev/mapper/vroot /root && exec /sbin/switch_root /root /sbin/init
/bin/mount -t squashfs -o ro /dev/mapper/vroot /root && exec /sbin/switch_root /root /sbin/init
fi
fi
fi
#/bin/mount -t ext4 -o ro,errors=continue ${ROOT_DEV} /root && exec /sbin/switch_root /root /sbin/init
printf "system enter halt error($?)\n"
/sbin/reboot -f
#busybox /bin/sh
浙公网安备 33010602011771号