二十五、grub (Boot Loader) 以及修复grub
作者:互联网
双系统安装(先Windows后Linux,以免windows NTloader会覆盖Linux loader)
GRUB Grand Uniform Bootloader
CentOS5,6 grub 0.X系 : grub legacy(设备或分区编号从0开始)
CentOS7 grub 1.X系 :grub2(设备或分区编号从1开始)
一、CentOS5,6 grub应用:
1、grub的工作流程
stage1 : mbr中
stage1.5 :mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统 (存储stage2所在分区的驱动)
stage2 :提供菜单,加载内核和ramdisk至内存,移交控制权 (磁盘分区/boot/grub)
2、grub配置文件
通常boot(stage2)及内核等通常放置于一个基本磁盘分区上:
功能: (1)提供菜单、并提供交互式接口; e:编辑模式,用于编辑菜单 c:命令模式,交互式接口 (2)加载用户选择的内核或操作系统 允许传递参数给内核 可隐藏此菜单 (3)为菜单提供了保护机制 为编辑菜单进行认证 为启动内核或操作系统进行认证
boot为一个独立的分区, /可以为普通分区或lvm。访问boot通过挂载在根中实现
内核: kernel /vmlinuz, initrd /initramfs
boot和根在同一个分区,/必须为普通分区
内核: kernel /boot/vmlinuz, initrd /boot/initramfs
3、grub的功能
提供菜单 : tile TITLE
加载用户选择的kernel及ramdisk : kernel path parameters , initrd path
为菜单提供保护机制(kernel和菜单编辑认证) : password --md5 STRING
二、grub的命令行接口
2.1、help :获取帮助列表
格式: help KEYWORD(关键字):详细帮助信息
help root : 对grub而言---第二阶段stage2所在的磁盘分区才叫根,而不是真正文件系统(操作系统)所在的根
- grub > help find
find (hd#,#)/PATH/TO/SOMEFIEL;定位某文件是否存在
find (hd0,0)/vm 如果该硬盘上有这个文件会自动补全
先设定根设备
- root (hd#,#) :把那个磁盘设置为根设备
- kernel /PATH/TO/KERNEL_FILE:设定本次启动时用到的内核文件(最后一个字符z表示压缩存放)
- 额外还可以添加许多内核支持使用的cmdline参数
例如 :init=/path/ti/init ,selinux=0
- initrd /PATH/TO/INITRAMFS_FILE :设定为选定的内核提供额外文件的ramdisk (注:必须与内核版本号完全一致)
- boot :引导启动选定的内核
2.2、如何识别设备
root (hd#,#) 指定引导设备在哪个设备的哪个分区上。
hd# :磁盘编号,用数字表示,从0开始,
# : 分区编号,用数字表示;从0开始编号
(hd0,0):表示第一个块硬盘,第一个分区
注:grub2系列 (hd1,1)示第一个块硬盘,第一个分区
2.3、此根非彼根
系统启动起来后,任何一个存储设备要想被访问到,其前提就是在当前根文件系统的某个路径下面挂载某个设备,当做访问入口。
grub刚启动时候,内核未被加载,操作系统更未启动,所以不能通过根文件系统下的boot入口来访问grub分区;但是现在需要访问grub分区,要不然怎么加载grub_stage2呢?
直接去找新分区来的简便些,grub由于有文件系统驱动,所以能够直接访问分区
2.4、手动在grub命令行接口启动系统:
grub> root (hd#,#) ## 引导设备位置 左0: 第一个磁盘设备,右0:第一个分区 grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE rhgb quiet grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
2.5、配置文件: /etc/grub.conf -> /boot/grub/grub.conf
/boot/grub/menu.lst -> ./grub.conf
2.6、配置格式
default=# ## 设置默认启动的菜单项:落单项(title)编号从0开始 timeout=# ## 指定菜单项等待选项选择的时长,单位秒 splashimage=(hd0,0)/grub/splash.xpm.gz # 指明菜单背景图片文件路径 (图片要求格式:640X480 14位索引色) hiddenmenu ## 是否隐藏菜单 password --md5 STRING ## 菜单加密功能,STRING由grub-md5-crypt 或 openssl passwd -1 -salt STRING 生成 title CentOS 6 (2.6.32-696.el6.i686) ## 定义菜单项的标题(可出现多次:引导不同内核版本) root (hd0,0) ## 引导设备位置 左0: 第一个磁盘设备,右0:第一个分区
grub查找stage2及kernel文件所在设备分区:为grub的“根” kernel /vmlinuz-2.6.32-696.el6.i686 ro root=/dev/mapper/myvg-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 rd_LVM_LV=myvg/lv_swap KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet rd_NO_DM rd_LVM_LV=myvg/lv_root rhgb quiet ##内核文件路径,及传递给内核的参数;只读方式root后面为正真文件系统的根
initrd /initramfs-2.6.32-696.el6.i686.img ##内核匹配的ramfs文件 (指定initramfs的路径) password --md5 STRING ##启用选定的内核或操作系统时进行认证 注意: root,kernel,initd格式的缩进
#一个title 指定一个操作系统或者一个内核 对于grub而言,所有类型硬盘一律为hd, (hd#,n) #表示第几个磁盘,最后的n表示对应磁盘的分区 rhgb :为色彩显示
quiet :安静模式(屏幕不会输出内核检测的信息)
注释: kernel /vmlinuz PARAMETERS
当stage1.5找到stage2时,内核只识别stage2所在的分区,此分区为/,所以分区的vmlinuz路径为,/vmlinuz
PARAMETERS:
ro 以只读方式挂载root=PATH指明的路径的根
root=<路径> 指明root的位置
quiet 静默模式
selinux=0 不启动selinux
init=/path/to/somefile 开机后,init程序为哪个。默认为/sbin/init
1,s,S,single 单用户模式
<更多参数: google: kernel command line parameters>
2.7、实例
- 添加全局密码认证:使用grub-md5-crypt命令
$1$aTuXQ0$Mv3PU1SopA33PfjgJdvpf1
- 然后把生成的密码串---$1$aTuXQ0$Mv3PU1SopA33PfjgJdvpf1 ,分别添加在如图位置即可
- sync
- shutdown -r 0
下面提示:“enter”选定哪一个启动 或者“p”键先输入密码
三、grub的安装
安装grub: grub-install命令(完整安装) 重新安装grub stage1,1.5,2
grub-install命令 grub-install --root-directory=DIR DEIVCE --root-directory=DIR 指向boot目录的上一级目录 DEVICE 给哪个设备安装grub
实例:设置grub,并拆下该磁盘,装在新虚拟机上步骤如下:
1)关机
2)添加新的磁盘
3)启动虚拟机
4)进入命令行
5)查看磁盘
6)分区
7)格式化
8)挂载
9)安装grub
grub-install --root-directory=/mnt /dev/sdb (明确告诉根在那块硬盘即可自己会找boot目录)
注:配置文件只能只能自己写
10)创建FHS格式文件种类
11)复制bash程序及其相关的库
注:ldd 出来的第一个文件为库文件的访问入口
方法一:把ldd 出来的四个动态共享依赖库复制到/mnt/sysroot/lib64下
cp /bin/bash/ /mnt/sysroot/bin
chroot /mnt/sysroot 根切换并检测能否运行bash
方法二如下:
12) 给出配置文件
该图中的root(hd0,0)是为了拆下磁盘后-------新虚拟机上的第一块磁盘,演示效果
init=/bin/bash :要求限定/bin先bash 而不是sbin下的init;会直接把bash当做用户空间的进程来启动(当做程序运行是没问题的)
13)同步
14)关机
# shutdown -h now
15)查看第二个磁盘的名字
16)、新建虚拟机
15)启动新建的虚拟机
e键进入后 selinux=0要写在前面 否则无法启动
16)启动OK
四、问题一:grub的修复(但未重启)
1、在命令行中: grub 只是stage1(MBR 512)被破坏时,才能修复.
2、开机失效: rescue模式
1、在命令行中: grub
1)备份mbr
[root@localhost ~]# dd if=/dev/sda of=/root/mbr.bak bs=512 count=1
2)破坏mbr的stage1(别破坏分区表)
[root@localhost ~]# dd of=/dev/sda if=/dev/zero bs=200 count=1 (小于446即可)
[root@localhost ~]# sync
3)用grub命令行修复
方法一:并不需要当前根下有boot目录,它会自动装好
[root@localhost ~]# grub-install --root-directory=/ /dev/DISK
方法二:如下(只要没有重启,只是修复grub)
注:指明的root设备上,必须事先存在一个grub目录,里面stage1、stage1_5、stage2等等文件都必须存在
a、进入grub命令行
[root@localhost ~]# grub Probing devices to guess BIOS drives. This may take a long time. GNU GRUB version 0.97 (640K lower / 3072K upper memory) [ Minimal BASH-like line editing is supported. For the first word, TAB lists possible command completions. Anywhere else TAB lists the possible completions of a device/filename.] grub>
b、设置引导设备位置
grub> root (hd0,0) root (hd0,0) Filesystem type is ext2fs, partition type 0x83
c、给设备安装grub
grub> setup (hd0) (该出指的是硬盘) setup (hd0) Checking if "/boot/grub/stage1" exists... no Checking if "/grub/stage1" exists... yes Checking if "/grub/stage2" exists... yes Checking if "/grub/e2fs_stage1_5" exists... yes Running "embed /grub/e2fs_stage1_5 (hd0)"... 27 sectors are embedded. succeeded Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded Done.
d、重启验证
grub> quit quit [root@localhost ~]# reboot [root@localhost ~]#
五、问题二:rescue(紧急)求援模式
1)、挂载光盘 关机 --> 编辑虚拟主机 --> CD/DVD(IDE) --> 使用ISO镜像文件 --> 浏览选择DVD光盘
2)、开机进入界面 开启虚拟机
鼠标选中光盘图标-----右键选件连接即可
保证光盘连接
3)、选择×××标记的行或ESC,输入 linux rescue 后回车
如下图:ESC出现的
图形界面中选择第三行
4)、选择语言
OK
5)、键盘类型,选择OK,如图
OK,出现如图界面
6)、是否需要启动网络,选择NO(本地修复)
NO
7)、临时将/挂载在/mnt/sysp_w_picpath中
Continue
8)、告知已经找到磁盘,需要使用root,运行chroot /mnt/sysp_w_picpath即可
OK
9)、
10)、选择第一个
11)弹出:打印一个shell提示符
方法一: grub-install --root-directory=/ /dev/sda
reboot重启时,把光盘断开连接即可完成了修复
方法二:如下
12)、切换至原root根目录
13)、修复
14)、重启测试
标签:grub,hd0,boot,分区,Boot,Loader,内核,root 来源: https://www.cnblogs.com/liuzhiyun/p/11436801.html