图文详解Linux根文件系统(2)

发布时间:2026/5/27 10:40:57

图文详解Linux根文件系统(2) 接前一篇文章图文详解Linux根文件系统12. initramfs详解前文已提到initramfs并不是真正的文件系统其本质上是一个cpio归档文件包含了挂载真实根文件系统需要用到的所有文件。具体来说initramfs是压缩如lz4、gzip、zstd等压缩格式了的cpio归档文件。cpioCopy In and Out是一种在Unix和Linux系统中广泛使用的归档工具用于将多个文件和目录打包成一个单独的归档文件同时保留文件的元数据如权限、所有者、时间戳等。cpio支持多种归档格式bin、odc、newc、crc、tar等。initramfs采用的是newc格式如图2所示。initramfs由一条条文件记录构成每条文件记录格式为文件头110字节文件名0-3字节填充文件数据0-3字节填充文件头包含文件的元数据固定大小为110字节其格式见表1为了加深大家对newc格式的理解我们创建一个最小initramfs并打包成newc格式测试脚本如下#!/bin/bash #创建文件树 mkdir bin conf etc lib touch etc/test.txt #创建init脚本 echo #!/bin/sh init #打包为newc格式 find bin conf etc lib init -depth | cpio -o -H newc initramfs.cpio执行测试脚本后将生成一个initramfs.cpio归档文件执行以下命令验证文件清单cpio -t demo.cpio文件清单如下# cpio -t initramfs.cpio bin conf etc/test.txt etc lib init执行hexdump -C initramfs.cpio查看归档文件记录输出结果如下最终cpio中的文件记录将一条条被解析并存储在rootfs文件系统中。3. /init脚本/init脚本是initramfs的核心它将完成以下关键任务挂载/proc、/sys、/dev等虚拟文件系统并创建必要的设备节点。加载访问存储设备和文件系统所需的内核模块。挂载真实根文件系统。将系统根目录切换到真实根文件系统并启动/sbin/init进程1号进程。实际的/init脚本一般都比较复杂为了便于讲解我们只关注根文件系统挂载相关的内容如图3所示内核调用run_init_process(/init)函数将会执行init脚本run_init_process函数主要任务是执行用户空间的第一个进程从而完成从内核态到用户态的切换。真实根文件系统如ext4未挂载之前系统执行文件相关的操作都是在rootfs文件系统中进行。1首先/init脚本会挂载伪文件系统proc、sysfs、devtmpfs等至rootfs。2接着内核会读取块设备并挂载块设备中的真实根文件系统挂载至rootfs挂载点由用户自行定义。3最后将已挂载的伪文件系统移动至真实根文件系统以及执行initramfs中的switch_root命令将运行环境切换至真实根文件系统。switch_root命令的核心功能包括将新根目录设置为系统的根文件系统。执行新根文件系统中的init程序通常是/sbin/init。清理并释放initramfs占用的内存空间。switch_root语法格式如下switch_root [-c /dev/console] NEW_ROOT NEW_INIT [ARGUMENTS_TO_INIT]NEW_ROOT已经挂载好的真正根文件系统挂载点例如 /newroot。NEW_INIT真正根文件系统中的init程序路径通常是/sbin/init软链接指向init或systemd。-c可选重定向新系统的控制台设备。总结真实根文件系统启动流程分为三步1首先挂载rootfs文件系统创建根目录解决文件系统从0到1的问题2接着解析initramfs并将initramfs中的文件保存至rootfs文件系统3最后执行initramfs中的init脚本init脚本将完成真实根文件系统挂载。

相关新闻