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

news2024/9/22 2:05:48

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
  • 这个分区不是系统的默认启动分区(系统默认启动分区是 /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
  • 但是在 /tdisk 目录中并不存在这些文件,所以第一步就是要在 /tdisk 目录中安装这些 GRUB 相关文件,具体采用 grub-install 命令。这个命令的格式如下:
[root@CncLucZK ~]# grub-install [选项] 设备文件名
  • 选项:

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

[root@CncLucZK ~]# grub-install /dev/sda
#因为默认 GRUB 就是安装到 /dev/sda 中的,所以不需要指定 --root-directory 选项
  • 需要把 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

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

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
#使用当前分区所在的启动扇区启动系统
  • 在 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交互界面
  • 这时 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
#退出
  • 重启系统之后,就可以发现熟悉的 GRUB 界面又回来了。这种安装 GRUB 的方式要比第一种情况简单,因为这并不是全装,仅仅是覆盖安装而已。

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

下一篇:Linux学习-72-GRUB加密方法(2种加密方式)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64280.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

主成分分析的基本原理

目录 什么是主成分分析? 主成分分析的步骤 根据什么选择主成分? 怎样解释主成分? 特征值、方差解释率及碎石图 载荷系数与共同度 什么是主成分分析? 主成分的概念由Karl Pearson在1901年提出的。他是考察多个 变量间相关性…

Qt扫盲-Qt Creator IDE使用总结

Qt Creator IDE使用总结一、欢迎页1. 最近项目2. 示例3. 教程二、编辑页1. 左侧菜单区1. 工具栏2. 项目目录常用操作介绍1. 项目名2. 中间编码区1.顶部工具区2.编码区的常用功能1. 文件操作2. 类的一些方便操作1、Follow Symbol Under Cursor2. 查找和替换3. Refactor4. F1帮助…

AP1236 线性LDO稳压IC 工作原理图分享

深圳世微半导体有限公司,专业研发DC/DC降压恒流车灯IC,我们有一流的研发团队,良好的服务,做一流品质的产品,所有产品均提供配套方案和技术支持 供应多种DC/DC降压恒流方案选型表: AP5160 外置MOS电流20MA-…

构造一个m行n列的二维数组(mln的取值均小于等于4, mln均由键盘输入),并由键盘输入数组元素的值,并且按照矩阵的形式输出

构造一个m行n列的二维数组(mln的取值均小于等于4, mln均由键盘输入),并由键盘输入数组元素的值,并且按照矩阵的形式输出 Scanner sc new Scanner(System.in); System.out.println("请输入行"); int m sc.nextInt(); System.out.println(&quo…

【Java】阿拉伯数字转汉字(完全符合中文阅读习惯)(支持所有整数类型)

Java 阿拉伯数字转汉字 网上看过很多实现,但都有 BUG,不是多余0没有处理,就是很多生成的汉字字符串根本不符合中文阅读习惯(各位代码写完测试的时候用例多搞一点啊) 刚好公司有个项目就要实现这个小功能,…

Python爬虫实战,requests+parsel模块,爬取二手房房源信息数据

前言 最近在尝试用Python爬虫二手房房源信息数据,在这里给需要的小伙伴们提供代码,并且给出一点小心得。 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这样的纯文本数据爬取的人会很多&…

关于chatGPT对有关Docker Desktop问题的一个回答

1、关于chatGPT 最近用https://github.com/Hitachi-Automotive-And-Industry-Lab/semantic-segmentation-editor的基于React的web端数据标记工具,挺好用。 但发现即便删除了container,之前标注的label都还在,觉得很奇怪,因为mon…

添加组件 页面上找一些功能组件直接用(比如layui)

layDate - JS 日期和时间选择器组件/插件 - 在线演示 - Layui 比如&#xff0c;我想添加一个日期的组件&#xff0c;我现在上面页面找 1.先找到日期与时间选择组件 2.找到你想要的组件 3.点击查看代码&#xff0c;找到组件代码的位置 在页面中添加上&#xff1a; <div cl…

你需要偷偷珍藏的java兼职平台

兼职在现在来说&#xff0c;应该不算什么非常罕见的事情。如果你感觉java技术还可以再练练手&#xff0c;或者想在闲暇的时间赚一点外快。那下面这些Java兼职平台&#xff0c;你一定要收藏。 1&#xff0c;程序员客栈 老实说&#xff0c;当时我使用这个平台&#xff0c;一个原…

vue 图片放大、缩小、旋转、滚轮操作图片放大缩小

组件 <template><!-- --><div class"imgCont"ref"imgCont"mousewheel.prevent"rollImg($event)"><div class"iconBtn"><span class"refreshBtn"><i class"el-icon-zoom-out"cl…

16S全长测序揭示绿头虻肠道微生物及共生细菌

论文题目&#xff1a;Greenhead (Tabanus nigrovittatus) Wolbachia and Its Microbiome: A Preliminary Study 期刊&#xff1a;Microbiol Spectrum 研究背景 绿头虻&#xff08;Tabanus nigrovittatus&#xff09;的雌虫刺吸牲畜的血液&#xff0c;危害家畜&#xff0c;是美…

2022年NPDP新版教材知识集锦--【第五章节】(1)

《产品经理认证(NPDP)知识体系指南(第2版)》已于2022年4月正式上架发行&#xff0c;新版教材自2022年11月NPDP考试起使用。将新版NPDP教材中的相关知识点进行了整理汇总&#xff0c;包括详细设计与规格阶段相关内容&#xff0c;快来看看吧。 【市场调研】(全部内容获取文末) 市…

基于Python实现的五子棋游戏设计(alpha-beta剪枝技术)

目录 第1章 问题描述 3 第2章 问题分析 3 第3章 算法设计 4 3.1 算法概述 4 3.2 极大极小树 4 3.3 α-β剪枝算法 5 3.3总体设计 6 3.3.1 系统流程图 7 3.3.2 基本设计 7 3.4 预处理 8 第4章 算法实现 11 4.1 估价函数 11 4.2 alpha-beta剪枝算法 15 4.2.1 算法流程图 15 4.2.2…

issac gym安装与运行 (一)

目录 1.安装 1.1 下载 ​编辑 1.2 安装 .2 初步运行 2.1 demo1 .3 官方demo 3.1 下载及安装 3.2 demo启动 3.3 加载训练好的模型 其他 References&#xff1a; nIsaac-gym(1): 安装及官方demo内容_hongliyu_lvliyu的博客-CSDN博客_isaac安装 NVIDIA Isaac Gym安装…

安卓宿舍管理系统源码

开发环境及工具&#xff1a; 大等于jdk1.8&#xff0c;大于mysql5.5&#xff0c;idea&#xff08;eclipse&#xff09;&#xff0c;Android Studio 技术说明&#xff1a; springboot mybatis android 代码注释齐全&#xff0c;没有多余代码&#xff0c;适合学习&#xff08…

孤儿进程与终端的关系

孤儿进程与终端的关系 孤儿进程 在本篇文章当中主要给大家介绍一下有关孤儿进程和终端之间的关系。 首先我们的需要知道什么是孤儿进程&#xff0c;简单的来说就是当一个程序还在执行&#xff0c;但是他的父进程已经退出了&#xff0c;这种进程叫做孤儿进程&#xff0c;因为…

C#中Convert与强制转换之间的区别

Reference Source Convert与强转最大的区别是 增加了范围校验&#xff0c;如果不在范围内&#xff0c;直接抛出异常 Convert 类 (System) | Microsoft Learn 小数转化为整数 使用基本数据类型强制转化原理&#xff1a;小数转化为整数&#xff0c;舍弃小数点后的所有数字。 …

HTTP响应是什么?

文章目录HTTP响应1. 响应行2. 响应头3. 空行与响应体4. HTTP响应示例HTTP响应 当客户端发起一个请求后&#xff0c;一般都会得到一个服务器的响应&#xff0c;断网或者服务器宕机的情况下除外。服务器发送给客户端的 HTTP 响应用于向客户端提供其请求的资源&#xff0c;以及客…

开源项目-绩效管理系统

开源项目-绩效管理系统 哈喽&#xff0c;今天给大家带来一个开源系统-绩效管理系统 源码下载​​​​​​​ 系统介绍 本系统为绩效考核系统&#xff0c;系统分为三大模块&#xff1a;考核设置&#xff0c;绩效考核&#xff0c;系统管理。 可满足小企业对员工进行考核。本系…

自定义maven骨架的添加与删除——完整详细介绍

目录一、创建好自己所需的目录结构二、命令配置2.1 配置总览2.2 指令配置说明2.3 指令配置详情三、配置Idea中maven新模板3.1 找到信息文件3.2 创建实例模板四、删除自定义模板4.1 删除本地仓库中的文件4.2 删除archetype-catalog.xml文件中的配置4.3 删除idea中的配置一、创建…