EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
`overlayroot` 是一种使用 OverlayFS 实现的功能,可将根文件系统挂载为只读,并通过一个临时的写层实现对文件系统的修改。这种方法非常适合嵌入式设备或需要保持系统文件完整性和安全性的场景。下文以 RK3568 平台为例,介绍制作 overlayroot 的详细步骤。 1. 制作精简文件系统ramdisk1.1 环境准备1. 目标系统:确保系统支持 OverlayFS(内核版本 ≥ 3.18)。 2. 工具和依赖: 1.2 OverlayFS 的基本原理OverlayFS 将文件系统分为以下两层: Lowerdir:只读的底层文件系统,通常是现有的根文件系统。 Upperdir:可写的顶层,存储所有的临时更改。 Workdir:OverlayFS 的工作目录,用于支持文件操作。
7 P4 u d' [, D* X! l 1.3 制作步骤1.3.1 创建 OverlayFS 配置结构首先创建一个工作目录来组织文件系统结构。 mkdir -p /tmp/ramdisk/{bin,sbin,etc,proc,sys,dev,tmp}将 busybox 和相关依赖文件复制到适当的目录 1.3.2 配置挂载脚本在ramdisk 的脚本中配置相关的挂载和优化 root_rw=/userdata #读写挂载点
6 B8 j, k0 ]7 {) I7 l( w) S! N7 a/ Z1 d
root_ro=/root-ro #只读文件系统挂载点. R0 V8 ]8 ^1 |. n- O2 M
G' x) K h% J+ I8 h' l! F: RROOTMNT=${rootmnt} # use global name to indicate created outside this* y8 p+ g8 L' R6 O4 c& ]
% h) Y7 h" Q. c9 W/ o. WOVERLAYROOT_DEBUG=0
: V9 B3 n( P/ |1 ^8 i
/ |" v" \+ H \3 m) Z5 J* @" N" U#优化userdata分区自动修复
( f* V* y! u( j& i! C4 i7 O' E# ~
- i* E4 d3 g3 He2fsck -y /dev/disk/by-partlabel/userdata
" D4 O' M' X$ s) t4 F2 N$ J! m" { `9 d; ]. S. V# t
tune2fs -O has_journal /dev/disk/by-partlabel/userdata, Q) F8 q$ n/ P/ w" { A
2. ramdisk.img 镜像打包和解包制作2.1 打包脚本创建脚本 pack_ramdisk.sh,将 RAMDisk 内容打包为 ramdisk.img: #!/bin/bash
* {5 W! w( o6 {# b- ^cd ramdisk_contents
2 n! ^; ?, ~% ?. E* nfind .| cpio -o -H newc >../ramdisk.cpio$ b6 N$ [( a, N3 b: a" j" w
gzip ../ramdisk.cpio
' _- I0 _& a5 p3 J" _& r n* Nmv ../ramdisk.cpio.gz ../ramdisk.img1 p2 O2 B' d( O6 e L
2.2 解包脚本创建脚本 unpack_ramdisk.sh,将 ramdisk.img 解包到工作目录: #!/bin/bash3 N9 ~" D3 t$ s _; w3 z
mkdir ramdisk_contents
* l+ K) O" `4 I6 rcd ramdisk_contents/ v0 y- q- D8 p( t
gunzip -c ../ramdisk.img > ramdisk.cpio; j$ @: f4 l/ Y7 X! ^, p7 \6 v; `
cpio -idv < ramdisk.cpio
( V2 p1 O5 B$ t4 K3 T/ R8 ]! ~; zrm ramdisk.cpio通过上面打包解包脚本可以直接修改已经制作好的ramdisk.img镜像 3. 打包到boot.img3.1 配置项目文件在项目 defconfig 文件中,添加以下内容: RK_USE_FIT_IMG=y. }' ^) z! D# ?" R3 }" I
RK_BOOT_FIT_ITS="bootramdisk.its"& ]; [- r) Q( a% J; W9 G& Z0 ]
RK_RAMDISK_IMG="ramdisk.img"在 rk356x_bsp/device/rockchip/common/scripts/mk-kernel.sh 文件中添加打包逻辑: if[-n "$RK_BOOT_FIT_ITS"; then
& Y4 F+ n% M! a5 d$ l7 ^. |6 P9 U3 [ if[-z "$RK_ROOTFS_INITRD"; then
+ I. a0 \# |9 M" h) e run_command \3 E, B# }+ n0 q" `3 a3 [
"$SCRIPTS_DIR/mk-fitimage.sh" \, o6 \/ d) F# {% B: S
"build-$VANXOAK_CUSTOMER_NAME/kernel/$RK_BOOT_IMG" \5 x+ V# j& w: ^: n2 w" U( n: O/ [/ l4 f
"$RK_BOOT_FIT_ITS" \
. d2 H' ^! _" [3 k }* n1 n; o2 P2 N8 n7 T9 H
"build-$VANXOAK_CUSTOMER_NAME/$RK_KERNEL_IMG" \
) S6 ?1 u8 B, p: L y( V: z
% ^8 P, x5 p% g7 H* D, _ "build-$VANXOAK_CUSTOMER_NAME/kernel/$RK_RAMDISK_IMG"* ^* Q' G& M! C
5 M3 T {$ D0 ^( t5 Q' n, v1 s
fi
' m( y: Q& \. c
/ }1 @- ?, W" o' D b fi2 q( A1 z% q: k3 ?- G; H+ F: u5 P
" \2 ~* c+ _4 U. z* |
4. Kernel 配置与设备树修改 4.1 设备树配置修改 修改设备树文件 chosen 节点,添加 overlayroot 参数: chosen: chosen {
+ w# v5 {9 r& G; d' I W5 i2 M" ~) L3 R4 m
//bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait";, F0 R3 N6 Q2 h, v" R
# U$ r" H; m! P$ B7 ] bootargs ="earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTLABEL=rootfs rootfstype=ext4 ro rootwait overlayroot=device:dev=PARTLABEL=userdata,fstype=ext4,mkfs=1 coherent_pool=1m systemd.gpt_auto=0 cgroup_enable=memory swapaccount=1 swIoTlb=0x10000 net.ifnames=0";6 E3 L& v. A0 ?& }5 o7 K; W" v
- H# }/ \% x( o' v1 J: D. v2 t% U5 M7 Y2 z* I. A2 x! G
/ F! F3 D9 L; c9 p% I: O };4.2 修改内核配置 确保内核启用了 OverlayFS: CONFIG_OVERLAY_FS=y5. 测试效果与优化 将更新后的 boot.img 刷写到开发板,重启后执行: df -h输出类似以下内容: root@hd-rk3568:~# df -h
+ ?; L6 e, V! [! @( }' |6 o. Z
x9 s( B+ M, S6 ]文件系统 容量 已用 可用已用% 挂载点
! S' w1 \. w! e2 f# X! q- x
V8 K" q8 d+ y/ O1 @udev 963M 8.0K 963M 1%/dev6 A; I8 D2 H) @/ ^6 c7 k
( ^0 V' [$ E# Q" O6 E
tmpfs 196M 1.3M 195M 1%/run
* X w' F7 X$ I3 r2 R3 e- ?
& G" J! P4 p1 K8 v2 ?+ g/dev/mmcblk0p6 3.2G 3.1G 0 100%/root-ro
; h& M* o: B0 F) ^; J4 ?: ^
. n" }6 c0 s. X$ V/dev/mmcblk0p8 23G 590M 23G 3%/userdata7 }% t' @+ N1 d; N4 O; d' \- @% q
; o4 x8 X8 s- T+ x6 `
overlayroot 23G 590M 23G 3%/添加完上面内容后,更新boot.img到开发板,执行df -h命令可以看到rootfs分区挂载为/root-ro变为只读分区,userdata分区挂载为overlayroot保存文件系统修改差异部分。若要重置系统状态,只需清空userdata内容即可。 3 o. `- t4 x6 ~' o
6. 总结通过以上步骤,您可以成功为 RK3568 平台配置 overlayroot。这种设置使得系统文件更加安全,同时提供灵活的更新和重置能力,非常适合嵌入式场景。
$ |" A4 f/ W. w* x9 d+ ^ |