grub:GRand Unified Bootloader
在早期的Linux发行版中,Bootloader一直采用LILO,LILO曾经是Linux发行版中主流的Bootloader,但是它不能引导1024柱面以后的分区,大大限制了操作空间,所以现如今的Linux发行版中的Bootloader都使用了GRUB,它有更好的接口和界面,而且能为用户提供交互式接口,使用配置更加灵活方便。
grub版本:grub 0.x : grub legacy(传统grub)
grub 1.x: grub2
grub的启动阶段(grub legacy):
stage1:位于mbr中;
stage1_5:mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统;
stage2:磁盘分区(/boot/grub);
配置文件:/boot/grub/grub.conf <-- /etc/grub.conf
stage2及内核等通常放置于一个基本磁盘分区中;
grub的访问路径:/grub,grub刚启动时内核并没有被启动起来,所以根文件系统也没有被挂载,所以grub的第二阶段就把自己的访问路径设为了临时根目录,但并不是启动后的根文件系统,所以在内核启动之前grub的路径就是/grub,内核的访问路径就是/vmlinuz.
功用:(1)提供菜单、并提供交互式接口
e:编辑模式,用于编辑菜单;
c:命令模式,交互式接口;
(2)加载用户选择的内核或操作系统
允许传递参数给内核
默认隐藏此菜单
(3)为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
注:在启动系统的界面键入ESC键可进入grub
可以键入e键进入编辑模式,用于编辑菜单:
键入c键进入命令行编辑模式
grub如何识别:
(hd#,# ):表示第#块磁盘的第#号分区
(hd0,0):表示第一块磁盘的第一个分区。
grub的命令行接口:
help:获取帮助列表
help KEYWORD:详细帮助列表。
find(hd#,#)/PATH/TO/SOMEFILE:查找指定文件(设定根文件系统之后就不用再指定磁盘进行查找了)
root (hd0,0) :设置相应磁盘为根文件系统
kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数;
例如:init=/path/to/init, selinux=0
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可以自动读取配置文件生成菜单模式来启动内核。
grub的配置文件:/boot/grub/grub.conf <-- /etc/grub.conf
配置项:
default=#: 设定默认启动的菜单项;落单项(title)编号从0开始;
timeout=#:指定菜单项等待选项选择的时长;
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;
hiddenmenu:隐藏菜单;
password [--md5] STRING: 菜单编辑认证(可省略);
title TITLE:定义菜单项“标题”, 可出现多次;
root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”;
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件;
password [--md5] STRING: 启动选定的内核或操作系统时进行认证(可省略);
grup-md5-crypt命令可生成加密算法为md5的密码
我们用命令行接口手动启动时候输入的命令都能通过该配置文件设置,配置完该文件后就会生成菜单页面自动执行操作。
进入单用户模式:
(1)编辑grub菜单(选定要编辑的title,而后使用e命令)
(2)在选定的kernel后附加 1,s,S或single都可以;
(3)在kernel所在行,键入“b”命令;
安装grub(可以为新的磁盘创建新的grub,也可以在Bootloader损坏时安装新的grub):
(1)grub-install
grub-install --root-directory=ROOT /dev/DISK
(2)grub(此种方法需要保证在该磁盘中必须要有grub目录以及各种文件的存在)
grub> root(hd#,#)
grub>setup (hd#)
我们可以在操作系统中新增加硬盘并装入grub并在新的操作系统中使用它:
以CentOS6(虚拟机)为例新增磁盘:
启动之后为新增的俄磁盘分区,grub会默认安装在boot目录中,所以我们要为新的磁盘至少创建三个分区,一个用来当作boot分区安装grub,一个为swap分区,另一个为根文件系统,这三个分区只能创建为基本分区。
如图:我们已经创建增加了新的磁盘:
之后我们需要进行分区,安装文件系统并挂载新的磁盘分区。
磁盘分区安装完文件系统后,我们需要创建新的boot目录让grub识别,我们暂且创建在/mnt中,并将它挂载至/dev/sdb1上:
在/mnt/boot中安装grub,并指明grub的根文件目录:
而后创建新的根挂载至sdb3,并创建根文件系统所需要的目录:
并为新的根系统复制一个bash程序
我们还需要为grub提供内核以及initrd:
为grub编写配置文件,因为我们要在新的系统上使用该grub,所以我们指定的磁盘分区为第一个。
copy一个bash程序到新的根文件系统中,
创建新的CentOS6并使用该新建的磁盘,并在内核选项中设置selinux=0:
成功运行了此系统中的grub并启动了设定的第一个程序bash
如何修复grub:
如图所示:我们破坏了grub的stage1
我们重装grub就能修复
也可以进入grub命令提示符进行修复,前提是grub目录中的stage1和stage1.5目录必须存在
如果grub被破坏后重启。就需要通过载入光盘进入救援模式进行安装grub的修复。