grub应用
1.Grub(bootloader):全称为:GRand Unified Bootloader。
现在存在两个版本:
grub 0.x: grub legacy
grub 1.x:grub2
2.grub的功能:
功能:提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核;
3.grub legacy 有三个阶段,分别是:
stage1,stage1_5,stage2
stage1:存放在MBR中
stage1_5:存放在MBR之后的扇区中,让stage1中的Bootloader 能识别stage2所在的分区上的文件系统
stage2:存在磁盘分区上(/boot/grub),提供菜单让用户选择不同的内核或操作系统。
grub的配置文件存放目录为:/boot/grub/grub.conf 其中/etc/grub.conf文件是/boot/grub/grub.conf 的一个连接文件
当系统启动的时,如果要加载grub所在的磁盘时,会读取这个磁盘的MBR,同时会加载stage1,stage1会尝试读取随后扇区的stage1_5阶段,stage1_5阶段会帮助stage1中的bootloader识别statge2所在的分区上的文件系统,然后加载stage2所在磁盘分区,这个分区不但有stage2阶段,还有内核和ramdisk等.
stage2及内核等通常放置于一个基本磁盘分区,而不会放在一个复杂的磁盘分区上,因为stage无法识别复杂的磁盘分区,如逻辑卷,软raid等。这也是为什么要单独创建一个简单的boot分区,而系统跟/做一个逻辑卷。但并不意味着boot要单独分区。
常用功能:
(1) 提供菜单、并提供交互式接口
e: 编辑模式,用于编辑菜单;
c: 命令模式,交互式接口;
(2) 加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏此菜单
(3) 为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
4.grub的交互式接口:
在系统启动时会有timeout用户选择的时长,按Enter键会进入一下界面(菜单选项):
grub如何识别设备:
(hd#,#)
hd#:表示第几块磁盘
#:表示第几块分区
(1)grub的命令行接口:
按下c键,会给出一个grub>命令行接口:
help命令:获取帮助列表
help KEYWORD:详细获取某个命令的帮助信息
find (hd#,#)/Path/To/Somefile:查找某个磁盘分区上的某个文件
root (hd#,#):设置grub的跟设备。
kernel /Path/To/Kernel_FILE
设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用cmdline参数;如:init=/path/to/init selinux=0
常用的内核启动参数:
磁盘相关启动参数:
root #指出启动的根文件系统 如:root=/dev/sda1
ro #指定根设备在启动过程中为read-only,默认情况下一般都是这样配的
rw #和ro类似,它是规定为read-write,可写
rootfstype #根文件系统类型,如:rootfstype=ext4
Console和kernel log相关启动参数:
console #console的设备和选项,如:console=tty0 console=ttyS0
debug #enable kernel debugging 启动中的所有debug信息都会打印到console上
quiet 静默模式 将kernel log level设置为KERN_WARNING,在启动中只非常严重的信息
loglevel #设置默认的console日志级别,如:loglevel=7 (0~7的数字分别为:KERN_EMERG,..,KERN_DEBUG)
time #设置在每条kernel log信息前加一个时间戳
内存相关的启动参数:
mem #指定kernel使用的内存量,mem=n[KMG]
hugepages #设置大页表页(4MB大小)的最多个数,hugepages=n
CPU相关的启动参数:
mce # Enable the machine check exception feature.
nosmp #Run as a single-processor machine. 不使用SMP(多处理器)
max_cpus #max_cpus=n, SMP系统最多能使用的CPU个数(即使系统中有大于n个的CPU)
Ramdisk相关的启动参数:
initrd #指定初始化ramdisk的位置,initrd=filename
noinitrd #不使用initrd的配置,即使配置了initrd参数
初始化相关启动参数:
init #在启动时去执行的程序,init=filename,默认值为/sbin/init
PCI相关的启动参数:
pci #pci相关的选项,我常使用pci=assign_buses,也使用过pci=nomsi
SELinux相关启动参数:
enforcing #SELinux enforcing状态的开关,enforcing=0表示仅仅是记录危险而不是阻止访问,enforcing=1完全enable,默认值是0
selinux #在启动时关闭或开启SELinux,selinux=0表示关闭,selinux=1表示开启selinux
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
(2)进入编辑模式:
每次手动引导启动系统,还是有点麻烦的,可以在按e键进入编辑模式:
在编辑模式下可以修改内核参数,也可以进入单用户模式下等等。
其实编辑模式下显示的内容就是grub的配置文件的内容:/boot/grub/grub.conf
5.grub的配置文件内容介绍:
配置文件/boot/gurb/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]:启动的内核
nitrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件;
password [--md5] STRING: 启动选定的内核或操作系统时进行认证;
(1)使用命令grub-md5-crypt生成密钥字符串为菜单或启动选定的内核进行认证
如:
生成加密字符串:
[[email protected] ~]# grub-md5-crypt
Password:
Retype password:
$1$bQjoR$xpjXuIPvDgccSKfEP3hE2.
编辑grub配置文件:
重启系统进行测试:
(2)进入单用户模式
(1) 编辑grub菜单(选定要编辑的title,而后使用e命令);
(2) 在选定的kernel后附加
1, s, S或single都可以;
(3) 在kernel所在行,键入“b”命令;
6.安装grub:
(1)grub-install
grub-install --root-directory=root /dev/DISK
其中--root-directory 的值为boot所在的目录。
如:boot目录在/mnt/boot 则--root-directory=/mnt
(2)grub
grub> root (hd#,#)
grub> setup(hd#)
7.grub损坏的修复:
(1)grub的配置文件损坏的情况下:
模拟grub配置文件损坏,丢失的情况下的修复过程:
先备份一下:# cp grub.conf{,.bak}
删除配置文件:# rm -rf grub.conf
重启系统:# init 6
重新启动系统之后,会出现grub命令行接口,在此处手动启动系统:
启动系统之后,在/boot/grub目录下在手动添加grub.conf配置文件。
(2)磁盘上的grub损坏的情况下:
模拟grub损坏,进行修复的过程:
模拟grub损坏:# dd if=/dev/zero of=/dev/sda bs=200 count=1
修复方法:
1.在grub已损坏,系统还没有重启的情况下:# grub-install --root-directory=/ /dev/sda 执行这个命令即可。
2.在grub已损坏,系统还没有重启的情况下:在grub的命令行模式下执行如下命令:
grub> root (hd0,0)
grub>setup (hd0)
eg:
3.grub已经损坏,系统已经关闭,无法启动的情况下:
有以下修复情况:
a.把损坏的磁盘拆卸下来,装载到一个好的系统上,在好的系统上利用grub-install命令进行对损坏的磁盘进行安装grub.
b.利用镜像文件进行修复:在系统启动时,以cdrom方式启动,启动之后会有一个选择界面的菜单,我们选择Rescue installed system 一项,即紧急救援模式。或者按Esc键,进入命令行模式,输入linux rescue 。boot:linux rescue
如:
然后执行以下命令即可:
# chroot /mnt/sysinit
# grub-install --root-directory=/ /dev/sda
# exit
# reboot