找回密码
 注册
关于网站域名变更的通知
查看: 367|回复: 1
打印 上一主题 下一主题

Linux文件系统的安全保障---Overlayroot!

[复制链接]

该用户从未签到

跳转到指定楼层
#
 楼主| 发表于 2025-1-7 17:04 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

`overlayroot` 是一种使用 OverlayFS 实现的功能,可将根文件系统挂载为只读,并通过一个临时的写层实现对文件系统的修改。这种方法非常适合嵌入式设备或需要保持系统文件完整性和安全性的场景。下文以 RK3568 平台为例,介绍制作 overlayroot 的详细步骤。
1. 制作精简文件系统ramdisk1.1   环境准备
1. 目标系统:确保系统支持 OverlayFS(内核版本 ≥ 3.18)。
2. 工具和依赖:
  • 一个支持 OverlayFS 的 Linux 内核。
  • `busybox` 或其他必要的系统工具。

    9 A8 v2 t. b- t& o5 G% u
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}
  • bin 和 sbin:存放用户工具(例如 busybox)。
  • etc:存放必要的配置文件。
  • proc、sys、dev:为内核文件系统挂载预留的挂载点。
  • tmp:用于临时存储文件。

    # u3 x3 X* K* w7 D) k8 V5 j
将 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=y
5. 测试效果与优化
将更新后的 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+ ^

该用户从未签到

1#
发表于 2025-1-8 16:12 | 只看该作者
开发板有程序包吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-23 14:00 , Processed in 0.171875 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表