一、rootfs 是什么(一句话)
rootfs 是内核启动后挂载的第一个根目录 /,提供用户空间核心资源(init 进程 / 命令工具 / 库文件 / 配置文件 / 设备节点);无 rootfs 内核找不到 PID1(init),直接 panic 崩溃。
二、为什么必须要 rootfs(核心 3 条)
- 核心:能启动 PID=1 的 init 进程(用户空间第一个进程)
- 基础:提供命令、动态库、配置文件、设备节点等运行依赖
三、能启动的最小 rootfs 必备清单
1)必备目录(最小可启动)
/bin /sbin /dev /proc /sys /etc
推荐补充(提升实用性):/tmp(权限 1777)、/run、/mnt动态程序额外需:/lib(aarch64 架构需补充 /lib64)
2)设备节点(最低底线)
- 必建节点:
/dev/console(字符设备,类型 c,主设备号 5,次设备号 1) - 必建节点:
/dev/null(字符设备,类型 c,主设备号 1,次设备号 3) - 最优方案:内核启用
CONFIG_DEVTMPFS,在 init 脚本中执行 mount -t devtmpfs devtmpfs /dev,无需手工创建大量设备节点
3)必备文件:init(PID1 进程)
- initramfs 场景:入口通常为根目录
/init - ext4 根文件系统场景:内核依次尝试
/sbin/init → /etc/init → /bin/init(均失败则启动崩溃) - 强制指定 init 路径:内核启动参数(cmdline)添加
init=/init - b、需赋予可执行权限(
chmod +x init) - c、换行符必须为 LF(避免 Windows 下 CRLF 导致执行报错)
四、BusyBox 在 rootfs 的核心作用(极简用法)
- BusyBox = 嵌入式轻量化 “命令工具箱”,集成 ls/cd/mount/sh 等核心命令
- 部署方式:交叉编译后执行
make install CONFIG_PREFIX=../rootfs,自动生成命令到 rootfs 对应目录 - 静态编译 BusyBox:无需拷贝动态库(可独立运行)
- 动态编译 BusyBox:必须将动态链接器(ldso)+ 依赖库拷贝到
/lib//lib64(路径需严格匹配)
五、内核启动到 rootfs 的最简流程(不混淆)
- 若配置 initramfs,会将其解包到临时根目录
- 挂载并切换到真实 rootfs(ext4/squashfs 等格式)
- 启动 init 进程(PID1),最终进入 shell 或系统服务
六、两种核心 rootfs 场景(避坑重点)
1)initramfs(cpio.gz 格式)
2)ext4 真实 rootfs
- 启动逻辑:默认走内核内置的 init 路径搜索;需强制用
/init 则添加 cmdline 参数 init=/init
七、终极避坑口诀(直接背)
- init 路径要对;脚本首行
#!/bin/sh、赋可执行权限、LF 换行 /dev/console//dev/null 必加(或尽早挂载 devtmpfs)- 静态 BusyBox 省库;动态版必带
/lib//lib64 + 动态链接器 - cmdline 匹配场景(root=/、rootwait、console=/,必要时 init=)
总结
- 最小可启动 rootfs 的核心是「目录 + 设备节点 + init 进程」三件套,缺一则启动失败;
- BusyBox 是嵌入式 rootfs 的核心工具集,静态编译比动态编译更易避库依赖坑;
- initramfs 和 ext4 rootfs 的 init 入口路径有差异,需配合 cmdline 参数精准匹配。