浅谈linux启动的那些事(initrd.img)


    本文记录下linux系统的启动过程,分析下每一步都做了什么。


一、linux系统的启动过程

  1.加载BIOS,上电自检。因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性

     等。通过BIOS的设置,计算机就知道去读取哪个硬件设备了。

  2.读取MBR,即主引导记录。(这里有几个MBR中概念:DPT:分区表,通俗说就是硬盘上记录分区信息的表。PBR:硬盘分区

     引导记录,就是具体到某个分区时,上边记录着这个分区的一些信息,详细了解可度娘。)它的大小是512字节,里面存放了预

     启动信息、分区表等信息。系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。其实被复制

     到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了。

  3.Boot LoaderBoot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建

     立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。Boot Loader

     有若干种,其中Grub、Lilo和spfdisk是常见的Loader。要了解GRUB的,可自行查阅资料

  4.Boot Loader加载内核,加载initrd。到此,这是本文要着重说明的地方。


二、什么是initrd

  1.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分为两种,2.4内核及以前的版本中的initrd.img的文件需要先用zip方式解压得到 initrd文件。这里获得到的initrd文件已经是

   个标准的image文件了(这个文件我们称为image-initrd),在linux下需要进行挂载,然后可以直接访问。2.5内核及其以后的版本

    中的initrd.img文件(这里称为cpio-initrd), initrd.img 是个gz压缩文件,initrd.img改名为initrd.gz能用windows下的winrar或linux

    下的gunzip解压,解压后会得到一个initrd文件。这个文件就是cpio格式的文件,只能在linux下用cpio命令解压,执行cpio -i < initrd

 

   2.initrd具体干了什么。

      这两种格式的initrd不只是打包方式不同,内部文件也有不同。下面介绍下2种文件的区别。

 
   image-initrd

   (1) boot loader(一般大家常用的是grub,关于它的介绍可以到网上搜索)把 initrd.img 初始化成一个设备 /dev/intrd。接着boot

        loader 把内核以及/dev/initrd的内容加载到内存。

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

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

   (4) 如果 /dev/ram0 被指定为真正的根文件系统,那么内核不会执行(5)、(6)、(7)的操作,因为这下操作是为了帮内核加载最终

        的根文件系统做的工作。

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

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

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

        被卸载。

   (8) 在真正的根文件系统上进行正常启动过程 ,执行 /sbin/init。

   linux2.4内核的 initrd 的执行是作为内核启动的一个中间阶段,也就是说 initrd 的 /linuxrc执行以后,内核会继续执行初始化代码。

   2.6 内核同时支持 image-initrd 和 cpip-initrd。而且 image-initrd处理流程也是这样的。

   cpio-initrd

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

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

   (3) 将initrd的内容释放到/rootfs中。(rootfs本身也是一个基于内存的文件系统。这样就省掉了ramdisk的挂载、卸载等)

   (4) 执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。也就是其实到了最后一步,

        内核就已经完成了自己所有的工作,直接移交给initrd 的/init。   


    下图为两种模式的 比较

   

    

    本文主要记录了initrd到底做了什么,比较粗略。

   



  • 18
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值