241123-UEFI模式下Linux-Windows双系统通过Grub设置选择开机系统

embedded/2024/11/25 11:15:22/

A. 准备工作: 将Linux系统作为默认启动系统

通过BIOS或EasyUEFI设置启动首选项为对应的Linux系统

  • A.1 通过BIOS选择对应的Linux系统

技嘉进入BIOS的按键

在这里插入图片描述

在这里插入图片描述

  • A.2 通过绿色向上箭头置顶Linux系统,下载地址: EasyUEFI
    在这里插入图片描述
  • A.1 与 A.2本质上执行的相同的操作

B. BIOS模式与UEFI模式的判断

在同时存在 /boot/grub2/grub.cfg/boot/efi/EFI/redhat/grub.cfg 的情况下,Linux 启动过程中系统会根据 系统的引导模式(BIOS 或 UEFI) 来选择哪个配置文件。以下是具体的行为分析:


1. 启动模式决定配置文件选择

  • BIOS 模式(Legacy Boot):
    如果系统在 BIOS 模式(Legacy 模式)下引导,它会使用 /boot/grub2/grub.cfg 作为 GRUB 的配置文件。
  • UEFI 模式
    如果系统在 UEFI 模式下引导,它会使用 /boot/efi/EFI/redhat/grub.cfg 作为 GRUB 的配置文件。

2. 启动过程的详细说明

BIOS 模式启动过程
  1. 系统固件(BIOS)从启动设备加载 MBR(主引导记录)。
  2. GRUB 阶段 1 位于 MBR 中,它会加载阶段 1.5 和阶段 2。
  3. GRUB 阶段 2 读取 /boot/grub2/grub.cfg 配置文件来显示引导菜单并启动系统。
UEFI 模式启动过程
  1. 系统固件(UEFI)直接从 EFI 分区加载启动项,例如 /boot/efi/EFI/redhat/grubx64.efi
  2. GRUB EFI 二进制文件会读取 /boot/efi/EFI/redhat/grub.cfg 配置文件来显示引导菜单并启动系统。

3. 两个配置文件的管理与区别

文件位置差异
  • /boot/grub2/grub.cfg
    • 适用于 BIOS 模式。
    • 位于标准的 /boot 分区。
  • /boot/efi/EFI/redhat/grub.cfg
    • 适用于 UEFI 模式。
    • 存储在 EFI 系统分区(通常挂载到 /boot/efi)。
内容差异
  • BIOS 模式的配置文件
    通常直接引用内核镜像和 initramfs 文件路径。
  • UEFI 模式的配置文件
    除了引用内核和 initramfs 文件,还可能包含 EFI 特定的配置,例如引导文件路径(/EFI/.../bootmgfw.efi)。

4. 如何确认当前使用的模式

可以通过以下方法检查系统是以 BIOS 还是 UEFI 模式启动的:

  1. 检查启动模式

    sudo ls /sys/firmware/efi
    
    • 如果目录存在,说明系统以 UEFI 模式启动。
    • 如果不存在,则是 BIOS 模式
  2. 检查当前 GRUB 配置文件
    根据启动模式,实际使用的 GRUB 配置文件通常是以下之一:

    • UEFI 模式:
      sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
      
    • BIOS 模式:
      sudo grub2-mkconfig -o /boot/grub2/grub.cfg
      

5. 优化 GRUB 配置管理

如果系统支持 UEFI,推荐以下优化措施:

  • 统一管理配置文件
    只需要维护 grub.cfg 的一个版本,通常是 UEFI 模式下的 /boot/efi/EFI/redhat/grub.cfg
  • 定期更新 GRUB 配置
    当内核更新或引导选项发生变化时,重新生成 GRUB 配置:
    sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
    

如果有 BIOS 模式设备,则需要同时更新 /boot/grub2/grub.cfg


总结

  • 系统引导时,会根据启动模式选择对应的 GRUB 配置文件:
    • BIOS 模式:使用 /boot/grub2/grub.cfg
    • UEFI 模式:使用 /boot/efi/EFI/redhat/grub.cfg
  • 推荐确认系统运行的启动模式,并主要维护对应的 GRUB 配置文件。
  • 使用以下命令确保正确更新配置:
    # UEFI 模式
    sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg# BIOS 模式
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    

C. 检查Grub是否识别Windows系统

  • 更新 GRUB 配置: 在 Linux 系统中,打开终端并运行以下命令:
sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

请添加图片描述

  • 检查生成的 GRUB 配置: 打开生成的 grub.cfg 文件,查找是否存在类似以下内容:
vim /boot/efi/EFI/redhat/grub.cfg

请添加图片描述

D. 查看Linux/Windows的启动项序号

D.1 ChatGPT的参考设置:实际中发现对应的序号不对

在这里插入图片描述

  • 如图所示:按照ChatGPT所说,Windows的启动序号应该是1,但实际是2

在这里插入图片描述

D.2 实际的序号顺序

在这里插入图片描述

E. 3步设置Windows为默认启动项

(base) [root@localhost lgk]# sudo grub2-set-default 2 🎯 此处设置与C.2截图一致
(base) [root@localhost lgk]# sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg 🎯 重新配置
Generating grub configuration file ...
Found Windows Boot Manager on /dev/nvme0n1p2@/EFI/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for EFI firmware configuration
done
(base) [root@localhost lgk]# sudo grub2-editenv list 🎯 检查是否生效
saved_entry=2
kernelopts=root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet modprobe.blacklist=nouveau 
boot_success=1
boot_indeterminate=0

F. 3步设置Linux/RHEL为默认启动项

(base) [lgk@localhost ~]$ su
Password: 
(base) [root@localhost lgk]# sudo grub2-set-default 0 🎯 此处设置与C.2截图一致
(base) [root@localhost lgk]# sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg 🎯 重新配置
Generating grub configuration file ...
Found Windows Boot Manager on /dev/nvme0n1p2@/EFI/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for EFI firmware configuration
done
(base) [root@localhost lgk]# sudo grub2-editenv list 🎯 检查是否生效
saved_entry=0
kernelopts=root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet modprobe.blacklist=nouveau 
boot_success=0
boot_indeterminate=0

请添加图片描述

G. 设置临时的Grub选择项,在其生效后会恢复成默认的启动选项

在这里插入图片描述
在 Linux 中,要临时设置默认的启动项而不更改永久设置,可以使用 grub2-reboot 命令,而不是直接使用 grub2-set-default。这是因为 grub2-reboot 会将默认的启动项设置为一次性生效,下一次启动后恢复为之前的默认项。

步骤

  1. 确定启动项编号
    首先,列出当前的 GRUB 启动项,查看你需要设置的启动项编号:

    grep menuentry /boot/grub2/grub.cfg | cut -d "'" -f2
    

    输出示例:

    CentOS Linux (4.18.0-425.3.1.el8.x86_64) 8 (Core)
    CentOS Linux (4.18.0-425.19.2.el8.x86_64) 8 (Core)
    Rescue mode
    

    这些启动项按顺序编号,从 0 开始。例如:

    • 0: 第一个启动项
    • 1: 第二个启动项
    • 2: Rescue mode
  2. 临时设置默认启动项
    使用 grub2-reboot 命令设置一次性的默认启动项,例如:

    sudo grub2-reboot 2
    

    这会将默认启动项临时设置为编号为 2 的启动项(Rescue mode)。

  3. 重新启动系统
    设置完成后,重启系统以使更改生效:

    sudo reboot
    

注意事项

  • 如果需要永久更改默认启动项,请使用 grub2-set-default
    sudo grub2-set-default <编号>
    
    然后更新 GRUB 配置(RHEL 系统):
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  • grub2-reboot 不会修改永久设置,重启后系统会恢复到原来的默认启动项。

这种方法可以确保在测试特定内核或模式时,不会意外更改系统的永久默认启动项。


http://www.ppmy.cn/embedded/140361.html

相关文章

unsloth vlm模型Qwen2-VL、Llama 3.2 Vision微调案例

T4卡15G显卡训练 参考: https://github.com/unslothai/unsloth 按自己显卡cuda版本安装 免费colab微调代码: Qwen2-VL: https://colab.research.google.com/drive/1whHb54GNZMrNxIsi2wm2EY_-Pvo2QyKh?usp=sharing from unsloth import FastVisionModel # NEW instead …

在云聊室项目中的前后端中,定义的一套前后端逻辑

1.用户信息 用户在完成登陆后&#xff0c;会获得token和userinfo的会话信息 // userinfo示范 {"id": null,"openId": "123123736EF541112312312313","nickname": "Deryck","roles": "player","p…

【jvm】解释器

目录 1. 说明2. 工作原理3. 特点4. JVM解释器与JIT编译器的关系5. JVM解释器的优化 1. 说明 1.JVM&#xff08;Java虚拟机&#xff09;解释器是JVM的一个重要组成部分&#xff0c;负责将Java字节码指令翻译并执行为本地机器码。 2. 工作原理 1.读取字节码指令&#xff1a;JV…

衡山派D133EBS 开发环境安装及SDK编译烧写镜像烧录

1.创建新文件夹&#xff0c;用来存放SDK包&#xff08;其实本质就是路径要对就ok了&#xff09;&#xff0c;右键鼠标通过Open Git Bash here来打开git 输入命令 git clone --depth1 https://gitee.com/lcsc/luban-lite.git 来拉取&#xff0c;如下所示&#xff1a;&#xff0…

Spring 框架环境搭建

一、新建 Maven 项⽬ 1.创建 Maven 的普通 Java 项⽬ 2. 设置项⽬的坐标 3.设置项⽬的 Maven 环境 4、设置项⽬的名称和存放的⼯作空间 二、调整项⽬环境 1. 修改 JDK 版本 2.改单元测试 JUnit 版本 3.build标签中的pluginManagement标签 三、添加 Spring 框架的依赖坐标 …

WPF——自定义ToolTip

问题 前一天制作的图标按钮&#xff0c;在测试的过程中发现一个问题&#xff1a;为图标按钮添加的提示如下图所示&#xff0c;它的显示效果非常差&#xff0c;甚至不能看清文本内容&#xff0c;并且其字体与颜色也不是愚所希望的。 产生原因 此是由于tooltip有一个默认的样式…

信号控制技巧

信号控制技巧 • 检查是否真正需要全局复位。 • 避免异步控制信号。 • 保持时钟、使能和复位信号极性一致。 • 勿将置位和复位编码到同一寄存器元件中。 • 如果确实需要异步复位&#xff0c;应务必与异步复位的解除保持同步。 掌握推断的结果 您的代码最终必须映…

阿里云VLDB顶会论文在Async-fork在redis中应用解读

1.背景 该论文主要是解决redis在持久化&#xff08;RDB&#xff0c;AOD&#xff09;以及主从全量同步时都会调用fork来创建子进程获取内存快照&#xff0c;由于fork需要复制父进程页表&#xff0c;此时如果内存比较大&#xff0c;也就是我们常说的大key过多&#xff0c;就会导…