概述
上篇我们以CentOS6为例介绍了一下系统启动流程,本篇将承接上篇,详细的介绍一下系统启动流程中的grub,以及系统启动过程中的各种故障的排除,以及利用现有内核自己构建一个能够正常启动的简单Linux系统。具体分为一下几个部分:
1 2 3 4 5 6 7 8 9 10 |
|
第一章 grub相关概念详解
1、linux上bootloader之grub详解:
grub 0.X: centos5、6上用的,也称之为grub legacy
grub 1.X: centos7上用的,也称之为grub2
2、grub legacy:分为几个阶段
stage1:安装在MBR中前446字节中
stage1_5:MBR之后的扇区,主要是让stage1中的bootloader能识别stage2所在的分区上的文件系统,否则无法加载stage2阶段
stage2:存放在磁盘分区上,一般在/boot/grub/目录下,这才是真正实现开机时显示的菜单和相关功能的程序所在位置,改程序也有其配置文件,配置文件时/boot/grub/grub.conf,其有个软链接文件是/etc/grub.conf
stage2及内核等,通常放置于一个基本磁盘分区,而不应该是放在lvm、软raid分区等复杂分区上,因为grub不能驱动lvm、软raid分区,另外lvm、软raid的识别是系统初始化脚本/etc/rc.d/rc.sysinit的功能,该功能在内核启动之后,init接管的时候才实现。
3、grub的功能:
<1>提供菜单,并提供交互式接口
e:编辑模式,用于编辑菜单
c:命令模式,交互式接口
等等
<2>加载用户选择的内核或操作系统
并允许用户传递参数给内核
也支持隐藏菜单
<3>为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
4、grub中是如何识别设备
无论是什么接口的硬盘,都识别为hd. 且用(hd数字1,数字2)表示第数字1的磁盘上的数字2的分区,都从0开始编号. 故(hd0,0) 表示第1个磁盘上的第1个分区
5、grub的命令行接口:
help:获取帮助列表
help 关键字 可获取某个关键字的详细帮助信息
find (hd数字1,数字2)/FILENAME 可在指定磁盘设备上找指定的文件,判断文件的存在性
如:find (hd0,0)/vmlinuz
root (hd数字1,数字2) 表示将那个磁盘设备设置为grub的根设备,注意,这里的根并不是文件系统的根
如:root (hd0,0)
如果指定了根,在find时就可以不必指定设备,而直接从grub的根开始找对应的文件
kernel /PATH/TO/KERNEL_FILE 设定本次启动时用到的内核文件,一般都需要用root指定grub根之后才指定kernel,额外还可以添加许多内核支持使用的命令行参数,如:
init=/PATH/TO/INIT 指定init程序
selinux=0 表示禁用内核中的selinux功能
root=/DEVICE 表示指定真正根文件系统所在的设备
max_loop=# 表示指定最大的loop设备的个数
initrd /PATH/TO/INITRAMFS_FILE 为选定的内核提供额外文件的ramdisk文件,ramdisk文件必须与内核版本号必须完全匹配
boot 引导启动选定的内核
6、grub的配置文件 /boot/grub/grub.conf或/etc/grub.conf
定义了启动时进入grub后哪个显示出来的可供用户选择的菜单,如果没有该定义,就要通过grub的命令行界面进行手工引导启动 配置文件内容为:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
7、grub-install命令
grub-install命令可以实现对grub的安装修复,能够修复grub的stage1,stage1.5,stage2的相关内容,但是其不能修复stage2中grub的配置文件
用法为:grub-install /磁盘设备号 –root-directory=/PATH
指明为哪个磁盘安装grub,以及该磁盘上的文件系统的根所在的路径,如果是命令本身所在的shell的文件系统根,则–root-directory可以省略
第二章 系统启动故障排除
1、grub配置文件写错,无法进入系统
方法一:进入启动菜单项后,修改菜单项为正确的内容,然后启动
方法二:进入启动菜单后,进入grub交互式界面,手动引导启动
2、grub的stage1故障修复
<1>破坏grub的stage1,如果未重启,则直接利用grub-install命令进行修复,如果重启,则继续
<2>重启后发现无法进入系统,此时可以利用光盘进入紧急救援模式,然后进行grub-install安装修复
3、grub的stage1.5故障修复
<1>破坏grub的1.5阶段,重启系统(如果没重启,可直接用grub-install进行安装)
<2>进入紧急救援模式(进入救援模式的步骤省略),进行grub-install安装修复grub
4、grub的stage2故障修复(删除/boot/grub目录和内核文件,ramdisk文件)
<1>删除/boot/grub目录和内核文件vmlinuz,ramdisk文件initramfs,然后重启
(如果没重启,可以直接拷贝系统光盘上的vmlinuz文件,然后运行mkinitrd命令生成initramfs文件,然后运行grub-install命令生成修复grub文件,最后编辑grub配置文件即可)
<2>进入紧急救援模式(进入过程省略)进行修复
5、破坏grub的stage1、stage1.5、删除boot目录的故障恢复
<1>破坏stage1、stage1.5,删除boot目录,然后重启
如果没重启,rpm安装kernel包(注意加上–replacepkgs或–force选项,因为kernel安装的文件不仅仅有boot目录下的相关文件,如果不用选项,会报错),然后grub-install安装修复grub,然后编辑生成一个grub.conf配置文件即可
<2>进入紧急救援模式(进入紧急救援模式的过程省略),修复
6、破坏grub的stage1、stage1.5、删除boot目录,删除/etc/fstab文件的故障恢复
<1>破坏grub的stage1、stage1.5、删除boot目录,删除/etc/fstab文件,重启系统
如果破坏后,尚未重启系统,只需重新编辑/etc/fstab文件,然后与上个实验一样,安装kernel包(注意加–replacepkgs或–force选项),grub-install安装grub,然后提供grub的配置文件即可
<2>进入紧急救援模式,进行修复
7、当系统安装在lvm逻辑卷上时, 破坏grub的stage1、stage1.5、删除boot目录,删除/etc/fstab文件的故障恢复
<1>破坏stage1、stage1.5,删除boot目录、删除/etc/fstab文件,并重启
<2>进入紧急救援模式修复
8、系统上init文件、inittab文件破坏后的恢复方案
步骤: 思路为查询文件是由哪个程序生成,然后在救援模式下进行安装对应的包,进行修复