GRUB

什么是GRUB

GRUB(boot loader):grub:GRand Unified Bootloader

    有两个版本:grub 0.x:grub legacy经典版;grub 2.x

grub legacy:主要运行分三个阶段

stage1(第一阶段):安装在mbr中

stage1.5(第1.5阶段):存放在mbr之后的扇区中,让stage1中的bootloader能识别stage2所在的分区上的文件系统(否则他是没办法加载第二阶段的)

stage2(第2阶段):这个就是我们开机能看到提供菜单,让我们能够编辑时的加载界面的那个阶段,第二阶段是存放在磁盘分区上的,一般都在/boot/grub/目录下

=============================以上就是grub的组织格式=============================

    因此当我们系统启动的时候如果要加载grub所在的磁盘时,会读取这个磁盘上的MBR,从此能加载到stage1,stage1加载完以后会尝试去加载stage1.5,stage1.5阶段读到以后,从而就能够驱动stage2所在的磁盘分区;其实这个磁盘分区上不但有第二阶段,还有内核文件和ramdisk等等,都在这个分区上放置着,这就是为什么grub能够加载内核文件的原因。注意:主板bios必须能够识别硬盘。然后bios才能去加载硬盘上的boot loader,磁盘上boot loader加载完以后就能够直接识别当前主机能识别到的硬盘设备了,但是,硬盘设备能够识别,并不以为着能够识别硬盘中的文件系统,因为文件系统是额外附加的一层软件组织的文件结构。所有要想能够对接某种文件系统,必须要用到文件系统驱动。所谓的stage1.5阶段也就是给grub提供了文件系统驱动,从而grub就能够访问对应的stage2和内核所在的分区了,这通常应该是一个基本磁盘分区,毕竟stage1.5不可能做的过于复杂。所以grub的第二阶段,以及内核还有ramdisk文件通常都会放在一个基本磁盘分区。

    stage2及内核等通常放置于一个基本磁盘分区(就是一般的磁盘分区,不是lvm和软raid;因为grub根本就驱动不了逻辑卷)

grub的功用:

    (1)提供菜单,并提供交互式接口

        e:编辑模式,用于编辑菜单;

        c:命令模式,交互式接口(对于grub来讲他不用读取配置文件,就能够打开其内置的命令行提示符,在我们键入的命令的支持下,完成某些操作)

    (2)加载用户选择的内核或操作系统

        加载内核的同时允许用户通过编辑菜单传递参数给内核,还可隐藏此菜单

    (3)为菜单提供了保护机制

        为编辑菜单进行认证

        为启用内核或操作系统进行认证

grub如何去识别设备:

    (hd#,#)

        hd#:磁盘编号,用数字表示

        #:分区编号用数字表示;从0开始编号

grub的命令行接口

    help:获取帮助列表

    helo KEYWORD:获取详细帮助信息

    find (hd#,#)/PATH/TO/SOMEFILE:

    root (hd#,#):表示把哪一个磁盘分区识别为根设备

    kernel /PATH/TO/KERNEL_FILE;设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的命令行参数

    例如:

        init=/path/to/init :表示我使用这个文件做init程序都可以

        selinux=0:表示禁用内核中的selinux功能

        initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk

    boot:引导启动选定的内核

如何手动在grub命令行接口启动系统

    grub> root (hd#,#)

    grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE

    grub> initrd /initramfs-VERSION-RELEASE.img

    grub> boot

grub也有配置文件/boot/grub.conf通常有个符号连接文件在/etc/grub.conf(/boot/grub/grub.conf <– /etc/grub.conf)

配置文件:/boot/grub/grub.conf

    配置项:

    default=#:设定默认启动的菜单项:菜单项(title)编号从0开始;

    timeout=#:指定菜单项等待用户选择的时长;

    splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;

    hiddenmenu:隐藏菜单;

    password [–md5] STRING:设定认证方式:菜单编辑认证

    title TITLE:定义菜单项“标题”,可出现多次;用来引导不同的内核或操作系统

    root (hd#,#):grub查找stage2及kernel文件所在的设备分区;为grubd的“根”;

    kernel /PATH/TO/VMLINUZ_FOLE [PARAMETERS]:启动的内核

    initrd /PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件 

    password [–md5] STRING:启动选定的内核或操作系统时进行认证;

blob.png

grub的保护机制;

    在配置文件中的主配置行加上password [–md5] STRING:设定认证方式:菜单编辑认证

    在配置文件中的菜单配置行加上password [–md5] STRING::启动选定的内核或操作系统时进行认证;

    加密密码串的命令

    openssl可以生成密码串

    grub-md5-crypt命令

如何进入单用户模式:

    (1)编辑grub菜单(选定要编辑的title,而后使用e命令:先选定tatle(菜单)再敲e键);

    (2)在选定的kernel后按键

        1,s,S或single都可以;

    (3) 在kernel所在行,键入“b”命令:

如何安装grub;两种方法

    (1)grub-install

        grub-install –root-directory=ROOT(boot目录的父目录) /dev/DISK

        注意:此种方法不要求当前指定的根下有boot目录

    (2)grub

        grub> root (hd#,#)

        grub> setup (hd#)

        注意:此种方法要求指定的root设备上必须事先存在有一个grub目录以及grub目录里的各种stage1,1.5,2文件都得存在才行。



实验启动流程排错

为GRUB菜单项和内核加上启动密码

在grub.conf配置文件中每个菜单项和内核项加上加密项(密文加密)

]# grub-md5-crypt 使用此命令生成密文,然后将密文添加进配置文件中相对应的菜单和内核,添加完以后下次重启必须输入密码才能进入。

blob.png

blob.png


使用菜单项编辑模式修复配置文件kernel配置项

先在配置文件中对kernel文件进行破坏

blob.png

在菜单项选定内核然后敲e键进入编辑模式,可看到kernel一栏为空

blob.png

选定kernel栏敲击e键键入以下内容保存敲击b键启动(/vmlinuz-2.6*表示内核核心文件,root=/dev/sda2表示操作系统的根,而且只是临时生效)

blob.png

启动后在需要在配置文件中恢复配置。

blob.png


手动破坏grub.conf配置文件

删除后启动会直接进入grub命令行界面,这就时需要手动执行命令进行配置内容。 

blob.png

启动之后手段编辑/boot/grub/grub.conf配置文件

blob.png


给菜单加上背景图片

先准备一张640*480大小的图片,并将图片放至家目录(这里图片名称问shan.jpg)。在centos下载图片处理工具]# yum -y install ImageMagick

]# yum -y install ImageMagick
]# convert -resize 640x480 -colors 14 shan.png shan.xpm 将图片格式转化为xpm
]# file shan.xpm 确认图片格式
]# more shan.xpm 确认图片大小
]# gzip shan.xpm 压缩图片
]# cp shan.xpm.gz /boot/grub/ 拷贝图片至grub目录
]# vim /boot/grub/grub.conf 编辑grub配置文件添加图片路径,然后重启

确认图片格式大小

blob.png

在配置文件中添加背景图片路径

blob.png

重启成功

blob.png


手动破坏grub第一阶段

]# dd if=/dev/zero of=/dev/sda bs=1 count=446 grub第一阶段是安装在mbr中的,所有破坏mbr的前446个字节即可,然后重启进入救援模式;
注意:不要破坏分区表,grub修复不了分区表

进入救援模式之后先切根,因为grub这个工具并不在救援模式中存放,进入模式后系统会把根挂载至/mnt/sysimage,要重建grub第一阶段必须拥有grub这个工具才行,切根就是为了如此。

注意:如果/etc/fstab文件损坏的话。救援模式就不会自动把根挂载至/mnt/sysimage目录下。

blob.png 切根

blob.png安装grub 指明安装位置为/dev/sda,mbr是在磁盘的0磁道1扇区的,grub第一阶段就是在mbr中。与分区无关

blob.png重启,注意:重启时系统会进行修复动作,略耗时间


手动破坏grub第1.5阶段,使用grub命令进行修复

]# dd if=/dev/zero of=/dev/sda bs=512 count=2 seek=1  注意:不要破坏分区表,grub修复不了分区表

blob.png

破坏以后重启系统会直接黑屏,因此需要再次进入救援模式,就如救援模式以后指明grub命令进入grub命令行;

blob.png

在grub命令行执行root (hd0,0)和setup(hd0)命令

blob.png

然后退出grub

blob.png

重启

blob.png

注:重启过程系统会执行修复动作,略耗时间。而且使用进入救援模式以后直接切根执行grub-install /dev/sda命令也可修复,

修复第二阶段的前提是1和1.5阶段没有损坏,而且grub命令行的修复是基于/boot/grub/目录下的各个文件的,如果没有这些文件将无法修复。但是grub-install不依赖与那些个文件。


破坏整个grub目录,用grub-install进行修复

]# rm -rf /boot/grub 删除grub目录
chroot /mnt/sysimage 进入救援模式切根
grub-install /dev/sda 救援模式下安装grub到/dev/sda (/dev/sda相当于 --root-dircetory=/)
vim /boot/grub/grub.comf 编辑grub配置文件

blob.png

退出救援模式重启



手动删除整个/boot目录,利用救援模式修复

]# rm -rf /boot/ 删除整个boot目录,命令执行完毕后会有一个报错,不予理会,实际boot下的所有文件都已经删除干净

光盘启动进入救援模式

chroot /mnt/sysimage 切根
mkdir /mnt/cdrom 创建挂载点
mount /dev/cdrom /mnt/cdrom/ 将光盘挂载至挂载点
rpm -ivh /mnt/cdrom/kernel-2*.rpm --replacepkgs|force 安装内核

blob.png

grub-install /dev/sda 安装grub

blob.png

vim /boot/grub/grub.conf 编辑grub配置文件

blob.png

退出救援模式重启


手动破坏/boot/vmlinuz核心文件和/boot/initramfs伪根文件,利用开启网络服务的救援模式进行修复

]# rm -rf /boot/initramfs-2.6.32-642.el6.x86_64.img vmlinuz-2.6.32-642.el6.x86_64 破坏

在救援模式选择开启网络

blob.png

选择网络设备

blob.png

配置网络地址,如有dhcp服务可选dhcp,如没有就需要自己配置,这里选择dhcp

blob.png

等待获取ip地址

blob.png

获取成功Continue继续

blob.png

两次ok进入shell start shell

blob.png

进入以后依次执行如下命令

chroot /mnt/sysimage/ 切根
scp 10.1.252.189:/boot/vmlinuz* /boot/ 从网络主机拷贝核心文件 需要知道目标主机ip地址和登录密码,而且要拷贝的核心文件必须与当前
主机版本号相同
scp 10.1.249.189:/boot/initramfs* /boot/ 从网络主机拷贝伪根文件 需要知道目标主机ip地址和登录密码,同样版本号需要相同
vim /boot/grub/grub.conf 检查配置文件中核心文件与伪根文件版本号是否和复制的版本号相同,如相同则重启,不同则修改后重启

手动破坏/boot/目录和/etc/fstab文件,利用救援模式修复

]# rm -rf /boot/ /etc/fstab 破坏

光盘进入救援模式,因为删除了/etc/fstab所以体系无法自动根据/etc/fstab进行挂载(若/etc/fstab存在我们可以使用chroot /mnt/sysimage,现在无法使用此命令),会出现下列提示;表示找不到系统分区情况,这是因为没有/etc/fstab文件,所以找不到挂载关系了,这个时候的修复工作就麻烦一些。

blob.png

fdisk -l 先查看分区情况

blob.png得知/dev/sda1为boot引导分区,但是不知道哪个是根

mkdir /mnt/sda1
mkdir /mnt/sda2
mkdir /mnt/sda3 分别创建各分区的挂载点
mount /dev/sda1 /mnt/dev/sda1
mount /dev/sda2 /mnt/dev/sda2
mount /dev/sda3 /mnt/dev/sda3 依次挂载并查看内容

blob.png 可看到根文件系统在sda2中

vi /mnt/sda2/etc/fstab 编辑自动挂载配置文件 也可以echo 进去

blob.png

保存退出,在救援模式重启,重新进入救援模式,让系统自动挂载/mnt/sysimage

blob.png重启

如果挂载成功就执行如下命令:如果挂载失败有可能是逻辑卷问题,逻辑卷问题后续解决

chroot /mnt/sysimage/
mount /dev/cdrom /mnt/
rpm -ivh /mnt/Packages/kernel-* --foace 安装内核
grub-install /dev/sda 安装grub

blob.png

vim /boot/grub/grub.conf 编辑grub配置文件
default=0
timeout=3
title ali
root (hd0,0)
    kernel /vmlinux* root=/dev/sda2
    initrd /initramfs*

blob.png

最后重启;恢复完成


逻辑卷情况下,删除/boot 和/etc/fstab,救援模式恢复

rm -rf /boot/ /etc/fstab dd if=/dev/zero of=/dev/sda bs=446 count=1 破坏

重启进入救援模式,出现挂载/mnt/sysimage失败

blob.png

执行lvscan 扫描可看到逻辑卷是无效的

blob.png

执行vgchange -ay 激活逻辑卷

blob.png

激活后再lvscan可看到逻辑卷生效

blob.png

将/dev/vh0/root 挂载至 /mnt/sysimage

blob.png

编辑自动挂载配置文件/etc/fstab

blob.png

退出重启

blob.png

再次光盘进入救援模式,让系统自动挂载/mnt/sysimage,挂载成功双ok选定shell

blob.png

blob.png

然后以次执行如下命令

chroot /mnt/sysimage
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
rpm -ivh /mnt/cdrom/kernel-* --force  安装内核

blob.png

grub-install /dev/sda 安装grub
vim /boot/grub/grub.conf 编辑配置文件

blob.png

最后退出救援模式重启系统 恢复成功



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

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-23 10:03

    文章对CentOS开机启动中grub启动程序解析的很透彻,同时给出的示例也很实用,赞一个。