目录

前言

一、基于rk3588使用OverlayRootfs

1.把ramdisk.img 放在RK SDK的内核根目录下

2.SDK 配置开启RK_ROOTFS_INITRD=y

3.内核配置开启使用OverlayFS

4.修改bootargs 

5.确认编译内核镜像时候加载ramdisk.img到boot.img

6.确认uboot阶段加载ramdisk.img

二、分析ramdisk镜像

三、结果



前言

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的内核根目录下

下载ramdisk镜像

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分区所有的东西,并不会影响到根文件分区。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐