在Linux操作系统中,有一项特殊的功能——初始化内存盘INITRD(INITial Ram Disk)技术,而且内核支持压缩的文件系统映像。有了这两项功能,我们可以让Linux系统从小的初始化内存盘启动,并把系统内存的一部分作为根文件系统挂载。

  Ramdisk就是将内存的一部分分配为一个分区并作为硬盘来使用。对于系统运行时不断使用的程序,将它们放在Ramdisk中将加快计算机的操作,如大数据量的网络服务器、无盘工作站等。为了能够使用Ramdisk,我们在编译内核时须将block device中的Ramdisk支持选上,它下面还有两个选项,一个是设定Ramdisk的大小,默认是4096k;另一个是设定默认个数。如果要使用initrd,还得选上的支持。它既可以直接编译进内核,也可以编译成模块,在需要的时候加载。我们由于在启动时就用它,所以必须将它直接编译进内核。

什么是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.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的处理流程却有很大的区别,流程非常简单。

nitial RAM disk

Linux初始RAM磁盘(initrd)是在系统引导过程中挂载的一个临时根文件系统,用来支持两阶段的引导过程。initrd文件中包含了各种可执行程序和驱动程序,它们可以用来挂载实际的根文件系统,然后再将这个 initrd RAM磁盘卸载,并释放内存。在很多嵌入式Linux系统中,initrd 就是最终的根文件系统。本文将探索 Linux 2.6 的初始 RAM磁盘,包括如何创建以及如何在Linux内核中使用。

什么是初始 RAM 磁盘

初始RAM磁盘(initrd)是在实际根文件系统可用之前挂载到系统中的一个初始根文件系统。initrd与内核绑定在一起,并作为内核引导过程的一部分进行加载。内核然后会将这个 initrd文件作为其两阶段引导过程的一部分来加载模块,这样才能稍后使用真正的文件系统,并挂载实际的根文件系统。
initrd 中包含了实现这个目标所需要的目录和可执行程序的最小集合,例如将内核模块加载到内核中所使用的 insmod 工具。
在桌面或服务器Linux 系统中,initrd 是一个临时的文件系统。其生存周期很短,只会用作到真实文件系统的一个桥梁。在没有存储设备的嵌入式系统中,initrd 是永久的根文件系统。本文将对这两种情况进行探索。

一开始我被ramdisk和initrd这两个东西弄胡涂了,其实ramdisk只是在ram上实现的块设备,initrd可以说是启动过程中用到的一种机制。就是在装载linux之前,bootloader可以把一个比较小的根文件系统的映象装载在内存的某个指定位置,姑且把这段内存称为initrd,然后通过传递参数的方式告诉内核initrd的起始地址和大小(也可以把这些参数编译在内核中),在启动阶段就可以暂时的用initrd来mount根文件系统。initrd的最初的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中,这样就在启动过程中可以从initrd所mount的根文件系统中装载需要的模块。这样的一个好处就是在保持kernel不变的情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶段,根文件系统可以重新mount到其他设备上,但是也可以不再重新mount(很多嵌入式系统就是这样)。 initrd的具体实现过程是这样的:bootloader把根文件系统映象装载到内存指定位置,把相关参数传递给内核,内核启动时把initrd中的内容复制到ramdisk中(ram0),把initrd占用的内存释放掉,在ram0上mount根文件系统。从这个过程可以看出,内核需要对同时对ramdisk和initrd的支持。

initrd的最初的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中,这样就在启动过程中可以从initrd所mount的根文件系统中装载需要的模块。这样的一个好处就是在保持kernel不变的情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶段,根文件系统可以重新mount到其他设备上。

标准的答案是:initrd是linux在系统引导过程中使用的一个临时的根文件系统,用来支持两阶段的引导过程。

再白话一点,initrd就是一个带有根文件系统的虚拟RAM盘,里面包含了根目录‘/’,以及其他的目录,比如:bin,dev,proc,sbin,sys等linux启动时必须的目录,以及在bin目录下加入了一下必须的可执行命令。

PC或者服务器linux内核使用这个initrd来挂载真正的根文件系统,然后将此initrd从内存中卸掉,这种情况下initrd其实就是一个过渡使用的东西。 当然也可以不卸载这个initrd,直接将其作为根文件系统使用,这当然是在没有硬盘的情况下了,这种情况多用在没有磁盘的超轻量级的嵌入式系统。 其实现在的大多数嵌入式系统也是有自己的磁盘的,所以,initrd在现在大多数的嵌入式系统中也作过渡使用。

Initrd的引导过程

‘第二阶段引导程序’,常用的是grub将内核解压缩并拷贝到内存中,然后内核接管了CPU开始执行,然后内核调用init()函数,注意,此init函数并不是后来的init进程!!!然后内核调用函数initrd_load()来在内存中加载initrd根文件系统。Initrd_load()函数又调用了一些其他的函数来为RAM磁盘分配空间,并计算CRC等操作。然后对RAM磁盘进行解压,并将其加载到内存中。现在,内存中就有了initrd的映象。

然后内核会调用mount_root()函数来创建真正的跟分区文件系统,然后调用sys_mount()函数来加载真正的根文件系统,然后chdir到这个真正的根文件系统中。

最后,init函数调用run_init_process函数,利用execve来启动init进程,从而进入init的运行过程。

linux 下的 initrd ramdisk相关推荐

  1. linux ramdisk 工具,Linux下用Busy Box制作Ramdisk全过程(转帖+部分完善) - 薛正华的专栏 - CSDN博客.pdf...

    Linux下用BusyBox制作Ramdisk全过程(转帖部分完善)-薛正华的专栏-CSDN博客 Linux下用Busy Box制作Ramdisk全过程(转帖+部分完善) 收藏 /software_z ...

  2. linux下使用ramdisk

    ramdisk是从内存中划出一部分作为一个分区使用,这个分区跟正常的磁盘分区一样,但其读写速度会远高于磁盘,不过存储在其中的数据会在系统断电或者关机后丢失.利用ramdisk的高速和易失特性,可以用r ...

  3. linux下的/dev/shm/ 以及与swap目录的区别

    一./dev/shm/介绍: /dev/shm/是linux下一个非常有用的目录,因为这个目录不在硬盘上,而是在内存里.因此在linux下,就不需要大费周折去建ramdisk,直接使用/dev/shm ...

  4. Vivado工程配置petalinux实现linux下网卡驱动

    0.说明 基于Vivado工程配置petalinux实现linux下控制PL端GPIO 完成对linux网卡的驱动 实验内容: 完成一个vivado工程,导出硬件信息 创建petalinux工程,导入 ...

  5. 虚拟机linux下扩充硬盘的方法

    扩大硬盘的方法有二:     1 新增一个虚拟硬盘     2 扩大原有硬盘 第一: 新增硬盘并将其格式化为lvm格式 第二: 扩大硬盘并利用分区工具,将扩大的部分添加到原有的分区中,再将该分区转为l ...

  6. linux 内核 不用initrd,linux2.4/2.6内核kernel对Initrd的处理流程

    linux2.4内核kernel对 Initrd 的处理流程 为了使读者清晰的了解Linux2.6内核initrd机制的变化,在重点介绍Linux2.6内核initrd之前,先对linux2.4内核的 ...

  7. Linux下的网络远程安装

    Linux下的网络远程安装 1.用RHEL6.5光盘安装第一台服务器 2.在第一台服务器上配置YUM服务器 先创建一个挂载 1 #mount 2 #umount /dev/cdrom 3 #mkdir ...

  8. 用C语言编写一个Linux下的简单shell程序

    这是一个简单的C程序,展示了如何进行系统调用执行logout cd ls pwd pid rm mkdir mv cp等命令,这是一个简单的命令解释程序shell,其源代码如下: #include & ...

  9. linux下的/dev/shm/ 以及与swap目录的区别【转】

    /dev/shm 概念 首先可以看出来/dev/shm是一个设备文件, 可以把/dev/shm看作是系统内存的入口, 可以把它看做是一块物理存储设备,一个tmp filesystem, 你可以通过这个 ...

最新文章

  1. [导入]Asp.net 2.0 实现自定义Email格式有效性验证(示例代码下载)
  2. bp神经网络预测_股指期货价格变动趋势往往反映的是股票价格的走势,因此BP神经网络对股指期货价格的准确预测就是对股票价格的准确预测。...
  3. shutil模块 python_python之模块之shutil模块
  4. C# - winform使用Dictionary的时候,程序一闪而过!
  5. Map 3D 2011 在线帮助真正在线了 :)
  6. 永城职业学院计算机专业分类,计算机专业师资队伍
  7. Cocos2d-x-lua游戏两个场景互相切换MainScene01切换到MainScene02
  8. 计算机考证一级考可以带书吗
  9. java运行html代码,java代码运行html
  10. 海康威视摄像头密码重置方法
  11. 怎样挖掘搜索关键词?
  12. excel取消工作表保护 获取原始密码
  13. 每日AC-小米笔试 风口的猪-中国牛市
  14. HPnbsp;Jetdirectnbsp;打印服务器配置
  15. 紧凑型游戏机械键盘——极度未知HyperX起源60水轴游戏机械键盘
  16. The Sandbox 与美国时装设计师协会(CFDA)达成合作,为 Web3 和时尚搭建桥梁
  17. 行人属性识别的一个调研
  18. STM32F4 FPU浮点运算单元
  19. 莫比乌斯带matlab代码,莫比乌斯带
  20. ssh秘钥远程登录服务器

热门文章

  1. OpenCV与相机的关系
  2. OpenCV之feature2d 模块. 2D特征框架(2)特征描述 使用FLANN进行特征点匹配 使用二维特征点(Features2D)和单映射(Homography)寻找已知物体 平面物体检测
  3. Windows服务程序时钟调用
  4. CUDA系列学习(三)GPU设计与结构QA coding练习
  5. 自然语言处理NLP常用开源/免费工具
  6. 数字图像处理:第十章 离散图象变换
  7. 观点 | 云原生时代来袭 下一代云数据库技术将走向何方?
  8. WPF绘制简单常用的Path
  9. 通过Flask和Redis构造一个动态维护的代理池
  10. 使用Goldengate 实现Oracle for Oracle 单向数据同步