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


`overlayroot` 是一种使用 OverlayFS 实现的功能,可将根文件系统挂载为只读,并通过一个临时的写层实现对文件系统的修改。这种方法非常适合嵌入式设备或需要保持系统文件完整性和安全性的场景。下文以 RK3568 平台为例,介绍制作 overlayroot 的详细步骤。

1. 制作精简文件系统ramdisk

1.1 环境准备

  1. 目标系统:确保系统支持 OverlayFS(内核版本 ≥ 3.18)。

  2. 工具和依赖:

  • 一个支持 OverlayFS 的 Linux 内核。

  • `busybox` 或其他必要的系统工具。

1.2 OverlayFS 的基本原理

OverlayFS 将文件系统分为以下两层:

  • Lowerdir:只读的底层文件系统,通常是现有的根文件系统。

  • Upperdir:可写的顶层,存储所有的临时更改。

  • Workdir:OverlayFS 的工作目录,用于支持文件操作。

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:用于临时存储文件。

将 busybox 和相关依赖文件复制到适当的目录

1.3.2 配置挂载脚本

在ramdisk 的脚本中配置相关的挂载和优化

root_rw=/userdata   #读写挂载点

root_ro=/root-ro   #只读文件系统挂载点

ROOTMNT=${rootmnt} # use global name to indicate created outside this

OVERLAYROOT_DEBUG=0

#优化userdata分区自动修复

e2fsck -y /dev/disk/by-partlabel/userdata

tune2fs -O has_journal /dev/disk/by-partlabel/userdata

2. ramdisk.img 镜像打包和解包制作

2.1 打包脚本

创建脚本 pack_ramdisk.sh,将 RAMDisk 内容打包为 ramdisk.img:

#!/bin/bash
cd ramdisk_contents
find .| cpio -o -H newc >../ramdisk.cpio
gzip ../ramdisk.cpio
mv ../ramdisk.cpio.gz   ../ramdisk.img

2.2 解包脚本

创建脚本 unpack_ramdisk.sh,将 ramdisk.img 解包到工作目录:

#!/bin/bash
mkdir ramdisk_contents
cd ramdisk_contents
gunzip -c ../ramdisk.img > ramdisk.cpio
cpio -idv < ramdisk.cpio
rm ramdisk.cpio

通过上面打包解包脚本可以直接修改已经制作好的ramdisk.img镜像

3. 打包到boot.img

3.1 配置项目文件

在项目 defconfig 文件中,添加以下内容:

RK_USE_FIT_IMG=y
RK_BOOT_FIT_ITS="bootramdisk.its"
RK_RAMDISK_IMG="ramdisk.img"

在 rk356x_bsp/device/rockchip/common/scripts/mk-kernel.sh 文件中添加打包逻辑:

                          if[-n "$RK_BOOT_FIT_ITS"]; then
                                   if[-z "$RK_ROOTFS_INITRD"]; then
                                            run_command \
                                                     "$SCRIPTS_DIR/mk-fitimage.sh" \
                                                     "build-$VANXOAK_CUSTOMER_NAME/kernel/$RK_BOOT_IMG" \
                                                     "$RK_BOOT_FIT_ITS" \

                                                    "build-$VANXOAK_CUSTOMER_NAME/$RK_KERNEL_IMG" \

                                                     "build-$VANXOAK_CUSTOMER_NAME/kernel/$RK_RAMDISK_IMG"

                                   fi

                          fi

4. Kernel 配置与设备树修改

4.1 设备树配置修改

修改设备树文件 chosen 节点,添加 overlayroot 参数:

    chosen: chosen {

                  //bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait";

                  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";



         };

4.2 修改内核配置

确保内核启用了 OverlayFS:

CONFIG_OVERLAY_FS=y
  1. 测试效果与优化

将更新后的 boot.img 刷写到开发板,重启后执行:

df -h

输出类似以下内容:

root@hd-rk3568:~# df -h

文件系统        容量   已用   可用已用% 挂载点

udev            963M   8.0K   963M    1%/dev

tmpfs           196M   1.3M   195M    1%/run

/dev/mmcblk0p6   3.2G   3.1G     0   100%/root-ro

/dev/mmcblk0p8   23G   590M   23G    3%/userdata

overlayroot      23G   590M   23G    3%/

添加完上面内容后,更新boot.img到开发板,执行df -h命令可以看到rootfs分区挂载为/root-ro变为只读分区,userdata分区挂载为overlayroot保存文件系统修改差异部分。若要重置系统状态,只需清空userdata内容即可。

6. 总结

通过以上步骤,您可以成功为 RK3568 平台配置 overlayroot。这种设置使得系统文件更加安全,同时提供灵活的更新和重置能力,非常适合嵌入式场景。

相关推荐
一念永恒@11 分钟前
vue2新增删除
前端·javascript·vue.js
袁庭新13 分钟前
Maven仓库如何搭建?保姆级教程
java·maven
Stimd14 分钟前
【重写SpringFramework】第三章小结(chapter 3-16)
java·后端·spring
潜洋23 分钟前
Spring Boot教程之五十二:CrudRepository 和 JpaRepository 之间的区别
java·大数据·数据库·spring boot
岸边的风29 分钟前
vue中mixin的理解,有那些使用场景?
前端·javascript·vue.js
TENET信条39 分钟前
代码随想录 day55 第十一章 图论part05
java·开发语言·图论
时间sk44 分钟前
CSS——6. 导入样式
前端·css
xiangzhihong81 小时前
Spring Boot整合Minio实现文件上传
java·spring boot·后端
diaya1 小时前
clickhouse 离线包安装(ubuntu)
linux·服务器·网络
玩具工匠1 小时前
字玩FontPlayer开发笔记9 Tauri2打包应用
前端·笔记