拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Linux系统-根文件系统

基于内核6.10版本讲解。1. 根文件系统从何而来Linux用户接触到的根文件系统只是挂载在根目录“/”下的一个真实的文件系统 我们习惯上把它称为真实根文件系统。内核初始化时会挂载一个rootfs文件系统伪文件系统只存在内存中rootfs是Linux内核启动后第一个挂载的文件系统所以它才是Linux的根文件系统。真实根文件系统启动流程分为三步1挂载rootfs伪文件系统创建 根目录 解决文件系统从0到1的问题2解析initramfs并将initramfs中的文件保存至rootfs文件系统3执行initramfs中的init脚本init脚本将完成真实根文件系统如ext4挂载。2. 根文件系统挂载流程2.1 挂载rootfs伪文件系统rootfs文件系统定义structfile_system_typerootfs_fs_type{.namerootfs,.init_fs_contextrootfs_init_fs_context,.kill_sbkill_litter_super,};rootfs_init_fs_context函数staticintrootfs_init_fs_context(structfs_context*fc){if(IS_ENABLED(CONFIG_TMPFS)is_tmpfs)returnshmem_init_fs_context(fc);returnramfs_init_fs_context(fc);}rootfs实际上是一个tmpfs或ramfs文件系统实例。ramfs和tmpfs都是Linux系统中基于内存的文件系统。它们将数据直接存储在RAM物理内存中因此读写速度极快但数据在系统重启后会丢失。文件系统挂载可以阅读这篇文章从ext4文件系统到Linux文件树2.2 解析initramfs至rootfsinitramfs详解initramfs是Linux启动过程中使用的临时文件系统其本质上是一个cpio归档文件包含了挂载真实根文件系统需要用到的所有文件。initramfs是压缩如lz4、gzip、zstd等压缩格式了的cpio归档文件。cpioCopy In and Out是一种在Unix和Linux系统中广泛使用的归档工具用于将多个文件和目录打包成一个单独的归档文件同时保留文件的元数据如权限、所有者、 时间戳 等cpio中的文件记录将一条条被解析并存储 在rootfs文件系统中。cpio支持多种归档格式bin、odc、newc、crc、tar等。initramfs采用的是newc格式。initramfs由一条条文件记录构成每条文件记录格式为文件头110字节文件名0-3字节填充文件数据0-3字节填充文件头包含文件的元数据固定大小为110字节测试脚本(demo.sh)#!/bin/bash #创建文件树 mkdir bin conf etc lib touch etc/test.txt #创建init脚本 echo#!/bin/shinit #打包为newc格式 find bin conf etc lib init-depth|cpio-o-H newcinitramfs.cpio执行./demo.sh cpio-tinitramfs.cpio #文件清单 hexdump-C initramfs.cpio #查看归档文件记录/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可选重定向新系统的控制台设备。2.3 挂载真实根文件系统initramfs解析完毕后rootfs根目录下会有一个init脚本init脚本将会完成真实文件系统挂载并将系统运行环境也 切换 至真实文件系统。对应的初始化路径为start_kernel() - vfs_caches_init() - rest_init() - kernel_init() - run_init_process(“/init”)。run_init_process函数将会执行init脚本。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门