[Linux] GRUB引导 学习笔记(一)

目录

概念

2.1 BIOS

2.2 UEFI

2.3 MBR与GPT

2.3.1 MBR

2.3.2 GPT

2.3.3 总结

2.4 GRUB

GRUB2和GRUB Legacy区别

进入GRUB命令行

命令

 GRUB工具命令

GRUB2配置

1.主要配置文件

2. 通过/etc/default/grub文件生成grub.cfg

定制GRUB的步骤


概念

BIOS、UEFI、MBR、GPT、GRUB 到底是什么意思?

2.1 BIOS

BIOS(Basic Input Output System),直译成中文名称就是" 基本输入输出系统"。它是一组固化到主板中一个ROM芯片上的程序,它可以从CMOS中读写系统设置的具体信息。此程序保存着计算机最重要的基本输入输出程序、开机后的自检程序和系统自启动程序。

简单来说,BIOS是一个控制电脑中所有输入输出的程序,它可以对主板上的键盘、鼠标、外部接口、频率、电源、磁盘驱动器等方面进行参数控制和调整。

2.2 UEFI

UEFI(Unified Extensible Firmware Interface)则是取代传统BIOS的,相比传统BIOS来说,它更易实现,容错和纠错特性也更强。

传统BIOS主要支持MBR引导,UEFI则是取代传统BIOS,它加入了对新硬件的支持,其中就有支持2TB以上硬盘。

2.3 MBR与GPT

全新硬盘在使用之前必须进行分区格式化,硬盘分区初始化的格式主要有两种,分别为 MBR格式和 GPT格式。

2.3.1 MBR

MBR是传统的分区表类型,当一台电脑启动时,它会先启动主板上的BIOS系统,BIOS再从硬盘上读取MBR主引导记录,硬盘上的MBR运行后,就会启动操作系统,但最大的缺点则是不支持容量大于2T的硬盘。

如下图,查询磁盘分区类似为:MBR

查询方法如下,感兴趣的同学可以查询下自己电脑的磁盘分区类型。

1、win+R,输入diskmgmt.msc,回车,打开磁盘管理器。
2、在磁盘上点右键,选属性。
3、在卷这一页,可以看到是GTP还是MBR。

2.3.2 GPT

而GPT是另一种更先进的磁盘系统分区方式,它的出现弥补了MBR这个缺点,最大支持 18EB的硬盘,是基于 UEFI使用的磁盘分区架构。

目前所有Windows系统均支持 MBR,而 GPT只有 64位系统才能支持。 BIOS只支持MBR引导系统,而GPT仅可用UEFI引导系统。正因为这样,现在主板大多采用BIOS集成UEFI,或UEFI集成BIOS,以此达到同时兼容MBR和GPT引导系统的目的。

2.3.3 总结

  • BIOS+MBR
    这是最传统的,系统都会支持;唯一的缺点就是不支持容量大于2T的硬盘
  • BIOS+GPT
    BIOS是可以使用GPT分区表的硬盘来作为数据盘的,但不能引导系统;若电脑同时带有容量小于2T的硬盘和容量大于2T的硬盘,小于2T的可以用MBR分区表安装系统,而大于2T的可以使用GPT分区表来存放资料。但系统须使用64位系统。
  • UEFI+MBR
    可以把UEFI设置成Legacy模式(传统模式)让其支持传统MBR启动,效果同BIOS+MBR;也可以建立FAT分区,放置UEFI启动文件来,可应用在U盘和移动硬盘上实现双模式启动。
  • UEFI+GPT
    如果要把大于2T的硬盘作为系统盘来安装系统的话,就必须UEFI+GPT。而且系统须使用64位系统,否则无法引导。但系统又不是传统在PE下安装后就能直接使用的,引导还得经过处理才行。

2.4 GRUB

GRUB(GRand unified bootloader),多操作系统启动程序。它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。

GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。它是一个多重操作系统启动管理器,用来引导不同系统,如Windows、Linux。Linux常见的引导程序包括LILO、GRUB、GRUB2。如下图所示为GRUB加载引导流程。

Centos 7 默认使用GRUB2引导系统启动,GRUB2 是基于 GRUB 开发成更加安全强大的多系统引导程序, 最新Linux发行版都是使用GRUB2作为引导程序。同时GRUB2采用了模块化设计,使得GRUB2核心更加精炼,使用更加灵活,同时也就不需要像GRUB分为 stage 1、stage 1.5、stage 2三个阶段。

GRUB2和GRUB Legacy区别

  • 目前 GRUB 分成 GRUB legacy 和 GRUB 2。版本号是 0.9x 以及之前的版本都称为 GRUB Legacy ,从 1.x 开始的就称为 GRUB 2,目前没有特别说明GRUB版本一般是指GRUB 2,查看GRUB版本方法为grub-install --version

  • GRUB 2 是源自于一个名为 PUPA 的项目,目的是建立下一代的 boot loader

  • GRUB 2 几乎是从零开始开始开发的,它和 GRUB Legacy 不同的地方有很多,例如支持 scripts、国际化语言、动态加载模块、带有 resuce 模式等等,这些都是 GRUB Legacy 所没有的.

  • 虽然GRUB 2是重写的GRUB ,但是他借鉴了grub的一些特征,grub2改进如下:

    1. 引导配置文件采用新名字grub.cfg,新的语法,加入许多新的命令
    2. grub.cfg 是用grub-mkconfig自动产生的,由update-grub维护,在执行update-grub之前修改的配置都不会 生效,这样可以容易的应对内核升级这样情况。
    3. grub2中的分区号不再是以0开始,而是以1开始。
    4. 配置文件是不可写的,而是修改文件后用命令自动更新
    5. grub2有更可靠的方法在磁盘上有多系统时发现文件和目标内核,可以用命令发现系统设备号或者UUID。
    6. 更多的文件系统支持,如ext4 hfs ntfs
    7. grub2可以直接从lvm和raid读取文件
    8. 在grub中的stage1 stage1.5 stage2已经被取消
    9. grub2引入很多设备模块,允许core镜像更小
    10. 支持脚本,包括简单的语法
    11. 在启动时没有选择菜单的话,按住shift即可强制显示菜单
    12. 可以使用grub-install -v来查看系统的grub版本

进入GRUB命令行

以下图片是Linux下的GRUB引导界面示例:

按下e见可以编辑所选菜单对应的grub菜单配置项,按下c键可以进入grub命令行交互模式。

grub>

ls 列出磁盘分区信息

(hd0),(hd1,msdos1),(hd1,msdos2),(hd1,msdos3)

这里看到只有一个磁盘 hd0

查看包含有

ls (hd1,msdos1)/boot/grub

假定我们在 msdos1这个分区下发现了grub.cfg文件,则表明Linux安装在这个分区

注意grub.cfg 文件不一定在 /boot/grub 这个路径下

加载grub.cfg并且GRUB引导启动Linux

configfile (hd0,msdos1)/boot/grub/grub.cfg

命令

设置GRUB引导系统的根文件系统位置

set root=(hd0,msdos1)

查看下当前的根文件

ls /

指定GRUB程序文件所在的位置

set prefix=(hd0,msdos1)/boot/grub

 GRUB工具命令

命令说明
grub-install生成 Grub 的配置文件(通常是 /boot/grub/grub.cfg),根据系统中已安装的操作系统和内核生成引导菜单。它会扫描系统中的可引导文件并生成菜单项。
grub-mkconfig生成 Grub 的配置文件(通常是 /boot/grub/grub.cfg),根据系统中已安装的操作系统和内核生成引导菜单。它会扫描系统中的可引导文件并生成菜单项。
grub-editenv用于编辑 Grub 的环境变量。这些环境变量包括默认启动项、引导选项和其他配置参数。
grub-mkrelpath生成相对路径,特别是在配置多重引导时使用。它可用于生成可用于配置文件中的相对路径
grub-mkimage生成 Grub 的镜像文件。镜像文件是包含 Grub 模块和配置文件的单个文件,可用于在无法直接访问文件系统的情况下引导系统。
grub-reboot设置下一次引导时要使用的默认引导项。使用该命令,您可以设置系统下一次启动时自动选择的引导项。
grub-set-default设置默认的引导项。它允许您将特定的引导项设置为默认选项,以便在引导时自动选择该项。
grub-probe用于探测系统中的设备和文件系统。它可以识别硬盘、分区和文件系统类型。
update-grub用于更新 Grub 的配置文件并重新生成引导菜单。它会扫描系统中已安装的操作系统和内核,并根据配置文件的规则重新生成 Grub 的引导菜单

 重新生成GRUB配置文件 grub.cfg

你可以使用 grub2-mkconfig 命令重新生成配置文件

grub2-mkconfig -o /boot/grub2/grub.cfg

GRUB2配置

1.主要配置文件

  • /boot/grub/grub.cfg -即使是root也不要编辑它,它在每次update-grub后自动生成
  • /etc/default/grub - 改变引导菜单外观的主要配置文件
  • /etc/grub.d/ - 各种用于生成grub.cfg的脚本文件,每次update-grub时会执行里面的文件

2. 通过/etc/default/grub文件生成grub.cfg

grub-mkconfig是根据/etc/default/grub文件来创建配置文件的。该文件中定义的是grub的全局宏,修改内置的宏可以快速生成grub配置文件。实际上在/etc/grub.d/目录下还有一些grub配置脚本,这些shell脚本读取一些脚本配置文件(如/etc/default/grub),根据指定的逻辑生成grub配置文件。

在/etc/default/grub中,使用"key=vaule"的格式,key全部为大小字母,如果vaule部分包含了空格或其他特殊字符,则需要使用引号包围;完全没有必要直接改/boot/grub/grub.cfg或者/etc/grub.d/下的文件

更多关于GRUB可以参考这个官方文档  https://help.ubuntu.com/community/Grub2

以下是常见的GRUB配置全局宏:

# If you change this file, run 'update-grub' afterwards to updateGRUB_DEFAULT=0
#设置默认启动项,按menuentry顺序如果要默认从第四个菜单项启动,数字改为3,若改为 saved,则默认为上次启动项GRUB_TIMEOUT="10"
#设置进入默认启动项的等候时间,默认值10秒,按自己需要修改,单位为秒改改为零和负值为无限等待操作GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` 
#获得发行版名称(比如Ubuntu, Debian,也可以自定义为其他名称)GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
#选择启动的环境,“quiet splash”为图像界面,“text”为文本界面#GRUB_CMDLINE_LINUX="noresume" 
#手动添加内核启动参数,比如 acpi=off noapic 等可在这里添加
# Uncomment to disable graphical terminal (grub-pc only)#GRUB_TERMINAL=console
#设置是否使用图形介面。前面有#注释(使用图形界面),前面没有#注释(仅使用控制台终端,不使用图形介面) )# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
#设定图形介面分辨率,如不使用默认。把前面#去掉,把分辨率改为800x600或1024x768# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
#取消注释以阻止GRUB将传递参数 "root=UUID=xxx" 传递给 Linux内核# Uncomment to disable generation of recovery mode menu entrys
#GRUB_DISABLE_LINUX_RECOVERY="true"
#定是否创建修复模式菜单项,前面有#注释(建立修复模式).前面没有#注释(不建立修复模式# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1" #当GRUB菜单出现时发出鸣音提醒,户无法看到屏幕特别有用,默认关闭

定制GRUB的步骤

  1. 修改/etc/default/grub文件(Ubuntu16等系统修改该配置文件)

  2. vim /etc/default/grub
    增加或者修改已有GRUB参数设置,例如 GRUB_TIMEOUT="10"
    保存退出

  3. 执行命令sudo update-grub, 更新/boot/grub/grub.cfg文件中,然后生效

问题:

[root@localhost ~]# update-grub
bash: update-grub: command not found...

发现命令不存在

[root@localhost ~]# whereis grub
grub: /usr/lib/grub /etc/grub.d /etc/grub2.cfg /usr/share/grub

发现grub已经安装

在某些 Linux 发行版中,update-grub 命令可能不存在。相反,可以使用 grub-mkconfig 命令来更新 GRUB 配置文件。

以下是更新 GRUB 配置文件的步骤:

grub-mkconfig -o /boot/grub/grub.cfg

如果使用 grub2 则使用

grub2-mkconfig -o /boot/grub2/grub.cfg

该命令将扫描系统中的安装操作系统,并生成新的配置文件 /boot/grub/grub.cfg

更新完成后,你可以重启系统以使更改生效。

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

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

相关文章

Programming abstractions in C阅读笔记:p184-p195

《Programming Abstractions In C》学习第61天,p184-p195总结。 一、技术总结 1.mutual recursion 2.natural number (1)定义 p184, If you limit the domain of possible values to the set of natural numbers,which are defined simply as the set of nonne…

visual studio 启用DPI识别功能

在开发widow程序时,有时必须将电脑 设置-->显示-->缩放与布局-->更改文本、应用项目的大小-->100%后,程序的画面才能正确运行,居说这是锁定了dpi的原因,需要启dpi识别功能。设置方法如下: 或者

C/S架构学习之组播

组播:过多的广播会占用网络带宽,产生广播风暴的现象,从而影响正常的通信活动;组播(或者多播)是局域网内部的通信,只有加入到某个多播组的主机才能收到数据;组播的方式既可以发给多个…

2023中国视频云市场报告:腾讯云音视频解决方案份额连续六次蝉联榜首,加速全球化布局

近日,国际数据公司(IDC)发布了《中国视频云市场跟踪(2023上半年)》报告,腾讯云音视频的解决方案份额连续六次蝉联榜首,并在视频生产创作与媒资管理市场份额中排名第一。同时,在实时音…

虹科示波器 | 汽车免拆检测 | 2017款长安福特翼虎车发动机故障灯异常点亮

一、故障现象 一辆2017款长安福特翼虎车,搭载CAF488WQ9发动机,累计行驶里程约为8.9万km。该车因发动机故障灯异常点亮在其他维修厂检修,维修人员用故障检测仪检测,提示气缸3失火,调换火花塞、点火线圈及喷油器&#xf…

动态、静态IP地址设置方法

目录 一、三种网络模式应用场景以及区别 1、 NAT(Network Address Translation)模式: 2、仅主机(Host-Only)模式: 3、桥接(Bridged)模式: 二、配置步骤 &#xff1a…

poi多sheet,模板导出数据

/*** 导出Excel* param response 响应对象* param headName 表头* param List 数据*/public static void exportExcel(HttpServletResponse response, String headName, List<数据对象> list) throws IOException {//读取模板Resource resourcenew ClassPathResourc…

SSM之spring注解式缓存redis

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 1.Redis与SSM的整合 1.1.添加Redis依赖 在Maven中添加Redis的依赖 <redis.version>2.9.0</redis.…

0X03

红包题第二弹 看到源码里面的提示 ?cmdphpinfo(); 看到源码 kk 关键点就是有两个正则表达式 第一个 preg_match("/[A-Za-oq-z0-9$]/",$cmd) 第二个 preg_match("/\~|\!|\|\#|\%|\^|\&|\*|\(|\)|\&#xff08;|\&#xff09;|\-|\_|\{|\}|\[|\]|\|\&q…

蓝绿部署:实现无缝可靠的软件发布

在快节奏的软件开发世界中&#xff0c;在不造成中断或停机的情况下向用户提供新功能和更新是一项至关重要的挑战。这就是蓝绿部署策略有用的地方。组织可以通过使用称为“蓝绿部署”的发布管理策略&#xff0c;以安全有效的方式推出其软件的新版本。在快节奏的软件开发世界中&a…

【独家揭秘】跨境电商源码独立开发,软著认证,前后端全开源,无加密,交付源码,商用无忧!

在这个数字化快速发展的时代&#xff0c;跨境电商已成为全球商业的重要趋势。为了帮助您快速进入这个潜力巨大的市场&#xff0c;我们独家推出了一款经过全面验证的跨境电商源码解决方案!这款源码具有独立开发、软著认证、前后端全开源、无加密等特点&#xff0c;为您的商业运营…

html中使用JQ自定义锚点偏移量

问题&#xff1a;一般情况下使用href跳转达到效果。如果页面中头部固定住了&#xff0c;点击瞄点的时候自动是最上面&#xff0c;头部会给它覆盖掉一部分&#xff0c;所以要在点击之后额外再加头部高度 <a href"#aa">Technical Documents</a><div id&…

批量迁移redis实例的key

我们知道migrate 命令可以迁移redis的多个key&#xff0c;但是如果redis的key有非常多&#xff0c;那用起来就很不方便了。 所以下面分享一个脚本来实现批量key的迁移&#xff0c;主要使用的命令为dump和restore 脚本如下&#xff1a; #!/bin/bash redis-cli -h host1 -p 63…

浅谈开源策略的实例:CGAL计算几何库

免责声明&#xff1a;本博客旨在分享我对开源策略的理解和体会&#xff0c;不代表任何组织或机构的立场或观点&#xff0c;也不构成任何商业或投资的建议或担保。本博客的内容可能存在错误或遗漏&#xff0c;也可能随着时间的推移而变得过时或不适用。请在使用或依赖本博客的内…

吴恩达《机器学习》6-1->6-3:分类问题、假设陈述、决策界限

一、什么是分类问题&#xff1f; 在分类问题中&#xff0c;我们试图预测的变量&#x1d466;是离散的值&#xff0c;通常表示某种类别或标签。这些类别可以是二元的&#xff0c;也可以是多元的。分类问题的示例包括&#xff1a; 判断一封电子邮件是否是垃圾邮件&#xff08;二…

Redis 多机方案

Redis 多机方案 Redis主从复制 Redis服务器角色可以分为主服务器和从服务器&#xff0c; 从服务器复制主服务。通过在指定服务器上执行SLAVEOF可以将服务器设置为目标服务器的从服务器&#xff0c; 目标服务器成为主服务器。 SLAVEOF 127.0.0.1 6379 同步实现 同步包括SLAV…

设计模式简要介绍

设计模式有很多&#xff0c;较为重要的如下 静态和单例模式 单例模式的本质就是类成员中有一个对象实例 public class Animal{public static string Title "Animal" // 类成员public string Name; // 对象成员public const float Pi 3.14f; // 类成员public rea…

C语言—窄字符或宽字符

#include<iostream> #include<Windows.h> #include<tchar.h>int main() {TCHAR destination[100];lstrcpy(destination, __T("你好"));_tprintf(__T("Copied string: %s\n"), destination); }/*在C/C中&#xff0c;__T(x) 格式通常用于实…

【系统集成项目管理工程师】——3.管理

主要掌握输入&#xff0c;输出内容先看他的过程域本身&#xff0c;过程域是什么输出就是什么 上一个过程域的输出是下一个过程域的输入 十大管理1432都有计划过程组&#xff0c;通常规划为首&#xff0c;控制为尾 规划阶段的万能输出是各子计划&#xff0c;即项目管理计划的…

【第2章 Node.js基础】2.1 JavaScript基本语法

文章目录 学习目标JavaScript版本与JavaScript运行环境JavaScript版本JavaScript运行环境 JavaScript语句与注释语句语句块注释 变量变量的命名变量的声明与赋值变量提升变量泄露全局作用域和函数作用域块级作用域与let关键字使用const关键字声明只读常量注意 数据类型数值&…