GRUB (Grand Unified Bootloader)
位于系统引导盘的MBR中的Boot Loader。
GRUB是一个来自GNU项目的启动引导程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
Grub分为2个版本:
grub 0版本:也叫grub legacy。CentOS6、CentOS5采用此版本
grub 1版本:也叫grub2。CentOS7采用此版本
一、grub legacy:
stage1:mbr
stage1_5:mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统。
功能:为grub提供文件系统驱动。从而能访问2阶段内核所在的分区。
stage2:磁盘分区(/boot/grub)
stage2及内核通常放置于一个基本磁盘分区。
stage2的功用:
(1)提供菜单、并提供交互式接口
e:编辑模式,用于编辑菜单
c:命令模式。交互式接口。
(2)加载用户选择的内核或操作系统
运行传递参数给内核
可隐藏菜单
(3)为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
二、配置文件:/boot/grub/grub.conf,有一链接文件/etc/grub.conf
2.1、grub配置文件:
/boot/grub/grub.conf 配置项: default=#:设定默认启动的菜单项,菜单项编号从0开始 timeout=#:指定菜单项等待选项选择的时长 splashimage=(hd#,#)/path/to/xpm_pic_file:指明菜单背景图片文件路径。 hiddenmenu:隐藏菜单 passwd [--md5] String:菜单编辑认证 title TITLE:定义菜单项“标题”,可出现多次 root (hd#,#):grub查找stage2及kernel文件所在的设备分区。为grub的根。 kernel /path/to/vmlinuz ro root=/dev/mapper/some_path:启动的内核 initrd /path/to/initramfs_file:内核匹配的ramfs文件。 passwd [--md5] String:启动选定的内核或操作系统时进行认证。
2.2、如何生成加密密码串:
1)openssl生成加密密码串
~]#openssl passwd -1 -salt "123456"
-1 指定加密方式为md5
-salt 在生成加密密码时,注入“盐质”
2)grub-md5-crypt命令:生成要保护密钥的密码串
三、grub中如何识别设备
(1)boot目录单独分区,并挂载于/目录。
这个时候,由于内核还未加载,所以不存在真正意义上的根,那么存放于/boot上的内核文件以及ramdisk文件和grub配置文件如何能够被识别呢?
stage1会将/boot选举为boot的根,在grub阶段查找/boot上的文件时, 是以boot为跟查找。比如,查找磁盘上的/boot/vmlinuz在grub阶段表现为查找/vmlinuz;查找/boot/grub/grub.conf表现为查找/grub/grub.conf。
(2)boot目录没有单独分区,而是位于/所在的分区。
这种情况下,grub阶段查找boot下的vmlinuz文件表现为查找/boot/vmlinuz;查找boot下grub目录下的grub.conf文件表现为查找/boot/grub/grub.conf文件。
(3)什么样的情形下boot单独分区,而不是位于/所在的分区?
grub访问的分区只能是基本磁盘分区,LVM&RAID等都不支持。当要使用LVM按需扩展/时,boot要单独分区。
(4)如何在grub中指定boot的根
grub中的root指令用于指定系统启动处于grub阶段时,文件系统的跟。若boot单独分区,则以boot分区为根;若boot未单独分区,则以文件的绝对路径查找文件。
root (hd#,#)
hd#:磁盘编号,用数字表示;从0开始编号
#:分区编号,用数字表示;从0开始编号
四、grub的命令行接口
4.1、在命令行中可使用的命令
help:获取帮助立标 help Command:获取对应命令的帮助信息 find (hd#,#) /path/to/some_file root (hd#,#) :设置在grub阶段的/ kernel /path/to/kernel_file:设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数 如:init=/path/to/init,selinux=0 initrd /path/to/initframfs_file:设定为选定的内核提供额外文件的ramdisk,其版本号必需与内核的版本号完全一致。 boot:引导启动选定的内核
4.1、如何手动在grub命令行接口启动系统:
grub>root (hd#,#) grub>kernel /vmlinuz-Version-Release ro root=/dev/Device grub>initrd /initramfs-Version-Release.imggrub>boot
五、GRUB Trouble Shooting:
5.1 如何进入单用户模式
(1)开机,进入系统,在grub菜单选择要使用的内核,摁“e”键,进入grub菜单,选定要编辑的title,而后使用e进行编辑
(2)选定kernel项,摁“e”进行编辑,在选定的kernel后附加:1、s、S或single都可进入单用户模式,输入完成,回车
(3)在kernel所在行,摁"b"键引导系统。
5.2 如何进入救援模式
选择通过光盘引导
选择进入救援模式
选择语言
选择键盘类型
根据需要选择是否开启网络功能
选择继续
选择shell,进入命令行模式
之后,可在命令行进行修复操作.
5.3 安装grub
grub-install命令:完整安装stage1、stage1_5、stage2
grub-install –root-directory=Root /dev/Disk
–root-directory=/ #指定/
/dev/Disk #指定/所在的硬盘,注:不是/所在的硬盘分区
5.4 grub被破坏或配置文件丢失。
如何为本机修复GRUB:
破坏stage,无法看见grub启动菜单,若退出,只能进入救援模式修复。若未退出,使用下面第一种、第二种方式进行修复。
模拟破坏:破坏之前先备份,也可以对虚拟机做备份。
dd if=/dev/sda of=/src/mbr.bak bs=1 count=512dd if=/dev/zero of=/dev/sda bs=1 count=200 sync
修复
第一种方式
grub-install --root-directory=Root /dev/Disksync
第二种方式
grub#进入grub提示符 grub >root (hd#,#) #指定/分区 grub >setup (hd#) #指定在那块磁盘上安装stage1 sync
注意:第二种方式仅限于/目录下必须事先存在boot目录,且stage1、stage1_5、stage2等文件必须存在,否则安装失败
第三种方式:破坏之后重启,进入救援模式修复
如何进入救援模式:
(1)载入系统光盘
(2)敲esc键,进入命令行模式,键入“linux rescue”命令;或者通过启动菜单中的rescue选项进入救援模式。
(3)chroot /mnt/sysimage #切换至原有系统的/目录下
(4)grub-install –root-directory=Root /dev/Disk
(5)exit
(6)reboot
1) 破坏stage1
在命令行模式进行修复
模拟破坏stage1,即MBR的前446字节
查看,发现前446字节已被破坏
~]#grub-install --root-directory=/ /dev/sda
再次查看MBR
重启系统可以正常进入系统
2) 破坏stage1.5
~]#dd if=/dev/zero of=/dev/sda bs=1 count=1024 seek=512
seek=n:跳过of指定的文件的前n个字节
不退出系统,使用grub命令进行修复
之后,重启系统,启动正常
3) 破坏stage2
stage2是加载内核及伪根文件系统initramfs的,要破坏stage2,删掉/boot下的vmlinuz文件和initramfs文件即可。
进入救援模式,恢复丢失的2个文件
a、系统上挂载有安装光盘,可以通过拷贝安装光盘上isolinux目录下的vmlinuz文件到/boot目录下,并使用mkinitrd命令生成initramfs文件,之后修改grub/grub.conf文件,修改kernel、initrd对应的文件。
chroot /mnt/sysimage cp /mnt/iso/isolinux/vmlinuz /boot/ mkinitrd /boot/initramfs-`uname -r`.img `uname -r`
修改grub/grub.conf文件
exit退出救援模式,选择reboot Reboot选项,重启系统
b、若系统不能挂载安装光盘,则可以选择通过网络来拷贝vmlinuz文件。在进入救援模式时,选择启用网络功能。之后使用scp 命令来拷贝远程文件。拷贝vmlinuz文件之后,使用mkinitrd命令生成initramfs文件,修改grub.conf文件,重启系统即可。
注:在这一过程中,损坏的系统必须与拷贝的目标主机在同一个局域网中。且目标主机应允许远程拷贝文件。
选择启用网络功能
选中要使用的网卡,摁"tab"键切换至ok选项,回车
若局域网中有dhcp服务器,可选择通过dhcp获取ip地址。没有dhcp服务器可选择手动添加ip地址。这里选择dhcp获取,ok确认
之后操作不再赘述。
4)破坏grub配置文件
要恢复grub.conf配置文件较简单,若未退出系统,手动编辑一份配置文件即可;若退出系统重启,进入救援模式编译grub.conf配置文件即可。修复过程不再赘述。
5)破坏/etc/fstab
删除/etc/fstab文件。重启不能正常启动。
启动报错
不能进入系统
重启进入救援模式
进入救援模式,能看到没有发现linux分区的错误,摁"ok"继续进入救援模式修复。
进入到命令行之后,使用fdisk -l查看磁盘分区情况,可以查看到,/dev/sda1为boot分区。但是无法确认/分区。
怎么确认/分区是那块磁盘呢,通过fdisk可以看到,除了boot分区之外,共有4个分区。为每个分区建立一个挂载点,分别挂载各分区,之后,进入挂载目录,查看目录结构,/分区的目录结构还是很好区分的。这里,挂载/dev/sda2报错,查看,发现sda2是LVM。
如果/是普通文件系统,可以直接挂载;若果是LVM,则需先激活,才能挂载。、
使用vgchange -ay 激活LVM
之后,挂载分区,进入分区查看。
其实通过lvscan直接就看出/dev/vg0/root是根分区了。如果/是普通分区的话,需要一一查看。
使用blkid可以查看到分区的文件系统。
查找到/之后,切换/
chroot /mnt/sda2(/dev/vg0/root的挂载点)
若在其他目录,有fstab文件的备份,可以拷贝该备份;若没有备份,则编辑/etc/fstab文件。注:若/usr单独分区,则/usr也应该挂载
保存,退出。重启系统。启动正常。
系统是能够正常启动,但是,若fstab文件没有备份,又不知道具体的每个分区挂载情况,有可能导致某些数据或功能或业务不能正常使用。所以,关键数据的备份是非常重要的,当系统出现错误时,我们能够通过备份快速恢复系统,并能保障业务的正常运行。
6) 破坏/boot
删除/boot下的所有文件,并umount /boot
进入救援模式修复
若/etc/fstab文件没被破坏,则直接切换根至/mnt/sysimage;若/etc/fstab文件被破坏,则先修复fstab文件,之后重启系统,再次进入救援模式,修复/boot。
chroot /mnt/sysimange
挂载安装光盘
安装光盘中的kernel-Version包。安装时使用–force选项。
kernel包安装完成之后,会生成vmlinuz文件及initramfs文件,但是grub目录及目录下的文件并没有生成,使用grub-install命令,生成grub目录及文件。
grub-install执行完成之后,生成grub目录及相关文件,但是grub.conf文件并没有生成,需要我们手动配置。重写grub.conf配置文件不再是个难题啦。
配置完成之后,重启系统,在grub菜单栏可以查看到我们填写的配置,回车选择,等待系统修复。
启动正常
7) /sbin/init文件被删除
删除/sbin/init文件
重启进入系统,无法正常工作。
进入救援模式,若有文件备份,直接拷贝使用,也可以重其他机器上拷贝使用;若没有备份,则需安装upstart的rpm包。
退出,重启,系统启动正常。
总结:系统重要文件应该备份,在出错时能及时得到恢复。在对配置文件做修改时,应先备份再修改,当配置出现错误时能得到还原。熟悉系统启动流程对于系统排故非常重要。熟练掌握在救援模式下修复系统非常重要。
原创文章,作者:M20-1钟明波,如若转载,请注明出处:http://www.178linux.com/46042