zoukankan      html  css  js  c++  java
  • 二十五、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

  • 相关阅读:
    assembly打包。
    调用jar程序,读取与jar同级的配置文件。
    java.lang.UnsupportedClassVersionError
    jar包程序 读取properties文件
    Mysql-5.7.10启动失败 。
    spring HibernateValidator 验证 子类不起作用
    Eclipse 启动Tomcat后web项目的classes的子文件夹中没有calss文件
    java.lang.Exception: Socket bind failed: [730013] An attempt was made to acc
    log4
    jquery.validationEngine
  • 原文地址:https://www.cnblogs.com/liuzhiyun/p/11436801.html
Copyright © 2011-2022 走看看