AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 432747
Accepted
Joe C
Joe C
Asked: 2018-03-22 23:27:22 +0800 CST2018-03-22 23:27:22 +0800 CST 2018-03-22 23:27:22 +0800 CST

如何创建任意 UEFI 引导存根?

  • 772

我安装了 TinyCore 作为我的维护操作系统。我给了那个 GRUB2。但是 TinyCore 安装说明告诉您使用 MBR 方法添加 GRUB2。(它可以工作,但这只是因为 EFI 向后兼容 MBR。)理想情况下,我想将它链接起来,以便 EFI 引导存根引导到 TinyCore 的 /boot/grub,这样我就可以从 TinyCore 的 GRUB2 引导我的任何其他操作系统想。或者第二个选择,我想将它链接起来,以便 EFI 引导存根向量到 TinyCore 的 vmlinuz。

TinyCore 没有 efibootmgr。当我从 Ubuntu USB 记忆棒启动时,efibootmgr 给了我“系统不支持 efivars”。

有没有办法只获取 TinyCore 的 grub 目录,将其带到其他 Linux 机器上并从中创建一个 grub.efi,然后我可以将其带回这台机器并复制到这台机器上的 ESP 中?

grub2 uefi
  • 2 2 个回答
  • 2084 Views

2 个回答

  • Voted
  1. telcoM
    2018-03-23T01:42:49+08:002018-03-23T01:42:49+08:00

    当我从 Ubuntu USB 记忆棒启动时,efibootmgr 给了我“系统不支持 efivars”。

    发生这种情况是因为您使用旧版 BIOS 样式从 USB 记忆棒启动,因此 UEFI 的兼容性支持模块将禁用用于访问启动变量的 UEFI 运行时接口。如果您可以在本机 UEFI 模式下启动 U 盘,则efibootmgr可以。如果固件启动设置包括选择首先尝试 UEFI 还是传统启动方法,请尝试在从记忆棒启动时将其切换到“UEFI 优先”模式。

    使用旧版 MBR GRUB2,您只能引导可使用旧版 MBR 样式引导的操作系统。为了链接到已安装以使用本机 UEFI 引导的操作系统,您需要 GRUB2 的 UEFI 版本。

    将 UEFI GRUB 从一个发行版移植到另一个发行版的问题在于,不同的发行版以稍微不同的方式设置它:例如,Debian 过去使用grub.efi嵌入式指令将一个非常小的 ESP 植入到 ESP 中,以从另一个发行版读取更多的 GRUB 模块和配置文件在 GRUB 安装时指定的文件系统(通常是包含/boot目录的文件系统)。

    这种方法的问题在于,如果启用 Secure Boot,这将变得不可能:加载的所有可执行代码都必须进行签名,并且由于 GRUB 模块没有使用与标准 UEFI 二进制文件相同的二进制文件格式,因此无法以会UEFI 固件可被识别。

    另一方面,RedHat 派生的发行版倾向于将所有必要的 GRUB 模块嵌入到主grubx64.efi二进制文件中,然后可以通过 Secure Boot 在一次操作中成功加载shim.efi。GRUB 配置文件也放置在 ESP 文件系统中,通常反映主 UEFI GRUB 二进制文件的命名,即如果二进制文件重命名为foo.efi,它将foo.cfg在同一目录中查找。

    知道了这一点,您只需确保禁用安全启动,grub.efi从 RedHat/CentOS/Fedora 安装介质中获取二进制文件,手动将其写入最小配置文件,将它们放入您的 ESP(可能是\EFI\boot\bootx64.efiand \EFI\boot\bootx64.cfg,因此 UEFI 应该选择它们无需 UEFI 变量)并启动一次。然后你可以看看TinyCore原生的GRUB配置生成器生成的GRUB配置文件是否兼容那个版本的GRUB,或者把简化的配置文件替换成真实的,或者用TinyCore的首选UEFI GRUB版本替换移植版的GRUB .

    如果你想vmlinuz直接从 UEFI 固件启动 TinyCore,内核需要用 编译CONFIG_EFI_STUB=y,然后你需要弄清楚如何处理启动参数和 initramfs 文件。通过将引导选项配置到 UEFI 引导变量中,我进行了一次这样的设置。如果没有引导加载程序,您可能无法在引导时更改引导参数,因此您最好提前生成几个具有不同引导参数的 UEFI 引导变量设置,这样您就可以访问例如,如果内核更新出现问题,系统会出现问题。

    (如果您的固件级 UEFI 引导选项包括引导到 UEFI Shell 的方法,那么它在设置“无引导加载程序”的 UEFI 可引导安装时非常有用。)

    UEFI 引导变量中使用的 UUID 可以通过运行该blkid命令来发现。GRUB 使用文件系统 UUID(=UUID=字段),而 UEFI 引导变量使用分区的唯一 UUID(=PARTUUID=字段)。

    • 3
  2. Best Answer
    Joe C
    2018-04-08T08:42:37+08:002018-04-08T08:42:37+08:00

    这就是我的做法。首先,我将我的 PC EFI 选项设置为仅 EFI 引导。然后我从 DVD 启动 Ubuntu 16.04.4。(显然这是 UEFI 引导。)。在 Ubuntu 16.04.4 中,我执行了以下操作。

    1. 挂载了我的 ESP 分区。(它是磁盘 1 的分区 1)
    2. mkdir /path/to/mounted/esp/partition/EFI/prime_boot
    3. 使用以下命令安装 grub-efi-amd64: sudo apt-get install grub-efi-amd64
    4. grub-mkimage -o /path/to/mounted/esp/partition/EFI/prime_boot/bootx64.efi --format=x86_64-efi '--prefix=(hd0,gpt1)/EFI/prime_boot' ext2 part_gpt
    5. 在 /path/to/mounted/esp/partition/EFI/prime_boot/ 中设置以下 grub.cfg 文件

      menuentry "GRUB 链式加载器" { 链式加载器 (hd0,gpt2)/boot/efi/core.efi }

    6. 将目录 /usr/lib/grub/x86_64-efi 复制到 /path/to/mounted/esp/partition/EFI/prime_boot/。

    7. efibootmgr -c -d /dev/sda -p 1 -l \EFI\prime_boot\bootx64.efi -L "主加载器"
    8. 在 EFI 菜单中设置引导顺序以使用“Primary Loader”

    是的,您必须在“efibootmgr”命令中转义“\”。现在您已经使用此主加载程序将 EFI 引导到 TinyCore 分区中的引导加载程序。所以现在你设置了 TinyCore 分区的引导加载程序。

    1. 挂载 TinyCore 分区。(我的是磁盘 1 分区 2)
    2. grub-mkimage -o /path/to/mounted/tinycore/partition/boot/efi/corex64.efi --format=x86_64-efi '--prefix=(hd0,gpt2)/boot/efi' ext2 part_gpt
    3. 现在在 /path/to/mounted/tinycore/partition/boot/efi/ 中创建多引导 grub.cfg

    我知道有人会想为什么我从主引导加载程序跳转到多引导加载程序。我只想在我的 esp 分区中做尽可能少的事情。我希望 TinyCore(我的维护操作系统)成为多引导引导管理器的所有者。

    • 0

相关问题

  • 无法在 UEFI 中启动实时 Linux 多重引导 USB

  • grub2-mkconfig 没有生成正确的挂载路径(以及如何摆脱不再使用的额外内核?)

  • 如何在 debian 上找到内核崩溃日志

  • Ctrl + C 在 Linux 上的单用户模式下不起作用

  • GRUB 配置以识别同一 Linux 发行版的不同桌面环境(安装)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve