Grub的概述

从《计算机是如何启动的?》一文知道,按下开机键后,程序员能控制的第一个程序并不是内核,而是引导器程序。 GNU GRUB是的最灵活的、功能最强大的、加载速度最快的、最精炼的引导器。除了GRUB,还有NT loader, OS/2 loader, DOS MBR loader, PQ BOOT, System Commander, Lilo等引导器

硬盘的主引导扇区(MBR)

当BIOS设置完成,硬件驱动成功及硬件检测都没问题之后,其将加载操作系统的主控权转交给硬盘的主引导扇区(Master Boot Record,MBR),也就是硬盘第零轨.让MBR中的开机管理程序可以将指针带到系统核心的地方。

  •  Bootloader是MBR用来存储开机管理程序的位置.
  •  Partition Table就是存储硬盘分区表的地方,总大小为64Bytes,硬盘中分区多上及每一分区的大小都记录在其中。
  •  Magic Number处被填入固定之“55AA”,并没有特殊用途,只是让存在于bootloader区的管理程序在辨认扇区时可确认MBR的位置。

但请注意,可存在Bootloader中的管理程序可以是任意程序,甚至可以是“简单的跳转到其他程序”的程序。但在Linux中,一般是Grub套件。

Bootloader开机时的功能主要是“加载扇区”和“加载kernel”

加载扇区

MBR将硬盘分为好几个分区,如何分区记录在Partition Table中。分区分由扇区组成,第一个扇区便被称为引导扇区(boot sector). 

 也可以把Bootloader管理程序放在 boot sector中。

加载kernel

因为因为实际中可能一台计算机装有多个操作系统,引导程序(GRUB)可以直接通config信息,找到某一个分区中指定的kernel文件进行加载。

何为GRUB

GRUB是一个强悍的开机管理程序,支持多重开机管理。/boot/gurb目录可看到几个系统文件,主要是stage1,stage1_5,stage2三个文件,这3个文件同时表示GRUB开机时的三个阶段。

stage1

stage1就是写入Bootloader中的开机管理程序。可以使用“grub-install”命令安装到MRB中。

如果stage1坏了,使用 rescue Mode 进入grub-shell

root  (hd0,0)      指定boot分区在hd(0,0)即在第一个硬盘的第一个分区

setup  ( hd0 )    指定安装地点(hd0),因为MBR不属于任何的分区,所以安装在第一个硬盘上,即(hd0)

stage1.5

stage1.5可以识别不同类型的文件系统。比如加载e2fs_stage1_5以后,就可以识别ext2格式。当stage1.5加载后,就赋予GRUB访问文件系统目录的权力,也就是说在开始找不到stage2,可以从文件系统中找到stage2的位置。stage1.5的程序,会被“grub-install”加载到MRB后的32K(即MBR后的27个扇区中),因此stage1步骤中,可直接加载stage1.5。

如果stage1.5坏了,使用 rescue Mode 进入grub-shell

dd    if=/dev/zero    of=/dev/sda    bs=1         count=13824  skip=512 seek=512    跳过MBR的512个字节破坏grub1.5阶段的13824个字节

后面步骤同stage1一样

stage2

stage2是GRUB最核心程序,操作系统的加载,新增参数,修改选项。由于stage1.5被加载,stage1可直接找到并加载stage2,放在各个分区的Boot Sector中。

如果stage2坏了,补全文件

GRUB2的介绍


GRUB2采用了模块化设计,使得GRUB2核心更加精炼,使用更加灵活,同时也就不需要像 GRUB那样分为stage1,stage1_5,stage2这样三个阶段了。GRUB2主要镜像文件:

  • boot.img: 相当与 GRUB 的 stage1 它被写入 MBR或 boot分区,它不能识别任何文件系统
  • cdboot.img:当从CD引导情况下被写入内核镜像第一个扇区到内容,它负责加载其余的内核镜像到内存。
  • diskboot.img:当从磁盘引导情况下被写入内核镜像第一个扇区到内容,它负责加载其余的内核镜像到内存。
  • pxeboot.img:当从网络启动时使用到的。
  • kernel.img:它是grub的kernel,和操作系统的内核无关,其包含运行时包含的基本工具,框架驱动、文件句柄、环境变量、安全模式命令行解析器等,他可以直接使用但是通常它会被编译进所有的内核镜像中使用。
  • *.mod:这是一些可以动态加载的一些模块,当我们需要时,可以将它们可以被动态加载编译进内核镜像,也可以使用insmod手动加载。他们就代替 GRUB 中的 stage1_5 之类到镜像。
  • core.img:这是GRUB2的内核镜像,它由grub-mkimage程序将diskboot.img、kernel.img和一些模块(*.mod)动态编译而成,一般情况下他已经包含足够的模块去访问/boot/grub,模块机制使得内核镜像能保持很小的尺寸。在某种程度上,它可以被视为 GRUB 中的 stage2。

在GRUB2安装时,GRUB2把内核镜像在磁盘中到位置(--boot-directory)写入到 boot.img 中这就使得 boot.img 能够在不能识别文件系统的情况下加载内核镜像。

安装grub2的过程大体分两步:

  1. 根据/usr/lib/grub/i386-pc/目录下的文件生成core.img,并拷贝boot.img和core.img涉及的某些模块文件到/boot/grub2/i386-pc/目录下;
  2. 根据/boot/grub2/i386-pc目录下的文件向磁盘上写boot loader。

在/boot/grub2/i386-pc目录下只有: boot.img,core.img, *.mod(被加载) 的文件

grub2的配置文件

grub2的默认配置文件为/boot/grub2/grub.cfg,该配置文件的写法弹性非常大,但绝大多数需要修改该配置文件时,都只需修改其中一小部分内容就可以达成目标。

grub2-mkconfig程序可用来生成符合绝大多数情况的grub.cfg文件,默认它会自动尝试探测有效的操作系统内核,并生成对应的操作系统菜单项。使用方法非常简单,只需一个选项"-o"指定输出文件即可。

grub2-mkconfig -o /boot/grub2/grub.cfg

grub2-mkconfig是根据/etc/default/grub文件来创建配置文件的。该文件中定义的是grub的全局宏,修改内置的宏可以快速生成grub配置文件。

  1. 配置文件选项手册:GNU GRUB Manual 2.06: Simple configuration
  2. 配置文件语法手册:GNU GRUB Manual 2.06: Shell-like scripting
  3. 配置文件命令手册:GNU GRUB Manual 2.06: Commands

进入shell

  1. 首先修改 /etc/default/grub文件,参考以下config文件注释掉GRUB_HIDDEN_TIMEOUT=0
  2. 执行"sudo update-grub"
  3. 重启后,看到menu,按“C”键进入

另外附上救援模式:https://www.cnblogs.com/pengdonglin137/articles/16874607.html

主要参考

 《带你到Linux最开始的地方

 《计算机是如何启动的?

 《grub2详解(翻译和整理官方手册)

 《LINUX操作系统之奥秘》

猜你喜欢

转载自blog.csdn.net/y3over/article/details/51395765