rootfs 详解与裁剪优化记录
rootfs 详解与裁剪优化记录(以busybox为例)rootfsRoot File System根文件系统是 Linux 内核启动后挂载的第一个文件系统挂载点为/是整个用户空间的运行根基。内核完成硬件初始化后会挂载 rootfs 并执行其中的init进程正式进入用户态。它包含了系统运行必需的初始化程序、命令工具、动态库、配置文件、设备节点等所有核心组件。一、rootfs 核心基础1.1 核心组成init 进程系统第一个用户进程PID1负责系统初始化与服务管理基础命令集shell、文件操作、系统管理等工具如 ls、mount、sh动态链接库libc、libm 等运行时依赖库系统配置/etc目录下的主机名、挂载表、用户权限、启动脚本等设备节点/dev下的硬件访问接口虚拟文件系统挂载点/proc、/sys、/tmp等1.2 常见类型与适用场景类型特点适用场景initramfs/initrd内存文件系统内核启动时加载到 RAM过渡启动、极小系统、ram 运行场景ext4通用读写文件系统稳定性好eMMC、SD 卡等块设备squashfs只读高压缩文件系统体积极小嵌入式固件、只读系统分区ubifs/yaffs2专为 NAND Flash 设计支持磨损均衡嵌入式 Flash 存储NFS rootfs网络挂载开发调试阶段1.3 主流构建方案对比方案上手难度体积控制包管理适用场景BusyBox 手动构建中等极致裁剪无原理学习、极小系统、深度定制Buildroot简单优秀有限嵌入式中小项目、快速量产Yocto/Poky困难优秀完整工业级项目、复杂系统定制Debootstrap简单一般aptDebian/Ubuntu 衍生系统二、从零构建最小 rootfsBusyBox 分步实操本步骤以 ARM 架构交叉编译为例x86_64 平台可直接使用本地 gcc流程完全一致。2.1 准备环境与源码安装基础依赖sudoaptinstallbuild-essential gcc-arm-linux-gnueabihfbzip2xz-utils squashfs-tools下载并解压 BusyBox 源码wgethttps://busybox.net/downloads/busybox-1.36.1.tar.bz2tarxf busybox-1.36.1.tar.bz2cdbusybox-1.36.12.2 编译 BusyBox推荐优先使用静态编译减少动态库依赖问题追求极致体积可选动态编译。方式一静态编译推荐新手进入配置界面makeARCHarmCROSS_COMPILEarm-linux-gnueabihf- menuconfig核心配置Settings - Build static binary (no shared libs)勾选Settings - Cross compiler prefix填写工具链前缀arm-linux-gnueabihf-可选裁剪在Applets分类中关闭不需要的命令编译安装makeARCHarmCROSS_COMPILEarm-linux-gnueabihf-install编译完成后产物会生成在_install目录中。方式二动态编译体积更小步骤与静态一致仅不勾选「Build static binary」后续需补充依赖库。2.3 搭建根目录结构创建 rootfs 工作目录并复制 BusyBox 产物mkdir-p~/minirootfscp-r_install/* ~/minirootfs/cd~/minirootfs补充 FHS 标准必要目录mkdir-petc/init.d dev proc sys tmp var/log var/run root home lib usr/lib2.4 配置核心系统文件/etc目录的配置是系统正常启动的关键逐个创建以下文件/etc/inittabinit 进程配置::sysinit:/etc/init.d/rcS ::askfirst:-/bin/sh ::restart:/sbin/init ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r/etc/init.d/rcS系统初始化脚本#!/bin/shmount-tproc proc /procmount-tsysfs sysfs /sysmount-tdevtmpfs devtmpfs /devhostname-F/etc/hostnamemount-a添加执行权限chmodx etc/init.d/rcS/etc/fstab文件系统挂载表proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 devtmpfs /dev devtmpfs defaults 0 0 tmpfs /tmp tmpfs defaults 0 0/etc/hostnameminirootfs/etc/passwd用户配置root:x:0:0:root:/root:/bin/sh/etc/group用户组配置root:x:0:2.5 补齐动态库依赖仅动态编译需要静态编译可跳过此步。查看 BusyBox 的库依赖arm-linux-gnueabihf-ldd bin/busybox将依赖的库文件复制到 rootfs 的lib目录例如cp/usr/arm-linux-gnueabihf/lib/ld-linux-armhf.so.3 lib/cp/usr/arm-linux-gnueabihf/lib/libc.so.6 lib/cp/usr/arm-linux-gnueabihf/lib/libm.so.6 lib/2.6 打包生成镜像根据使用场景选择对应格式场景1制作 initramfs 镜像内核启动用find.|cpio-o-Hnewc|gzip-9../rootfs.cpio.gz场景2制作 squashfs 只读压缩镜像量产推荐mksquashfs ~/minirootfs rootfs.squashfs-compxz-b128K场景3制作 ext4 读写镜像ddif/dev/zeroofrootfs.ext4bs1Mcount128mkfs.ext4 rootfs.ext4mkdir-p/mnt/rootfsmountrootfs.ext4 /mnt/rootfscp-r~/minirootfs/* /mnt/rootfs/umount/mnt/rootfs三、rootfs 裁剪核心步骤逐层瘦身裁剪遵循「先功能模块 → 再二进制库 → 再文件系统 → 最后启动流程」的优先级从大体积项入手收益最高。3.1 第一层功能模块裁剪体积减少 50%核心原则只保留系统必需功能移除所有非必要组件。BusyBox 命令集深度裁剪BusyBox 默认包含上百个命令绝大多数场景无需使用。进入make menuconfig按需关闭无网络需求关闭Networking Utilities全部分类ping、ifconfig、wget 等无文件高级操作关闭 diff、patch、cpio、tar 等无进程高级管理关闭 top、strace、ps 高级选项无模块加载需求关闭Linux Module Utilities无打印、多媒体、蓝牙相关功能全部关闭极致裁剪后仅保留 init、sh、mount、ls、cp、rm 等核心命令静态编译体积可压缩到 200KB 以内。移除冗余系统服务日志服务不需要日志可关闭 syslogd、klogd定时任务不需要 cron 则直接移除网络服务sshd、ftp、telnetd 等按需保留登录认证嵌入式场景可去掉 login、passwd直接 root 自动登录C 库选型优化底层体积关键glibc功能最全但体积最大完整动态库约 8MBmusl libc轻量级 POSIX 兼容库完整动态库仅几百 KB静态编译优势极大uClibc-ng面向嵌入式兼容性好体积略大于 musl嵌入式裁剪首选 musl libc同等功能下体积比 glibc 小 70% 以上。3.2 第二层二进制与库文件裁剪体积减少 20%~40%strip 剥离符号信息编译生成的二进制、动态库包含大量调试符号与符号表占用显著体积使用 strip 工具剥离# 剥离二进制所有符号量产必做arm-linux-gnueabihf-strip --strip-all bin/* sbin/* usr/bin/* usr/sbin/*# 剥离库文件冗余符号保留动态链接必需信息arm-linux-gnueabihf-strip --strip-unneeded lib/*.so* usr/lib/*.so*通常 strip 后体积可减少 30% 左右缺点是无法进行源码级调试。清理冗余库文件只保留程序实际依赖的.so库不复制完整 lib 目录删除所有静态库文件.a后缀运行时系统完全不需要移除库的调试版本、冗余版本号软链接编译选项优化所有组件编译时添加大小优化参数CFLAGS 添加-Os编译器优先优化代码大小添加-g0不生成调试符号C 程序添加-fno-exceptions -fno-rtti关闭异常与运行时类型信息3.3 第三层文件系统级裁剪体积减少 50%选择高压缩只读文件系统固件系统分区优先使用squashfs支持多种压缩算法xz压缩率最高比 ext4 小 60%~80%适合体积优先场景zstd压缩解压速度快平衡性能与体积极致压缩命令示例mksquashfs rootfs rootfs.squashfs-compxz -Xdict-size 128K-b128K -no-exports -no-xattrs如需可写配置推荐「squashfs 只读系统 overlayfs 可写叠加」方案兼顾体积与配置持久化。清理非运行必需文件逐项删除无用内容文档手册/usr/share/man、/usr/share/doc、README、LICENSE多语言文件/usr/share/locale仅保留需要的语言头文件/usr/include运行时完全不需要示例程序、测试脚本、图标主题缓存与日志/var/cache、/var/log/*3.4 第四层启动流程精简替换重型 init 系统用 BusyBox init 替代 systemd、SysVinit体积从几 MB 降到几十 KB极简场景甚至可用自定义脚本直接作为 init 进程。精简初始化脚本rcS 脚本只保留必需操作仅挂载核心虚拟文件系统移除不必要的硬件检测、模块加载去掉启动欢迎信息、冗余日志打印不启动多余后台服务简化登录流程嵌入式场景无需登录验证时修改 inittab 将askfirst改为respawn:/bin/sh启动后直接进入 shell。四、rootfs 性能优化启动速度 运行效率4.1 启动速度优化精简 initramfs无需 initramfs 的场景直接从 Flash 挂载 rootfs省去内存拷贝与解压开销并行启动服务无依赖的服务后台并行启动避免串行等待驱动内置化将必需驱动编译进内核builtin减少模块加载开销移除 rootfs 中无用内核模块临时目录内存化/tmp、/var/run、/var/log挂载 tmpfs大幅提升 IO 速度4.2 运行时性能优化挂载参数优化添加noatime、nodiratime禁止更新文件访问时间减少 Flash 写入动态库预链接使用prelink提前完成动态链接重定位缩短程序启动时间日志降频写入减少日志写入频率或先写入 tmpfs 定期落盘降低 Flash 磨损内存优化精简后台进程关闭无用内核功能减少内存占用与碎片五、Buildroot 下的 rootfs 裁剪实战实际项目中 Buildroot 是最主流的构建工具以下是核心优化步骤5.1 基础配置优化执行make menuconfig进入配置Build options勾选strip target binariesgcc optimization level选择Optimize for size (-Os)关闭compile packages with debugging symbolsToolchainC library 选择musl关闭Thread library debugging support关闭Locale support、C support不需要则关闭System configurationInit system 选择BusyBox关闭不必要的登录、getty 功能自定义精简初始化脚本5.2 包与 BusyBox 裁剪Target packages中仅勾选必需软件包默认多余包全部关闭执行make busybox-menuconfig按前文方法深度裁剪 BusyBox 命令集5.3 文件系统镜像优化进入Filesystem images仅保留需要的镜像格式如 squashfssquashfs 压缩算法选择xz关闭 ext4、tar 等其他镜像格式配置完成后执行make即可生成裁剪优化后的固件镜像。六、裁剪验证与问题排查6.1 体积分析方法# 查看总大小du-shrootfs/# 逐层定位大目录du-h--max-depth1rootfs/# 找出最大的10个文件findrootfs/-typef-execdu-h{}\;|sort-rh|head-106.2 功能验证方式QEMU 模拟启动快速验证系统可用性无需硬件NFS 网络挂载开发板通过网络挂载 rootfs方便调试修改逐项功能测试验证保留的命令、服务是否正常工作6.3 常见问题定位Kernel panic: No init found检查/sbin/init是否存在、动态库是否完整、内核是否支持对应文件系统命令执行报错 not found动态库缺失用 ldd 检查依赖或交叉编译架构与目标不一致裁剪后功能异常遵循少量多次原则逐步回退裁剪项定位误删的命令或库

相关新闻

一图看懂UE4 Pak文件内部结构:UnrealPakViewer三步完成资源体检

一图看懂UE4 Pak文件内部结构:UnrealPakViewer三步完成资源体检

一图看懂UE4 Pak文件内部结构:UnrealPakViewer三步完成资源体检 【免费下载链接】UnrealPakViewer 查看 UE4 Pak 文件的图形化工具,支持 UE4 pak/ucas 文件 项目地址: https://gitcode.com/gh_mirrors/un/UnrealPakViewer 周五晚上十点&#xff0…

2026/10/7 4:43:01 阅读更多 →
# 一个JSP打天下:47KB万能表单引擎

# 一个JSP打天下:47KB万能表单引擎

一个JSP打天下:47KB万能表单引擎 非科班野生程序员,深耕政务信息化20年,这套自研Java Web框架支撑过省级社保、跨省医保结算等核心民生系统。政务审批系统的核心是工作流,但工作流的前端——表单——比工作流本身更复杂。这篇拆解…

2026/10/7 4:43:05 阅读更多 →
装 Switch 模拟器还要手动折腾一下午?这款模拟器管理工具把时间砍到 10 分钟

装 Switch 模拟器还要手动折腾一下午?这款模拟器管理工具把时间砍到 10 分钟

装 Switch 模拟器还要手动折腾一下午?这款模拟器管理工具把时间砍到 10 分钟 【免费下载链接】ns-emu-tools 一个用于安装/更新 NS 模拟器的工具 项目地址: https://gitcode.com/gh_mirrors/ns/ns-emu-tools 朋友半夜发消息吐槽:模拟器装好了双击…

2026/10/7 4:43:05 阅读更多 →

最新新闻

AnyPS5实战:用开源面板统一管理PS5游戏库与远程串流

AnyPS5实战:用开源面板统一管理PS5游戏库与远程串流

AnyPS5 这个名字听起来像是一台主机,其实它是我折腾的一个本地工具项目。起因很简单:我手里的游戏、账号、主机状态越来越散,数字版躺在不同账号里,光盘版挤在书架上,想远程玩一把还得分清哪台机器、哪个账号、哪次打折…

2026/10/13 5:57:39 阅读更多 →
多AI Provider架构设计:从统一接口到动态路由的接入层重构

多AI Provider架构设计:从统一接口到动态路由的接入层重构

一个多月前,我把 HagiCode 平台的核心接入层从“单 Provider 写死”重构成了“多 AI Provider 架构”。今天把整个过程中的设计取舍、代码落地方案以及踩过的坑整理出来,算是给后端团队和做 AI 应用集成的朋友一份参考。这里说的 AI Provider&#xff0c…

2026/10/13 5:57:39 阅读更多 →
小程序加密实战:CE固定动态密钥与全流程自动化方案

小程序加密实战:CE固定动态密钥与全流程自动化方案

小程序加密这件事,很多团队一开始都低估了。刚接手一个电商小程序项目时,我以为把请求参数签个名、在本地存个AppSecret就够了,结果上线没几天,接口就被别人用脚本刷了一遍。原因不复杂:小程序包里的东西基本是透明的&…

2026/10/13 5:57:39 阅读更多 →
风机叶片开裂智能预警:机器学习方案的数据清洗、特征工程与模型落地

风机叶片开裂智能预警:机器学习方案的数据清洗、特征工程与模型落地

简介:一套面向风电运维与机器学习实践者的风机叶片开裂故障智能预警系统实现方案,系统阐述从多传感器网络部署、数据标准化滤波与质量校验,到共振频移、应变分布等敏感特征提取,再到集成学习与深度神经网络构建异常识别模型&#…

2026/10/13 5:57:39 阅读更多 →
小程序加解密动态密钥管理:从受控调试到自动化验证

小程序加解密动态密钥管理:从受控调试到自动化验证

做小程序加解密这一块,最难受的从来不是AES算法本身怎么写,而是密钥怎么发、怎么存、怎么换,以及出了问题之后怎么把密文层层剥开去定位。之前我处理过一个线上问题:同一套动态密钥在当前会话里加解密完全正常,换一个会…

2026/10/13 5:57:39 阅读更多 →
西门子PLC实战:锂电浆料线程序开发与通讯调试全流程

西门子PLC实战:锂电浆料线程序开发与通讯调试全流程

很多人找我聊西门子PLC程序开发怎么入门,我一般不会直接甩教程,而是先反问一句:你见过新能源浆料线吗?去年我接手了一条锂电正极浆料产线的整套PLC程序开发,从需求梳理到带料调试,前后折腾了小半年。说句实…

2026/10/13 5:56:39 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →