GRUB(GRand Unified Bootloader)统一引导加载器,即启动加载器,主要用于加载内核或系统而存在。centos上的grub分为两个版本,分别是: grub 0.x和grub 1.x
grub 0.x也称为grub legacy;grub 1.x也称为grub2,本文主要以grub legacy展开介绍.
Grub legacy分3阶段,分别安装在不同的位置上
stage1:安装在MBR中,为了加载stage2阶段
stage1.5:安装在MBR后,分区前的间隙中,为了stage1识别stage2所在的分区文件系统。
stage2:安装在磁盘分区上,通常安装在/boot/grub目录下
stage2的作用:
1、提供菜单、并提供交互式接口
2、加载用户选择的内核或操作系统
3、为菜单提供了保护机制
GRUB命令行接口
grub的命令行接口:
help: 获取帮助列表
help KEYWORD: 详细帮助信息
find (hd#,#)/PATH/TO/SOMEFILE:查找文件
root (hd#,#)
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 lagacy的配置文件
配置文件位置:/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文件所在设备分区;为grub的“根”;
kernel:启动的内核
initrd 内核匹配的ramfs文件;
password [–md5] STRING: 启动选定的内核或操作系统时进行认证;
获取加密后的MD5密码可以使用grub-md5-crypt,
title后面的参数应该缩进在该title下;
password写在title下,说明该密码指对该title有效
GRUB安装
手动安装grub
实验过程如下:
在虚拟机中新建一个硬盘,在新的硬盘上安装grub,把预先准备好的内核和临时根复制过去(可以复制自Centos6)然后拿/bin/bash用作init程序;以上都做好后,新建一台虚拟机,磁盘用已经安装好grub的磁盘,如果一切正常,新机器应该能启动内核并且会运行bash程序。
第一步:在已装有Centos6的虚拟机中新建一个磁盘。
第二步:在此磁盘上新建/boot和根文件系统分区
分区分别用作/boot、/和swap
第三步:格式化分区
[root@test1 ~]# mkfs.ext4 /dev/sdb1 #用作/boot
[root@test1 ~]# mkfs.ext4 /dev/sdb2 #用作/
[root@test1 ~]# mkswap /dev/sdb3 #用作swap
第四步:挂载到临时目录,模拟根文件系统创建相应目录,并把bash复制为/sbin/init并且提供好相应的库文件
[root@test1 mnt]# mkdir -p bin boot dev home lib lib64 mnt proc root sbin srv sys usr var home
[root@test1 mnt]# ldd /bin/bash #查看bash依赖那些库文件
linux-vdso.so.1 => (0x00007fff80d86000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x000000348b000000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000347c000000)
libc.so.6 => /lib64/libc.so.6 (0x000000347c400000)
/lib64/ld-linux-x86-64.so.2 (0x00007f066c3d2000)
[root@test1 mnt]# cp /lib64/libtinfo.so.5 /mnt/lib64/
[root@test1 mnt]# cp /lib64/libdl.so.2 /mnt/lib64/
[root@test1 mnt]# cp /lib64/libc.so.6 /mnt/lib64/
[root@test1 mnt]# cp /lib64/ld-linux-x86-64.so.2 /mnt/lib64/
[root@test1 mnt]# cp /bin/bash /mnt/sbin/init #复制bash作为init程序
第五步:取消挂载/,随后挂载/dev/sdb1安装grub程序,
[root@test1 /]# umount /mnt #已经对/完成操作,可以取消挂载了
[root@test1 /]# mount /dev/sdb1 /mnt #挂载用作安装grub,并且用作grub的根
[root@test1 /]# grub-install --root-directory=/mnt/boot /dev/sdb #安装grub
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/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'.
(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
可以查看下device文件
[root@test1 /]# cat /mnt/boot/grub/device.map
(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
注意:
这个文件指定了hd0是sda,如果不打算把硬盘移植到其他虚拟机上,要使用新安装的grub,在配置文件中,应该把root指定为hd1,因为sdb是第二块硬盘linux识别顺序会把它识别为sdb;如果打算把硬盘移植到新的虚拟机上,hd0就是第一块硬盘,只要linux识别这块硬盘为sda,那么这里就用不用修改了,现在的实验是打算移植到新的虚拟机上,所以在配置文件中,root应该指定为hd0。
第六步:复制内核文件与initrd文件到grub的根目录。
[root@test1 boot]# cp /boot/vmlinuz-2.6.32-696.el6.x86_64 /mnt/
[root@test1 boot]# cp /boot/initramfs-2.6.32-696.el6.x86_64.img /mnt/
第七步:编写grub.conf配置文件。
编写grub配置文件最好参考已经能用的配置文件,不容易出错。
[root@test1 grub]vim /mnt/boot/grub/grub.conf
default=0
timeout=5
hiddenmenu
title CentOS (test)
root (hd0,0)
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro selinux=0 root=/dev/sda2 quiet
initrd /initramfs-2.6.32-696.el6.x86_64.img
###根文件系统在第二个分区上,而且linux识别硬盘时候由sda开始,所以这里sda2就代表根文件系统所在的分区。
第八步:使用定制好的磁盘用作新建虚拟机的磁盘
Grub的单用户模式
单用户模式可以不使用root密码就可以进入系统,适合破解root密码
流程很简单,在菜单选定对应内核按E,进入,随后选定至kernel行按E编辑,在最后加上参数1, s, S或single都可以,内核接受到此参数后,会进入单用户模式。回到菜单界面按b启动,即可进入单用户模式
然后修改好密码重启即可。
救援模式的使用
实验过程:先备份好MBR中的grub,随后破坏它,这样,通过磁盘是没办法引导系统的,随后借助光盘的引导程序,加载光盘的内核。
随后寻找磁盘的根文件系统,切换到磁盘的根文件系统,修复grub,最后完成。
第一步:备份MBR
[root@test1 ~]# dd if=/dev/sda of=/root/back/stage1 count=1 bs=446
记录了1+0 的读入
记录了1+0 的写出
446字节(446 B)已复制,0.0122644 秒,36.4 kB/秒
第二步:破坏MBR中的bootloader
[root@test1 ~]# dd of=/dev/sda if=/dev/zero count=1 bs=446
记录了1+0 的读入
记录了1+0 的写出
446字节(446 B)已复制,0.000546797 秒,816 kB/秒
重启后已经不能正常引导了
第四步:插入光盘,进入救援模式
选择好语言根键盘布局后,接下来救援模式会尝试在磁盘上寻找根文件系统。
如果找到根文件系统,会挂载在/mnt/sysimage目录下
此时我们选择continue寻找根文件系统即可,
如果可以找到,会提示我们是否启动shell,启动shell后,使用chroot改变根文件系统路径到/mnt/sysimage,即可运行此文件系统下的程序,随后修复grub,重启即可。