Linux GRUB内核加载

Linux GRUB内核加载教程

Linux 的启动过程中,我们知道启动引导程序(Boot Loader,也就是 GRUB)会在启动过程中加载内核,之后内核才能取代 BIOS 接管启动过程。如果没有启动引导程,那么内核是不能被加载的。

现在,我们就来看看启动引导程序加载内核的过程,当然 initramfs 这个虚拟文件系统也是要靠启动引导程序调用的。在 CentOS 6.x 中,启动引导程序默认是 GRUB,GRUB 是现在最为流行的启动引导程序,我们也用 GRUB 来说明启动引导程序的作用。

早期的 LILO 引导程序已经不是很常见了,GRUB 相比来讲有很多优势,主要有:

  • 支持更多的文件系统。
  • GRUB 的主程序可以直接在文件系统中查找内核文件。
  • 在系统启动时,可以利用 GRUB 的交互界面编辑和修改启动选项。
  • 可以动态修改 GRUB 的配置文件,这样在修改配置文件之后不需要重新安装 GRUB,而只需重新启动就可以生效。

GRUB加载内核的过程

GRUB 的作用有以下几个:

  • 加载操作系统的内核;
  • 拥有一个可以让用户选择的的菜单,来选择到底启动哪个系统;
  • 可以调用其他的启动引导程序,来实现多系统引导。

按照启动流程,BIOS 在自检完成后,会到第一个启动设备的 MBR 中读取 GRUB。在 MBR 中用来放置启动引导程序的空间只有 446 Byte,那么 GRUB 可以放到这里吗?答案是空间不够,GRUB 的功能非常强大,MBRM 空间是不够使用的。那么 Linux 的解决办法是把 GRUB 的程序分成了三个阶段来执行。

执行GRUB主程序

第一阶段是用来执行 GRUB 主程序的,这个主程序必须放在启动区中(也就是 MBR 或者引导扇区中)。但是 MBR 太小了,所以只能安装 GRUB 的最小的主程序,而不能安装 GRUB 的相关配置文件。这个主程序主要是用来启动下面两个阶段的。

识别不同的文件系统

加载 GRUB 的配置文件比较大,只能放在文件系统中(分区),但是执行 GRUB 主程序不能识别不同的文件系统,所以不能直接加载 GRUB 的配置文件。这时需要先识别不同的文件系统再加载不同文件系统中的 GRUB 的配置文件。

加载GRUB的配置文件

该阶段主要就是加载 GRUB 的配置文件 /boot/grub/grub.conf,然后根据配置文件中的定义,加载内核和虚拟文件系统。接下来内核就可以接管启动过程,继续自检与加载硬件模块了。