Linux Grub 启动引导过程介绍
2015-02-26 10:46:36 阿炯

GNU GRUB是一个来自GNU项目的启动引导程序,是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。

BIOS是英文"Basic Input Output System"的缩略语,直译过来后中文名称就是"基本输入输出系统"。其实它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

因为BIOS很小,功能有限,为了完成加载操作系统的功能,就产生了mbr; bios检测到一个硬盘后,将硬盘的0柱面、0磁头、1扇区的内容经过简单判断后, 至内存中的指定位置,然后跳转至这个位置,开始从这个位置运行; MBR,全称为Master Boot Record,即硬盘的主引导记录。 为了便于理解,一般将MBR分为广义和狭义两种:广义的MBR包含整个扇区(引导程序、分区表及分隔标识),也就是上面所说的主引导记录;而狭义的MBR仅指引导程序而言。 硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。bios可设置系统启动的方式,比如可以设置从硬盘,光驱或U盘启动。

MBR是硬盘的主引导记录,属于引导区。

内核(kernel),是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。
 
内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。

严格地说,内核并不是计算机系统中必要的组成部分。程序可以直接地被调入计算机中执行,这样的设计说明了设计者不希望提供任何硬件抽象和操作系统的支持,它常见于早期计算机系统的设计中。最终,一些辅助性程序,例如程序加载器和调试器,被设计到机器核心当中,或者固化在只读存储器里。这些变化发生时,操作系统内核的概念就渐渐明晰起来了。

BootLoader,系统引导文件,在根目录下。

引导装载程序实际上是引出更高级的功能,以允许用户装载一个特定的操作系统。所以有多种引导装载程序,grub只是其中一种。这里强调指出,grub只是mbr的升级版,补充完成mbr所做不了的事情,其实他们的本质都一样,都是引导程序。

Linux系统启动过程

1、主机开机后,就是硬件检测(POST),通过后再根据BIOS里面设置的启动顺序找到启动驱动器(如硬盘,光驱等)。

2、读取硬盘MBR,启动系统引导程序(如grub、lilo),再由系统引导程序加载Linux的核心(kernel)

系统引导程序引导并运行核心可以分两个阶段:
一阶段:即BIOS从MBR中读入IPL(initial program loaderI),就是启动系统引导程序如grub。

二阶段:加载boot loader的所有配置文件和相关的环境参数;由于MBR只有512字节,所以系统引导工具还要从其它地方读入数据( /boot目录下的文件)。

注:MBR(Master Boot Record 512 字节,0头0道1扇区),前446字节存放的是 stage1,后面存放硬盘分区表信息。
 
3、Kernel会立即初始化系统中各种设备并做相关配置工作,其中包括CPU、I/O、存储设备等,也就是加载驱动程序啦。

4、驱动加载后,会创建一个根设备,然后将根文件系统 / 以只读的方式挂载,结束后,执行 switchroot,转到真正的根 / 上面去,同时运行 /sbin/init 程序,运行linux系统的第一号进程(init进程,也就是所有进程的父进程,PID为1)。

5、读取 /etc/inittab 配置文件。

6、执行系统初始化脚本 (/etc/rc.d/rc.sysinit )对系统进行基本配置,以读写方式挂载根文件系统及其其它文件系统;

主要工作有:取得网络环境与主机类型(/etc/sysconfig/network)、挂载 /proc 及 /sys、配置selinux、系统时钟、内核参数(/etc/sysctl.conf)、加载用户自定义的模块( /etc/sysconfig/modules/*.modules)、hostname、使能swap分区、根文件系统的检查和二次挂载(读写)、激活RAID和LVM设备、使能磁盘quota、检查并挂载其它文件系统等等。

根据运行级别启动相应服务,具体的每个运行级别的服务状态是放在 /etc/rc.d/rcX.d (X= 0 ~ 6)目录下,所有的文件均链接到 /etc/init.d下的相应文件/etc/rc.d/rcX.d/ 里面的文件介绍:(里面的文件都是链接文件,都是指向 /etc/init.d目录下)
 以 S 为开头的文件,为开机时需要启动的服务;
 以 K 为开头的文件,为关机时需要关闭的服务的档案连结;
 在 S 与 K 后面接的数字,代表该档案被执行的顺序。

7、读取 /etc/rc.d/rc.local 文件,就是启动用户自定义的一些脚本程序,所以说如果你有什么东西需要在系统启动时启的的话就往这个文件里面写就可以了。

8、执行 /bin/login 程序,并等待用户登入

9、系统启动完成。

下图为上面描述,感谢原作者。