深入解析 Linux initramfs:从基础到高级应用

news2024/11/12 17:18:22

深入解析 Linux initramfs:从基础到高级应用

1. 引言

1.1 简介

initramfs(初始化 RAM 文件系统)是 Linux 启动过程中一个临时的文件系统。在内核启动时,initramfs 被加载并解压至内存中,用于执行必要的驱动程序和初始化脚本,以便能够访问并挂载最终的根文件系统。initramfsinitrd(初始化 RAM 磁盘)的继承者,提供了更灵活和高效的方式来处理复杂的启动过程。

1.2 本文的读者

本文将详细介绍 initramfs 的定义、结构、工作原理以及如何创建和定制 initramfs,适合Linux开发者、运维工程师和内核研究人员阅读,旨在提供实用的技术细节和操作指南。

2. Linux 启动过程回顾

2.1 启动阶段简述

Linux 启动过程可以分为以下几个阶段:

  1. BIOS/UEFI:硬件自检和初始化。
  2. Bootloader:加载内核和 initramfs
  3. 内核初始化:内核加载并初始化硬件。
  4. initramfs 加载:内核将 initramfs 解压至内存,并将其作为临时根文件系统。
  5. initramfs 内的初始化进程启动:在 initramfs 中,内核会执行 /init 脚本,以完成必要的初始化任务。
  6. 切换到真实根文件系统initramfs 执行完初始化任务后,通过 pivot_rootswitch_root 切换到最终的根文件系统,并将控制权移交给真实的根文件系统上的 init 进程。

2.2 initramfs 的作用

initramfs 在启动过程中充当一个临时的根文件系统,它包含必要的工具和驱动程序,用于在真正的根文件系统挂载之前完成初始化任务。initramfs 的存在使得 Linux 能够支持更复杂的启动场景,如使用 LVM、RAID、加密分区和网络文件系统等。

3. initramfs的结构解析

3.1 典型目录结构及用途

initramfs 是一个临时根文件系统,包含一组基础工具和配置文件,用于引导 Linux 系统的初始化过程。典型的 initramfs 目录结构包括以下几个主要目录及其用途:

  • /bin/:包含常用的可执行文件,如 sh(启动时的基础 shell)、mount(用于挂载文件系统)、umount(用于卸载文件系统)等。这些工具在初始化过程中执行基本命令,是启动必不可少的。

  • /dev/:包含设备文件,用于访问硬件设备。典型设备包括 /dev/null/dev/console/dev/sda1 等,允许在启动过程中直接与硬件交互。

  • /etc/:包含启动时所需的配置文件,如 /etc/fstab(定义文件系统挂载信息)等。这些文件提供挂载点和其他初始化参数。

  • /lib/:包含共享库文件,为 initramfs 中的可执行文件提供支持。例如,libc.so 是大多数程序所依赖的 C 标准库。

  • /sbin/:包含系统管理工具和文件系统切换工具,如 pivot_rootswitch_root,用于在启动后期切换到最终的根文件系统。

  • /proc/:虚拟文件系统的挂载点,通过 mount -t proc proc /proc 挂载,提供内核信息和进程状态。这是一个在内存中的虚拟文件系统。

  • /sys/:另一个虚拟文件系统的挂载点,通过 mount -t sysfs sys /sys 挂载,提供系统和设备信息,呈现设备的层次结构状态。

  • /initinitramfs主启动脚本。在启动过程中,内核会执行该脚本,它负责整个 initramfs 环境的初始化操作,例如加载驱动程序、挂载文件系统等。最终,通过 pivot_rootswitch_root 将控制权交给真正的根文件系统上的 init 进程。

3.2 initramfs与实际根文件系统的关系

initramfs 是启动过程中加载的临时根文件系统,用于执行一些初始化任务,例如检测和加载必要的驱动程序、挂载设备和配置网络等。在完成初始化任务并确保最终的根文件系统可用后,initramfs 会通过 pivot_root 或 switch_root 交出控制权,切换到真正的根文件系统。切换后,initramfs 通常会被释放或卸载,由真正的根文件系统上的 init 进程继续启动后续的系统服务和应用程序。

4. init文件详解

4.1 init脚本的启动流程与主要任务

init脚本是initramfs的核心 负责完成系统引导阶段的所有初始化任务,确保系统能够顺利启动到根文件系统。init脚本的典型启动流程和主要任务如下:

  1. 设备节点创建:在/dev下创建关键设备节点(例如/dev/sda1),为后续的文件系统操作提供访问入口。

  2. 文件系统挂载:挂载必要的虚拟文件系统(如/proc/sys/dev),为启动过程中的进程提供访问接口。

  3. 驱动加载:加载启动所需的驱动程序,特别是存储和网络驱动,以确保能够识别和访问系统硬件。

  4. 根文件系统挂载:挂载最终的根文件系统(如从加密分区或逻辑卷加载),并切换到该文件系统,以便继续系统的完整启动流程。

  5. 启动脚本和服务:执行必要的启动脚本进行配置(如网络设置、解密等)并启动关键系统服务(如日志服务、网络服务等),保证系统环境的正常运行。

  6. 错误处理和故障恢复:在启动过程中,若遇到错误,init脚本会进行必要的故障处理和恢复尝试,确保系统可以在一定程度上自动修复,提升启动的鲁棒性。

4.2 关键的init操作与代码示例

以下是一个简单的init脚本示例,展示了如何挂载根文件系统并切换控制权:

#!/bin/sh

# 创建必要的目录
mkdir -p /proc /sys /dev /mnt/root

# 挂载必要的文件系统
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev

# 加载必要的驱动程序
modprobe ext4

# 挂载根文件系统
mount /dev/sda1 /mnt/root

# 切换到真正的根文件系统
exec switch_root /mnt/root /sbin/init

4.3 init的错误处理和故障恢复流程

  • 错误处理:在每个关键步骤后检查返回值,如果失败则记录错误信息并进行适当的处理。
  • 故障恢复:如果某些步骤出错, 则initramfs会提供一个交互式shell,允许用户手动干预和修复问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2237211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue2,vue3,uniapp,小程序实现前端url生成二维码

最近遇到一个项目,api返回url地址,前端通过地址生成二维码。 话不多说直接上代码,亲测有效,希望能帮助大家,同时如果有更好的方法希望大家能够分享 1、第一步,在项目的utils文件夹下面创建一个weapp-qrco…

openlayers实现图层裁剪,只展示关心区域,抹掉无关区域,“抠”地图

先给大家看一下效果: 很久没有用ol了,今天突发奇想,想完成一下在ol中如何实现图层裁剪,抹掉消除非关心区域的地图的操作。过去写了有关于遮罩和掩膜的教程,现在看来好像有点低级,不足以满足需求,于是我们重新来做一下。 首先要知道ol官方是支持canvas参数传递的,就是说…

SpringBoot框架:共享汽车管理的创新工具

5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 共享汽车管理系统的系统管理员可以管理用户,可以对用户信息修改删除以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.1.2 投放地区管理 系统管理员可以对投放地区信息进行添加&#…

初学者指南:用例图——开启您的软件工程之旅

目录 背景: 基本组成: 关联(Assciation): 包含(Include): 扩展(Extend): 泛化(Inheritance): 完整银行…

MySQL —— Innodb 索引数据结构

文章目录 不用平衡二叉树或红黑树作为索引B树适合作为索引比B树更适合作为索引的结构——B树总结 MySQL 使用 B树索引数据结构(因为默认使用 innodb 存储引擎) B树:有序数组 平衡多叉树;B树:有序数组链表 平衡多叉树…

安信金业:3d黄金跟999足金的区别

黄金饰品,作为一种永恒的象征,一直备受人们的喜爱。随着工艺技术的不断革新,黄金饰品也呈现出多元化的风格。近年来,3D硬金逐渐走入人们的视野,与传统的999足金形成了鲜明的对比。那么,3D硬金和999足金究竟…

Mac如何实现最简单的随时监测实时运行状态的方法

Mac book有着不同于Windows的设计逻辑与交互设计,使得Mac book有着非常棒的使用体验,但是在Mac电脑的使用时间过长时,电脑也会出现响应速度变慢或应用程序崩溃的情况,当发生的时候却不知道什么原因导致的,想要查询电脑…

c语言其实很简单----【数组】

TOC 1.输入10个学生成绩&#xff0c;计算及格人数&#xff0c;平均成绩&#xff0c;总成绩。 #include<stdio.h> int main(){float score[10];int i ,cut;float avar0.0,sum0.0;for(i0;i<10;i)scanf("%f",&score[i]);//输入10个学生的成绩cut0;for(i0…

音视频入门基础:H.264专题(22)——通过FFprobe显示H.264裸流每个packet的信息

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

centos7的maven配置

首先进入conf配置文件夹下的setting.xml 要改两个地方 第一&#xff1a;设置镜像源 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>c…

【优选算法 — 滑动窗口】滑动窗口小专题(一)

长度最小的子数组 长度最小的子数组 题目解析&#xff1a; 对于示例一 对于剩下两种示例&#xff1a; 解法一&#xff1a;暴力枚举 把所有的子数组全部枚举出来&#xff0c;并且枚举出的每一个子数组求和判断&#xff0c;返回长度最小的子数组&#xff1b; 时间复杂度 &…

从零创建vue+elementui+sass+three.js项目

初始化&#xff1a; vue init webpack projectnamecd projectnamenpm install支持sass: npm install sass --save-dev npm install sass-loader7.1.0 --save-dev npm install node-sass4.12.0 --save-devbuild/webpack.base.conf.js添加 rules: [...,{test: /\.scss$/,loade…

Golang--网络编程

1、概念 网络编程&#xff1a;把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统&#xff0c;从而使众多的计算机可以方便地互相传递信息、共享数据、软件、数据信息等资源。 客户端&#xff08;Client&#xff09; 客户端是请求服务…

RNN(循环神经网络)详解

1️⃣ RNN介绍 前馈神经网络&#xff08;CNN&#xff0c;全连接网络&#xff09;的流程是前向传播、反向传播和参数更新&#xff0c;存在以下不足&#xff1a; 无法处理时序数据&#xff1a;时序数据长度一般不固定&#xff0c;而前馈神经网络要求输入和输出的维度是固定的&a…

Parallax.js:让智能设备视差效果更智能、更自然

今天给大家分享一款功能非常强大的javascript视觉差特效引擎插件&#xff1a;Parallax.js。 Parallax.js简介 Parallax.js是一个简单的&#xff0c;轻量级的视差引擎。你可以将它作为作为jQuery或Zepto插件来使用&#xff0c;也可以以纯JS的方式来使用。 最-最-最厉害的是它…

【三维重建】Semantic Gaussians:开放词汇的3DGS场景理解

文章目录 摘要一、引言二、主要方法1.3D Gaussian Splatting2.其他方法2.1 Gaussian Grouping&#xff08;ECCV 2024&#xff09;2.2 GARField 3. 2D Versatile 投影4. 3D Semantic Network4. 推理 四、实验1. 实验设置2.定量结果 论文&#xff1a;https://arxiv.org/pdf/2403.…

【功能介绍】信创终端系统上各WPS版本的授权差异

原文链接&#xff1a;【功能介绍】信创终端系统上各WPS版本的授权差异 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于信创终端操作系统上WPS Office各版本&#xff08;不包括政务版、企业版等&#xff09;之间的差异的文章。WPS Office作为国内广泛使用的办公软…

Elmo驱动器上位机软件的详细配置

续接上文,本文讲解Elmo驱动器上位机软件更详细的配置,重点关注,在电机的位置受到约束的情况下,完成驱动器的参数整定过程,以及一些调试方法 一 硬件介绍 本文使用的是另一套设备,假设电机的位置是受到约束的 1 编码器规格书 编码器已知信息是 :读数头是26位的,通讯…

「Mac畅玩鸿蒙与硬件32」UI互动应用篇9 - 番茄钟倒计时应用

本篇将带你实现一个番茄钟倒计时应用&#xff0c;用户可以设置专注时间和休息时间的时长&#xff0c;点击“开始专注”或“开始休息”按钮启动计时&#xff0c;应用会在倒计时结束时进行提醒。番茄钟应用对于管理时间、提升工作效率非常有帮助&#xff0c;并且还会加入猫咪图片…

SparkSql读取数据的方式

一、读取普通文件 方式一&#xff1a;给定读取数据源的类型和地址 spark.read.format("json").load(path) spark.read.format("csv").load(path) spark.read.format("parquet").load(path) 方式二&#xff1a;直接调用对应数据源类型的方法 …