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中
[root@bogon boot]# ls grub initramfs.img vmlinuz [root@bogon 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就可以了
已经安装成功,现在可以重启系统了。
大功告成!!