CentOS系统启动流程第一部分

在我们按下电脑电源键后,究竟发生了什么操作?本文将详细讲述按下电源键后,机器所做的那些事。

我们生活中的大多数人,对于电脑的认识都是,按一下电源键,然后等待几秒钟,我们便可以看到操作系统了,从来没想过其中的过程是什么,但他们也不需要知道这其中的过程和原理。但身为一个运维人员来说,理解这其中的工作过程,我们可以更好的对系统进行排错,方便我们的工作。系统的启动主要分为下面的几个过程:加电自检,系统引导,挂载根文件系统,启动默认配置几个大步骤,但我理解主要是两个大部分:BIOS部分和内核部分。我们在两大部分详细进行拆解。

BIOS部分

在机器加电之后,内核接管之前,这一段一般是BIOS系统在起作用。BIOS是什么?Basic Input Output System,基本输入输出系统,所有的冯诺依曼体系架构的计算机一般都会有这个系统(现在好像还有UEFI,不太了解)很多有过装机经验的人都会知道,在装机之前我们要去更改BOOT,这是为什么?一般来说我们的BIOS系统是存储在主板上的一个ROM芯片中,这样就可以防止我们不太会的人将系统给删除,这个系统很简单,显示硬件的基本信息,设置引导顺序,开启和关闭一些功能,大体就是这样。在我们按下电源键之后,主板会传递一个信号,激活CPU,CPU一般出厂时就会设定好,去固定的地址去加载指令完成操作,这些指令就是用来传递信号,探测主机上的硬件工作是否工作正常,如果正常的话,就会进行接下来的步骤,下面我们来看个流程图:

CPU是通过发送电压信号确认设备的运转情况。一般探测到所有的设备都运行正常后,BIOS回去查找默认启动项,按照我们设定的顺序进行依次的顺序读取设备的信息,一般我们第一启动项是CD的话,会引导我们的CD中的系统,但CD无法写入,所以我们一般使用磁盘设备进行我们操作系统的存储,我们将设备磁盘放在第一位,就会自动读取磁盘的第一个扇区的第一个数据。如果没数据,则会读取接下来的顺序的设备。这里我们假设是有数据的,我们都知道,磁盘的前512字节都是MBR,前446位Boot Loader,这个引导便是引导我们去寻找内核的,在我们进行系统安装的时候,这段代码一般会被安装系统的程序装入前446字节,这时我们内核便可以加载完毕了,接下来内核便可以接管下面的工作了,BIOS工作工程就到这儿。在进入第二阶段前,我们详细了解下引导程序。

Boot Loader

什么是引导加载程序?最简单地讲,引导加载程序(boot loader 会引导操作系统。当机器引导它的操作系统时,BIOS 会读取引导介质上最前面的 512 字节(即人们所知的 主引导记录(master boot record,MBR))。在单一的 MBR 中只能存储一个操作系统的引导记录,所以当需要多个操作系统时就会出现问题。所以需要更灵活的引导加载程序。

主引导记录本身要包含两类内容 —— 部分(或全部)引导加载程序以及分区表(其中包含有关于介质其余部分如何划分为分区的信息)。当 BIOS 引导时,它会寻找硬盘驱动器第一个扇区(MBR)中存储的数据;BIOS 使用存储在 MBR 中的数据激活引导加载程序。

由于 BIOS 只能访问很少量的数据,所以大部分引导加载程序分两个阶段进行引导。在引导的第一个阶段中,BIOS 引导一部分引导加载程序,即 初始程序加载程序(initial program loader,IPL)。IPL 查询分区表,从而能够加载位于不同介质上任意位置的数据。首先通过这步操作来定位第二阶段引导加载程序(其中包含加载程序的其余部分)。

第二阶段引导加载程序是引导加载程序的主体;很多人认为这才是引导加载程序的真正部分。它包含有加载程序更需要磁盘空间的部分,比如用户界面和内核引导程序。从简单的命令行到绘声绘色的 GUI,这些用户界面的范围很广泛。

引导加载程序通常配置为两种方式的其中之一:要么是作为主引导加载程序(primary boot loader),要么是作为二级引导加载程序(secondaryboot loader)。主引导程序 是安装在 MBR 上的第一阶段引导加载程序(见先前的描述)。 二级引导加载程序 是安装在可引导分区的第一阶段引导加载程序。必须在 MBR 上安装单独的引导加载程序,并配置它将 控制权转交给二级引导加载程序。

很多较新的 Linux 引导加载程序特别实用,因为它们提供了不同程度的交互,比如高级的 GUI 和加密的口令,以及通过选择操作系统进行引导的能力。这样,可以在具有多个物理磁盘的同一机器上共存多个操作系统。这种设置越来越常见,因为它帮助很多用户在安装新的 Linux 时,能够保留先前由 Windows® 机器所生成的宝贵数据资料。我个人认为这种设置非常美妙;只使用一台机器就可同时拥有 Linux 和 Windows。

随着时间的推移,引导加载程序已经得到了增强,为用户引入了大量的功能。各个引导程序的功能和配置存在差异,但基本的目标是相同的。

现在来看两个较为流行的引导加载程序:LILO 和 GRUB。LILO因为主要应用于安卓系统,我们这里不过多讨论,我们主要进行GRUB的流程介绍:

当 GRUB 初始加载时,从 MBR 加载第一阶段程序。加载后,它进入第一阶段和第二阶段引导加载程序之间的中间阶段(为了方便讨论,可称为第 1.5 阶段)。 之所以存在第 1.5 阶段,是为了能够对 /boot/grub 中的 GRUB 配置文件进行常规的文件系统访问,而不是去访问磁盘块。然后进入引导加载程序的第二阶段,GRUB 加载 grub.conf 文件。

现在应该能够看到 GRUB GUI 了。对于熟悉 Windows 的用户来说,这看起来感觉比 LILO 更友好。不过,不要因为 GRUB 拥有 GUI 就认为它是一个不能 处理数据的引导加载程序。可选项多得惊人。

如果像我那样配置,那么现在应该能看到屏幕中有两个选项:引导到 Red Hat Linux 或者引导到 Windows XP。默认情况下,它将加载 Linux。选择任意一个的结果不言而喻

配置 GRUB

GRUB 的配置都是通过位于/boot/grub/grub.conf 的一个配置文件来完成的。清单 2 给出了一个示例配置,使用的是我的家用机器,支持 Linux 和 Windows 机器的双重引导:

清单 . grub.conf 示例文件

1

2

3

4

5

6

7

8

9

10

11

12

13

default=0

timeout=10

splashimage=(hd1,3)/grub/splash.xpm.gz

password --md5 $1$opeVt0$Y.br.18LyAasRsGdSKLYlp1

title Red Hat Linux

    password --md5 $1$0peVt0$Y.br.18LyAasRsGdSKLYlp1

    root (hd1,3)

    kernel /vmlinuz-2.4.18-14 ro root=LABEL=/

    initrd /initrd-2.4.18-14.img

title Windows XP

    password --md5 $1$0peVt0$Y.br.18LyAasRsGdSKLYlp1

    rootnoverify (hd0,0)

    chainloader +1

清单中的选项:

default= 选项通知 GRUB 在超时之后默认使用哪个映像进行引导。这一选项与 grub.conf 文件中的某个映像相关联。 0 表示指定了第一个,1 表示指定了第二个,依次类推。如果没有在配置文件指定此选项,那么它将引导文件中指定的第一个映像。

timeout= 是在自动引导默认 OS(在本例中是Red Hat Linux)之前引导提示会等待多少秒。

splashimage= 是用作 GRUB GUI 背景的图片所在的位置。

password 选项指定了使用 MD5 加密的口令,用于访问 GRUB 的交互式引导选项。注意,这不会阻止用户选择 引导已经定义的 OS;需要为每一个 -title 设置它。为了生成一个 md5 口令, 请运行 GRUB 所附带的 grub-md5-crypt 工具(以 root 身份)。它将提示输入一个希望加密的口令。然后输出使用 MD5 加密的口令。将这个口令拷贝到 grub.conf 中 password -md5 之后,但是要在同一行上。通常这个口令可以设置为 root 口令,因为无论如何也只有 root 才可以读取 grub.conf 文件。

title 标明了在运行期间能够从用户界面引导的具体 OS。 与 LILO 不同,在这个名称中可以有空格。

password 的设置方式与前面的 password 相同。如果计划与其他用户共享此机器,那么不要将这个口令设置为 root 口令。

root 告诉 GRUB OS 文件系统的实际位置。可见,GRUB 引用介质的方式与 LILO 不同。在 LILO 示例中, /dev/hdb3 是第二块硬盘中的第三个分区。Grub 将此硬盘引用为(hd1,3),即第二块硬盘的第三个分区(disk 0 是第一块硬盘)。

kernel:vmlinuz-X.X.XX-XX 是 root 目录中默认引导映像的名称。

initrd:initrd-X.X.XX-XX.img 是 root 目录中默认 initrd 映像的名称。

title 与所有其他 title 选项相同。

password:见其他口令选项。

rootnoverify 告诉 GRUB 不要尝试去改变OS 的 root。这样,当文件系统不被 GRUB 所支持时,不会出现引导错误。

chainloader +1 告诉 GRUB 使用一个链式加载程序来加载这个 OS,加载 Windows 时需要这个选项。

在 grub.conf 文件中可以使用很多其他参数,不过清单 2 中的参数就足以让机器可用了。与 LILO 的配置文件不同,grub.conf会在引导时被读取,当被修改时不必去更新 MBR。

内核设计流派

说说内核设计的两大流派:单内核,微内核

 微内核从根本上讲,将一个事情拆成各个小问题,然后每个小问题只复杂一个任务是linux的设计哲学之一。按道理,linux是微内核,但恰恰不是。我们的windows才是标准的微内核设计,下面看一张图:


早期设计的时没有使用微内核的思想,linux是一步步扩展而来后来,有呼声,要将linux改为微内核,但linus拒绝,能工作能稳定的工作,就OK,更重要的是,虽然微内核是一种优良的设计思想,但时下,他跑起来一点不比单内核高效更高级,但微内核有更优良的线程,linux则表现一般。但linux在一步步的发展中吸取了微内核的设计经验,虽然是单内核,但是兼具微内核的特性。

 linux通过使用模块化内核设计来兼具微内核特性,但这样的模块化设化设计并不是像微内核一样是各个子系统,而是由核心加外围的功能性模块组成内核。而微内核子系统都是各自独立运行的,不需要依赖其他部分就能工作。而linux各模块必许依赖核心,只是能在使用时进行装载,不用时被动态卸载。linux下的模块外在表现为类型程序的库文件,只是程序库文件为.so,而内核模块为.ko(kernel object),被内核调用。  

 假设,如果驱动是内核提供的,想象下,编译好一个内核,装在主机上,万一后来发现他无法驱动我们后来新添加的新硬件设备。各种硬件都是由内核驱动的,内核没有提供这个程序。假设我们有了驱动程序,怎样才能让他驱动起来,是不是从新编译内核,这是对用户和厂商的不幸。模块化设计得以避免这种情况,故各赢家厂商的以模块化的形式开发自己的驱动,只需针对某一特定设备开发自己驱动程序的即可,而后我们编译这些模块即可。由于linux支持动态装卸载模块,因此当我需要和不需要某一功能时,可自行拆卸,并不影响核心的运行,这就是好处和优势表现之一。下面一片文章我们进行内核加载之后的介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值