UEFI 双启动情况下禁用 GRUB 的启动菜单

本文介绍如何在支持UEFI的计算机上禁用GRUB启动菜单,通过编辑配置文件并更新GRUB,实现由BIOS启动管理器统一管理启动过程。

转载来源:http://jingyan.baidu.com/article/e73e26c0be516624adb6a7e4.html

在支持 UEFI 双启动的电脑上,由于电脑 BIOS 有启动管理器(Boot Manager)功能,完全可以由它管理操作系统的启动选单。但是,有的操作系统(比如 Ubuntu 等 Linux 发行版)还自带有 GRUB 启动管理器,这样从 BIOS 的启动管理器选择启动此系统后,还要再显示一次 GRUB 启动选单,它们在功能上重复不说,还浪费时间。本经验就介绍一下如何禁用 GRUB 启动菜单。

UEFI 双启动情况下禁用 GRUB 的启动菜单

方法/步骤

  1. 在支持 UEFI 启动模式的电脑上,其 BIOS 有启动管理器(Boot Manager)功能,可以在开机时按下启动选择键(注意事项1),系统首先进入启动管理器(Boot Manager),用方向键选择要启动的操作系统,回车即可启动它。

    UEFI 双启动情况下禁用 GRUB 的启动菜单
  2. 如上一步骤图,选择启动了 Ubuntu,但是 Ubuntu 自带 GRUB 启动管理器,还会显示一个启动选单。选单中包括了 Ubuntu 自身的维护模式(注意事项2),以及电脑上安装的 Windows 操作系统。在双系统环境下,GRUB 的启动选择菜单是强制显示的,目的是为了确保在当前启动不正常时,还能正常启动到其他内核或其他操作系统。

    UEFI 双启动情况下禁用 GRUB 的启动菜单
  3. 进入 Ubuntu 桌面,按下 Ctrl + Alt + t 调出终端,键入以下命令:

             sudo gedit /etc/default/grub

    意思是以管理员(root)的权限启动文本编辑器,编辑 /etc/default/grub 这个文件。

    在  /etc/default/ 文件夹下的这个 grub 文件,控制着 GRUB 的行为方式,包括默认启动哪个系统、整个菜单的显示时间等。

    注意这里需要输入管理员密码。 

    UEFI 双启动情况下禁用 GRUB 的启动菜单
  4. gedit 文本编辑器将打开/etc/default/grub 这个文件。

    可以看到,默认启动的操作系统为第 0 项(GRUB_DEFAULT=0,在本经验的电脑上是 Ubuntu),GRUB 的启动菜单默认显示 10 秒钟(GRUB_TIMEOUT=10)。

    UEFI 双启动情况下禁用 GRUB 的启动菜单
  5. 将 GRUB_TIMEOUT=10 这一行中的值,由“10”改为“0”,意思是设置 GRUB 菜单的倒计时为“0”秒,也就是不显示 GRUB 菜单。

    但是,由于前述“双系统”的因素存在,只改此处仍然不能实现禁用 GRUB 菜单的目的。还得修改其他内容。 

    UEFI 双启动情况下禁用 GRUB 的启动菜单
  6. 在 /etc/default/grub 文件的末尾添加一行:

            GRUB_DISABLE_OS_PROBER=true

    意思是禁用 GRUB 探测电脑上安装的其他操作系统的能力。

    这样,GRUB 将不再探测 Windows 等其他操作系统的存在,结合上一步骤中菜单显示倒计时为“0”,就能实现关闭 GRUB 显示菜单的目的了。

    UEFI 双启动情况下禁用 GRUB 的启动菜单
  7. 还差最后一步。回到终端,键入以下命令:

            sudo update-grub

    此命令更新 GRUB 启动菜单的内容,并写入 GRUB 的启动脚本——至此,上述操作才正式生效。可以从命令的反馈信息中看到,已经没有关于其他操作系统的条目了。

    重新启动,开机按下 F10,选择 Ubuntu 启动,GRUB 的启动选单消失了。

    UEFI 双启动情况下禁用 GRUB 的启动菜单
  8. 上述操作禁用了 GRUB 的启动菜单,同时也禁用了进入 Ubuntu 维护模式、以启动其他内核的能力。这在当前内核无法启动、需要启动其他正常内核时,是灾难性的。

    为了避免这种灾难性的后果,可以采取折衷的方案——缩短 GRUB 菜单的显示时间:重复上述步骤,在 /etc/default/grub 文件末尾添加的 GRUB_DISABLE_OS_PROBER=true 行前面键入一个“#”号,注释掉该行;然后修改 GRUB_TIMEOUT 的值为一个较小的数值(比如“1”或“5”),再执行 sudo update-grub。

    在这种情况下,GRUB 启动菜单仍然显示,但是显示时间缩短。

    UEFI 双启动情况下禁用 GRUB 的启动菜单
    END

<think>好的,用户现在想了解如何在编译GRUB2时处理UEFI安全启动需求,并解决CentOS Stream 9和Rocky Linux 9的grub2-2.06源码包编译失败的问题。之前已经给过一些步骤,但用户现在特别关注UEFI安全启动的支持,可能需要更详细的指导。 首先,我需要回顾之前的回答。之前提到过处理补丁错误、环境准备、编译参数设置等。但用户现在的问题涉及UEFI安全启动,这可能需要额外的步骤,比如签名密钥的处理和编译时的安全启动选项。 接下来,我需要参考用户提供的引用内容。引用[1]提到在GRUB启动参数中添加net.ifnames=0,这可能与UEFI配置相关吗?不一定,但用户可能在启动参数配置方面有经验,可能需要引导他们如何将安全启动参数整合到编译过程中。引用[4]提到efiboot.img,这涉及到UEFI引导镜像的生成,可能在编译GRUB时需要特别处理这部分。 用户的问题中提到编译失败的原因是补丁问题,现在需要结合安全启动来处理。可能需要确保在编译时启用安全启动相关的选项,并正确配置签名密钥。例如,GRUBUEFI安全启动需要特定的证书和签名步骤,否则生成的efiboot.img可能无法通过安全启动验证。 此外,用户提到在CentOS Stream 10的源码包编译成功,但9的版本失败。可能CentOS 9的grub2版本较旧,需要更多的补丁或配置调整来支持安全启动。需要检查CentOS 9的SPEC文件中是否有关于安全启动的补丁或配置选项,并确保这些补丁正确应用。 可能的解决方案步骤包括: 1. 确保安装所有依赖项,包括安全启动相关的工具如sbsigntools。 2. 配置编译参数时启用安全启动支持,可能需要指定签名密钥路径。 3. 处理源码包中的补丁,尤其是与UEFI和安全启动相关的补丁,可能需要手动解决冲突。 4. 在编译后对生成的EFI文件进行签名,以符合安全启动要求。 5. 更新GRUB配置并重新生成grub.cfg,确保安全启动参数正确。 还需要考虑用户可能遇到的常见错误,例如签名失败、证书路径错误、补丁应用冲突等,并提供相应的解决方法。例如,如果编译时提示缺少安全启动相关的头文件,可能需要安装对应的开发包。 最后,确保回答结构清晰,分步骤说明,并包含验证步骤,比如如何检查生成的GRUB是否支持安全启动,以及如何测试安全启动是否生效。可能还需要指导用户如何将自定义签名的GRUB添加到系统的安全启动密钥数据库中,这在UEFI环境中是必要的步骤。</think>在CentOS Stream 9/Rocky Linux 9上编译支持UEFI安全启动GRUB2-2.06需要特殊配置,以下是分步解决方案: ### 一、安全启动编译准备 1. **安装安全启动依赖** ```bash sudo dnf install -y sbsigntools pesign mokutil openssl shim-unsigned ``` *关键组件说明*: - $sbsigntool$ 用于EFI二进制签名 - $shim-unsigned$ 提供Microsoft签名的启动加载器 - $mokutil$ 管理机器所有者密钥(MOK)[^1] 2. **生成自定义签名证书** ```bash openssl req -new -x509 -newkey rsa:2048 -keyout SB.key -out SB.crt -nodes -days 3650 -subj "/CN=My Secure Boot Signing Key/" sudo mkdir -p /etc/secureboot/keys sudo cp SB.{key,crt} /etc/secureboot/keys/ ``` --- ### 二、源码编译关键配置 1. **修复补丁冲突(关键步骤)** 在SPEC文件中强制启用安全启动支持: ```specfile %global with_secureboot 1 # 强制启用安全启动编译模式 %define _use_internal_dependency_generator 0 # 禁用自动依赖检测 ``` 2. **调整编译参数** ```bash ./configure \ --target=x86_64 \ --with-platform=efi \ --enable-uefi-secure-boot \ # 显式启用安全启动支持 --disable-efiemu \ --prefix=/usr \ --sbindir=/sbin \ --sysconfdir=/etc \ --with-bootdir=/boot/efi/EFI/rocky \ --with-efi-signed-kernel # 启用内核签名验证 ``` --- ### 三、签名处理流程 1. **编译后签名(关键路径)** ```bash sbsign --key /etc/secureboot/keys/SB.key \ --cert /etc/secureboot/keys/SB.crt \ --output grubx64.efi.signed \ grub-core/grubx64.efi ``` 2. **生成shim组合镜像** ```bash cp /usr/share/shim/*.efi . cat shimx64.efi grubx64.efi.signed > BOOTX64.EFI ``` --- ### 四、系统级集成 1. **部署到ESP分区** ```bash sudo mkdir -p /boot/efi/EFI/rocky sudo cp BOOTX64.EFI /boot/efi/EFI/rocky/ ``` 2. **注册MOK密钥** ```bash sudo mokutil --import /etc/secureboot/keys/SB.crt # 重启后进入MOK管理界面完成注册 ``` --- ### 五、验证安全启动状态 ```bash # 检查EFI镜像签名 sbverify --list /boot/efi/EFI/rocky/BOOTX64.EFI # 验证系统安全启动模式 mokutil --sb-state # 预期输出:SecureBoot enabled ``` --- ### 六、常见错误处理表 | 错误现象 | 解决方案 | |---------|----------| | `"Secure Boot forbidden signature"` | 1. 确认shim版本与证书链匹配<br>2. 重新注册MOK密钥 | | `undefined symbol: grub_efi_secure_boot` | 在CFLAGS中添加`-DHAVE_EFI_SECURE_BOOT=1` | | `pesign: could not find .note section` | 使用`sbsigntools`替代`pesign`签名 | | `invalid parameter: SecureBoot` | 更新fwupd至最新版:`sudo fwupdmgr refresh` | --- ### 七、兼容性验证方法 1. **QEMU测试环境** ```bash qemu-system-x86_64 -bios /usr/share/edk2/ovmf/OVMF_CODE.secboot.fd \ -drive file=/path/to/disk.img,format=raw \ -net none ``` *通过虚拟TPM芯片验证安全启动链完整性* --- ### 八、维护升级策略 1. **自动签名集成** 在SPEC文件中添加post-build脚本: ```specfile %post /usr/bin/sbsign --key /etc/secureboot/keys/SB.key \ --cert /etc/secureboot/keys/SB.crt \ /boot/efi/EFI/%{name}/grubx64.efi ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值