GNU GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
回忆下开机流程:BIOS(POST)--> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --> 系统初始化脚本 --> 关闭和启动对应级别下的服务 --> 启动终端
从以上流程可以看出,grub处于系统硬件初始化完成和内核初始化开始之前的位置,grub的功能就是;基于硬件环境(就是一个基本功能完整的主机环境),提供一个菜单,允许用户选择要启动的系统或不同的内核版本; 把用户选定的内核装载到RAM中的特定空间中、解压、展开,而后把系统控制权移交给内核。
CentOS5,6版本用grub 0.x版本:也就是grub legacy, grub 1.x也就是grub2。目前企业应用中较为常用的系统时CentOS6,所以grub1版本是最为常用的,所以基于centos6.7,暂时介绍grub1这个版本。
grub legacy分段设计为stage1,stage2,其中还存在grub stage1.5,其区别与功用如图:
grub配置文件为 /boot/grub/grub.conf 由上图可以看到,该文件位于磁盘上,
grub的功用:功能和作用不一样,作用是功能的必须,功能是作用的升华。
(1) 提供菜单、并提供交互式接口
e: 编辑模式,用于编辑菜单;
c: 命令模式,交互式接口;
(2) 加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏此菜单
(3) 为菜单提供了两种保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
grub的命令行接口(centos 6,centos7 和6很大不同)
help: 获取帮助列表
help KEYWORD: 详细帮助信息
find (hd#,#)/PATH/TO/SOMEFILE #在指定设备查找文件
root (hd#,#) # boot文件所在的根文件所在设备
kernel /PATH/TO/KERNEL_FILE # 设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数;
例如:init=/path/to/init, selinux=0 # 使用这个init作为init程序, selinux=0
root=/dev/DEVICE #指定内核根文件系统的分区
initrd /PATH/TO/INITRAMFS_FILE #设定为选定的内核提供额外文件的ramdisk;必须与内核版本完全匹配。
boot: 引导启动选定的内核;
如何手动在grub命令行接口启动系统:
grub> root (hd#,#)
grub> kernel /vmlinuz-2.6.32-584.el6.x86_64 ro root=/dev/mapper/vg0-root quiet
grub> initrd /initramfs-2.6.32-584.el6.x86_64.img
grub> boot
grub 如何识别设备:
(hd#,#):
hd#: 磁盘编号,用数字表示;从0开始编号
#: 分区编号,用数字表示; 从0开始编号
示例:(hd0,0)
说明:grub从grub2开始不用0标识磁盘和分区第一个为:hd(1,1)标识
配置文件:
/boot/grub/grub.conf 有链接文件为 /etc/grub
配置项:
default=#: 设定默认启动的菜单项;菜单项(title)编号从0开始;
timeout=#:指定菜单项等待选项选择的时长;
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;
hiddenmenu:隐藏菜单;hiddenmenu会显示读秒而不进入菜单,回车进菜单,否则显示菜单,等待用户选择;
password [--md5] STRING: 设定认证方式,菜单编辑认证;按“e”键的编辑的时候就会提示输入该密码
title TITLE:定义菜单项“标题”, title 可出现多次,从而引导不同的内核;
[缩进]root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”;
[缩进]kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS] root=/dev/sdb2 init=/bin/bash :启动的内核,root指定内核rootfs根设备位置,init指定启动init程序位置。
init
[缩进]initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件;
[缩进]password [--md5] STRING: 启动选定的内核或操作系统时进行认证;
grub密码生成工具
grub-md5-crypt工具可以生成命令,由于grub.conf是对所有用户可见的,所以建议用--md5指定加密码串。
grub-md5-crypt
输入密码:
再次输入密码:
进入单用户模式:
(1) 编辑grub菜单(选定要编辑的title,而后使用e命令);
(2) 在选定的kernel后附加
1, s, S或single都可以;
(3) 光标定位在kernel所在行,键入“b”命令,进入单用户模式;
恢复grub
安装grub:
1) grub-install
grub-install --root-directory=ROOT /dev/DISK # 所有阶段1、1.5、2 阶段。??是否需要存在grub目录的stage1,1_5、2文件
dd if=/dev/zero of=/dev/sda bs=200 count=1
grub-install --root-directory=/ /dev/sda
reboot
(2) grub # 需要所有阶段1、1.5、2 阶段。
grub> root (hd#,#) # boot根分区位置
grub> setup (hd#) #安装第一阶段,需要第一阶段和1.5阶段,hd#为硬盘
grub> root (hd0,0) root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... no
说明:setup 会需要检测是否存在/boot/grub/stage1setup (hd0)
Checking if "boot/grub/stage1" exits... no
Checking if "/grub/stage1" exits... yes
Checking if "/grub/stage2" exits... yes
Checking if "/grub/e2fs_stage1_5" exits... yes
Running "enbed /grub/e2fs_stage1_5 (hd0)" .. 27 sectors are enbended.successed
Runing "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf" ... succededDone
说明:修复bootloader:有grub提示符就可以修复硬盘上系统,光盘,usb都可以。双系统windows坏了,重装没了,用安装盘上的试用linux安装选项进入grub命令修改源磁盘。
原文地址:http://kingslanding.blog.51cto.com/9130940/1758146