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


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

103.png

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 thisOVERLAYROOT_DEBUG=0#优化userdata分区自动修复e2fsck -y /dev/disk/by-partlabel/userdatatune2fs -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"]; thenif[-z "$RK_ROOTFS_INITRD"]; thenrun_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"fifi

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

5. 测试效果与优化

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

df -h

输出类似以下内容:

root@hd-rk3568:~# df -h文件系统        容量   已用   可用已用% 挂载点udev            963M   8.0K   963M    1%/devtmpfs           196M   1.3M   195M    1%/run/dev/mmcblk0p6   3.2G   3.1G     0   100%/root-ro/dev/mmcblk0p8   23G   590M   23G    3%/userdataoverlayroot      23G   590M   23G    3%/

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

6. 总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DEVIN AI==初步使用

注册 官网 Devin (the Developer) 开启一个对话session 体验第一个官方DEMO 工作内容是爬取两个网页&#xff0c;对比他们的注册流程&#xff0c;然后生成一个网页展示对比的结果 左边是对话&#xff0c;可以描述你的需求&#xff0c;右边是DEVIN根据你的要求做的一些事情&…

【Rust自学】11.3. 自定义错误信息

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.3.1. 添加错误信息 在 11.2. 断言(Assert) 中我们学习了assert!、assert_eq!和assert_ne!这三个宏&#xff0c;而这篇文章讲的就是它…

git - 用SSH方式迁出远端git库

文章目录 git - 用SSH方式迁出远端git库概述笔记以gitee为例产生RSA密钥对 备注END git - 用SSH方式迁出远端git库 概述 最近一段时间&#xff0c;在网络没问题的情况下&#xff0c;用git方式直接迁出git库总是会失败。 失败都是在远端, 显示RPC错误。 但是git服务器端是没问…

Linux第一个系统程序---进度条

进度条---命令行版本 回车换行 其实本质上回车和换行是不同概念&#xff0c;我们用一张图来简单的理解一下&#xff1a; 在计算机语言当中&#xff1a; 换行符&#xff1a;\n 回车符&#xff1a;\r \r\n&#xff1a;回车换行 这时候有人可能会有疑问&#xff1a;我在学习C…

智慧城市应急指挥中心系统平台建设方案

建设背景与目标 智慧城市应急指挥中心系统平台的建设&#xff0c;源于对城市管理精细化、智能化的迫切需求。平台旨在通过整合各方资源&#xff0c;实现应急事件的快速响应与高效处置&#xff0c;提升城市安全管理水平。 前端设计与信息采集 前端设计注重立体化、全方位信息…

011:利用大津算法完成图片分割

本文为合集收录&#xff0c;欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 上一篇文章介绍了大津算法可以完成图片的前景和背景分割。 总的来说&#xff0c;大津算法的核心思想就两个&#xff1a; 数学上&#xff0c;通过确定一个像素阈值&#xf…

一键部署Netdata系统无需公网IP轻松实现本地服务器的可视化监控

文章目录 前言1.关于Netdata2.本地部署Netdata3.使用Netdata4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Netdata公网地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。…

21_Spring Boot缓存注解介绍

前面我们通过使用@EnableCaching、@Cacheable注解实现了Spring Boot默认的基于注解的缓存管理,除此之外,还有更多的缓存注解以及注解属性可以配置优化缓存管理。下面我们针对Spring Boot中的缓存注解及相关属性进行详细讲解。 1.@EnableCaching注解 @EnableCaching是由Spri…

【Artificial Intelligence篇】AI 入侵家庭:解锁智能生活的魔法密码,开启居家梦幻新体验

家庭智能化的时代已经到来&#xff0c;准备好了嘛&#xff01;&#xff01;&#xff01; 在当今数字化浪潮汹涌澎湃的时代&#xff0c;人工智能&#xff08;AI&#xff09;宛如一位神秘而强大的魔法师&#xff0c;悄然 “入侵” 了我…

如何用SQL语句来查询表或索引的行存/列存存储方式|OceanBase 用户问题集锦

一、问题背景 自OceanBase 4.3.0版本起&#xff0c;支持了列存引擎&#xff0c;允许表和索引以行存、纯列存或行列冗余的形式创建&#xff0c;且这些存储方式可以自由组合。除了使用 show create table命令来查看表和索引的存储类型外&#xff0c;也有用户询问如何通过SQL语句…

2024机器学习前沿:从大型语言模型到高效计算的技术创新与发展趋势

大型语言模型在多个领域的应用潜力及其推动的技术发展与创新 大型语言模型&#xff08;Large Language Models, LLMs&#xff09;如GPT-4、BERT等&#xff0c;凭借其强大的自然语言理解和生成能力&#xff0c;正在多个领域展现出广泛的应用潜力&#xff0c;推动相关技术的快速…

<C++学习> C++ Boost 内存管理教程

C Boost 内存管理教程 Boost 提供了一系列工具来增强 C 的内存管理能力&#xff0c;主要通过智能指针、池分配器和内存池等模块实现。与原始指针和手动内存分配相比&#xff0c;Boost 内存管理工具能够显著提升安全性和性能&#xff0c;同时简化开发。 1. 内存管理的核心工具 …

程序员如何高效学习API

API&#xff08;应用程序编程接口&#xff09;是软件开发中的关键组件&#xff0c;它允许不同的软件应用程序相互通信、交换数据和功能。作为程序员&#xff0c;掌握API的学习和应用是提升开发效率和代码质量的重要途径。本文将详细介绍程序员如何高效学习API&#xff0c;包括基…

如何播放视频文件

文章目录 1. 概念介绍2. 使用方法2.1 实现步骤2.2 具体细节3. 示例代码4. 内容总结我们在上一章回中介绍了"如何获取文件类型"相关的内容,本章回中将介绍如何播放视频.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 播放视频是我们常用的功能,不过Flutter官方…

Type-C单口便携显示器-LDR6021

Type-C单口便携显示器是一种新兴的显示设备&#xff0c;它凭借其便携性、高性能和广泛的应用场景等优势&#xff0c;正在成为市场的新宠。以下是Type-C单口便携显示器的具体运用方式&#xff1a; 一、连接与传输 1. **设备连接**&#xff1a;Type-C单口便携显示器通过Type-C接…

Perl语言的循环实现

Perl语言的循环实现 Perl是一种功能强大的脚本语言&#xff0c;在文本处理、系统管理、网络编程等多个领域都被广泛应用。作为一种高级编程语言&#xff0c;Perl提供了多种控制结构&#xff0c;其中循环结构是其核心组成部分之一。本文将详细介绍Perl中的循环实现&#xff0c;…

软件架构考试基础知识 002:进程的状态与其切换

进程状态转换的说明 在操作系统中&#xff0c;进程的状态表示其当前的执行情况和资源占用情况。进程状态的转换反映了操作系统如何管理和调度进程。以下是进程状态转换的说明&#xff1a; 1. 三态模型&#xff08;Three-state Model&#xff09; 三态模型是最基础的进程状态模…

计算机网络之---MAC协议

MAC协议的作用 在数据链路层中&#xff0c;MAC&#xff08;媒介访问控制&#xff09;协议负责控制设备如何访问共享的通信介质&#xff08;如以太网、无线电波等&#xff09;&#xff0c;确保在多台设备共享同一传输媒介时能够有效地进行数据传输&#xff0c;避免冲突、控制流…

124.【C语言】数据结构之快速排序的小区间优化和非递归的解决方法

目录 1.小区间优化 测试代码 运行结果 2.非递归的解决方法(重要!) 递归产生的问题 一般来说,递归改非递归有两种方法 算法分析 递归产生的二叉树 栈的示意图 先写代码框架 再填写细节部分 1.小区间优化 回顾121.【C语言】数据结构之快速排序(未优化的Hoare排序存在…

如何学习Vue设计模式

如何学习Vue设计模式 Vue 设计模式是 Vue.js 框架中用于解决常见问题的可复用解决方案。这些模式帮助开发者更有效地组织和管理代码&#xff0c;提升代码的可维护性、可扩展性和可读性。以下是一些常见的 Vue 设计模式&#xff1a; 1. 数据存储模式 可组合函数&#xff1a;用…