本文主要讲解grub原理和系统启动过程中grub的作用过程.


grub是多数Linux发行版中使用的boot loader系统引导程序, 其主要作用是计算机从boot sequence中选取指定设备之后, 由grub找到系统内核kernel文件并加载内核文件的作用. 


grub执行过程

grub作用过程中主要分为三个阶段的作用, 如下图所示:


wKioL1XrHKrSiXReAAIF7A29u8c551.jpg


stage1: 启动grub程序, 位于MBR的前446Byte中;

stage1.5: 识别内核所在分区的文件系统类型, 位于内核文件所在分区的boot sector中;

stage2: 根据grub的配置文件grub.conf中的启动菜单, 读取菜单中指定的内核vmlinuz文件及读取参数和initramfs文件, 位于内核vmlinuz文件所在的boot目录中.

其中内核文件命名方式为: vmlinuz-$(uname -r);

initrd文件命名方式为: initrd-$(uname -r).img(RHEL5)或initramfs-$(uname -r).img(RHEL6)


grub配置文件grub.conf的字段说明

default=0    指定默认启动的title菜单
timeout=5    指定等待时间
password --md5 $1$FRa2P$uZGEloRiLOH8sBMqhz5zP/    指定通过命令行管理grub配置文件的密码
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz    指定grub背景图片路径
hiddenmenu    指定隐藏菜单选项
title CentOS 6 (2.6.32-504.el6.x86_64)    title字段指定菜单名称
	root (hd0,0)    root字段指定内核文件vmlinuz所在分区作为"grub根目录"
	kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/mapper/vg0-root
	kernel字段指定内核文件vmlinuz在"grub根目录"的绝对路径, 并指定以只读方式加载真正根文件系统的设备文件路径
	initrd /initramfs-2.6.32-504.el6.x86_64.img    initrd字段指定initramfs文件在"grub根目录"的绝对路径
	password --md5 $1$FRa2P$uZGEloRiLOH8sBMqhz5zP/    指定启用系统时的密码

注:

1 对grub而言,所有类型硬盘一律hd,格式为(hd#,N) : #表示第几个磁盘 , 最后的N表示对应磁盘的分区;可以通过查看 /boot/grub/device.map 来查看 grub 识别的对应磁盘编号

2 根据boot目录是否单独分区, "grub的根目录"会发生改变, kernel文件和initrd文件以"grub根目录"参考点的绝对路径也会改变:

    boot目录单独分区/dev/sda1, /根目录为/dev/sda2 ==> "grub根目录"为/dev/sda1 ==> kernel文件以"grub根目录"参考点的绝对路径为/vmlinz-$(uname -r), initrd文件同理;

    boot目录没有单独分区, 而是作为/根目录的一个子目录且/根目录为/dev/sda1 ==> "grub根目录"为/dev/sda1 ==> kernel文件以"grub根目录"参考点的绝对路径为/boot/vmlinz-$(uname -r), initrd文件同理.


grub主要作用

1 用户忘记登录密码

方法: 系统启动进入grub菜单画面后, 按e键进入菜单编辑模式, 选择第二行kernel菜单项后按e键对其进行编辑, 在其后加上1或s或S后, Esc退出后, 再按b键就会以单用户模式启动内核, 直接可以修改用户密码.

密码修改完成后可以通过init命令切换至原级别就可以正常使用.


wKiom1XrJsOSLFwNAAGaJzVIvkc405.jpg


2. grub.conf配置文件丢失或损坏

方法: 系统默认会进入grub的命令行模式 grub> 


wKioL1XrK7mwJLUXAAHEzqEBAVQ903.jpg


先通过 find (hd#,0)/+TAB键, 可以通过 find 和 Tab将命令查找到vmlinuz文件所在磁盘分区

grub> root (hd#,0)通过 root 指定 vmlinuz 所在磁盘分区
grub> kernel /vmlinuz-2.6.18-208.e15 ro root=/dev/mapper/vg0-root 通过 kernel 指定 kernel 文件, 并以只读方式挂载根文件系统
grub> initrd /initrd-2.6.18-208.e15.img通过 initrd 指定 initramfs 文件
grub> boot启动

正常开机启动后添加 GRUB 的配置文件


3. grub程序损坏

方法: grub损坏后无法通过grub引导系统内核, 系统提示为boot

wKiom1XrKinQMMlzAACeW8OO7l4944.jpg


在光驱中插入系统镜像光盘, 并设定启动顺序为光盘启动,

通过光盘启动后选择通过救援模式修复系统

wKioL1XrLE-AAXxXAAESyfkBBf4958.jpg


在救援模式种类中选择光盘

wKiom1XrKimC4ZWgAADO2oq0AAU293.jpg


选择救援模式后系统会提示尽力恢复原系统, 并将原系统挂载之/mnt/sysp_w_picpath目录中

wKiom1XrK4ygHB0UAAJS1YO2xaM093.jpg


查找到原系统后会提示执行根切换 chroot /mnt/sysp_w_picpath, 来将根切换至原有系统根目录下

wKioL1XrLbPAVnoOAAEMRFkBO4I813.jpg


进入救援模式的shell环境中, 将根切换至原有系统根目录下, 使用grub-install命令来对原有系统的对应磁盘的MBR中安装grub程序.wKioL1XrLFDCkwGrAADtWo8lgHg670.jpg


安装完成后, 退出原有根系统后, 在救援模式环境下重启系统即可还原为原系统,

如果此时配置文件没有损坏, 不需要修改配置文件; 如果配置文件损坏, 会在开机后进入grub命令行接口, 再手动指定grub.conf配置文件中的内容即可正常启动

# 重启系统后要将启动设备的光盘启动取消


本人水平有限, 如有理解不当的地方, 请大家给予指正, 非常感谢!