Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1370829
  • 博文数量: 245
  • 博客积分: 10021
  • 博客等级: 上将
  • 技术积分: 3094
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-12 14:51
文章存档

2011年(2)

2009年(152)

2008年(91)

我的朋友

分类: LINUX

2009-01-21 10:51:37

  开机流程简介

  开机不是只要按一下电源钮而关机只要关掉电源钮就可以了吗?有何大学问?话是这样没错啦,但是由于 Linux 是一套多人多工的作业系统,你难保你在关机时没有人在线上,如果你关机的时候碰巧一大群人在线上工作, 那会让当时在线上工作的人马上断线的!那不是害死人了!一些资料可是无价之宝哩!

  另外,与 DOS 环境不同的是, Linux 在执行的时候,虽然你在画面上只会看到黑压压的一片,完全没有任何画面, 但其实他是有很多的程式在背景底下执行的,例如登录档管控程式、前面两章提到的例行性命令, 当然还有一大堆网路服务,如邮件伺服器、WWW伺服器等等。你如果随便关机的话, 是很容易伤害硬碟及资料传输的动作的!所以在 Linux 下关机可是一门大学问喔。

  既然开机是很严肃的一件事,呵呵,那我们来瞭解一下整个开机的过程吧! 好让大家比较容易发现开机过程里面发生错误的地方,与解决之道!不过,由于开机的过程中,那个开机管理程式 ( Boot Loader ) 使用的软体可能不一样,例如目前各大 Linux distributions 的主流为 grub, 但早期 Linux 预设是使用 LILO ,台湾地区则很多朋友喜欢使用 spfdisk 。 但无论如何,我们总是得要瞭解整个 boot loader 的工作情况,才能瞭解为何进行多重开机的设定时, 为何老是听人家讲要先安装 Windows 再安装 Linux 的原因~

  我们先来想一想, Linux 整个开机的程序是怎样呢?还记得我们提过,开机时要载入核心, 让核心来驱动整个硬体,这样才能算是一个最阳春、最基础的作业系统吧?然后才能够执行各种程式的运作。 同样的,开机的流程也是需要先载入核心的。不过,载入核心前,却需要一些前置作业,才能够正确无误的载入核心嘛! 所以,整个开机的程序是这样的:

  1. 载入 BIOS 的硬体资讯,并取得第一个开机装置的代号;
  2. 读取第一个开机装置的 MBR 的 boot Loader (亦即是 lilo, grub, spfdisk 等等) 的开机资讯;
  3. 载入 Kernel 作业系统核心资讯, Kernel 开始解压缩,并且尝试驱动所有硬体装置;
  4. Kernel 执行 init 程式并取得 run-level 资讯;
  5. init 执行 /etc/rc.d/rc.sysinit 档案;
  6. 启动核心的外挂模组 (/etc/modprobe.conf);
  7. init 执行 run-level 的各个批次档( Scripts );
  8. init 执行 /etc/rc.d/rc.local 档案;
  9. 执行 /bin/login 程式,并等待使用者登入;
  10. 登入之后开始以 Shell 控管主机。

(评论:linux开机顺序,第一先读bios,读取硬件信息,然后根据bios的设定读取第一个硬盘的master boot record即MBR。MBR中安装有boot loader,boot loader解释核心的文件系统并且指向系统核心的文件。通过boot loader解压缩系统核心,并将系统核心加载到内存中。总之,系统先读bios,再根据bios读取硬盘的MBR,再根据MBR中的boot loader分析系统核心的文件系统。并指向系统核心。

虽然以上分析很复杂,但是管理员接触就只是grub和lilo等开机程序而已。grub是安装在MBR内一个小程序,这个小程序能够认识核心的文件系统。


  大概的流程就是上面写的那个样子啦,而每一个程序的内容主要是在干嘛呢?底下就分别来谈一谈吧!

  boot loader 与 kernel 载入

  由第一篇里面谈到的一些基础的主机硬体概念当中,我们知道整个主机在开机的时候,第一个被读取的地方, 就是 BIOS ( Basic Input Output System ) 啦,这个 BIOS 里面记录了主机板的晶片组与相关的设定, 例如 CPU 与周边设备的沟通时脉啊、开机装置的搜寻顺序啊、硬碟的大小与类型啊、 系统时间啊、各周边汇流排的是否启动 Plug and Play (PnP, 随插即用装置) 啊、 各周边设备的 I/O 位址啊、以及与 CPU 沟通的 IRQ 岔断等等的资讯都记录在此, 所以啰,系统要顺利的开机,首先就是要去读取 BIOS 的相关设定值了。

  读取了 BIOS 设定值之后,系统会根据 BIOS 的资料,进行开机自我测试 (power on self test, POST), 然后开始执行硬体侦测的初始化,并设定 PnP 装置,之后再定义出可开机的装置, 之后就会开始进行开机装置的资料读取了 (MBR 相关的任务开始)。

  读完了 BIOS 并且瞭解了主要的主机硬体相关资讯后,主机便会开始尝试由储存媒体载入作业系统了。 我们刚刚提到 BIOS 会记录‘可用来开机的装置搜寻顺序’对吧!所以,系统会开始去第一个开机装置上面进行开机程序。 我们在第二篇的 磁碟档案系统(filesystem) 当中提到过整个储存装置的特性, 如果以硬碟来看,那么开机流程读到硬碟的过程中,第一个要读取的就是该硬碟的主要开机磁区 (Master Boot Record, MBR) 了,而系统可以由主要开机区所安装的开机管理程式 (boot loader) 开始执行核心辨识的工作。
  
Tips:

  我们知道每颗硬碟的第一个磁区称为 MBR ,那么如果我的主机上面有两颗硬碟的话, 系统会去哪颗硬碟的 MBR 读取资料呢?这个就得要看 BIOS 的设定了。 基本上,我们常常讲的‘系统的 MBR’其实指的是 第一个开机装置的 MBR 才对! 所以,改天如果您要将开机管理程式安装到某颗硬碟的 MBR 时, 要特别注意当时系统的‘第一个开机装置’是那个,否则会安装到错误的硬碟上面喔!重要重要!    

  那么为什么要在 MBR 安装 boot loader 呢?而这个 boot loader 有什么功能呢? 还记得我们在第二篇提到的 磁碟档案系统 吧? 我们的作业系统核心必须要认识磁碟档案系统才能读取里面的资料啊, 但是整个系统才刚刚到开机起头的地方而已,要如何认识磁碟档案格式呢? 那就得要藉由 boot loader 来辅助啦!所以啰,当然必须要有 boot loader 才有办法载入 Linux 的核心 (kernel) 啊!由于 boot loader 的特殊功能,因此,想要载入 Linux 核心时, 当然得使用支援 Linux filesystem 的 boot loader 了,目前主流的 grub 这套开机管理程式, 不但可以支援 Linux ,同时也支援 Windows 相关的核心系统呢!

  好了,先再来回忆一下,如果你是以 grub 程式开机的话,那么在开机的时候会显示什么资料呢?呵呵! 会显示蛮多的开机选单,没错~就是‘选单’,然后选择了你的选择项目之后, 系统就会跑到该磁区去读取该作业系统的核心啰!呵呵!所以一个好的 boot loader 会具有两个功能,就是:

  * 选单功能 (menu)
  * 指向功能 (pointer)

作业系统的核心在硬盘上,管理员通过grub这个小程序操作核心系统的文件,开启整个操作系统。

一个boot loader引导一个操作系统,如果是windows和linux并存,则是两个boot loader引导两个操作系统,
开机管理程式boot loader除了可以安装在MBR之外, 还可以安装在每个分割槽的开机磁区(boot sector),通过MBR内boot loader的选项,管理员可以选择指向另一个分区的boot loader,这另一个boot loader在另一个分区的boot sector内,这就是多重开机原理。

  再来强调一下,因为 Windows 与 Linux 的档案格式不一样?! 为了载入系统核心,所以必须要安装认识我们作业系统的 loader, 而 Linux 的 loader ( lilo 或 grub ) 是可以认识 windows 的核心档案的,但是 Windows 的 loader 却不认识 Linux 的核心档案,因此,作为一个多重开机的设定 loader ,就无法使用 Windows 所提供的 loader 啰!由于需要让系统认识你的 kernel ,因此,就需要 boot loader 啦!这样想就对啦!

安装windows操作系统时,windows操作系统的boot loader会将MBR中的内容全部覆盖掉,所以在安装多重操作系统时,最好先安装windows,再安装linux,如果先安装linux,则windows会把linux的boot loader覆盖掉,导致linux无法开机。

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

  在载入核心的过程当中,我们必须要知道的是,系统只会‘挂载根目录’而已,而且是以唯读的方式挂载的。 此外,有时为了让某些功能可以用档案的方式来读取,因此,有的系统在开机的时候, 会制作所谓的虚拟硬碟 (RAM Disk) 来辅助的,那就是 initrd 以及 linuxrc 的功用了。 利用 boot loader 的功能,可以在载入核心的时候,一起载入 initrd 的映象档 (/boot/initrd-xxxx.img), Linux 系统会主动的以 initrd (man 4 initrd) 来进行虚拟硬碟的建置, 并且利用 linuxrc (包含在 initrd 的映象档内) 这个程式的功能来进行载入模组的动作。 linuxrc 主要的特性是:

  * 必须是 linuxrc 这个档名;
  * 必须放置在 initrd 所建立的虚拟磁碟的最顶层目录;
  * 必须要可以被核心所执行。

  在核心驱动周边硬体的工作完成之后, initrd 所建立的虚拟磁碟就会被移除了! 不过您要注意的是, initrd 并非必要的,是可有可无的,要看您当初建立该核心的时候, 整个编译的角度与过程。一般来说,各大 Linux distributions 在建立核心时, 都会一起建立出这个 initrd 的映象档,辅助开机的顺利进行。

  总之,在这个过程当中, boot loader 可以找到 Linux 的核心档案并且将他载入到主记忆体当中, 同时可能可以藉由 initrd 建立起虚拟硬碟 (RAM Disk) 辅助开机的进行, 最后,将读自 BIOS 的主机硬体资料交由 Linux 核心来进行侦测并且载入适当的驱动程式 (driver) ,就让整个主机硬体准备系统的要求了。整个流程有点像这样:

  

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

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

阅读(3614) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~