GRUB(GRand Unified Bootloader,简称“GRUB”)是一个多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB 可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
在 x86 架构的机器中,Linux、BSD 或其它Unix类的操作系统中GRUB、LILO 是大家最为常用,应该说是主流。
grub 现有两个版本,如下:
grub legacy 在引导安装系统的时候,一共分为如下阶段,如下:
stage 2 及内核等通常放置于一个基本磁盘分区(注意是基本磁盘分区,mbr 无法驱动高级软设备LVM或软raid)。
选择相应编辑键,进入相应的配置模式:
e: 编辑模式,用于编辑菜单
c: 命令模式,交互式接口
允许传递参数给内核
可隐藏此菜单
为编辑菜单进行认证
为启用内核或操作系统进行认证
在 stage 2 阶段读取相关配置文件的时候,需要指定相应的硬盘和分区去加载内核和ramdisk 文件,格式如下:
格式:(hd#,#)
字段含义:
hd# :磁盘编号,用数字表示,从0开始编号
# :分区编号,用数字表示,从0开始编号
示例:
(hd0,0) 代表 第一块硬盘的第一个分区
以 CentOS 6 为例,在系统启动时,按 c 键进行交互接口,可进行如下命令配置。
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
# ramdisk版本必须要与内核版本完全一致
boot:引导启动选定的内核
也可以在 grub 命令行接口运用命令启动系统,配置如下:
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
grub 在系统启动时,是通过读取相关配置文件(/boot/grub/grub.conf)来显示启动界面的,如果配置文件丢失或者损坏,可以进行手动配置。
配置项含义如下:
default=#:设定默认启动的菜单项,编号从0开始(从上至下:0、1、2 、...)
timeout=#:指定菜单项等待选项选择的时长,超时后,直接选择默认启动的菜单项启动
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径
hiddenmenu:隐藏菜单
password [--md5] STRING: 菜单编辑认证
title TITLE:定义菜单项“标题”,可出现多次(以实现多个系统的选择)
root (hd#,#):grub查找 stage 2 及 kernel 文件所在设备分区(此为 grub 的“根”,不是真正 rootfs 的根)
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件
password [--md5] STRING:启动选定的内核或操作系统时进行认证
备注:
# STRING:密码字符串,输入相匹配的密码时,才允许编辑菜单或者启动选定的系统
# 使用 grub-md5-crypt 命令 生成密码串,输入上述 STRING 的位置中
可以按照以下操作,进入单用户模式。
(1) 编辑 grub 菜单(选定要编辑的 title,而后使用 e 命令)
(2) 在选定的 kernel 后附加(1, s, S 或 single 都可以)
(3) 在 kernel 所在行,键入“b”命令
可以用 grub-install 重新安装本机的 grub,或者对相应的硬盘安装 grub ,常用于修复 grub 文件。
# 重新安装本机的 grub
grub-install
# 对相应的硬盘安装 grub
grub-install --root-directory=ROOT /dev/DISK
也可以在 grub 界面安装 grub 文件。
# 在系统启动时,按编辑键 e 进入到 grub 界面
grub> root (hd#,#)
grub> setup (hd#)
根据 Linux 系统的启动流程,可以自建一个简版的 Liunx ,会加深自己对 CentOS 启动流程的理解。
可以运用 VMware 对指定硬盘进行系统创建,并在新的 Liunx 系统中指定此硬盘,验证简版 Linux 。
在 VMware 现有的 Linux 系统中,添加新的硬盘(大小20G,验证使用)。
对新增的硬盘创建 grub,操作顺序如下:
fdsik /dev/sdb
n # 创建新分区
p # 创建主分区
1 # 创建 boot 分区
default # 键入 Enter 使用默认值
+100M # 大小为 100M
n # 创建新分区
p # 创建主分区
2 # 创建 swap 分区
default # 键入 Enter 使用默认值
+2G # 大小为 2G
t # 修改分区类型
2 # 修改第二个分区类型
82 # 82 代表 swap 类型
n # 创建新分区
p # 创建主分区
3 # 创建 root 分区
default # 键入 Enter 使用默认值
+2G # 大小为 2G
w # 保存,退出
partx -a /dev/sdb # 查看磁盘是否分区成功
cat /proc/partitions
[root@LeeMumu ~]# partx -a /dev/sdb
BLKPG: Device or resource busy
error adding partition 1
BLKPG: Device or resource busy
error adding partition 2
BLKPG: Device or resource busy
error adding partition 3
cat /proc/partitions
[root@LeeMumu ~]# cat /proc/partitions
major minor #blocks name
8 0 20971520 sda
8 1 204800 sda1
8 2 19741696 sda2
8 3 1024000 sda3
8 16 20971520 sdb
8 17 112423 sdb1
8 18 2104515 sdb2
8 19 5253255 sdb3
[root@LeeMumu ~]# fdisk -l
Disk /dev/sda: 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: 0x000c0f69
Device Boot Start End Blocks Id System
/dev/sda1 * 1 26 204800 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 26 2484 19741696 83 Linux
/dev/sda3 2484 2611 1024000 82 Linux swap / Solaris
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: 0xf973b675
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
mke2fs -t ext4 /dev/sdb1 # 给 grub 分区创建文件系统
mkswap /dev/sdb2 # 给 swap 分区创建文件系统
mke2fs -t ext4 /dev/sdb3 # 给 root 分区创建文件系统
# 把 grub 分区挂载到 boot 目录下(此系统内的 boot 目录再使用,可以创建一个新的 boot 目录)
mkdir /mnt/boot
mount /dev/sdb1 /mnt/boot/
ls /mnt/boot/ # 显示挂载成功
lost+found
# 安装 grub ,指定 “根”,不需要指定到 boot 目录下,因为 grub 会主动去找 boot 目录
grub-install --root-directory=/mnt /dev/sdb
ls /mnt/boot/
# 需要手动写配置文件,并且复制内核文件和ramdisk
ls /mnt/boot/grub/
cp /boot/vmlinuz-3.10.0-957.el7.x86_64 /mnt/boot/vmlinuz
cp /boot/initramfs-3.10.0-957.el7.x86_64.img /mnt/boot/initramfs.img
vim /mnt/boot/grub/grub.conf
default=0
timeout=5
title CentOS (Express)
root (hd0,0) # 1
kernel /vmlinuz ro root=/dev/sda3 selinux=0 init=/bin/bash # 2
initrd /initramfs.img # 3
grub 配置文件,要注意以下几点:
mkdir /mnt/sysroot # 挂载根文件系统
mount /dev/sdb3 /mnt/sysroot/
cd /mnt/sysroot/
ls
#创建基本目录
mkdir –pv /mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}
cp /bin/bash /mnt/sysroot/bin # 复制bash文件,单是 bash 不能直接使用,还需要把相应的库文件进行复制
ldd /bin/bash # 查看 bash 的库文件,复制时,目录路径一定要对应
chroot /mnt/sysroot # 切换根系统,看根是否可用,除了内建命令其它命令都不能使用
sync # 用于强制被改变的内容立刻写入磁盘
# 查看 bash 的依赖库文件,并复制到新的文件系统中的 lib64 目录内
[root@LeeMumu sysroot]# ldd /bin/bash
linux-vdso.so.1 => (0x00007fffe36d9000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f5809d6f000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f5809b6b000)
libc.so.6 => /lib64/libc.so.6 (0x00007f58097d6000)
/lib64/ld-linux-x86-64.so.2 (0x00005571c8339000)
[root@LeeMumu sysroot]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/
[root@LeeMumu sysroot]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/
[root@LeeMumu sysroot]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/
[root@LeeMumu sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/
在 VMware 上新建一个虚机,选择已有磁盘(就是在上述操作中配置的硬盘)作为硬盘进行启动,并保持现有的文件格式,就能启动一个简易的 Linux 。
在系统 grub 文件损坏或缺失的情况下,如何对系统进行修复。
因为是自己演示和验证,所以先对 mbr 文件进行备份。
dd if=/dev/sda of=/root/mbr.bak count=1 ba=512
对现有系统的 grub 文件进行破坏,只需损坏 mbr 前446字节的数据。
dd if=/dev/zero of=/dev/sda count=1 ba=200
sync
1.使用 grub-install 命令进行修复。
grub-install --root-directory=/ /dev/sda
2.在 grub 界面进行修复。
grub> root (hd0,0)
grub> setup (hd0)
grub> exit
sync
如果系统已经重启,且无法出现 grub 界面,这时候就需要使用救援模式进行修复。
加载启动光盘,重启,进入 Rescue Istalled System 救援模式。
chroot /mnt/sysimage # 切换根系统
grub-install --root-directory=/ /dev/sda # 安装 grub 文件
reboot # 退出此根系统,然后重启