二十五、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)及内核等通常放置于一个基本磁盘分区上:
功能: ()提供菜单、并提供交互式接口;
e:编辑模式,用于编辑菜单
c:命令模式,交互式接口
()加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏此菜单
()为菜单提供了保护机制
为编辑菜单进行认证
为启动内核或操作系统进行认证
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,)/grub/splash.xpm.gz # 指明菜单背景图片文件路径 (图片要求格式:640X480 14位索引色)
hiddenmenu ## 是否隐藏菜单
password --md5 STRING ## 菜单加密功能,STRING由grub-md5-crypt 或 openssl passwd - -salt STRING 生成
title CentOS (2.6.-.el6.i686) ## 定义菜单项的标题(可出现多次:引导不同内核版本)
root (hd0,) ## 引导设备位置 左0: 第一个磁盘设备,右0:第一个分区
grub查找stage2及kernel文件所在设备分区:为grub的“根”
kernel /vmlinuz-2.6.-.el6.i686 ro root=/dev/mapper/myvg-lv_root rd_NO_LUKS LANG=en_US.UTF- 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.-.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>
注:
在说明配置方法之前,需要说明一个关键点,boot是否是一个独立的分区,它影响后面路径的配置。
在一个正常的操作系统中查看/boot/grub/grub.conf文件,可以在NOTICE段看到提示,说你是否拥有一个独立的boot分区?如果有则意味着kernel和initrd的路径是从/开始的而不是/boot开始的,如/vmlinuz-xxx,如果没有独立的boot分区,则kernel和initrd的路径中需要指明boot路径,例如Boot没有分区而是在/文件系统下的一个目录,则/boot/vmlinuz-xxx。
root (hd0,0)定义grub识别的根。一般定义的都是boot所在的分区,grub只能识别hd,所以这里只能使用hd,hd0表示在第一块磁盘上,hd0,0的第二个0表示boot在第一个分区上,grub2在分区的计算上是从1开始的,这是传统grub和grub2不同的地方。
kernel定义内核文件的路径和启动参数,等价于grub2的linux命令或linux16命令。首先说明参数,ro表示只读,root=/dev/sda[N]或者root=UUID="device_uuid_num"指定根文件系统所在的分区,这是必须的参数。rhgb表示在操作系统启动过程中使用图形界面输出一些信息,将其省略可以加快启动速度,quiet表示启动操作系统时静默输出信息。再说明路径,如果是boot是独立分区的,则kernel的路径定义方式为/vmlinuz-xxx,如果没有独立分区,则指明其绝对路径,一般都是在根文件系统下的目录,所以一般为/boot/vmlinuz-xxx。
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= count=
2)破坏mbr的stage1(别破坏分区表)
[root@localhost ~]# dd of=/dev/sda if=/dev/zero bs= 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,)
root (hd0,)
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)"... 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图象修改
1、安装gimp
yum install gimp
2、进入x windows
startx &
3、进入application --> GNU gimp2
4、图象(p_w_picpath) --> scole(缩放)
640 x 480 convert
5、图象 --> 模式(mode) --> 索引(index) 14
Floyd-Steinburg(减少颜色渗色)
6、文件 --> 保存 as --> lll.xpm
extend (xpm)
7、将保存在/root/目录中的文件压缩
gzip lll.xpm
8、移动至引导分区中
mv 111.xpm.gz /boot
9、修改/etc/grub.conf 或 /boot/grub/menu.lst 或 /boot/grub/grub.conf
splashp_w_picpath=(hd0,0) /lll.xpm.gz
10、重启
reboot
可参考:https://blog.csdn.net/weixin_42758707/article/details/92760614
https://blog.csdn.net/weixin_42758707/article/details/92764021
二十五、grub (Boot Loader) 以及修复grub的更多相关文章
- Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
本文是 Spring Boot 整合数据持久化方案的最后一篇,主要和大伙来聊聊 Spring Boot 整合 Jpa 多数据源问题.在 Spring Boot 整合JbdcTemplate 多数据源. ...
- Bootstrap <基础二十五>警告(Alerts)
警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...
- VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池
VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池 终端服务池是指由一台或多台微软终端服务器提供服务的桌面源组成的池.终端服务器桌面源可交付多个桌面.它具有以下特征: 1.终端 ...
- WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[元数据描述篇]
原文:WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[元数据描述篇] 在[WS标准篇]中我花了很大的篇幅介绍了WS-MEX以及与它相关的WS规范:WS-Policy.WS-Tra ...
- Bootstrap入门(二十五)JS插件2:过渡效果
Bootstrap入门(二十五)JS插件2:过渡效果 对于简单的过渡效果,只需将 transition.js 和其它 JS 文件一起引入即可.如果你使用的是编译(或压缩)版的bootstrap.js ...
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...
- JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine
JAVA之旅(二十五)--文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine 我们继续IO上个篇 ...
- Java进阶(二十五)Java连接mysql数据库(底层实现)
Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...
- 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)
策略模式 Strategy 与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...
随机推荐
- hdu 6208 上一个kmp模板
#include <cstdio> #include <cstring> #include <iostream> #include <queue> #i ...
- docker 学习1 WSL docker ,Windows docker
获取Linux内核版本 //使用 lsb_release -a 可见我电脑上的 WSL Linux 版本是 Ubuntu的. 安装docker for ubuntu (遇到问题) 转[http://b ...
- Ajax中解析Json的两种方法
eval(); //此方法不推荐 JSON.parse(); //推荐方法 一.两种方法的区别 我们先初始化一个json格式的对象: var jsonDate = '{ "name" ...
- 把一个质量为M0 的物体加速到 时间慢100倍 需要多大能量
洛伦兹系数 γ = 100: 运动时候的质量 M = γM0 速度 v = c*sqrt(1-1/γ2) E = 1/2 * m0c2 *γ* (1-1/γ2) 如果一个60kg 的人想要加 ...
- python常见函数运用【一】
1.Python hasattr() 函数 描述hasattr() 函数用于判断对象是否包含对应的属性. 语法 hasattr 语法: hasattr(object, name)参数object -- ...
- JavaScript Drum kit
用 JavaScript 实现网页鼓乐器,相关的初始代码在 JavaScript30 官网和 GitHub 上已经存在.我把 sound 文件夹下的音频全部替换掉了,一些相关解释也直接在注释中标明. ...
- 【ASE模型组】Hint::neural 模型与case study
模型 基于搜索的提示系统 我们的系统用Pycee针对语法错误给出提示.然而,对于语法正确.结果错误的代码,我们需要另外的解决方式.因此,我们维护一些 (错误代码, 相应提示) 的数据,该数据可以由我们 ...
- <a>标签的target 属性 全局作用
局部(或全局)设置<a>标签的target属性 对于超链接<a>标签,target属性的设置是比较关键的,在不同的用户场景下选用适合的新页面载入方式,可以大 ...
- 安装mysql 好不容易成功了 却连不上
[mysqld] skip-grant-tables datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbo ...
- linux下无法删除文件的解决办法
1.使用 lsattr 命令查看文件的附加属性.查看文件是否被赋予了 a , i 属性,如果含有这两个属性,文件是不能被删除的. a:让文件或目录仅供附加用途: b:不更新文件或目录的最后存取时间: ...