22.04 Jammy PXE 引导帮助

22.04 Jammy PXE 引导帮助

总结一下,我遇到的问题就是当我使用 PXE 启动 UEFI 系统时,我卡在了一个grub>提示符处。看来 UEFI 系统没有加载 grub.cfg 文件,我真不知道为什么。

由于 22.04 不再为我们提供 mini.iso 或 netboot.iso 选项,我一直在(在我们的实验室中)构建“新”系统部署自动化方法的 POC。在大多数情况下,我一直遵循以下两个 URL 中的说明:

目前,我的 PoC 全部位于一个小型 Hyper-V 实验室中。网络配置非常简单,因为我有一个 pfSense FW,可让我的实验室网络访问互联网,并且 FW 后面的所有内容都在封闭(私有)网络上。这使我可以完全控制 DHCP 等内容。

在我称之为 PXE 的服务器上,我安装了:

  • 阿帕奇2
  • isc-dhcp 服务器
  • tftpd-hpa

TFTP目录结构:

├── boot
│   ├── bootx64.efi
│   ├── grub
│   │   ├── font.pf2
│   │   ├── grub.cfg
│   │   ├── unicode.pf2
│   │   └── x86_64-efi
│   │       ├── command.lst
│   │       ├── crypto.lst
│   │       ├── fs.lst
│   │       └── terminal.lst
│   ├── grubx64.efi
│   ├── jammy
│   │   ├── initrd
│   │   └── vmlinuz
│   ├── ldlinux.c32 -> ./syslinux/bios/ldlinux.c32
│   ├── libutil.c32 -> ./syslinux/bios/libutil.c32
│   ├── menu.c32 -> ./syslinux/bios/menu.c32
│   ├── pxelinux.0
│   ├── pxelinux.cfg
│   │   └── default
│   └── syslinux
│       └── bios
│           ├── ldlinux.c32
│           ├── libutil.c32
│           └── menu.c32
└── grub -> ./boot/grub/

/etc/dhcp/dhcpd.conf

allow booting;
allow bootp;
option arch code 93 = unsigned integer 16;

subnet 172.16.1.0 netmask 255.255.255.0 {
    range 172.16.1.100 172.16.1.110;
}

host test1 {
    hardware ethernet 00:15:5d:01:21:07;
    if option arch = 00:07 {
        filename "boot/bootx64.efi";
    } else {
        filename "boot/pxelinux.0";
    }
    next-server 172.16.1.50;
    fixed-address 172.16.1.60;
}

host test2 {
        hardware ethernet 00:15:5d:01:21:08;
        if option arch = 00:07 {
               filename "boot/bootx64.efi";
        } else {
                filename "boot/pxelinux.0";
        }
        next-server 172.16.1.50;
        fixed-address 172.16.1.61;
}

笔记:我希望我的 pfSense 服务器能够发出 DHCP,但我发现让 isc-dhcp-server 启动的唯一方法是指定某种类型或范围。我需要解决这个问题,但目前看来,由于所有内容都在同一个子网上,因此使用此配置一切运行良好。

在/etc/default/tftpd-hpa中

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure

/etc/default/isc-dhcp 服务器

# Defaults for isc-dhcp-server (sourced by /etc/init.d/isc-dhcp-server)

# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
#DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
#DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf

# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
#DHCPDv4_PID=/var/run/dhcpd.pid
#DHCPDv6_PID=/var/run/dhcpd6.pid

# Additional options to start dhcpd with.
#       Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
#OPTIONS=""

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4="eth0"
INTERFACESv6="eth0"

/tftp/boot/grub/grub.cfg

set timeout=30

loadfont unicode

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray

menuentry "Install Ubuntu Jammy (22.04)" {
        set gfxpayload=keep
        linux   /boot/jammy/vmlinuz ip=dhcp cloud-config-url=/dev/null url=http://172.16.1.50/isos/jammy/ubuntu-22.04-live-server-amd64.iso autoinstall ds="nocloud-net;s=http://172.16.1.50/cloud-init/jammy/" --- # Don't forget the slash at the end.
        initrd  /boot/jammy/initrd
}

tcpdump -n -i eth0 端口 69

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
01:26:56.188414 IP 172.16.1.60.1332 > 172.16.1.50.69: TFTP, length 59, RRQ "boot/bootx64.efi" octet tsize 0 blksize 1482 windowsize 4
01:26:56.189458 IP 172.16.1.60.1333 > 172.16.1.50.69: TFTP, length 51, RRQ "boot/bootx64.efi" octet blksize 1482 windowsize 4
01:26:56.225401 IP 172.16.1.60.1334 > 172.16.1.50.69: TFTP, length 50, RRQ "boot/grubx64.efi" octet blksize 512 windowsize 4

grub> 回显 $prefix

(tftp,172.16.1.50)/boot/grub

Grub>Info 的屏幕截图

不管怎样,我已经验证了 Apache2 目录是否正确提供服务,事实上,通过上述配置,我能够使用 pxelinux.0 以 PXE 方式启动基于 BIOS 的系统。

无论出于什么原因,UEFI 系统(或者在我的情况下是 Hyper-V Gen2)都会在菜单中“卡住” grub>

任何帮助或建议都将不胜感激。我知道我已经很接近了。

干杯!

答案1

我们也遇到了这个问题。请grubnetx64.efi从下载文件http://archive.ubuntu.com/ubuntu/dists/jammy/main/uefi/grub2-amd64/current/并替换现有grubx64.efi文件。它应该可以工作。

答案2

我隐约记得 ubuntu20 也存在这个问题,然后找到了我的笔记……ISO 中的原版 grubx64.efi 不支持网络启动。相反,你必须从镜像中获取几个包并提取所需的文件:

++++对于U22.04:

cd /var/tmp
wget http://mirrors.kernel.org/ubuntu/pool/main/g/grub2-signed/grub-efi-amd64-signed_1.180+2.06-2ubuntu7_amd64.deb
wget http://mirrors.kernel.org/ubuntu/pool/main/s/shim-signed/shim-signed_1.51+15.4-0ubuntu9_amd64.deb
dpkg -x grub-efi-amd64-signed_1.180+2.06-2ubuntu7_amd64.deb  grub
dpkg -x shim-signed_1.51+15.4-0ubuntu9_amd64.deb shim

这些是截至今天的镜像路径,如果重要的话,您可能需要确保获取最新版本......

cp shim/usr/lib/shim/shimx64.efi.signed /tftpboot/bootx64.efi
cp grub/usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed /tftpboot/grubx64.efi

当然,适当调整您的 /tftpboot... 路径。

相关内容