• Linux学习-71-GRUB手动安装方法


    16.13 GRUB手动安装方法
    • 需要手工安装 GRUB 主要有两种情况:
      1. Linux 系统原先不是使用 GRUB 作为引导程序而现在想要使用 GRUB 来作为引导程序;
      2. MBR 中的引导程序被覆盖,需要在 MBR 中重新安装 GRUB,如先安装了 Linux 系统,后安装了 Windows 系统。
    16.13.1 系统中没有GRUB,需要手工安装
    • Linux 系统中没有安装 GRUB,我们需要重新安装 GRUB;或者打算把不是启动分区的某个分区变成启动分区。比如新建了一个分区 /dev/sdb1,并挂载到了 /tdisk/ 目录上,我们查看一下新建立的分区,命令如下:
    [root@CncLucZK ~]# df
    文件系统 1K-块 已用 可用 已用% 挂载点
    /dev/sda3 19923216 1787736 17123412 10% /
    tmpfs 312672 0 312672 0% /dev/shm
    /dev/sda1 198337 26359 161738 15% /boot
    /dev/sdb1 2071384 68632 1897528 4% /tdisk
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 这个分区不是系统的默认启动分区(系统默认启动分区是 /boot 分区)。我们用这个分区模拟一个不是采用 GRUB 作为默认引导程序的 Linux 硬盘,在这个分区中手工安装 GRUB 引导程序。也就是说,这个测试成功后,/boot 分区可以启动系统,/tdisk 分区也可以启动系统。具体安装步骤如下:
    1. 使用 grub-install 命令在要启动系统的分区中安装 GRUB 相关文件
    • 在 /boot 分区中有一个 /boot/grub/ 目录,这个目录中保存的就是 GRUB 的相关文件(如文件系统的 Stage 1.5 文件)。我们查看一下 /boot 分区中的这个目录,如下:
    [root@CncLucZK ~]#ls /boot/grub/
    device.map ffs_stage1_5 jfs_stage1_5 reiserfs_stage1_5 stage2
    xfs_stage1_5 e2fs_stage1_5 grub.conf menu.lst splash.xpm.gz
    ufs2_stage1_5 fat_stage1_5 iso9660_stage1_5 minix_stage1_5 stage1
    vstafs_stage1_5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 但是在 /tdisk 目录中并不存在这些文件,所以第一步就是要在 /tdisk 目录中安装这些 GRUB 相关文件,具体采用 grub-install 命令。这个命令的格式如下:
    [root@CncLucZK ~]# grub-install [选项] 设备文件名
    
    • 1
    • 选项:

      • -root-directory=DIR:DIR 为实际目录,也就是手工指定 GRUB 相关文件的安装目录;
    • 命令标准格式:

    [root@CncLucZK ~]# grub-install /dev/sda
    #因为默认 GRUB 就是安装到 /dev/sda 中的,所以不需要指定 --root-directory 选项
    
    • 1
    • 2
    • 需要把 GRUB 安装到 /tdisk 分区,所以需要执行以下命令:
    [root@CncLucZK ~]# grub-install --root-directory=/tdisk/dev/sdb1
    #把GRUB安装至/tdisk分区
    Probing devices to guess BIOS drives. This may take a long time.
    Installation finished. No error reported.
    This is the contents of the device map/tdisk/boot/ grub/device.map.
    Check if this is correct or not. If any of the lines is incorrect,
    fix it and re-rnn the script 'grub-install'.
    (fd0) /dev/fd0
    (hd0) /dev/sda
    (hd1) /dev/sdb
    #说明安装的设备文件名
    #查看一下:新分区的grub目录
    [root@CncLucZK ~]# ll /tdisk/boot/grub/
    总用量272
    -rw-r--r--. 1 root root 45 5 月 22 23:51 device.map
    -rw-r--r--. 1 root root 13392 5 月 22 23:51 e2fs_stage1_5
    -rw-r--r--. 1 root root 12632 5 月 22 23:51 fat_stage1_5
    -rw-r--r--. 1 root root 11760 5 月 22 23:51 ffs_stage1_5
    -rw-r--r--. 1 root root 11768 5 月 22 23:51 iso9660_stage1_5
    -rw-r--r--. 1 root root 13280 5 月 22 23:51 jfs_stage1_5
    -rw-r--r--. 1 root root 11968 5 月 22 23:51 minix_stage1_5
    -rw-r--r--. 1 root root 14424 5 月 22 23:51 reiserfs_stage1_5
    -rw-r--r--. 1 root root 512 5月 22 23:51 stage1
    -rw-r--r--. 1 root root 125984 5月 22 23:51 stage2
    -rw-r--r--. 1 root root 12036 5 月 22 23:51 ufs2_stage1_5
    -rw-r--r--. 1 root root 11376 5 月 22 23:51 vstafs_stage1_5
    -rw-r--r--. 1 root root 13976 5 月 22 23:51 xfs_stage1_5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    GRUB 的相关文件已经安装到 /tdisk/boot/grub/ 目录中。当然,这些文件还是需要 GRUB 的配置文件来读取的。但是/tdisk/boot/grub/ 目录中没有 grub.conf 或 menu.lst 配置文件,这些配置文件还是需要依赖 /boot/grub/ 目录的。

    • 注意,如果系统中没有 grub-install 命令,则说明没有 GRUB 软件,这时可以源码包安装,也可以 RPM 包安装。RPM 包的安装命令如下:
    [root@CncLucZK ~]# yum -y install grub
    
    • 1

    2.修改GRUB的配置文件:一般GRUB 是已经安装好的,所以可以直接修改 /boot/grub/grub.conf 配置文件。但如果是没有安装过 GRUB 的 Linux 系统手工安装 GURB,就需要自己建立 GRUB 配置文件了。那么我们修改 /boot/grub/grub.conf 配置文件如下:

    [root@CncLucZK ~]# cat /boot/gmb/grub.conf
    default=0
    timeout=5
    splashimage=(hd0,0)/grub/splash.xpm.gz
    hiddenmenu
    
    title CentOS (2.6.32-279.el6.i686)
    root(hd0,0)
    kemel/vmlinuz-2.6.32-279.el6.i686 ro
    root=UUID=b9a7a1 a8-767f-4a87-8a2ba535edb362c9 rd_NO_LUKS
    KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkemel=auto
    LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
    initrd/initramfs-2.6.32-279.el6.i686.img 
    
    title CentOS tdisk #给自己这个启动分区起个名字
    root(hd1,0)
    #注意启动分区的位置是/dev/sdb1,也就是/tdisk目录
    chainloader +1
    #使用当前分区所在的启动扇区启动系统
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 在 title CentOS tdisk 段中不能指定内核镜像和 initramfs 虚拟文件系统,因为在 /tdisk/boot/ 目录中只有 grub 目录,而没有内核镜像文件和 initramfs 虚拟文件系统的镜像文件,所以需要通过 chainloader 来调用启动扇区。

    3.安装GRUB到/dev/sdb1分区的启动扇区中:通过 GRUB 配置文件中的 chainloader 来调用启动扇区,但是 /dev/sdb1 这个分区是新建立的,它的启动扇区中并没有 GRUB 程序。所以最后一步就是要在 /dev/sdb1 分区的启动扇区中安装 GRUB。这时就要利用 GRUB 交互模式了,如下:

    [root@CncLucZK boot]# grub
    #启动进入GRUB交互模式
    grub> root (hd0,0)
    root (hd0,0)
    Filesystem type is ext2fs, partition type 0x83
    #设定GRUB的主目录,这里只能是(hd0,0),因为内核和虚拟文件系统安装在/dev/sdal中,也就是/boot分区中
    grub> find /boot/grub/stagel
    find /boot/grub/stagel (hd1,0)
    #查询一下Stage 1安装的分区
    #存在一点问题,我们在/boot和/tdisk分区中都安装了GRUB,只看到了/tdisk分区
    grub> find /grub/stagel
    find /grub/stagel (hd0,0)
    #只有这样才能看到/boot分区中的Stage 1。因为/boot分区是一个单独分区。上面能看到是因为/tdisk才是分区,而/boot/grub/只是/tdisk分区中的目录
    grub> find /vmlinuz-2.6.32-279.el6.1686
    find /vmlinuz-2.6.32-279.el6.i686 (hd0,0)
    #能够查到内核位置。注意不能通过/boot/vmlinuz-2.6.32-279.el6.i686查询,还是因为/boot是单独分区。但是这次/tdisk分区中没有内核
    grub> setup (hd1,0)
    setup (hd1,0)
    Checking if "/boot/grub/stagel" exists... no
    Checking if "/grub/stagel" exists... yes
    Checking if "/grub/stage2" exists... yes
    Checking if "/grub/e2fs_stage1_5" exists... yes
    Running "embed /grub/e2fs_stage1_5 (hd1,0)"... failed (this is not fatal)
    Running "embed /grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal)
    Running "install /grub/stagel d (hd1,0) /grub/stage2 p /grub/grub.conf "...
    succeeded
    Done
    #在/tdisk分区的启动扇区中安装GRUB。虽然有两个failed,但这只是两个文件系统的Stage 1.5文件没有安装,并不影响
    grub> quit
    #退出GRUB交互界面
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 这时 GRUB 安装完成了,可以重新启动试验一下了。重启后可以看到如下界面:
      在这里插入图片描述

    当然 /tdisk 分区中并没有真正的内核,所以最终还是要靠 /boot 分区启动。如果是多内核并存的,就可以真正启动了。

    • 总结一下,在 Linux 系统中安装 GRUB,或者在新分区中安装 GRUB 的步骤如下:
      • 需要在 Linux 系统的指定分区中安装 GRUB 的相关文件。这是通过 grub-install 命令实现的。
      • 需要按照要求修改 GRUB 的配置文件,也就是 /boot/grub/grub.conf。
      • 需要在分区的启动扇区中安装 GRUB,这是通过 grub 命令的交互模式实现的。
    16.13.2 MBR中的GRUB被覆盖,需要重新安装GRUB
    • 这种情况最常见的就是先安装了 Linux 系统,后安装了 Windows 系统,导致 MBR 中的 GRUB 被覆盖。而 Windows 系统的启动引导程序又不能识别 Linux 系统,从而导致 Linux 系统不能正常启动。这种情况解决起来比第一种要简单得多,因为不需要安装 GRUB 的相关文件和修改 GRUB 的配置文件,也就是第一种情况的第一步和第二步不需要执行,因为这是已经安装和修改好的。只需要执行第三步,覆盖 MBR 中的启动引导程序即可。
    • 但是这里的问题是,应该在什么地方启动 GRUB 的交互模式呢?第一种情况是,我们是在 Linux 的命令行中执行 grub 命令,来启动 GRUB 交互模式。第二种情况是已经不能正常启动 Linux 系统了,当然也就没有 Linux 的命令行了。在这种情况下,我们需要先利用 Linux 的光盘修复模式,使用光盘来启动 Linux,进入 Linux 的命令行,再指定 grub 命令。
    • 进入了光盘修复模式中的 Linux 命令行,执行如下命令即可:
    sh-4.1#grub
    #启动GRUB交互界面。提示符不一样了,那是因为系统是从光盘启动的,所以环境变量没有生效
    grub>root (hd0.0)
    #同样需要设置GRUB的主目录
    grub>setup (hd0)
    #直接把GRUB安装到MBR中,所以不需要指定分区
    grub>quit
    #退出
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 重启系统之后,就可以发现熟悉的 GRUB 界面又回来了。这种安装 GRUB 的方式要比第一种情况简单,因为这并不是全装,仅仅是覆盖安装而已。

    参考文献:
    Linux GRUB手动安装方法详解

    下一篇:Linux学习-72-GRUB加密方法(2种加密方式)
  • 相关阅读:
    因果发现方法概述
    logback.xml springboot 项目通用logback配置,粘贴即用,按日期生成
    【测试工具】Jmeter常用beanshell
    神经网络与深度学习笔记(1)——实践基础
    基于Python实现的AStar求解八数码问题
    Layui数据表格中checkbox位置不居中
    【无标题】
    小程序中如何给会员卡设置到期时间
    CUDA C并行编程:开发环境搭建
    51单片机的简易篮球计分器倒计时仿真设计( proteus仿真+程序+原理图+报告+讲解视频)
  • 原文地址:https://blog.csdn.net/weixin_42045639/article/details/128193320