我正在尝试为 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.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 的条目更改为:
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
告诉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=
相应地调整参数。这至少会加快安装过程的初始部分。