1、初识grub所扮演的角色

GNU GRUBGRand Unified Bootloader)是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。由此可见它功能的强大。现在去看看这个传说中的多操作系统启动程序到底长什么样子。

[root@www ~]# grub

Probing devices to guess BIOS drives. This may take a long time.

    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB

   lists possible command completions.  Anywhere else TAB lists the possible

   completions of a device/filename.]

grub> 

grub> 

通过登录grub界面,不难,看出当前的grub的版本是0.97。时至今日其实grub的版本已经有1.x的版本。但是有点其实需要说明的。Grub0.x1.x版本之间区别很大,大到可以认为1.0之后的版本,是重新编写的。

2、进一步剖析grub

在启动系统的时候,需要去加载grub,那么在加载grub的过程当中,首先stage1先实现加载MBR。而MBR存储在磁盘的第一个扇区,公共512个字节。其中MBR只占据446个字节。其他64被分区表占据。最后两个字节表示分区列表的结束符55AA

stage1_5mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统;stage2:磁盘分区(/boot/grub/等通常放置于一个基本磁盘分区上;

功能:

   

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

允许传递参数给内核

可隐藏此菜单

3)位菜单提供了保护机制

    未编辑菜单进行认证

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

Grub程序正常情况下回存储在磁盘上。存储的形式如下:

(hd0,0)这里我以一块磁盘为例。(grub0.x版本下)

Hd0: 磁盘编号,用数字表示;从0开始编号

0: 分区编号,用数字表示0开始编号

而在grub1.x之后,从1开始。

接下来去看看当登录linux系统的时候,所需经历的grub的过程如下:

wKiom1XrpPaiS8KtAAEwP7VW2Gg197.jpg

当登录上面的界面的时候,不难发现,下面有一些提示信息。通过这些提示信息,可以很好对其进行操作。其中e:编辑模式,用于编辑菜单;c:命令模式,交互式接口。

当按C键的时候,直接进入grub交互接口。你可以在grub里面选择你的root启动内核,选择启动你想要的内核版本。如下:

wKiom1XrpWWRwPeiAAGr5-g6968642.jpg

通过输入如上这些信息,就能够登录linux系统。由于内核版本信息不一样。所以需要的一些信息也不同。简单的说主需要注入如下这些信息即可。

grub> root (hd#,#)

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

grub> initrd /initramfs-VERSION-RELEASE.img

grub> boot引导选择好的内核

但其实如果你在登录grub之后,如果不知如何操作还以通过help寻求帮助。接下来我列出一些个人认为比较常用的命令

grub> help

boot                                 cat FILE                                        

clear                                 module FILE [ARG ...]     

configfile FILE                        device DRIVE DEVICE                                       

find FILENAME                       initrd FILE [ARG ...]                                                                                                    

对于其他的一些使用方法,大家可以自行去了解一下。个人觉得还是比较简单

3、具体了解grub的详情。

接下来去了解grub的配置文件,这样能够更加直观的了解grub的配置文件。使得大家能够更好的了解使用grubGrub.conf的配置文件有两处可以进入配置修改。

[root@www ~]# ll /boot/grub/grub.conf 

-rw-------. 1 root root 1154 Sep  5  2015 /boot/grub/grub.conf

[root@www ~]# ll /etc/grub.conf 

lrwxrwxrwx. 1 root root 22 Aug 14 13:11 /etc/grub.conf -> ../boot/grub/grub.conf

说是两处其实就一处,etc目录下的是boot下的grub.conf的连接文件。其实配置文件里面所配置的文字很少,很好理解。其配置文件如下:

[root@www ~]# vim /boot/grub/grub.conf

# grub.conf generated by anaconda

# Note that you do not have to rerun grub after making changes to this file

# NOTICE:  You have a /boot partition.  This means that

#          all kernel and initrd paths are relative to /boot/, eg.

#          root (hd0,0)

#          kernel /vmlinuz-version ro root=/dev/mapper/vg0-root

#          initrd /initrd-[generic-]version.img

其实grub文件内部已经提供模板,对于初学者来说,还是很有帮助的。

#boot=/dev/sda———提示说明boot在哪块硬盘上

default=0——设备默认启动菜单项,

timeout=5——菜单被选择的等待时间默认五秒;

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz——:指明菜单背景图片文件路径;

Hiddenmenu——默认启动隐藏菜单,再启动系统的时候,如果不起启动,不会显示;

title CentOS 6 (2.6.32-504.el6.x86_64)——定义菜单项“标题”,可出现多次;

        root (hd0,0)——grub查找的stage2及其kernel文字所存储的分区。

        kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root  KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=auto quiet rhgb quiet——指定内核的版本信息及其,挂载根文件系统的模式,默认以只读形式启动。指定语言格式,还有才是合作根式创建分区。并且以静默形式输出文件系统。

        initrd /initramfs-2.6.32-504.el6.x86_64.img——指定init的版本,注意init的版本必须和内核的版本保存一致。

此外在这个配置文件当中,可以加入密码的设置选项,这样能一定程度的保障grub的安全性,避免随意被破坏。格式如下:

Password——md5——采取MD5的方式进行加密。

同时还可以给选定的内核和init叫上密码保护。

但是这个时候有人就会好奇,既然能够加密,如果采用命名的方式加密。那么密码泄露的几率很大。这样设置密码的意义就是去了。因为设计者,有特意编写了加密程序。加密格式如下:

[root@www ~]# grub-md5-crypt 

Password: 

Retype password: 

$1$Wc3lO$6GQUBBT2YJEzd7x06dcrs.

这样就生成一个加密过的密码,然后把它添加至grub.conf中去:格式如下

password --md5 $1$Wc3lO$6GQUBBT2YJEzd7x06dcrs.

把这条命令也在需要选择启动的内核后面加上即可。之后重启系统可以测试

wKioL1Xrp57gorzjAAE5bT6uDLo688.jpg

重启启动系统的时候会提需要输入密码才能操作,这样才一定程度上保护系统。

4、grub的损坏修复方式。

对于grub的保护只管重要,一旦grub损坏。那么系统也就被损坏了,只能通过修复grub。让grub正常跑起来。接下来介绍几种修复grub的方式。首先破坏了grub。对于grub大家都知道,主要就是磁盘分区最开始的第一扇区的446个字节。大家在破坏的时候尽量别去破坏512个字节。不然连分区表一块损坏,不然这就启动不了。建议在测试的时候,尽量备份一MBR。接下演示破话及其修复过程。

[root@www ~]# dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1

1+0 records ingrub进行备份

1+0 records out

512 bytes (512 B) copied, 0.000163604 s, 3.1 MB/s

[root@www ~]# dd if=/dev/zero of=/dev/sda bs=300 count=1

1+0 records in破坏MBR表。

1+0 records out

300 bytes (300 B) copied, 0.000267628 s, 1.1 MB/s

[root@www ~]# sync同步到磁盘,现在grub已经被损坏,如果重启系统,肯定启动不了,连grub都进入不了

接下里演示如果能够修复grub

[root@www ~]# grub-install --root-directory=/ /dev/sda ——指明安装grub的位置,及其所在磁盘路径

Installation finished. No error reported.

This is the contents of the device map //boot/grub/device.map.

Check if this is correct or not. If any of the lines is incorrect,

fix it and re-run the script `grub-install'.

# this device map was generated by anaconda

(hd0)     /dev/sda修复完成之后然后去同步磁盘

[root@www ~]# sync

除了可以通过上面的方式修改其实还可以切花到grub下,去修复grub程序。

wKioL1Xrp8Kh_R2MAALzGFI74T0498.jpg

执行上面三步即可。出去上面两种方法还可以通过系统光盘进行修复grub。并且这种方法是必须要掌握的一种,接下来演示如何修复grub

先破话MBR表,还是使用上面的方法;

[root@www ~]# dd if=/dev/zero of=/dev/sda bs=300 count=1

1+0 records in破坏MBR表。

1+0 records out

300 bytes (300 B) copied, 0.000267628 s, 1.1 MB/s

接下来去重启系统,会发现系统MBR已经被破坏了

wKioL1Xrp_7jolYvAAERf6iprhE894.jpg

接下来演示如果通过光盘修复grub

wKioL1XrqA2QX2olAAHGwedjs1w408.jpg

当选择光盘启动的时候,选择启用救援模式进行修复grub,然后回车,然后会进入下面这个界面。接下来的这不和下一步都选择默认安装即可。

wKiom1XrpfLQbPT7AAE5xwKgk70037.jpg

然后会弹出让你选择是否启动网络服务,这一步我建议不选择启动网络服务。

wKioL1XrqCOg-r4pAACul2sHvuY859.jpg

借来下一步系统会提你对于救援一些所需要的注意的帮助信息需要做选择,选择继续continue即可。

wKiom1XrpgbzWraWAAJVMHic7rQ469.jpg

接下来的几步都默认选项即可:在选择的时候,需要注意一点,光盘有提示如果能够切换到之前的系统上去。如下

wKiom1Xrpi-C-IR7AAD_AKDrtiA068.jpg

接下来光盘需要让你选择模式,需要shell模式即可,然后就会进入文字就没模式下

wKiom1XrpjqwnY58AACu85PkWDk704.jpg

接下来进入救援模式,然后切花到系统模式下进行修复grub

wKioL1XrqG2iJP8NAADh4th8mWg746.jpg

然后执行第一种修复方式就能修复grub。然后退出救援模式重启即可

wKioL1XrqHiwPbxxAAIC8z_i4EQ944.jpg

对于grub的讲解到这里差不多,有些地方没有详尽说明,保持歉意!!!