我正在尝试按照这些说明为 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=...
不理解 - 但它应该是什么?
当
grubx64.efi
从您的 TFTP 服务器请求时,它会提供文件/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.cfg
Ubuntu 22.04 的条目更改为:linux
关键字后的文件名initrd
告诉 PXE 引导的 GRUB 通过 TFTP 下载这些文件,因此这些路径名必须与服务器的 TFTP 根目录相关。在这一点上,
url=
只是一个数据字符串,它将按原样传递而不解释给 GRUB 试图引导的内核。一旦内核启动并且initrd
文件中的脚本和工具开始执行(换句话说,在 initramfs 启动阶段),字符串将通过/proc/cmdline
. 我手头没有 Ubuntu 网络安装initrd
文件,所以我无法提取它来确认,但我猜想该url=
选项的存在会触发一些脚本来使用类似工具curl
或wget
将该 URL 的内容下载到 RAM 磁盘。由于 URL 指定
https://
,它与 TFTP 无关。如果您的互联网连接不是最快的,您可能需要下载一次 ISO,将其托管在一些合理的本地 HTTP 或 HTTPS 服务器上,并url=
相应地调整参数。这至少应该加快安装过程的初始部分。