GRUB(Boot Loader)
GRUB,GRand Unified Bootlader ,是一个来自GUN项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
grub版本:
grub 0.x:grub(legacy) centos 5,6
grub 1.x:grub2 centos 7
grublegacy:
stage1:mbr,主引导目录;
stage1_5:mbr之后的扇区,让stage1中的BootLoader能识别stage2所在的分区上的文件系统;
stage2:磁盘分区(/boot/grub)
配置文件:/boot/grub/grub.conf <--/etc/grub.conf
工作流程:当系统启动时,如果要加载grub所在的磁盘时,会读取这个磁盘的MBR,同时会加载stage1,stage1会尝试读取后扇区的stage1_5阶段,stage1_5阶段会帮助stage1中的bootloader识别stage2所在的分区上的文件系统,然后加载stage2所在的磁盘分区,这个分区不但有stage2阶段,还有内核和ramdisk等。
Stage2及内核等通常放置于一个基本磁盘分区:
功用:
(1)提供菜单、并提供交互式接口
e:编辑模式,用于编辑菜单;
c:命令模式,交互式接口;
(2) 加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏此菜单
(3)为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
如何识别设备:
(hd#,#)
hd#:磁盘编号,用数字表示;从0开始编号
#:分区编号,用数字表示;从0开始编号
(hd0,0)
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 #指定根设备在启动过程中为readly-only,默认情况下一般都是这样配的
rw #和ro类似,为read-write,可写
rootfstype 根文件系统类型,如:rootfstype=ext4
console和kernel log相关的启动参数:
console #console的设备和选项,如:console=tty0console=ttyS0
debug #enable kerneldebugging 启动中的的所有debug信息
quiet 静默模式 将kernel loglevel设置为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;
boot:引导启动选定的内核;
手动在grub命令行接口启动系统:
grub> root(hd#,#)
grub> kernel /path/to/kernel_file roroot=/dev/device
grub> initrd /path/to/initramfs_file
grub> boot
配置文件:/boot/grub/grub.conf
配置项:
default=#:设定默认启动的菜单项;落单项(title)编号从0开始;
timeout=#:指定菜单项等待选项选择的时长;
splashp_w_picpath=(hd#,#)/path/to/xpm_pic_file:指明菜单背景图片文件路径;
hiddenmenu:隐藏菜单;
password [--md5] STRING:菜单编辑认证;
title TITLE:定义菜单项“标题”,可出现多次;
root (hd#,#):grub查找stage2及kernel文件所在的设备分区;为grub的根;
kernel /PATH/TO/VMLINUZ_FILE[PARAMENTERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE:内核匹配到的ramfs文件;
password [--md5] STRING:启动选定的内核或操作系统时进行认证;
grub-md5-crypt命令,可生成密钥。
对grub菜单编辑认证和启动选定内核认证:
1. 运用grub-md5-crypt命令生成密钥:
2. 编辑grub配置文件:
3. 重启系统,进入grub菜单模式,会发现需要密码才能进入菜单;
4. 输入密码,按回车键发现可以编辑;
5. 启动启动系统发现也需要密码;
6. 输入密码便可进入系统;
进入单用户模式:
(1) 编辑grub菜单(选定要编辑的title,而后使用e命令);
(2) 在选定的kernel,键入e命令进入编辑
(3) 在选定的kernel后附加1,s,S或single都可以,回车;
(4) 在kernel所在行,键入b命令;
(5) 进入单用户模式;
如需修改密码,进入单用户模式后可使用passwd命令修改密码;
安装grub:
(1) grub-install
grub-install--root-directory=ROOT /dev/DISK
(2) grub
grub>root(hd#,#)
grub > setup(hd#)
练习:
1. 新加磁盘,提供直接单独运行的bash系统
1) 对新加的硬盘进行分区,并检查分区是否成功;
2) 对分区进行格式化,/dev/sdb1,3格式化为ext4分区,/dev/sdb2格式化为swap分区
3) 创建挂在目录/mnt/boot,并将/dev/sdb1挂载至此目录;
4) 安装grub至新硬盘的基本文件系统上,使用grub-install,grub-install会自动寻找boot目录,指定根目录时只需要指定到boot目录的上一级目录即可;
5) 复制内核和initramfs到新硬盘的boot目录下;
6) 创建grub配置文件;
7) 为新硬盘的根分区创建常用的一级子目录
8) 复制bash程序到新硬盘的对应目录下;
9) 复制完bash后需要将bash所依赖的动态库复制到对应目录下,首先查看二进制程序所依赖的动态库;
10) 复制bash所依赖的动态库;
11) 切换根,并测试bash是否可用;
12) 找到磁盘文件,将其作为新的虚拟机的磁盘使用;
13) 新建虚拟机,磁盘选择现有的磁盘;
14) 此时开启虚拟机,系统启动失败,因为内核默认启用了selinux,故需要通过grub编辑模式在选择init之前输入selinux=0,这时启动将顺利进行,启动完毕后可以使用bash;
进入grub编辑模式,设置后重新启动,便可进入;
2. 破坏本机grub stage1,而后在救援模式下修复之;
1) 破坏本机的grub stage1;
#dd if=/dev/sdaof=/root/mbr.bak count=1 bs=512 备份
#dd if=/dev/zeroof=/dev/sda count=200 count=1 破坏
#sync 设置同步到磁盘
2) 如果系统还处于开机状态,使用grub-install命令安装修复;
#grub-install–root-directory=/ /dev/sda
#sync
或者可以用grub命令进入命令行模式进行修复;
#grub
grub>root(hd0, 0)
grub>setup(hd0)
3) 如果系统已经处于关机状态,便需要使用紧急救援模式;
1. 挂载,重启系统,选择rescure installed system,按esc键
2. 输入 linux rescue 回车;
3. 选择语言;
4. 选择键盘;
5. 开启网卡,此处也可以选择不开启;
6. 选择继续;
7. 选择ok继续;
8. 点击ok进入修复模式;
9. 切换到实际的根目录,执行grub-install命令;
10.用exit退出到修复模式,reboot重启系统便可顺利进入系统了;