根文件系统核心原理:内核启动挂载流程与目录结构解析

发布时间:2026/7/22 1:25:02
根文件系统核心原理:内核启动挂载流程与目录结构解析 根文件系统核心原理内核启动挂载流程与目录结构解析你可以把内核想象成一个刚入职的CEO能力很强但啥也干不了——除非有人给他准备好办公室、桌椅、文件柜。这个办公室就是根文件系统Rootfs。一、什么是根文件系统根文件系统英文名Root File System简称Rootfs是 Linux 内核启动后挂载的第一个文件系统。它挂载在/根目录下是整个用户空间的基石。简单来说内核负责管理硬件、调度进程、分配内存根文件系统负责提供程序、库、配置文件、设备节点等用户态资源没有根文件系统内核启动到最后会直接 panic恐慌崩溃打出那句经典报错VFS: Unable to mount root fs on unknown-block(0,0)这句话的意思是内核找不到可以挂载的根文件系统所以只能摆烂了。二、根文件系统的核心组成一个最小可用的根文件系统至少需要包含以下内容组成部分说明示例init 程序内核启动的第一个用户进程PID1/init、/sbin/init基本命令提供Shell和常用操作命令/bin/sh、/bin/ls动态库程序运行时依赖的共享库/lib/libc.so设备节点访问硬件设备的接口文件/dev/console、/dev/null配置文件系统初始化和服务的配置/etc/inittab、/etc/fstab三、内核启动到挂载根文件系统的完整流程这是整篇文章的核心。理解了这个流程你才能真正搞懂内核是怎么找到并使用根文件系统的。3.1 Bootloader 阶段以 U-Boot 为例Bootloader 完成硬件初始化后做三件事加载内核镜像uImage/zImage到内存加载设备树dtb到内存设置启动参数bootargs跳转执行内核# U-Boot 中典型的启动命令setenv bootargsconsolettySAC0,115200 root/dev/mmcblk0p2 rootwait rwsetenv bootcmdfatload mmc 0:1 0x40008000 zImage; fatload mmc 0:1 0x41000000 sun8i-h3-orangepi-pc.dtb; bootz 0x40008000 - 0x41000000boot其中bootargs里的root/dev/mmcblk0p2就是告诉内核你的根文件系统在 SD 卡的第二个分区上。3.2 内核启动阶段内核被加载到内存后依次执行以下步骤┌──────────────────────────────────────────────┐ │ 1. 内核自解压如果是压缩镜像 │ │ 2. 初始化内存管理、调度器、中断系统 │ │ 3. 解析设备树Device Tree │ │ 4. 初始化各子系统网络、USB、MTD等 │ │ 5. 挂载临时根文件系统initramfs/initrd │ │ 6. 挂载真正的根文件系统 │ │ 7. 执行 init 进程PID1 │ └──────────────────────────────────────────────┘3.3 root 参数解析与挂载内核通过解析bootargs中的root参数来确定根文件系统的位置。常见写法参数写法含义root/dev/mmcblk0p2SD/eMMC 的第2个分区root/dev/mtdblock2MTD NAND 的第3个分区root/dev/nfs通过 NFS 网络挂载根文件系统rootubi0:rootfsUBI 卷用于 NAND Flash内核找到设备后还需要知道文件系统类型。可以通过rootfstype显式指定# 指定根文件系统类型为 ext4root/dev/mmcblk0p2rootfstypeext4 rw如果不指定内核会依次尝试 ext4、ext3、ext2 等格式自动探测。3.4 切换到真正的根文件系统如果使用了 initramfs内存根文件系统内核会先挂载它然后在 initramfs 中执行/init脚本。该脚本负责加载必要驱动、找到真正的根设备最终通过switch_root命令完成切换# initramfs 中的 /init 脚本核心逻辑mount-tsysfs sysfs /sysmount-tproc proc /proc# 等待根设备就绪sleep2# 挂载真正的根文件系统mount/dev/mmcblk0p2 /mnt/root# 切换根目录并执行真正的 initexecswitch_root /mnt/root /sbin/init3.5 执行 init 进程根文件系统挂载成功后内核按以下顺序查找 init 程序/sbin/init/etc/init/bin/init/bin/sh找到后以 PID1 启动用户空间的初始化正式开始。在嵌入式系统中init 通常由BusyBox提供对应的配置文件是/etc/inittab。四、FHS 目录标准简介FHSFilesystem Hierarchy Standard文件系统层次标准定义了 Linux 目录结构的标准规范。即使是嵌入式系统也建议遵循该标准方便维护和移植。以下是根文件系统的标准目录结构/ ├── bin/ # 所有用户可用的基本命令 ├── sbin/ # 系统管理命令通常需要root权限 ├── etc/ # 系统配置文件 ├── lib/ # 共享库和内核模块 ├── dev/ # 设备文件 ├── proc/ # proc 虚拟文件系统挂载点 ├── sys/ # sysfs 虚拟文件系统挂载点 ├── tmp/ # 临时文件 ├── var/ # 可变数据日志、缓存等 ├── usr/ # 用户程序和库 │ ├── bin/ │ ├── lib/ │ └── sbin/ ├── home/ # 用户主目录 ├── root/ # root用户主目录 └── mnt/ # 临时挂载点各目录的核心作用对照目录作用嵌入式是否必须/bin基本命令ls, cp, cat等是/sbin系统命令init, reboot等是/etc配置文件是/lib共享库 内核模块是/dev设备节点是/proc内核状态信息是/sys设备树信息是/tmp临时文件可选/var日志、PID文件等可选/usr额外程序可选/home普通用户目录可选/rootroot用户目录可选五、嵌入式系统与桌面发行版的区别桌面 Linux 发行版如 Ubuntu的根文件系统动辄几个 GB而嵌入式系统通常只有几 MB 到几十 MB。两者的关键区别init 系统不同桌面用 systemd嵌入式多用 BusyBox init 或直接自定义脚本目录精简嵌入式通常没有/usr/share/doc、/usr/share/man等文档目录设备节点管理桌面用 udev 动态创建嵌入式常用静态设备节点或 mdev库的链接方式嵌入式常用静态链接或裁剪过的动态库总结根文件系统是内核与用户空间之间的桥梁。理解它的核心原理关键在于搞清楚三件事内核如何找到它root参数、如何挂载它文件系统驱动、如何启动它init进程。掌握了这个流程后续无论是用 BusyBox 手搓最小系统还是用 Buildroot 一键构建都能做到心中有数。