0

我正在开发一个旨在部署裸机基础设施的开源项目bluebanquise,现在我们支持 RHEL/CentOS 8 发行版,我希望添加其他 RHEL 衍生发行版(Rocky Linux、Oracle Linux、Cloud Linux 等),将来还会有其他非 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 文件。

但是,我无法创建一个能够做到这一点的脚本:-(

我在此页面上找到了一个有趣的脚本,但我无法使 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"

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

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

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

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

我最好的问候

4

1 回答 1

0

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

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 什么也没找到。第二次循环时,找到了文件。所以这里的解决方法是第一次循环,什么都不做,然后再用条件和引导重做一次。

如果有一天有人了解这里发生了什么,我会非常感兴趣:-) 现在,它就像一种魅力。

于 2021-06-09T12:00:44.187 回答