GRUB Legacy&Trouble Shooting

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 在生成加密密码时,注入“盐质”

blob.png

2)grub-md5-crypt命令:生成要保护密钥的密码串

 blob.png

三、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进行编辑      

blob.png

       (2)选定kernel项,摁“e”进行编辑,在选定的kernel后附加:1、s、S或single都可进入单用户模式,输入完成,回车

blob.png

blob.png

       (3)在kernel所在行,摁"b"键引导系统。

5.2 如何进入救援模式

选择通过光盘引导

blob.png

选择进入救援模式

blob.png

选择语言

blob.png

选择键盘类型

blob.png

根据需要选择是否开启网络功能

blob.png

选择继续

blob.png

选择shell,进入命令行模式

blob.png

之后,可在命令行进行修复操作.

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字节

blob.png

              查看,发现前446字节已被破坏

blob.png

~]#grub-install  --root-directory=/ /dev/sda

再次查看MBR

blob.png

       重启系统可以正常进入系统

2) 破坏stage1.5

~]#dd if=/dev/zero of=/dev/sda bs=1 count=1024 seek=512

       seek=n:跳过of指定的文件的前n个字节

 blob.png

不退出系统,使用grub命令进行修复

blob.png

 blob.png

之后,重启系统,启动正常

3) 破坏stage2

stage2是加载内核及伪根文件系统initramfs的,要破坏stage2,删掉/boot下的vmlinuz文件和initramfs文件即可。

blob.png

进入救援模式,恢复丢失的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`

 blob.png

blob.png

       修改grub/grub.conf文件

blob.png

exit退出救援模式,选择reboot Reboot选项,重启系统

blob.png

b、若系统不能挂载安装光盘,则可以选择通过网络来拷贝vmlinuz文件。在进入救援模式时,选择启用网络功能。之后使用scp 命令来拷贝远程文件。拷贝vmlinuz文件之后,使用mkinitrd命令生成initramfs文件,修改grub.conf文件,重启系统即可。

注:在这一过程中,损坏的系统必须与拷贝的目标主机在同一个局域网中。且目标主机应允许远程拷贝文件。

选择启用网络功能

blob.png

选中要使用的网卡,摁"tab"键切换至ok选项,回车

blob.png

若局域网中有dhcp服务器,可选择通过dhcp获取ip地址。没有dhcp服务器可选择手动添加ip地址。这里选择dhcp获取,ok确认

blob.png

       之后操作不再赘述。

4)破坏grub配置文件

要恢复grub.conf配置文件较简单,若未退出系统,手动编辑一份配置文件即可;若退出系统重启,进入救援模式编译grub.conf配置文件即可。修复过程不再赘述。

blob.png

5)破坏/etc/fstab

删除/etc/fstab文件。重启不能正常启动。

blob.png

启动报错

blob.png

不能进入系统

blob.png

重启进入救援模式

进入救援模式,能看到没有发现linux分区的错误,摁"ok"继续进入救援模式修复。

blob.png

进入到命令行之后,使用fdisk -l查看磁盘分区情况,可以查看到,/dev/sda1为boot分区。但是无法确认/分区。

blob.png

怎么确认/分区是那块磁盘呢,通过fdisk可以看到,除了boot分区之外,共有4个分区。为每个分区建立一个挂载点,分别挂载各分区,之后,进入挂载目录,查看目录结构,/分区的目录结构还是很好区分的。这里,挂载/dev/sda2报错,查看,发现sda2是LVM。

blob.png

如果/是普通文件系统,可以直接挂载;若果是LVM,则需先激活,才能挂载。、

使用vgchange -ay 激活LVM

blob.png

之后,挂载分区,进入分区查看。

其实通过lvscan直接就看出/dev/vg0/root是根分区了。如果/是普通分区的话,需要一一查看。

blob.png

使用blkid可以查看到分区的文件系统。

blob.png

 blob.png

查找到/之后,切换/

chroot /mnt/sda2(/dev/vg0/root的挂载点)

若在其他目录,有fstab文件的备份,可以拷贝该备份;若没有备份,则编辑/etc/fstab文件。注:若/usr单独分区,则/usr也应该挂载

blob.png

保存,退出。重启系统。启动正常。

系统是能够正常启动,但是,若fstab文件没有备份,又不知道具体的每个分区挂载情况,有可能导致某些数据或功能或业务不能正常使用。所以,关键数据的备份是非常重要的,当系统出现错误时,我们能够通过备份快速恢复系统,并能保障业务的正常运行。

6) 破坏/boot

删除/boot下的所有文件,并umount /boot

blob.png

进入救援模式修复

若/etc/fstab文件没被破坏,则直接切换根至/mnt/sysimage;若/etc/fstab文件被破坏,则先修复fstab文件,之后重启系统,再次进入救援模式,修复/boot。

chroot /mnt/sysimange

挂载安装光盘

安装光盘中的kernel-Version包。安装时使用–force选项。

blob.png

kernel包安装完成之后,会生成vmlinuz文件及initramfs文件,但是grub目录及目录下的文件并没有生成,使用grub-install命令,生成grub目录及文件。

blob.png

grub-install执行完成之后,生成grub目录及相关文件,但是grub.conf文件并没有生成,需要我们手动配置。重写grub.conf配置文件不再是个难题啦。

blob.png

配置完成之后,重启系统,在grub菜单栏可以查看到我们填写的配置,回车选择,等待系统修复。

blob.png

blob.png

启动正常

7) /sbin/init文件被删除

       删除/sbin/init文件

blob.png

重启进入系统,无法正常工作。

blob.png

进入救援模式,若有文件备份,直接拷贝使用,也可以重其他机器上拷贝使用;若没有备份,则需安装upstart的rpm包。

blob.png

退出,重启,系统启动正常。

blob.png

总结:系统重要文件应该备份,在出错时能及时得到恢复。在对配置文件做修改时,应先备份再修改,当配置出现错误时能得到还原。熟悉系统启动流程对于系统排故非常重要。熟练掌握在救援模式下修复系统非常重要。

原创文章,作者:M20-1钟明波,如若转载,请注明出处:http://www.178linux.com/46042