Grub: GRand Unified Bootloader,一个GNU项目下的多操作系统启动引导程序,主要用于选择磁盘上不同的的操作系统或内核
grub 0.x: grub legacy #传统grub(Centos5,CentOS6均使用grub legacy)
grub 1.x: grub2 (CentOS7)
传统grub可分文3个阶段:
grub 1: 存储在MBR中
grub 1_5:存储在MBR之后的扇区,让stage1中的bootloader 能够识别stage2所在分区的文件系统
grub 2:存储在磁盘分区(/boog/grub)
grub 配置文件:/boot/grub/grub.conf [root@S2 ~]# ll /etc/grub.conf lrwxrwxrwx. 1 root root 22 Sep 12 18:25 /etc/grub.conf -> ../boot/grub/grub.conf
stage2及内核等通常放置于一个基本磁盘分区;否则启动时候,无法被内核加载,因为缺少文件系统的驱动,即/boot应该
是一个基本磁盘分区
功用:
(1) 提供菜单、并提供交互式接口
e: 编辑模式,用于编辑菜单;
c: 命令模式,交互式接口;
(2) 加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏此菜单
(3) 为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
如何识别设备:
(hd#,#)
hd#: 磁盘编号,用数字表示;从0开始编号
#: 分区编号,用数字表示; 从0开始编号
root (hd#,#):可以指定根
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#,#) (hd0,0) 表示第一个磁盘的,第一个分区
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
配置文件:/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 /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件;
password [--md5] STRING: 启动选定的内核或操作系统时进行认证;
系统启动时,在如下页面,按任意可进入菜单页面
按c即可进入命令模式,命令模式下也可以使用find 等命令
启用认证:
grub菜单编辑认证和启动选定的内核或操作系统时进行认证
编辑 grub.conf 配置文件
如下配置:启动了菜单认证,并对Test System 单独启用了操作系统认证
[root@S2 ~]# grub-md5-crypt #对密码使用md5加密算法加密
Password:
Retype password:
$1$w2jUR$DjJTCxZKcg9kb76nLKgvY1 #将加密过的密码写入到如下grub.conf配置文件中去
重启后,需要按'p' 输入密码才可以编辑grub 菜单,如果输入错误的密码,将无法进入菜单编辑页
如果验证用过,则会正常进入编辑界面
验证启动Test System是否需要输入密码(如果此时选择启动Centos 6 将不需要输入密码,因为配置文件中未对其做启动操作系统认证)
如果密码错误,会提示如下
如果密码正确,就会正常启动系统
如何进入单用户模式:
(1) 编辑grub菜单(选定要编辑的title,而后使用e命令);
(2) 在选定的kernel后附加1, s, S或single都可以;
(3) 在kernel所在行,键入“b”命令;
练习: 在空白磁盘安装grub,并成功引导系统
[root@localhost ~]# fdisk -l /dev/sdb #创建了如下三个分区,分别是sdb1(将作为/boot),sdb2 (swap),sdb3(将作为/root)
Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x501be724
Device Boot Start End Blocks Id System
/dev/sdb1 1 14 112423+ 83 Linux
/dev/sdb2 15 276 2104515 82 Linux swap / Solaris
/dev/sdb3 277 930 5253255 83 Linux
# mkdir /mnt/root #为sdb1创建挂载点
# mkidr /mnt/sysroo #为sdb3创建挂载点
# mount /dev/sdb1 /mnt/boot #挂载sdb1
# mount /dev/sdb3 /mnt/sysroot #挂载sdb2
# grub-install --root-directory=/mnt /dev/sdb #向磁盘sdb安装grub程序
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'.
# vim /mnt/boot/grub/grub.conf #创建grub.conf 配置文件
default=0
timeout=5
title Test Centos
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda3 selinux=0 init=/bin/bash #将使用/bin/bash 作为系统启动后运行的第一个程序
initrd /initramfs.img #指定ramdisk文件
复制/bin/bash 和其所依赖的库文件到/mnt/sysroot (sdb3)
#cp /bin/bash /mnt/sysroot/bin
# ldd /bin/bash #查看/bin/bash依赖的库文件
linux-vdso.so.1 => (0x00007fffd7143000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fc7e3f01000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fc7e3cfd000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc7e3968000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc7e4130000)
复制/bin/bash以来的所有的库文件到对应的目录
#cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/
#cp /lib64/libdl.so.2 /mnt/sysroot/lib64/
#cp /lib64/libc.so.6 /mnt/sysroot/lib64/
#cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64
[root@S2 ~]# ls /mnt/boot/grub/ #查看/boot目录有有没grub相关文件,证明grub已经安装成功
device.map e2fs_stage1_5 fat_stage1_5 ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 reiserfs_stage1_5 stage1 stage2 ufs2_stage1_5 vstafs_stage1_5 xfs_stage1_5
第二步:准备内核文件和ramdisk文件
# cp /boot/vmlinuz-2.6.32-504.el6.x86_64 /mnt/boot/vmlinuz #直接复制当前系统的vmliuz文件到新硬盘sdb上的boot目录
# cp /boot/initramfs-2.6.32-504.el6.x86_64.img /mnt/boot/initramfs.img #直接复制当前系统的ramdisk到新硬盘sdb上的boot目录
# chroot /mnt/sysroot/ #切换到新根目录下,验证复制过去的bash能否正常工作
bash-4.1#
第三步:创建虚拟机,然后使用刚刚安装有grub的空白磁盘来启动系统
选择稍后安装操作系统
选择使用现有虚拟磁盘
浏览到虚拟磁盘的具体位置,并加载
接下来启动虚拟机,验证能否成功grub引导系统,看到#提示符,就已经OK了