嵌入式linux开发板使用OverlayRootfs 功能
OverlayRootfs 是指利用 OverlayFS 技术创建的根文件系统(root filesystem)使用 OverlayRootfs 的设备可以轻松的实现:根文件系统写保护、恢复出厂设置功能,在很多的实际项目中会用到这个功能。
目录
1.把ramdisk.img 放在RK SDK的内核根目录下
5.确认编译内核镜像时候加载ramdisk.img到boot.img
前言
OverlayRootfs 是指利用 OverlayFS 技术创建的根文件系统(root filesystem)使用 OverlayRootfs 的设备可以轻松的实现:根文件系统写保护、恢复出厂设置功能,在很多的实际项目中会用到这个功能。
用两个命令解释这个技术原理:
1.mount -o ro /dev/mmcblk0p6 /root-ro # 把根文件系统分区映射到/root-ro 目录
2.mount -n -t overlay overlayroot -o lowerdir=/root-ro,upperdir=/userdata/upperdir,workdir=/userdata/workdir / # 把根文件系统分区(root-ro)与/userdata/*分区 组成 / (系统根目录)
一、基于rk3588使用OverlayRootfs
基于rk3588使用OverlayRootfs,其他芯片可以参考
1.把ramdisk.img 放在RK SDK的内核根目录下
eternal@eternal:~/board/rockchip_linux/rk3399_rk3588_linux_rkr5$ ls ./kernel/ramdisk.img
./kernel/ramdisk.img
2.SDK 配置开启RK_ROOTFS_INITRD=y

3.内核配置开启使用OverlayFS
CONFIG_OVERLAY_FS=y
4.修改bootargs
在内核bootargs 中加上 overlayroot=device:dev=PARTLABEL=userdata,fstype=ext4,mkfs=1
chosen: chosen {
bootargs = "earlycon=uart8250,mmio32,0xfeb50000 console=ttyFIQ0 irqchip.gicv3_pseudo_nmi=0 root=PARTLABEL=rootfs rootfstype=ext4 ro rootwait overlayroot=device:dev=PARTLABEL=userdata,fstype=ext4,mkfs=1";
};
5.确认编译内核镜像时候加载ramdisk.img到boot.img
Image: boot.img (with Image ramdisk.img resource.img) is ready
eternal@eternal:~/board/rockchip_linux/rk3399_rk3588_linux_rkr5$ ./build.sh kernel
Log saved at /home/eternal/board/rockchip_linux/rk3399_rk3588_linux_rkr5/output/log/2025-01-26_09-54-39
Toolchain for kernel:
/home/eternal/board/rockchip_linux/rk3399_rk3588_linux_rkr5/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
Toolchain for loader (u-boot):
/home/eternal/board/rockchip_linux/rk3399_rk3588_linux_rkr5/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
==========================================
Final configs
==========================================
RK_BOOT_FIT_ITS=boot.its
RK_BOOT_IMG=boot.img
RK_BUILDROOT_CFG=rockchip_rk3588_ramboot
RK_CHIP_FAMILY=rk3588
RK_DEBIAN_ARCH=arm64
RK_DEBIAN_ARM64=y
RK_DEBIAN_VERSION=bullseye
RK_DEFCONFIG=/home/eternal/board/rockchip_linux/rk3399_rk3588_linux_rkr5/device/rockchip/.chips/rk3588/rockchip_rk3588-edge-v12-debian_defconfig
RK_EXTRA_PARTITION_NUM=2
RK_EXTRA_PARTITION_STR=oem:oem:/oem:ext4:defaults:normal:auto:@userdata:userdata:/userdata:ext4:defaults:normal:auto:@@@
RK_KERNEL_ARCH=arm64
RK_KERNEL_ARM64=y
RK_KERNEL_CFG=rockchip_linux_defconfig
RK_KERNEL_CFG_FRAGMENTS=rk3588_linux.config
RK_KERNEL_DTB=kernel/arch/arm64/boot/dts/rockchip/rk3588--linux.dtb
RK_KERNEL_DTS=kernel/arch/arm64/boot/dts/rockchip/rk3588--linux.dts
RK_KERNEL_IMG=kernel/arch/arm64/boot/Image
RK_KERNEL_TOOLCHAIN=/home/eternal/board/rockchip_linux/rk3399_rk3588_linux_rkr5/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
RK_KERNEL_VERSION=5.10
RK_KERNEL_VERSION_REAL=5.10
RK_MISC_IMG=wipe_all-misc.img
RK_PARAMETER=parameter.txt
RK_PCBA_CFG=rockchip_rk3588_pcba
RK_RECOVERY_CFG=rockchip_rk3588_recovery
RK_RECOVERY_FIT_ITS=boot4recovery.its
RK_ROOTFS_INITRD=y
RK_ROOTFS_SYSTEM=debian
RK_ROOTFS_SYSTEM_DEBIAN=y
RK_ROOTFS_TYPE=cpio.gz
RK_ROOTFS_UDEV_RULES=y
RK_SAVE_TRACKED=y
RK_SESSION=2025-01-26_09-54-39
RK_UBOOT_ARCH=arm64
RK_UBOOT_ARM64=y
RK_UBOOT_CFG=rk3588
RK_UBOOT_TOOLCHAIN=/home/eternal/board/rockchip_linux/rk3399_rk3588_linux_rkr5/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
RK_UPDATE=y
RK_USB_ADBD=y
RK_USB_ADBD_BASH=y
RK_USB_ADBD_TCP_PORT=5555
RK_USE_FIT_IMG=y
RK_WIFIBT_CHIP=ALL_AP
RK_WIFIBT_TTY=ttyS0
RK_YOCTO_CFG=rockchip-rk3588-evb
RK_YOCTO_CHROMIUM=y
RK_YOCTO_DISPLAY_PLATFORM=wayland
RK_YOCTO_DISPLAY_PLATFORM_WAYLAND=y
==========================================
Start building kernel
==========================================
+ make -C kernel/ -j73 CROSS_COMPILE=/home/eternal/board/rockchip_linux/rk3399_rk3588_linux_rkr5/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- ARCH=arm64 rockchip_linux_defconfig rk3588_linux.config
make: Entering directory '/home/eternal/board/rockchip_linux/rk3399_rk3588_linux_rkr5/kernel'
#
# configuration written to .config
#
Using .config as base
Merging ./arch/arm64/configs/rk3588_linux.config
Value of CONFIG_BCMDHD_PCIE is redefined by fragment ./arch/arm64/configs/rk3588_linux.config:
Previous value: # CONFIG_BCMDHD_PCIE is not set
New value: CONFIG_BCMDHD_PCIE=y
Value of CONFIG_MALI_CSF_SUPPORT is redefined by fragment ./arch/arm64/configs/rk3588_linux.config:
Previous value: # CONFIG_MALI_CSF_SUPPORT is not set
New value: CONFIG_MALI_CSF_SUPPORT=y
Value of CONFIG_R8125 is redefined by fragment ./arch/arm64/configs/rk3588_linux.config:
Previous value: # CONFIG_R8125 is not set
New value: CONFIG_R8125=y
Value of CONFIG_OVERLAY_FS is redefined by fragment ./arch/arm64/configs/rk3588_linux.config:
Previous value: # CONFIG_OVERLAY_FS is not set
New value: CONFIG_OVERLAY_FS=y
#
# merged configuration written to .config (needs make)
#
.config:7170:warning: override: BCMDHD_PCIE changes choice state
#
# configuration written to .config
#
make: Leaving directory '/home/eternal/board/rockchip_linux/rk3399_rk3588_linux_rkr5/kernel'
+ make -C kernel/ -j73 CROSS_COMPILE=/home/eternal/board/rockchip_linux/rk3399_rk3588_linux_rkr5/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- ARCH=arm64 rk3588--linux.img
make: Entering directory '/home/eternal/board/rockchip_linux/rk3399_rk3588_linux_rkr5/kernel'
SYNC include/config/auto.conf.cmd
CALL scripts/atomic/check-atomics.sh
CALL scripts/checksyscalls.sh
CHK include/generated/compile.h
Image: resource.img (with rk3588--linux.dtb logo.bmp logo_kernel.bmp) is ready
Image: boot.img (with Image ramdisk.img resource.img) is ready
Image: zboot.img (with Image.lz4 ramdisk.img resource.img) is ready
make: Leaving directory '/home/eternal/board/rockchip_linux/rk3399_rk3588_linux_rkr5/kernel'
Not Found io-domains in kernel/arch/arm64/boot/dts/rockchip/rk3588--linux.dts
Running 10-kernel.sh - build_kernel succeeded.
6.确认uboot阶段加载ramdisk.img
Rockchip UBOOT DRM driver version: v1.0.1
vp0 have layer nr:2[0 2 ], primary plane: 2
vp1 have layer nr:2[1 3 ], primary plane: 3
vp2 have layer nr:2[6 8 ], primary plane: 8
vp3 have layer nr:2[7 9 ], primary plane: 9
hdmi@fde80000 disconnected
dp@fde60000 disconnected
CLK: (sync kernel. arm: enter 1008000 KHz, init 1008000 KHz, kernel 0N/A)
b0pll 24000 KHz
b1pll 24000 KHz
lpll 24000 KHz
v0pll 24000 KHz
aupll 786431 KHz
cpll 1500000 KHz
gpll 1188000 KHz
npll 850000 KHz
ppll 1100000 KHz
aclk_center_root 702000 KHz
pclk_center_root 100000 KHz
hclk_center_root 396000 KHz
aclk_center_low_root 500000 KHz
aclk_top_root 750000 KHz
pclk_top_root 100000 KHz
aclk_low_top_root 396000 KHz
Net: eth1: ethernet@fe1c0000, eth0: ethernet@fe1b0000
Hit key to stop autoboot('CTRL+C'): 0
ANDROID: reboot reason: "(none)"
Not AVB images, AVB skip
ANDROID: Hash OK
Booting IMAGE kernel at 0x00400000 with fdt at 0x08300000...
Fdt Ramdisk skip relocation
## Booting Android Image at 0x003ff800 ...
Kernel: 0x00400000 - 0x025fca00 (34803 KiB)
ramdisk: 0x0a200000 - 0x0aac76db (8990 KiB)
## Flattened Device Tree blob at 0x08300000
Booting using the fdt blob at 0x08300000
XIP Kernel Image from 0x00400000 to 0x00400000 ... OK
kernel loaded at 0x00400000, end = 0x025fca00
Using Device Tree in place at 0000000008300000, end 000000000832a8de
WARNING: could not set reg FDT_ERR_BADOFFSET.
## reserved-memory:
cma: addr=10000000 size=10000000
drm-logo@00000000: addr=edf00000 size=b8000
ramoops@110000: addr=110000 size=f0000
Adding bank: 0x00200000 - 0x08400000 (size: 0x08200000)
Adding bank: 0x09400000 - 0xf0000000 (size: 0xe6c00000)
Adding bank: 0x1f0000000 - 0x200000000 (size: 0x10000000)
Total: 995.848/1321.911 ms
Starting kernel ...
[ 1.326145] Booting Linux on physical CPU 0x0000000000 [0x412fd050]
[ 1.326163] Linux version 5.10.160 (eternal@eternal) (aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 10.3.1 20210621, GNU ld (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 2.36.1.20210621) #13 SMP Sat Jan 25 22:41:18 CST 2025
已经加载ramdisk.img
二、分析ramdisk镜像
把ramdisk.镜像解压出来,发现是一些脚本

可以研看一下 init 脚本,这个是开机后首先启动的init脚本
[ 3.339972] Run /init as init process
Loading, please wait...

三、结果
系统加载过程
[ 3.338935] pci 0002:21:00.0: [14e4:449d] type 00 class 0x028000
[ 3.339027] pci 0002:21:00.0: reg 0x10: [mem 0x00000000-0x0000ffff 64bit]
[ 3.339084] pci 0002:21:00.0: reg 0x18: [mem 0x00000000-0x003fffff 64bit]
[ 3.339606] pci 0002:21:00.0: supports D1 D2
[ 3.339614] pci 0002:21:00.0: PME# supported from D0 D1 D2 D3hot D3cold
[ 3.339972] Run /init as init process
Loading, please wait...
/dev/console is Ok
[ 3.353817] pci_bus 0002:21: busn_res: [bus 21-2f] end is updated to 21
[ 3.353881] pci 0002:20:00.0: BAR 8: assigned [mem 0xf2200000-0xf27fffff]
[ 3.353892] pci 0002:20:00.0: BAR 6: assigned [mem 0xf2800000-0xf280ffff pref]
[ 3.353905] pci 0002:21:00.0: BAR 2: assigned [mem 0xf2400000-0xf27fffff 64bit]
[ 3.353953] pci 0002:21:00.0: BAR 0: assigned [mem 0xf2200000-0xf220ffff 64bit]
[ 3.354000] pci 0002:20:00.0: PCI bridge to [bus 21]
[ 3.354010] pci 0002:20:00.0: bridge window [mem 0xf2200000-0xf27fffff]
[ 3.356196] pcieport 0002:20:00.0: PME: Signaling with IRQ 145
starting version 237
[ 3.605291] usb 2-1.1: new full-speed USB device number 3 using ehci-platform
[ 3.707681] usb 2-1.1: New USB device found, idVendor=1ea7, idProduct=0064, bcdDevice= 2.00
[ 3.707726] usb 2-1.1: New USB device strings: Mfr=0, Product=1, SerialNumber=0
[ 3.707734] usb 2-1.1: Product: 2.4G Mouse
[ 3.711355] input: 2.4G Mouse as /devices/platform/fc880000.usb/usb2/2-1/2-1.1/2-1.1:1.0/0003:1EA7:0064.0001/input/input8
[ 3.711600] input: 2.4G Mouse as /devices/platform/fc880000.usb/usb2/2-1/2-1.1/2-1.1:1.0/0003:1EA7:0064.0001/input/input9
[ 3.765511] hid-generic 0003:1EA7:0064.0001: input,hiddev96,hidraw0: USB HID v1.10 Mouse [2.4G Mouse] on usb-fc880000.usb-1.1/input0
Begin: Loading essential drivers ... done.
Begin: Running /scripts/init-premount ... done.
Begin: Mounting root file system ... Begin: Running /scripts/local-top ... done.
Begin: Running /scripts/local-premount ... done.
Begin: Will now check root file system ... fsck from util-linux 2.36.1-4309-dirty
[/sbin/fsck.ext4 (1) -- /dev/mmcblk0p6] fsck.ext4 -a -C0 /dev/mmcblk0p6
/dev/mmcblk0p6: clean, 112854/910336 files, 1019271/3670016 blocks
done.
[ 4.851062] EXT4-fs (mmcblk0p6): mounted filesystem with ordered data mode. Opts: (null)
done.
Begin: Running /scripts/local-bottom ... done.
Begin: Running /scripts/init-bottom ... Warning: overlayroot: configuring overlayroot with driver=overlay mode=device opts='dev=PARTLABEL=userdata,fstype=ext4,mkfs=1' per kernel cmdline
[ 5.065310] EXT4-fs (mmcblk0p8): 2 orphan inodes deleted
[ 5.065359] EXT4-fs (mmcblk0p8): recovery complete
[ 5.068521] EXT4-fs (mmcblk0p8): mounted filesystem with ordered data mode. Opts: (null)
Success: overlayroot: configured root with 'device:dev=PARTLABEL=userdata,fstype=ext4,mkfs=1' using overlay per kernel cmdline
Warning: Something odd, no /lib/modules/5.10.160 in initramfs.
done.
[ 5.238953] systemd[1]: Failed to look up module alias 'autofs4': Function not implemented
Welcome to Debian GNU/Linux 11 (bullseye)!
root@linaro-alip:/#
root@linaro-alip:/#
root@linaro-alip:/#
root@linaro-alip:/# df -h
文件系统 容量 已用 可用 已用% 挂载点
udev 1.8G 8.0K 1.8G 1% /dev
tmpfs 391M 2.1M 389M 1% /run
/dev/mmcblk0p6 14G 3.6G 9.5G 28% /root-ro
/dev/mmcblk0p8 15G 63M 14G 1% /userdata
overlayroot 15G 63M 14G 1% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 2.0G 12K 2.0G 1% /tmp
/dev/mmcblk0p7 121M 12M 101M 11% /oem
tmpfs 391M 56K 391M 1% /run/user/1000
root@linaro-alip:/#
root@linaro-alip:/#
root@linaro-alip:/#
root@linaro-alip:/# ls /userdata/
bt_pcba_test lost+found rootfs_overlay wifi_chip
docker recovery rootfs_overlay-workdir
root@linaro-alip:/#

要想恢复出厂设置,就删除userdata分区所有的东西,并不会影响到根文件分区。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)