什么是 Initrd 映像?如何在 Linux 中创建 initrd 映像

2024-03-18 08:48
文章标签 linux 创建 映像 initrd

本文主要是介绍什么是 Initrd 映像?如何在 Linux 中创建 initrd 映像,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Linux 系统的引导过程涉及多个阶段。其中包括 BIOS 初始化、读取 MBR、引导加载程序、内核初始化和 init 进程。

initrd(初始 ramdisk)在引导系统中起着非常重要的作用。本教程讨论 initrd ramdisk 以及在需要重新创建它时如何创建它。

GRUB 引导加载程序和 initrd

引导加载程序是在启动过程中运行的第一个软件程序。它负责引导操作系统。Bootloader 将内核加载到内存中,内核挂载根分区,以便启动第一个进程,即 init 进程。让我们看一下引导加载程序为这些任务执行的命令:

root (hd0,0)

kernel /vmlinuz-2.6.18-238.el5 ro root=/dev/VolGroup00/LogVol00

initrd /initrd-2.6.18-238.el5.img

第一个命令“root (hd0,0)”告诉引导加载程序内核映像存在于硬盘 hd0 的第一个分区(即 hd0,0)。这是内核映像的位置。

第二个命令是内核映像本身。在这种情况下,它是“/vmlinuz-2.6.18-238.el5”。传递给该命令的参数是 ro 和 root。ro 指定只读模式,root 告诉根文件系统所在的分区。内核以只读模式挂载这个根分区。

第三个命令是 initrd 的位置。现在要了解 initrd 是什么,让我们看一下内核在挂载根分区时面临的一个问题。

鸡蛋模块问题

我们刚刚看到内核必须以只读模式挂载根分区。但是根文件系统可以位于具有以下一项或多项功能的分区上:

• Logical Volume Management (as in our case).

• Software RAID.

• NFS.

• Encrypted partition.

• SCSI controller support.

内核需要这些设备的模块,因为它们没有编译到内核本身中。因此,内核将在运行时为这些设备加载模块。这些模块存在于“/lib/modules/”目录中。该目录存在于根文件系统本身上,并且尚未安装根分区(这就是全部内容)。那么,内核如何访问用于挂载根分区本身的根分区的模块(不挂载它)?

这里 initrd 来拯救。initrd ramdisk 包含挂载根分区所需的模块。此 initrd 驻留在内核映像所在的同一分区上。因此内核将 initrd 加载到内存中,访问模块并以只读模式挂载根分区。

创建 initrd

当文件系统硬件或软件发生变化时,我们需要重新创建 initrd。initrd 可以使用“mkinitrd”命令创建。initrd 的位置是 /boot 目录。为其创建 initrd 映像的内核版本需要作为参数传递给 mkinitrd 命令。可以使用uname 命令检查当前内核版本。

# uname -r

2.6.18-238.el5

我们可以使用此命令通过命令替换传递所需的参数:

# mkinitrd /boot/initrd-latest.img $(uname -r)

$(uname -r) 将替换命令“uname -r”的输出。

initrd 映像是压缩映像。您可以使用文件命令检查这一点:

# file /boot/initrd-latest.img

/boot/initrd-latest.img: gzip compressed data, from Unix, last modified: Fri Aug 3 10:47:47 2012, max compression

这篇关于什么是 Initrd 映像?如何在 Linux 中创建 initrd 映像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/821821

相关文章

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主