注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

谷搜互联网应用www.iguso.com

谷搜专注企业邮箱十二年

 
 
 

日志

 
 

载入核心侦测硬体与 initrd 的功能  

2014-09-15 10:36:09|  分类: Linux技术文章 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 载入核心侦测硬体与 initrd 的功能

  当我们藉由 boot loader 的管理而开始读取核心档案后,接下来, Linux 就会将核心解压缩到主记忆体当中, 并且利用核心的功能,开始测试与驱动各个周边装置,包括储存装置、CPU、网路卡、音效卡等等。 此时 Linux 核心会以自己的功能重新侦测一次硬体,而不一定会使用 BIOS 侦测到的硬体资讯哦!也就是说,核心此时才开始接管 BIOS 后的工作了。 那么核心档案在哪里啊?一般来说,他会被放置到 /boot 里面,并且取名为 /boot/vmlinuz 才对!

  [root@www ~]# ls --format=single-column -F /boot

  config-2.6.18-92.el5 <==此版本核心被编译时选择的功能与模组设定档

  grub/ <==就是开机管理程式 grub 相关资料目录

  initrd-2.6.18-92.el5.img <==虚拟档案系统档!

  System.map-2.6.18-92.el5 <==核心功能放置到记忆体位址的对应表

  vmlinuz-2.6.18-92.el5 <==就是核心档案啦!最重要者!

  从上表我们也可以知道此版本的 Linux 核心为 2.6.18-92.el5 这个版本!为了硬体开发商与其他核心功能开发者的便利, 因此 Linux 核心是可以透过动态载入核心模组的 (就请想成驱动程式即可),谷搜外贸企业邮箱这些核心模组就放置在 /lib/modules/ 目录内。 由于模组放置到磁碟根目录内 (要记得 /lib 不可以与 / 分别放在不同的 partition !), 因此在开机的过程中核心必须要挂载根目录,这样才能够读取核心模组提供载入驱动程式的功能。 而且为了担心影响到磁碟内的档案系统,因此开机过程中根目录是以唯读的方式来挂载的哦。

  一般来说,非必要的功能且可以编译成为模组的核心功能,目前的 Linux distributions 都会将他编译成为模组。 因此 USB, SATA, SCSI... 等磁碟装置的驱动程式通常都是以模组的方式来存在的。 现在来思考一种情况,假设你的 linux 是安装在 SATA 磁碟上面的,你可以透过 BIOS 的 INT 13 取得 boot loader 与 kernel 档案来开机,然后 kernel 会开始接管系统并且侦测硬体及尝试挂载根目录来取得额外的驱动程式。

  问题是,核心根本不认识 SATA 磁碟,所以需要载入 SATA 磁碟的驱动程式, 否则根本就无法挂载根目录。但是 SATA 的驱动程式在 /lib/modules 内,你根本无法挂载根目录又怎么读取到 /lib/modules/ 内的驱动程式?是吧!非常的两难吧!在这个情况之下,你的 Linux 是无法顺利开机的! 那怎办?没关系,我们可以透过虚拟档案系统来处理这个问题。

  虚拟档案系统 (Initial RAM Disk) 一般使用的档名为 /boot/initrd ,这个档案的特色是,他也能够透过 boot loader 来载入到记忆体中, 然后这个档案会被解压缩并且在记忆体当中模拟成一个根目录, 且此模拟在记忆体当中的档案系统能够提供一支可执行的程式,透过该程式来载入开机过程中所最需要的核心模组, 通常这些模组就是 USB, RAID, LVM, SCSI 等档案系统与磁碟介面的驱动程式啦!等载入完成后, 会帮助核心重新呼叫 /sbin/init 来开始后续的正常开机流程。

  图 1.2.3、 BIOS 与 boot loader 及核心载入流程示意图

  如上图所示,boot loader 可以载入 kernel 与 initrd ,然后在记忆体中让 initrd 解压缩成为根目录, kernel 就能够藉此载入适当的驱动程式,最终释放虚拟档案系统,并挂载实际的根目录档案系统, 美国空间就能够开始后续的正常开机流程。更详细的 initrd 说明,你可以自行使用 man initrd 去查阅看看。 底下让我们来了解一下 CentOS 5.x 的 initrd 档案内容有什么吧!

  # 1. 先将 /boot/initrd 复制到 /tmp/initrd 目录中,等待解压缩:

  [root@www ~]# mkdir /tmp/initrd

  [root@www ~]# cp /boot/initrd-2.6.18-92.el5.img /tmp/initrd/

  [root@www ~]# cd /tmp/initrd

  [root@www initrd]# file initrd-2.6.18-92.el5.img

  initrd-2.6.18-92.el5.img: gzip compressed data, ...

  # 原来是 gzip 的压缩档!因为是 gzip ,所以副档名给他改成 .gz 吧!

  # 2. 将上述的档案解压缩:

  [root@www initrd]# mv initrd-2.6.18-92.el5.img initrd-2.6.18-92.el5.gz

  [root@www initrd]# gzip -d initrd-2.6.18-92.el5.gz

  [root@www initrd]# file initrd-2.6.18-92.el5

  initrd-2.6.18-92.el5: ASCII cpio archive (SVR4 with no CRC)

  # 搞了老半天,原来还是 cpio 的指令压缩成的档案啊!解压缩看看!

  # 3. 用 cpio 解压缩

  [root@www initrd]# cpio -ivcdu < initrd-2.6.18-92.el5

  [root@www initrd]# ll

  drwx------ 2 root root 4096 Apr 10 02:05 bin

  drwx------ 3 root root 4096 Apr 10 02:05 dev

  drwx------ 2 root root 4096 Apr 10 02:05 etc

  -rwx------ 1 root root 1888 Apr 10 02:05 init

  -rw------- 1 root root 5408768 Apr 10 02:00 initrd-2.6.18-92.el5

  drwx------ 3 root root 4096 Apr 10 02:05 lib

  drwx------ 2 root root 4096 Apr 10 02:05 proc

  lrwxrwxrwx 1 root root 3 Apr 10 02:05 sbin -> bin

  drwx------ 2 root root 4096 Apr 10 02:05 sys

  drwx------ 2 root root 4096 Apr 10 02:05 sysroot

  # 看!是否很像根目录!尤其也是有 init 这个执行档!务必看一下权限!

  # 接下来看看 init 这个档案内有啥咚咚?

  # 4. 观察 init 档案内较重要的执行项目

  [root@www initrd]# cat init

  #!/bin/nash <==使用类似 bash 的 shell 来执行

  mount -t proc /proc /proc <==挂载记忆体的虚拟档案系统

  ....(中间省略)....

  echo Creating initial device nodes

  mknod /dev/null c 1 3 <==建立系统所需要的各项装置!

  ....(中间省略)....

  echo "Loading ehci-hcd.ko module"

  insmod /lib/ehci-hcd.ko <==载入各项核心模组,就是驱动程式!

  ....(中间省略)....

  echo Creating root device.

  mkrootdev -t ext3 -o defaults,ro hdc2 <==尝试挂载根目录啦!

  ....(底下省略)....

  透过上述执行档的内容,我们可以知道 initrd 有载入模组并且尝试挂载了虚拟档案系统。 接下来就能够顺利的运作啦!那么是否一定需要 initrd 呢?

  例题:

  是否没有 initrd 就无法顺利开机?

  答:

  不见得的!需要 initrd 最重要的原因是,当开机时无法挂载根目录的情况下,谷搜企业邮箱 此时就一定需要 initrd ,例如你的根目录在特殊的磁碟介面 (USB, SATA, SCSI) , 或者是你的档案系统较为特殊 (LVM, RAID) 等等,才会需要 initrd。

  如果你的 Linux 是安装在 IDE 介面的磁碟上,并且使用预设的 ext2/ext3 档案系统, 那么不需要 initrd 也能够顺利的开机进入 Linux 的!

  在核心完整的载入后,您的主机应该就开始正确的运作了,接下来,就是要开始执行系统的第一支程式: /sbin/init。

  评论这张
 
阅读(12)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017