【问题标题】:Create a grub script that auto detect EFI systems, and boot first one创建一个自动检测 EFI 系统并启动第一个系统的 grub 脚本
【发布时间】:2021-08-02 22:58:40
【问题描述】:

我正在开发一个开源项目bluebanquise,该项目旨在部署裸机基础架构,现在我们支持 RHEL/CentOS 8 发行版,我希望添加其他 RHEL 衍生发行版(Rocky Linux、Oracle Linux、Cloud Linux , etc etc), 以及未来的其他非 RHEL 发行版 (Ubuntu, OpenSuse 等)。

默认情况下,在我们的基础架构上,所有服务器都默认通过 PXE 启动。 DHCP 提供了一个 iPXE rom,它链接到其他 ipxe 文件等。在这个链中的某个点,如果服务器必须在磁盘上启动(所以不要在无盘中部署或启动),并且如果服务器在 EFI 中,iPXE 链到 grub2带有嵌入脚本的映像,该脚本尝试检测已安装的操作系统并启动找到的第一个操作系统。

注意:也许这不是在 EFI 中从 iPXE 引导到磁盘的最佳解决方案。但我什么也没找到。

脚本如下:grub2-efi-autofind.cfg

基本上,它会为 RedHat 或 CentOS Linux 搜索 grub.cfg 文件,如果找到则使用它们进行引导。 但是现在,我想让这个脚本更“通用”,这样它就可以绕过分发名称的需要,只查找任何 /efi/*/grub.cfg 文件。

但是,我无法创建能够执行此操作的脚本 :-(

我在this page 上找到了一个有趣的脚本,但我未能根据我的需要调整 for 循环。我尝试单独使用它:

     for efi in (*,gpt*)/efi/*/grub.cfg ; do
        regexp --set=1:efi_device '^\((.*)\)/' "${efi}"
        echo found efi
        echo "${efi}"
        echo "${efi_device}"
        echo "${2}"
        echo "${1}"
        sleep --interruptible --verbose 10
    done

但这不会输出任何东西,除了“(,gpt)/efi/*/grub.cfg”

我尝试使用此页面的纯代码,它确实检测到了文件,但是在自动菜单中进行了几次迭代之后(我需要在检测 EFI 引导加载程序上按两次才能获得正确的路径)。这不是自动的。

GRUB2 文档中并没有很多与此相关的示例,我也没有在网上找到很多关于此问题的交流。

如果你们中的某个人知道从 iPXE rom 引导磁盘上的 EFI 系统的更好方法,或者如果您知道如何通过一般检测 efi 中的任何 grub.cfg 的方式将 search.file 替换为静态路径分区,我很高兴读到它! :-)

非常感谢您阅读本文,即使您没有答案。

致以最诚挚的问候

【问题讨论】:

    标签: grub grub2 ipxe


    【解决方案1】:

    我终于找到了一种方法,添加了很多回声和睡眠,我能够找到一个有效的模式:

    echo " Loading modules..."
    insmod part_gpt
    insmod fat
    insmod chain
    insmod part_msdos
    insmod ext2
    echo
    echo "Scanning, first pass..."
    for efi in (*,gpt*)/efi/*/grub.cfg (*,gpt*)/efi/*/*/grub.cfg (*,gpt*)/grub.cfg (*,gpt*)/*/grub.cfg ; do
                    regexp --set=1:efi_device '^\((.*)\)/' "${efi}"
    done
    echo "Scanning, second pass..."
    for efi in (*,gpt*)/efi/*/grub.cfg (*,gpt*)/efi/*/*/grub.cfg (*,gpt*)/grub.cfg (*,gpt*)/*/grub.cfg ; do
                    regexp --set=1:efi_device '^\((.*)\)/' "${efi}"
                    if [ -e "${efi}" ]; then
                        efi_found=true
                        echo " >> Found operating system! <<"
                        echo " Path: ${efi}"
                        echo " Booting in 5s..."
                        sleep --interruptible --verbose 5
                        configfile "${efi}"
                        boot
                    fi
    done
    

    但是,虽然它有效,但我不明白为什么......基本上,它第一次执行 for 循环时,grub 什么也没找到。 第二次循环时,找到了文件。所以这里的解决方法是第一次循环,什么都不做,然后再用条件和引导重做一次。

    如果有一天有人明白这里发生了什么,我很感兴趣:-) 现在,它就像一个魅力一样发挥作用。

    【讨论】:

      猜你喜欢
      • 2011-06-05
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多