PXE:找不到文件 - 但为什么?

PXE:找不到文件 - 但为什么?

我正在尝试为 Ubuntu 22.04 服务器设置 PXE 启动,如下这些说明。这是我的/srv/tftp

root@vogon:~# ll /srv/tftp
total 1444
drwxr-xr-x 3 root root    4096 Jul 15  2022 boot/
drwxr-xr-x 3 root root    4096 Jul  1  2022 debian/
drwxrwxrwx 3 root root    4096 Jul  8  2022 debian-installer/
lrwxrwxrwx 1 root root      36 Jul  8  2022 grub.cfg -> debian-installer/amd64/grub/grub.cfg
-rw-r--r-- 1 root root    9278 Jul  1  2022 grub.cfg.bk
-rw-r--r-- 1 root root 1426816 Jan 25 13:44 grubx64.efi
drwx------ 2 root root   16384 Jul  8  2022 lost+found/
drwxr-xr-x 2 root root    4096 Jan 25 13:22 save/
drwxr-xr-x 4 root root    4096 Jan 25 12:52 ubuntu/

我的想法是,我将能够从多个发行版中进行选择,这适用于 Debian 11 和 Ubuntu 20.04;我现在想添加 Ubuntu 22.04 - 这是我的grub.cfg

root@vogon:~# cat /srv/tftp/grub.cfg
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue
set gfxpayload=text
set timeout=-1

menuentry 'Debian 11'{
        set background_color=black
        linux    /debian/11/amd64/linux priority=low vga=788 ---
        initrd   /debian/11/amd64/initrd.gz
}

menuentry "Ubuntu 20.04" {
  linux /ubuntu/20.04/amd64/linux only-ubiquity ip=dhcp ---
  initrd /ubuntu/20.04/amd64/initrd.gz
}

menuentry "Ubuntu 22.04 Server" {
  linux /srv/tftp/ubuntu/22.04-srv/vmlinuz url=https://www.releases.ubuntu.com/22.04/ubuntu-22.04.1-live-server-amd64.iso only-ubiquity ip=dhcp ---
  initrd=/srv/tftp/ubuntu/22.04-srv/initrd
}

菜单显示得很好,但是当我选择 时Ubuntu 22.04 Server,我短暂地看到了一条消息File not found- 但没有任何关于哪个文件的信息。此条目的行linux ...已经经过多次排列,所有排列都显示相同的错误。中提到的最后一个文件syslog/srv/tftp/ubuntu/22.04-srv/vmlinuz

...
Jan 25 13:18:52 vogon in.tftpd[376344]: RRQ from 192.168.50.96 filename grubx64.efi
Jan 25 13:18:52 vogon in.tftpd[376345]: RRQ from 192.168.50.96 filename /debian-installer/amd64/grub/x86_64-efi/command.lst
Jan 25 13:18:52 vogon in.tftpd[376346]: RRQ from 192.168.50.96 filename /debian-installer/amd64/grub/x86_64-efi/fs.lst
Jan 25 13:18:52 vogon in.tftpd[376347]: RRQ from 192.168.50.96 filename /debian-installer/amd64/grub/x86_64-efi/crypto.lst
Jan 25 13:18:52 vogon in.tftpd[376348]: RRQ from 192.168.50.96 filename /debian-installer/amd64/grub/x86_64-efi/terminal.lst
Jan 25 13:18:52 vogon in.tftpd[376349]: RRQ from 192.168.50.96 filename /debian-installer/amd64/grub/grub.cfg
Jan 25 13:19:00 vogon in.tftpd[376358]: RRQ from 192.168.50.96 filename /srv/tftp/ubuntu/22.04-srv/vmlinuz
...

我怀疑它vmlinux已加载,但url=...不被理解 - 但它应该是什么?

答案1

grubx64.efiTFTP 服务器发出请求时,它会提供文件/srv/tftp/grubx64.efi.

/debian-installer/amd64/grub/x86_64-efi/command.lst被请求时,它提供文件/srv/tftp/debian-installer/amd64/grub/x86_64-efi/command.lst。你能看到图案吗?

您的 TFTP 服务器似乎将/srv/tftp/前缀添加到它收到的所有请求的路径名中,从而有效地限制 TFTP/srv/tftp/仅访问其下的目录。你可以说这/srv/tftp是你的服务器的TFTP 根目录

在为 Ubuntu 22.04 编写菜单项时,您已写入该前缀,这与其他菜单项不同。当 TFTP 服务器收到 的请求时/srv/tftp/ubuntu/22.04-srv/vmlinuz,它将再次添加前缀……并最终尝试读取/srv/tftp/srv/tftp/ubuntu/22.04-srv/vmlinuz,而这显然不存在。

我建议将/srv/tftp/grub.cfgUbuntu 22.04 的条目更改为:

menuentry "Ubuntu 22.04 Server" {
  linux /ubuntu/22.04-srv/vmlinuz url=https://www.releases.ubuntu.com/22.04/ubuntu-22.04.1-live-server-amd64.iso only-ubiquity ip=dhcp ---
  initrd /ubuntu/22.04-srv/initrd
}

关键字后面的文件名linux告诉initrdPXE 引导的 GRUB 通过 TFTP 下载这些文件,因此这些路径名必须相对于服务器的 TFTP 根目录。

此时,url=只是一个数据字符串,它将按原样传递,无需解释到 GRUB 尝试引导的内核。一旦内核启动并且文件中的脚本和工具initrd开始执行(换句话说,在 initramfs 引导阶段),就会通过/proc/cmdline.我手头没有 Ubuntu 网络安装initrd文件,所以我无法提取它来确认,但我猜想该选项的存在url=将触发一些脚本来使用类似工具curlwget将该 URL 的内容下载到 RAM 磁盘。

由于 URL 指定了https://,因此与 TFTP 无关。如果您的互联网连接不是最快的,您可能需要下载一次 ISO,将其托管在某个相当本地的 HTTP 或 HTTPS 服务器中,并url=相应地调整参数。这至少会加快安装过程的初始部分。

相关内容