什么是Initrd

initrd的英文含义是 boot loader initialized RAM disk,就是由boot loader初始化的内存盘。在 linux内核启动前, boot loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。

在 boot loader 配置了 initrd 的情况下,内核启动被分成了两个阶段,第一阶段先执行 initrd文件系统中的"某个文件",完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的 /sbin/init 进程。

这里提到的"某个文件",Linux2.6 内核会同以前版本内核的不同,所以这里暂时使用了"某个文件"这个称呼,后面会详细讲到。

第一阶段启动的目的是为第二阶段的启动扫清一切障碍,最主要的是加载根文件系统存储介质的驱动模块。为了在内核启动之后能够判断哪些硬件驱动需要加载,哪些不需要,文件系统有没有问题等,最终使得根分区能顺利加载。我们知道根文件系统可以存储在包括IDE、SCSI、USB在内的多种介质上,如果将这些设备的驱动都编译进内核,可以想象内核会多么庞大、臃肿。


Initrd的用途

1.linux 发行版的必备部件

linux 发行版必须适应各种不同的硬件架构,将所有的驱动编译进内核是不现实的,initrd技术是解决该问题的关键技术,Linux发行版在内核中只编译了基本的硬件驱动,在安装过程中通过检测系统硬件,生成包含安装系统硬件驱动的initrd,无非是一种即可行又灵活的解决方案。

2.livecd 的必备部件

同linux发行版相比livecd可能会面对更加复杂的硬件环境,所以也必须使用initrd。

3.制作 Linux usb 启动盘必须使用 initrd

usb 设备是启动比较慢的设备,从驱动加载到设备真正可用大概需要几秒钟时间。如果将usb驱动编译进内核,内核通常不能成功访问usb设备中的文件系统。因为在内核访问usb设备时,usb设备通常没有初始化完毕。所以常规的做法是,在 initrd 中加载usb驱动,然后休眠几秒中,等待usb设备初始化完毕后再挂载usb设备中的文件系统。

4.在linuxrc脚本中可以很方便地启用个性化bootsplash。


Linux2.4内核对Initrd的处理流程

为了清晰的了解Linux2.6内核initrd机制的变化,在介绍Linux2.6内核initrd之前,先对linux2.4内核的initrd进行一个简单的介绍。Linux2.4内核的initrd的格式是文件系统镜像文件,本文将其称为image-initrd,以区别后面介绍的linux2.6内核的cpio格式的initrd。

linux2.4内核对initrd的处理流程如下:

1.boot loader把内核以及/dev/initrd的内容加载到内存,/dev/initrd是由boot loader初始化的设备,存储着initrd。

2.在内核初始化过程中,内核把/dev/initrd设备的内容解压缩并拷贝到/dev/ram0设备上。

3.内核以可读写的方式把/dev/ram0设备挂载为原始的根文件系统。

4.如果/dev/ram0被指定为真正的根文件系统,那么内核跳至最后一步正常启动。

5.执行initrd上的/linuxrc文件,linuxrc通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动,以及加载根文件系统。

6./linuxrc执行完毕,真正的根文件系统被挂载。

7.如果真正的根文件系统存在/initrd目录,那么/dev/ram0将从/ 移动到/initrd。否则如果/initrd目录不存在,/dev/ram0将被卸载。

8.在真正的根文件系统上进行正常启动过程,执行/sbin/init。linux2.4内核的initrd的执行是作为内核启动的一个中间阶段,也就是说initrd的/linuxrc执行以后,内核会继续执行初始化代码,我们后面会看到这是linux2.4内核同2.6内核的initrd处理流程的一个显著区别。


Linux2.6内核对Initrd的处理流程

linux2.6内核支持两种格式的initrd,一种是前面第3部分介绍的linux2.4内核那种传统格式的文件系统镜像-image-initrd,它的制作方法同Linux2.4内核的initrd一样,其核心文件就是/linuxrc。另外一种格式的initrd 是cpio格式的,这种格式的initrd从 linux2.5 起开始引入,使用cpio工具生成,其核心文件不再是/linuxrc,而是/init,本文将这种initrd称为cpio-initrd。

尽管linux2.6内核对cpio-initrd和image-initrd这两种格式的initrd均支持,但对其处理流程有着显著的区别,下面分别介绍linux2.6内核对这两种initrd的处理流程。

cpio-initrd 的处理流程

1.boot loader把内核以及initrd文件加载到内存的特定位置。

2.内核判断initrd的文件格式,如果是cpio格式。

3.将initrd的内容释放到rootfs中。

4.执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。

image-initrd的处理流程

1.boot loader把内核以及initrd文件加载到内存的特定位置。

2.内核判断initrd的文件格式,如果不是cpio格式,将其作为image-initrd处理。

3.内核将initrd的内容保存在rootfs下的/initrd.image文件中。

4.内核将/initrd.image的内容读入/dev/ram0设备中,也就是读入了一个内存盘中。

5.接着内核以可读写的方式把/dev/ram0设备挂载为原始的根文件系统。

6..如果/dev/ram0被指定为真正的根文件系统,那么内核跳至最后一步正常启动。

7.执行initrd上的/linuxrc文件,linuxrc通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动,以及加载根文件系统。

8./linuxrc执行完毕,常规根文件系统被挂载

9.如果常规根文件系统存在/initrd目录,那么/dev/ram0将从/移动到/initrd。否则如果/initrd目录不存在,/dev/ram0将被卸载。

10.在常规根文件系统上进行正常启动过程 ,执行/sbin/init。

通过上面的流程介绍可知,Linux2.6内核对image-initrd的处理流程同linux2.4内核相比并没有显著的变化,cpio-initrd的处理流程相比于image-initrd的处理流程却有很大的区别,流程非常简单。


Linux发行版内核更新步骤

(1)进入内核目录,执行清理工作:make distclean(对于全新的内核,此步可以省略)。

(2)复制参考配置文件到内核目录下的.config。

(3)使.config生效:make menuconfig。

(4)编译内核镜像:make bzImage。

(5)编译内核模块:make modules。

(6)安装内核模块:make modules_install。

(7)制作initrd:RHEL、fedoral等使用mkinitrd,Ubuntu、Debian等使用mkinitramfs。

(8)复制initrd和内核镜像bzImage到/boot。

(9)修改grub配置文档,添加新的启动项。

(10)然后重启系统,进入grub选择从新的内核启动。


grub配置文件说明

(1)default行,是指grub启动时默认菜单项。0表示第一项,如果是多系统可以修改此选项改变默认光标停留位置。

(2)timeout行,是指在菜单到自动启动系统前的停留时间,单位时间为sec,可以按需分配。

(3)splashimage行,指定启动菜单的背景图标,图片格式应该是xpm。

(4)hiddenmenu行,用于启动时隐藏菜单,除非在 timeout 之前按下 Esc键才能看到菜单。

(5)password行,用于定义进入 GRUB 命令模式的密码。你还可以为每个操作系统都定义一个密码,方法是把 password 命令放在 title行之后。

第25~28行为linux类,其一般格式如下。

1
2
3
4
title (......)
root (hd[0-n],x)
kernel (......)
initrd (......)

title行,指定一个启动操作系统名称。

root行,指定相应内核镜像所在目录/boot所在的磁盘分区,hd[0-n]表示的是第几个硬盘,x则表示的是[第几个分区-1]。

kernel行,指定Linux的内核镜像所在路径。

initrd行,指定Linux的initial ramdisk所在路径

【内核】Linux内核Initrd机制解析,内核更新步骤,grub配置说明的更多相关文章

  1. 【转载】linux2.6内核initrd机制解析

    题记 很久之前就分析过这部分内容,但是那个时候不够深入,姑且知道这么个东西存在,到底怎么用,来龙去脉咋回事就不知道了.前段时间工作上遇到了一个initrd的问题,没办法只能再去研究研究,还好,有点眉目 ...

  2. Linux2.6 内核的 Initrd 机制解析

    文章来自:www.ibm.com/developerworks/cn/linux/l-k26initrd/ 1.什么是 Initrd initrd 的英文含义是 boot loader initial ...

  3. Linux2.6 内核的 Initrd 机制解析(转)

    from: https://www.ibm.com/developerworks/cn/linux/l-k26initrd/ 简介: Linux 的 initrd 技术是一个非常普遍使用的机制,lin ...

  4. Linux内核Ramdisk(initrd)机制【转】

    转自:http://www.cnblogs.com/armlinux/archive/2011/03/30/2396827.html 摘要:对于Linux用户来说,Ramdisk并不陌生,可是为什么需 ...

  5. Linux系统的快速启动机制(内核切换) 【转】

    转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26807463&id=4187846 原文地址:Linux系统的 ...

  6. linux内核崩溃之kdump机制

    kdump相关概念 standard(production) kernel   生产内核    ,是指我们正在使用的kernel. Crash(capture)kernel             捕 ...

  7. LINUX内核CPU负载均衡机制【转】

    转自:http://oenhan.com/cpu-load-balance 还是神奇的进程调度问题引发的,参看Linux进程组调度机制分析,组调度机制是看清楚了,发现在重启过程中,很多内核调用栈阻塞在 ...

  8. Linux内核很吊之 module_init解析 (下)【转】

    转自:https://blog.csdn.net/richard_liujh/article/details/46758073 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...

  9. Linux内核(11) - 子系统的初始化之内核选项解析

    首先感谢国家.其次感谢上大的钟莉颖,让我知道了大学不仅有校花,还有校鸡,而且很多时候这两者其实没什么差别.最后感谢清华女刘静,让我深刻体会到了素质教育的重要性,让我感到有责任写写子系统的初始化. 各个 ...

随机推荐

  1. 一、linux扩展

    1.linux-解压bz2文件提示tar (child): bzip2: Cannot exec: No such file or directory 原因,linux下没有bzip2解压工具 安装b ...

  2. 二、kubernetes

    一.kubernetes(简称k8s) 集群示意图 Kubernetes工作模式server-client,Kubenetes Master提供集中化管理Minions.部署1台Kubernetes ...

  3. Nginx geo模块

    geo 模块默认编译进nginx 可以通过--without-http_geo_module禁用 Syntax: geo [$address] $variable { ... } Default: — ...

  4. YUV格式与RGB格式

    YUV420介绍: YUV420格式是指,每个像素都保留一个Y(亮度)分量,而在水平方向上,不是每行都取U和V分量,而是一行只取U分量,则其接着一行就只取V分量,以此重复(即4:2:0, 4:0:2, ...

  5. pip 解决下载包速度慢的问题

    对于Python开发用户来讲,PIP安装软件包是家常便饭.但国外的源下载速度实在太慢,浪费时间.而且经常出现下载后安装出错问题.所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安装成 ...

  6. 【XSY2472】string KMP 期望DP

    题目大意 给定一个由且仅由字符'H','T'构成的字符串\(S\). ​ 给定一个最初为空的字符串\(T\) ,每次随机地在\(T\)的末尾添加'H'或者'T'. 问当\(S\)为\(T\)的后缀时, ...

  7. MySQL中 如何查询表名中包含某字段的表

    查询tablename 数据库中 以"_copy" 结尾的表 select table_name from information_schema.tables where tabl ...

  8. SCOI2016幸运数字(树剖/倍增/点分治+线性基)

    题目链接 loj luogu 题意 求树上路径最大点权异或和 自然想到(维护树上路径)+ (维护最大异或和) 那么有三种方法可以选择 1.树剖+线性基 2.倍增+线性基 3.点分治+线性基 至于线性基 ...

  9. 洛谷P1829 [国家集训队]Crash的数字表格

    题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时整除a和b的最小正整数.例如,LCM(6, ...

  10. [CERC2017]Intrinsic Interval(神仙+线段树)

    题目大意:给一个1-n的排列,有一堆询问区间,定义一个好的区间为它的值域区间长度等于它的区间长度,求包这个询问区间的最小好的区间. 题解 做法太神了,根本想不到. %%%i207m. 结论:当一个区间 ...