GRUB的那些事

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GRUB的那些事相关的知识,希望对你有一定的参考价值。

            GRUB简介:

     GRUB是GRand Unified Bootloader的简写,翻译一下就是很牛×的统一启动引导器,它是在lilo不能识别磁盘1024柱面的巨大缺陷的背景下诞生。到目前为止分为grub 0.x(grub legacy)和grub 1.x(grub 2)两个版本,这篇来讲讲grub legacy。

    GRUB功能;

     支持多系统并存,并提供菜单选项,还可以向内核传递参数,还可以提供保护机制。

    GRUB原理:

     已经说过grub分三个阶段,分别为:

        stage 1:还记得前面讲的MBR吗,在那446K里面存的是bootloader?没错,由于只有446K,要想完成这种功能几乎不可能的事,因此就分为3段,而第一段就是就在MBR中,是为了将硬盘上的操作系统加载到内存中。

        stage 1.5:我们都知道在操作系统下硬盘必须格式为某文件系统才能存放数据,而内核恰恰是存在在操作系统的硬盘下(不然何谈引导操作系统),那么想要读取里面的数据就必须有相应的文件系统驱动才行啊,而这个1.5阶段就是在MBR后面的扇区存放有基本的文件系统驱动(因此不支持那些比如LVM之类的,因为只是基本的啊),因此所谓的1.5阶段是为了识别2阶段。

        stage 2:有了1.5阶段的驱动,就可以将2阶段放在磁盘分区上的内核和dandisk文件加载到内存了。这个分区就是众所周知的/boot/,在这下面有grub和vmlinuz-版本-发型号和initramfs-版本-发型号(再提一下两个版本号和发型号必须一样,在5中是initrd-版本-发型号)。

    通过grub命令行启动系统:

      前面说过grub能提供菜单,但是这菜单不仅仅只是选择回车然后启动操作系统的作用,还能编辑这菜单(按e),而且还能通过命令行引导(按e后选中内核按c进入)。

    技术分享

 看到下面的提示了吗,用上下箭头选择菜单(但是这里只有一个),按回车键启动选中的操作系统,按e编辑选中的菜单,按a修改细节,按c进入命令行模式。这里我们按c进去。

    技术分享   

 就是这个样子,可以输入help来看看帮助,也可以“help 关键字”来看看指定的帮助信息,还可以find想要寻找的文件,好了现在首先让grub知道它的根在哪(人也应该如此,不能忘本啊),这里使用root (hd#,#)这样的方式,其中hd是代表磁盘,这个与现在系统的什么sd不一样,而且第一个#数字表示的是第几块磁盘,第二个#数字表示的是在第一个分区上。然后是kernel grub根下的vmlinuz-版本-发型号,指定内核的位置,接着是initrd grub根下的initramfs-版本-发型号,指定dandisk的文件的位置。这里需要注意:这两个数字都是从0开始的,也就是说第一个0表示第一块硬盘,第二0表示第一块分区,以此类推。而且这个根不是根文件系统的“/”,而是grub的根,如果你的/boot单独分区了,那么请记下你的分区号(建议放在第一个分区上),那个分区就是grub的根,如果你的/boot没有单独分区(其实这是不理智的),那么文件系统的根下的boot才是grub的根。我这里是单独分区的。

    技术分享   

我的grub根是/boot这个单独分区,这个分区在我的虚拟机的第一块硬盘下的第一个分区中,因此是(hd0,0),而vmlinuz和initramfs在grub的根/boot下,因此只需要从/开始写(再次强调这个/不是文件系统的/,除非你的/boot没有单独分区,那么就是/boot/开始)。同理initrd也是这个意思,还有kernel那行的文件系统必须以只读的方式挂着,而且还要指定根文件系统在哪个位置,不然grub怎么知道呢,当然这行可以指定很多的内核参数,比如quit静默模式,init=/bin/bash指定第一个进程为bash而不是/sbin/init等等。然后只需要回车输入boot就可以启动操作系统了。

    GRUB配置文件配置。

     GRUB的配置文件在/boot/grub/grub.conf或者/etc/grub.conf中,后面的是前面的一个软链接。

    技术分享

     信息说明:

        #boot:指明在哪个硬盘。(可以在title下特地指定,这个位置指定的都是全局的)

        default=0:表示默认进入第一个操作系统

        timeout=5:表示5秒不选的话就直接进入

        splashimge:指定开机图片所在的位置

        hiddenmenu:隐藏的菜单(这里没有)

        title 自定义菜单名称

            root:

            kernel:

            initrd:

        这三个前面已经说了。

    由于grub可以支持多个系统菜单,因此如果装多个系统只需要在下面接着加上title的内容就行

    还可以加上密码保护,在title上指定的话就是全局的,在title里面指定的话就是局限在这个菜单里的,方法是:password --md5 密码(可以用grub-md5-crypt生成,然后复制进去)。

    技术分享

    技术分享

    这里我在全局设置里面加上了密码,并在第二个里面加上了局部密码,下面来看一下效果。

    技术分享

  看下面的提示信息,说按p键解锁进入菜单

    技术分享  

    按下p后下面出现了密码,下面看看输入密码后的

    技术分享

    熟悉的一幕又回来了,但这是全局的菜单密码,下面选中第二个回车看看。

    技术分享

    需要密码,这就是在局部里面设置密码的作用。

    GRUB的安装:

     当你的GRUB不知所以的挂了的时候怎么办,重装系统?呵呵。。。其实grub有命令可以安装的。下面看看grub安装的两种方法。

     方法一:使用grub-install命令。

        用法:grub-install --root-directory=grub根位置 /dev/sd[a-z](指定在哪个磁盘上),由于grub-install会去找/boot目录,所以我们先进行破坏再重装。

        dd if=/dev/zero of=/dev/sda count=1 bs=200(切记不要大于446K)

    技术分享

                                         

    方法二:直接进入grub

    技术分享

    加一块新硬盘,提供单独运行的bash系统。

    技术分享

    首先分区,简单三个基本分区就可以了,/boot / swap,然后格式化为文件系统。由于grub会找/boot这个目录,所有可以建一个/mnt/boot的目录来挂载/dev/sdb1这个当boot的分区,然后为了不覆盖/dev/sdb1,可以建一个/mnt/sys来挂载/dev/sdb3这个当/的分区(这些基本步骤就不演示了)。

    现在在/dev/sdb1这个将要做boot的分区上安装grub

    技术分享

    然后在/dev/sdb3这个将要做文件系统根的分区创建FHS上的基本目录

    技术分享

    然后复制/bin/bash到/mnt/sys/bin中,并将其需要的库文件也复制到相应的库文件目录中,可以用ldd /bin/bash查看需要的库文件。

    技术分享

    然后chroot到/mnt/sys中

    技术分享

    因为只是一个bash所以只能使用内嵌命令。

    再编辑grub.conf,我也是通过复制,这样方便些,当然你也可以自己建,上面有参数,然后将系统中的内核和randisk(在/boot)复制到/mnt/boot中

[[email protected] boot]# ls
grub  initramfs.img  vmlinuz
[[email protected] boot]# ls grub/grub.conf 
grub/grub.conf

    然后编辑grub.conf

技术分享

现在建一个虚拟机,使用这块硬盘。

    技术分享

就是这一步。然后选择自己的这块硬盘。然后开机就可以进入了。

    技术分享

    

    上面的都是在能进入系统的情况下,如果grub破坏了但是又关机了呢?那就需要进入紧急救援模式了。

    技术分享

    下面重启看看

    技术分享

    这时候就需要挂载系统光盘开启紧急救援模式了

    技术分享    

    

 选择Rescue installed system或者直接按ESC键进入命令行模式输入Linux rescue后回车就可以进入紧急救援模式了。

    技术分享   

    技术分享

会出来这个界面,然后一直选择就行了直到

    技术分享

    信息说我的系统已经被挂载到了/mnt/sysimage上,点OK就进去了

    技术分享    ok,现在可以在shell中安装grub了,chroot进/mnt/sysimage,然后安装grub就可以了

    技术分享

 已经安装成功,现在可以重启系统了。

    技术分享  

 

    大功告成!!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

     

以上是关于GRUB的那些事的主要内容,如果未能解决你的问题,请参考以下文章

转载关于烂代码的那些事

关于烂代码的那些事(中)

关于烂代码的那些事(下)

关于代码调试de那些事

函数那些事

内存的那些事