二十五、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>

  

注:

在说明配置方法之前,需要说明一个关键点,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)关机

wKiom1mlOCTTrM5MAAAvEuq7njE882.png

 

2)添加新的磁盘

 

wKioL1mlOTPieKtTAAHaLdxl3NE999.png

wKiom1mlOUbARDaHAAB87CROfhU030.png

wKioL1mlOTTTXmg1AACC3jbbPAA793.png

wKiom1mlOUeD5DghAABpUAJnNxQ463.png

wKioL1mlOTXDl8GxAADeELrB6SY972.png

 

3)启动虚拟机

wKiom1mlOheAloQ3AAAwuvEXbJo385.png

 

4)进入命令行

wKiom1mlOuvTKB9zAAAJ__w8zd8001.png

 

5)查看磁盘

wKiom1mlO0azNe3gAAArtnOK_6E856.png

 

6)分区

 

wKioL1mlO9zCkpqkAAACkkUiBxk551.png

wKioL1mlO9zTXXjfAAAPYcC2KPA156.png

wKiom1mlO--REyqqAAAhRpXcluo600.png

wKioL1mlO92h8cSpAAAPfm7bFcE274.png

wKiom1mlPILihMEiAAAKk4Qz2wg575.png

 

7)格式化

wKioL1mlPG-geALhAAAXQN0NTk8229.png

wKioL1mlPG-gzRGTAAAt0GEdEaw348.png

wKiom1mlPILhcEMjAAAvau8GH3A751.png

wKioL1mlPHDxV3iMAAAJgB06m34128.png

 

8)挂载

wKioL1mlPSGC8BwXAAADLTPmZt8032.png

wKiom1mlPTTxrTNbAAAK9RXOzwM962.png


9)安装grub

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

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

wKiom1mlPcDxJZtuAAAVVdxtRN0293.png

 

wKioL1mlPa3QVyv7AAANxzz2H80365.png

 

10)创建FHS格式文件种类

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

wKiom1mlPwmh9OSJAAADopUz7SE732.png

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

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

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

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

方法二如下:

wKiom1mlQI-CYkARAAACia7apQk245.png

wKioL1mlQHzSkDt4AAAUFSMP7CE076.png

wKioL1mlRZmCwE9KAAAPcxhUfn4969.png

wKioL1mlSHmyoUP0AAAF4aHtTu0124.png

wKioL1mlSQvT7zziAAAnrobENww666.png

12) 给出配置文件

wKioL1mlRgzBDz7jAAAT8cTjKTg357.png

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

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

wKiom1mlRk_Dv5GBAAAOMYO0bZs797.png

 

13)同步

wKioL1mlQO7xc0WAAAAFsyUuAMg952.png

14)关机

# shutdown -h now

 

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

 

16)、新建虚拟机

wKiom1mlQniwZDQjAABMgCwlyZA401.png

 

 

wKioL1mlQmaCzg__AABtZ2q6LJk280.png

 

15)启动新建的虚拟机

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

 

16)启动OK

wKioL1mlSfnCYOQ-AAAdtskm-dc267.png

 

四、问题一: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)、开机进入界面 开启虚拟机 

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

wKiom1mlMNHTV0r0AAARINf7Vc4421.png

保证光盘连接

 

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

  如下图:ESC出现的

wKiom1mlMZTydOavAAAHbovcsTU779.png

 

 图形界面中选择第三行

wKiom1mlMrKDBqyqAAbZxFUkE0Q440.png

 

4)、选择语言

wKioL1mlMzPwUAfHAABDYKKTu-I694.png

OK

 

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

wKioL1mlM3CT2rCIAAA-7lIuA-s249.png

OK,出现如图界面

wKiom1mlM7WiWXAVAAAJtLnaUWg110.png

 

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

wKiom1mlM9Ow3WrXAAAwuTXm_Gg017.png

NO 

 

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

wKiom1mlNB3h4cXXAABD0yaV8D4765.png

Continue

wKioL1mlNEPy49LOAAAOYRokHrE443.png

 

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

wKioL1mlNIbxHaF5AAAmS_KoFig067.png

OK

 

9)、

wKiom1mlNOvwrqJXAAASNHblzrY151.png

 

10)、选择第一个

wKioL1mlNP7hx-1uAAAdjLWrkJ8444.png

 

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

wKioL1mlNSqQ47vWAAAEWEzMeOU744.png

 

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

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

 

方法二:如下

12)、切换至原root根目录

13)、修复

wKioL1mlNgSzhmo-AABdi0oxsNw871.png

14)、重启测试

wKiom1mlNnigpTOPAAATDz03FnU440.png

 


开机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

posted @ 2019-08-31 19:46  幻落之瞳  阅读(1954)  评论(0编辑  收藏  举报