当前位置:首页>Linux>嵌入式 Linux 根文件系统(rootfs)核心笔记

嵌入式 Linux 根文件系统(rootfs)核心笔记

  • 2026-10-10 16:17:52
嵌入式 Linux 根文件系统(rootfs)核心笔记

一、rootfs 是什么(一句话)

rootfs 是内核启动后挂载的第一个根目录 /,提供用户空间核心资源(init 进程 / 命令工具 / 库文件 / 配置文件 / 设备节点);无 rootfs 内核找不到 PID1(init),直接 panic 崩溃。

二、为什么必须要 rootfs(核心 3 条)

  1. 核心:能启动 PID=1 的 init 进程(用户空间第一个进程)
  2. 基础:提供命令、动态库、配置文件、设备节点等运行依赖
  3. 桥梁:打通内核与用户空间,实现硬件操作、应用运行

三、能启动的最小 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
  • 脚本型 init 核心要求:
    1. a、首行必须写 #!/bin/sh
    2. b、需赋予可执行权限(chmod +x init)
    3. c、换行符必须为 LF(避免 Windows 下 CRLF 导致执行报错)

四、BusyBox 在 rootfs 的核心作用(极简用法)

  • BusyBox = 嵌入式轻量化 “命令工具箱”,集成 ls/cd/mount/sh 等核心命令
  • 部署方式:交叉编译后执行 make install CONFIG_PREFIX=../rootfs,自动生成命令到 rootfs 对应目录
  • 静态编译 BusyBox:无需拷贝动态库(可独立运行)
  • 动态编译 BusyBox:必须将动态链接器(ldso)+ 依赖库拷贝到 /lib//lib64(路径需严格匹配)

五、内核启动到 rootfs 的最简流程(不混淆)

  1. 内核启动后先加载内置临时根文件系统(ramfs)
    若配置 initramfs,会将其解包到临时根目录
  2. 挂载并切换到真实 rootfs(ext4/squashfs 等格式)
  3. 启动 init 进程(PID1),最终进入 shell 或系统服务

六、两种核心 rootfs 场景(避坑重点)

1)initramfs(cpio.gz 格式)

  • 入口文件:通常为 /init
  • 适用场景:早期调试、系统救援、过渡型根文件系统

2)ext4 真实 rootfs

  • 适用场景:量产设备
  • 启动逻辑:默认走内核内置的 init 路径搜索;需强制用 /init 则添加 cmdline 参数 init=/init

七、终极避坑口诀(直接背)

  1. init 路径要对;脚本首行 #!/bin/sh、赋可执行权限、LF 换行
  2. /dev/console
    //dev/null 必加(或尽早挂载 devtmpfs)
  3. 静态 BusyBox 省库;动态版必带 /lib//lib64 + 动态链接器
  4. cmdline 匹配场景(root=/、rootwait、console=/,必要时 init=)

总结

  1. 最小可启动 rootfs 的核心是「目录 + 设备节点 + init 进程」三件套,缺一则启动失败;
  2. BusyBox 是嵌入式 rootfs 的核心工具集,静态编译比动态编译更易避库依赖坑;
  3. initramfs 和 ext4 rootfs 的 init 入口路径有差异,需配合 cmdline 参数精准匹配。

最新文章

随机文章