二十五、grub (Boot Loader) 以及修复grub

时间:2021-06-13 09:57:12

双系统安装(先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 (Boot Loader) 以及修复grub

  • grub >  help find 

find (hd#,#)/PATH/TO/SOMEFIEL;定位某文件是否存在

   find  (hd0,0)/vm        如果该硬盘上有这个文件会自动补全

二十五、grub (Boot Loader) 以及修复grub

  先设定根设备

  • root  (hd#,#) :把那个磁盘设置为根设备

二十五、grub (Boot Loader) 以及修复grub

  • 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由于有文件系统驱动,所以能够直接访问分区

二十五、grub (Boot Loader) 以及修复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

二十五、grub (Boot Loader) 以及修复grub

  • 然后把生成的密码串---$1$aTuXQ0$Mv3PU1SopA33PfjgJdvpf1 ,分别添加在如图位置即可

二十五、grub (Boot Loader) 以及修复grub

  • sync
  • shutdown -r 0

二十五、grub (Boot Loader) 以及修复grub

下面提示:“enter”选定哪一个启动 或者“p”键先输入密码

二十五、grub (Boot Loader) 以及修复grub

三、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)关机

二十五、grub (Boot Loader) 以及修复grub

2)添加新的磁盘

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

3)启动虚拟机

二十五、grub (Boot Loader) 以及修复grub

4)进入命令行

二十五、grub (Boot Loader) 以及修复grub

5)查看磁盘

二十五、grub (Boot Loader) 以及修复grub

6)分区

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

7)格式化

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

8)挂载

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

9)安装grub

grub-install   --root-directory=/mnt   /dev/sdb (明确告诉根在那块硬盘即可自己会找boot目录)

注:配置文件只能只能自己写

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

10)创建FHS格式文件种类

二十五、grub (Boot Loader) 以及修复grub

11)复制bash程序及其相关的库

二十五、grub (Boot Loader) 以及修复grub

 注:ldd 出来的第一个文件为库文件的访问入口

二十五、grub (Boot Loader) 以及修复grub

方法一:把ldd 出来的四个动态共享依赖库复制到/mnt/sysroot/lib64下

    cp /bin/bash/   /mnt/sysroot/bin

    chroot /mnt/sysroot  根切换并检测能否运行bash

方法二如下:

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

12) 给出配置文件

二十五、grub (Boot Loader) 以及修复grub

该图中的root(hd0,0)是为了拆下磁盘后-------新虚拟机上的第一块磁盘,演示效果

  init=/bin/bash :要求限定/bin先bash 而不是sbin下的init;会直接把bash当做用户空间的进程来启动(当做程序运行是没问题的)

二十五、grub (Boot Loader) 以及修复grub

13)同步

二十五、grub (Boot Loader) 以及修复grub

14)关机

# shutdown -h now

15)查看第二个磁盘的名字

二十五、grub (Boot Loader) 以及修复grub

16)、新建虚拟机

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

二十五、grub (Boot Loader) 以及修复grub

15)启动新建的虚拟机

e键进入后 selinux=0要写在前面 否则无法启动

二十五、grub (Boot Loader) 以及修复grub

16)启动OK

二十五、grub (Boot Loader) 以及修复grub

四、问题一: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(紧急)求援模式

二十五、grub (Boot Loader) 以及修复grub

1)、挂载光盘 关机 --> 编辑虚拟主机 --> CD/DVD(IDE) --> 使用ISO镜像文件 --> 浏览选择DVD光盘

2)、开机进入界面 开启虚拟机

鼠标选中光盘图标-----右键选件连接即可

二十五、grub (Boot Loader) 以及修复grub

保证光盘连接

3)、选择×××标记的行或ESC,输入 linux rescue 后回车

  如下图:ESC出现的

二十五、grub (Boot Loader) 以及修复grub

 

 图形界面中选择第三行

二十五、grub (Boot Loader) 以及修复grub

4)、选择语言

二十五、grub (Boot Loader) 以及修复grub

OK

5)、键盘类型,选择OK,如图

二十五、grub (Boot Loader) 以及修复grub

OK,出现如图界面

二十五、grub (Boot Loader) 以及修复grub

6)、是否需要启动网络,选择NO(本地修复)

二十五、grub (Boot Loader) 以及修复grub

NO

7)、临时将/挂载在/mnt/sysp_w_picpath中

二十五、grub (Boot Loader) 以及修复grub

Continue

二十五、grub (Boot Loader) 以及修复grub

8)、告知已经找到磁盘,需要使用root,运行chroot /mnt/sysp_w_picpath即可

二十五、grub (Boot Loader) 以及修复grub

OK

9)、

二十五、grub (Boot Loader) 以及修复grub

10)、选择第一个

二十五、grub (Boot Loader) 以及修复grub

11)弹出:打印一个shell提示符

二十五、grub (Boot Loader) 以及修复grub

方法一: grub-install  --root-directory=/  /dev/sda

二十五、grub (Boot Loader) 以及修复grub

reboot重启时,把光盘断开连接即可完成了修复

方法二:如下

12)、切换至原root根目录

二十五、grub (Boot Loader) 以及修复grub

13)、修复

二十五、grub (Boot Loader) 以及修复grub

14)、重启测试

二十五、grub (Boot Loader) 以及修复grub


开机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的更多相关文章

  1. Spring Boot2 系列教程&lpar;二十五&rpar;Spring Boot 整合 Jpa 多数据源

    本文是 Spring Boot 整合数据持久化方案的最后一篇,主要和大伙来聊聊 Spring Boot 整合 Jpa 多数据源问题.在 Spring Boot 整合JbdcTemplate 多数据源. ...

  2. Bootstrap &lt&semi;基础二十五&gt&semi;警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

  3. VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池

    VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池 终端服务池是指由一台或多台微软终端服务器提供服务的桌面源组成的池.终端服务器桌面源可交付多个桌面.它具有以下特征: 1.终端 ...

  4. WCF技术剖析之二十五&colon; 元数据(Metadata)架构体系全景展现&lbrack;元数据描述篇&rsqb;

    原文:WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[元数据描述篇] 在[WS标准篇]中我花了很大的篇幅介绍了WS-MEX以及与它相关的WS规范:WS-Policy.WS-Tra ...

  5. Bootstrap入门(二十五)JS插件2:过渡效果

    Bootstrap入门(二十五)JS插件2:过渡效果 对于简单的过渡效果,只需将 transition.js 和其它 JS 文件一起引入即可.如果你使用的是编译(或压缩)版的bootstrap.js  ...

  6. JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

    JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...

  7. JAVA之旅(二十五)——文件复制&comma;字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine

    JAVA之旅(二十五)--文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine 我们继续IO上个篇 ...

  8. Java进阶&lpar;二十五&rpar;Java连接mysql数据库&lpar;底层实现&rpar;

    Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...

  9. 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)

    策略模式 Strategy   与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...

随机推荐

  1. Hibernate加载数据失败failed to lazily initialize a collection of role

    在测试获取数据库中的数据或者在页面获取时,有时会遇到这样的错误提示: failed to lazily initialize a collection of role: com.exam.entity ...

  2. Python笔记总结week5

    Decorator:多层装饰器 #双层装饰器(用户登录,权限) #多层: 调用从最外层到最内层函数,返回值则从最内到最外层函数 USER_INFO = {} #USER_INFO['is_login' ...

  3. linux init&period;d脚本编写模板

    #!/bin/bash ### BEGIN INIT INFO # # Provides: location_server # Required-Start: $local_fs $remote_fs ...

  4. List&lpar;列表&rpar;

    List(列表): List的特征是其元素以线性方式存储,集合中可以存放重复对象. List接口主要实现类包括: ArrayList() : 代表长度可以改变得数组.可以对元素进行随机的访问,向Arr ...

  5. Greetings

    1,Common English Greetings Hey! Hey man! Hey girl! Hi. How's it going? How are you doing? What's up? ...

  6. 学习笔记70—Photoshop画齿轮

    具体步骤如下: 1)选择多边形工具: 2)设置齿轮个数及颜色相应参数: 3)画出模型: 4)找到上图模型的中心 (借助:ctrl + T),选择椭圆工具,并 长按Shift+Alt, 画出圆: 5) ...

  7. 不同应用共享redis应用,但分数据库存储数据

    日常开发工作中,常常遇到这种情况 项目A ,需要使用redis 项目B ,也需使用redis …… 原来傻乎乎的在服务器上装几个redis,通过不同的端口号来进行使用 其实redis可用有16个数据库 ...

  8. openldap系列

    openldap系列 阅读视图 系列介绍 openldap系列目录 1. 系列介绍 本系列文档大部分来自于郭大勇老师的<OpenLDAP实战指南>,少部分来自于互联网.所有文档均已经过本人 ...

  9. asp&period;net core读取appsettings&period;json,如何读取多环境开发配置

    摘要 在读取appsettings.json文件中配置的时候,觉得最简单的方式就是使用asp.net core注入的方式进行读取了. 步骤 首先根据配置项的结构定义一个配置类,比如叫AppSettin ...

  10. iOS 播放远程网络音乐的核心技术点

    一.前言 这两天做了个小项目涉及到了远程音乐播放,因为第一次做这种音乐项目,边查资料边做,其中涉及到主要技术点有: 如何播放远程网络音乐 如何切换当前正在播放中的音乐资源 如何监听音乐播放的各种状态( ...