预启动执行环境
出自 维基百科:预启动执行环境
- 预启动执行环境(PXE,通常发音为 pixie)规范描述了一种标准化的客户端-服务器环境,该环境在启用 PXE 的客户端上启动从网络检索的软件组件。在客户端,它仅需要支持 PXE 的网络接口控制器(NIC),并使用一小组行业标准网络协议,例如 DHCP 和 TFTP。
在本指南中,PXE 用于使用适当的选项 ROM 启动安装介质,该选项 ROM 在目标机器上支持 PXE。当您已经设置了服务器时,这非常有效。
准备工作
概述
概述 PXE 启动过程对于理解#服务器设置、客户端的#安装以及所需的 Arch Linux 文件非常有用。
客户端首先广播数据包,请求 DHCP 服务器并包含特定的 PXE 选项。DHCP 服务器使用网络信息(分配给客户端的 IP 地址)进行响应,并且还通过使用 DHCP 的特定引导程序协议(BOOTP)参数,提供其他信息,例如TFTP服务器地址、要下载的初始网络引导程序(NBP)的路径或引导配置文件名。
NBP 使用 TFTP 从 PXE 服务器传输到客户端,加载到内存中并执行。内核和 initramfs 也以这种方式传输。
然后,根文件系统使用以下协议之一传输:HTTP、NFS 或 NBD。
从安装介质启动
为了收集将从服务器传输到客户端进行启动的文件,请从下载页面获取最新的官方安装镜像。
接下来挂载镜像
# mount --mkdir -o loop,ro archlinux-release_date-x86_64.iso /mnt/archiso
其中 release_date
是 ISO 文件名中的发布日期,例如 2022.10.01
。
从网络启动
Arch Linux netboot 镜像可用于在系统启动时动态下载最新的 Arch Linux 版本。下载与您的配置兼容的镜像。
Pixiecore
一个一体化解决方案由 pixiecore 提供
- 安装 pixiecore-gitAUR
- 以 root 身份运行
pixiecore quick arch --dhcp-no-bind
- 通过 PXE 启动
服务器设置
您将需要设置一个 DHCP 服务器、一个用于传输 NBP 的 TFTP 服务器,以及以下服务之一用于传输根文件系统:HTTP 服务器、NFS 或 NBD。
网络
启动您的有线网络适配器,并为其分配适当的地址。
# ip link set eth0 up # ip addr add 192.168.0.1/24 dev eth0
您还可以使用 dhcpcd 来配置静态 IP。
DHCP + TFTP
您将需要 DHCP 服务器和 TFTP 服务器来配置安装目标的网络,并促进服务器和客户端之间的文件传输。dnsmasq 可以同时实现这两者,并且非常容易设置。
dnsmasq 需要配置。请参阅关于如何设置 dnsmasq#TFTP 服务器和 dnsmasq#PXE 服务器的说明。
下面提供了一些常见的配置说明。tftp_root 是 Arch ISO 挂载的目录(例如 /mnt/archiso
)或网络引导程序所在的目录。
# /etc/dnsmasq.conf
# Listen only to the specified interface interface=eth0 # Do not function as DNS server port=0 # TFTP server setup enable-tftp tftp-root=tftp_root # Log extra information about DHCP transactions (for debug purposes) log-dhcp
要启用 DHCP 服务器并在某个范围内提供 IPv4 地址,请在配置文件中添加类似于以下的行
dhcp-range=192.168.0.50,192.168.0.150
或者,如果网络上已经运行了 DHCP 服务器,并且您想与其互操作,请参阅 dnsmasq#Proxy DHCP。
下面提供了两个涵盖不同启动样式和安装介质的示例。
根据您的需要配置完成后,启动 dnsmasq.service
。
从安装介质 BIOS 启动
要传输的初始引导程序的路径在配置文件中使用 dhcp-boot
选项定义。
dhcp-boot=/boot/syslinux/lpxelinux.0
为了发送特定的引导程序协议(BOOTP)参数,例如配置文件路径,使用 dhcp-option-force=flag,value
行。
dhcp-option-force=209,archiso_pxe.cfg # this file might be under /mnt/archiso/boot/syslinux dhcp-option-force=210,
从网络 UEFI 启动
要根据体系结构发送文件,此处为 UEFI 样式启动的网络启动镜像,请使用
pxe-service=BC_EFI, "Boot from network BC EFI", ipxe.efi pxe-service=X86-64_EFI, "Boot from network X86-64 EFI", ipxe.efi
如果使用网络启动,则服务器设置部分的其余部分(侧重于 Arch ISO)不适用。
传输 archiso 根文件系统
由于 archiso 中的 archiso_pxe_http
、archiso_pxe_nfs
和 archiso_pxe_nbd
initcpio 钩子,可以使用 HTTP、NFS 或 NBD 进行启动。这三种方法的启动时间大致相同,但 HTTP 方法允许您以百分比形式查看 airootfs.sfs
的下载状态。
HTTP
在所有替代方案中,darkhttpd 是迄今为止最容易设置的(也是最轻量级的)。
然后使用我们的 /mnt/archiso
作为文档根目录启动 darkhttpd
# darkhttpd /mnt/archiso
darkhttpd/1.8, copyright (c) 2003-2011 Emil Mikulic. listening on: http://0.0.0.0:80/
80
上运行非常重要。如果您在没有 root 访问权限的情况下启动 darkhttpd,它将默认为 8080
,客户端仍然会尝试访问端口 80,并且启动将失败。NFS
您将需要设置一个 NFS 服务器,并在您挂载的安装介质的根目录(如果您按照#准备工作操作,则为 /mnt/archiso
)上进行导出。设置服务器后,将以下行添加到您的 /etc/exports
文件中
/etc/exports
/mnt/archiso 192.168.0.0/24(ro,no_subtree_check)
如果服务器已在运行,请使用 exportfs -r -a -v
重新导出文件系统。
安装程序中的默认设置期望在 /run/archiso/bootmnt/
找到 NFS,因此您需要编辑启动选项。为此,请在相应的启动菜单选项上按 Tab 键,并相应地编辑 archiso_nfs_srv
选项
archiso_nfs_srv=${pxeserver}:/mnt/archiso
或者,您可以为整个过程使用 /run/archiso/bootmnt
。
内核加载后,Arch 引导程序镜像将通过 NFS 将根文件系统复制到正在启动的主机。这可能需要一段时间。完成后,您应该有一个正在运行的系统。
NBD
/etc/nbd-server/config
[generic] [archiso] readonly = true exportname = /srv/archlinux-release_date-x86_64.iso
其中 release_date
是 ISO 文件名中的发布日期,例如 2022.10.01
。
启动 nbd.service
。
现有 PXE 服务器
如果您有现有的 PXE 服务器,并设置了 PXELINUX 系统(例如 DHCP 和 TFTP 的组合),您可以将以下菜单项添加到您的 /tftpboot/pxelinux.cfg/default
文件中,以便通过您喜欢的方法启动 Arch。
由于 PXELINUX 支持 HTTP,因此只需要通过 TFTP 传输引导加载程序,其他所有内容都可以使用 HTTP。例如
LABEL archlinux MENU LABEL Arch Linux x86_64 LINUX http://httpserver/path/to/extracted/Arch/ISO/arch/boot/x86_64/vmlinuz-linux INITRD http://httpserver/path/to/extracted/Arch/ISO/arch/boot/x86_64/initramfs-linux.img APPEND archisobasedir=arch archiso_http_srv=http://httpserver/path/to/extracted/Arch/ISO/ cms_verify=y SYSAPPEND 3 TEXT HELP Arch Linux 2022.10.01 x86_64 ENDTEXT
对于 NFS 和 NBD,内核和 initramfs 必须从 TFTP 下载。例如,对于 NFS
LABEL archlinux MENU LABEL Arch Linux x86_64 LINUX /path/to/extracted/Arch/ISO/arch/boot/x86_64/vmlinuz-linux INITRD /path/to/extracted/Arch/ISO/arch/boot/x86_64/initramfs-linux.img APPEND archisobasedir=arch archiso_nfs_srv=pxeserver:/run/archiso/bootmnt cms_verify=y SYSAPPEND 3 TEXT HELP Arch Linux 2022.10.01 x86_64 ENDTEXT
LINUX
和 INITRD
路径相对于 TFTP 根目录。对于 NBD,请在上面的示例中将 archiso_nfs_srv
替换为 archiso_nbd_srv
。请参阅 Arch Linux ISO 上的 boot/syslinux/archiso_pxe.cfg
文件中的用法示例。
无论您选择哪种方法,都必须传递 ip=
参数,以指示内核在尝试通过网络挂载安装介质之前启动网络接口。当客户端有多个有线接口和/或您希望在启动的 archiso 中已配置 resolv.conf
时,需要传递 BOOTIF=
。您可以使用 sysappend 掩码 3
(即 1
+2
)来自动传递这些参数。有关可用的启动参数,请参阅 README.bootparams。
安装
对于这部分,您需要弄清楚如何告知客户端尝试 PXE 启动;在屏幕的角落以及正常的启动后消息中,通常会提示您按哪个键首先尝试 PXE 启动。在 IBM x3650 上,F12
会调出启动菜单,第一个选项是网络;在 Dell PE 1950/2950 上,按 F12
会直接启动 PXE 启动。
启动
查看 PXE 服务器上的 journald 将提供有关 PXE 启动过程早期阶段究竟发生了什么的更多见解
# journalctl -u dnsmasq.service -f
dnsmasq-dhcp[2544]: DHCPDISCOVER(eth1) 00:1a:64:6a:a2:4d dnsmasq-dhcp[2544]: DHCPOFFER(eth1) 192.168.0.110 00:1a:64:6a:a2:4d dnsmasq-dhcp[2544]: DHCPREQUEST(eth1) 192.168.0.110 00:1a:64:6a:a2:4d dnsmasq-dhcp[2544]: DHCPACK(eth1) 192.168.0.110 00:1a:64:6a:a2:4d dnsmasq-tftp[2544]: sent /mnt/archiso/boot/syslinux/pxelinux.0 to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/boot/syslinux/archiso.cfg to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/boot/syslinux/whichsys.c32 to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/boot/syslinux/archiso_pxe_choose.cfg to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/boot/syslinux/ifcpu64.c32 to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/boot/syslinux/archiso_pxe_both_inc.cfg to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/boot/syslinux/archiso_head.cfg to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/boot/syslinux/archiso_pxe32.cfg to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/boot/syslinux/archiso_pxe64.cfg to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/boot/syslinux/archiso_tail.cfg to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/boot/syslinux/vesamenu.c32 to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/boot/syslinux/splash.png to 192.168.0.110
在您通过 TFTP 加载 pxelinux.0
和 archiso.cfg
后,您(希望)将看到一个 syslinux 启动菜单,其中有多个选项,您可以选择启动 Arch Linux (x86_64) (HTTP)。
接下来,内核和 initramfs(适用于您选择的体系结构)将再次通过 TFTP 传输
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/x86_64/vmlinuz to 192.168.0.110 dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/x86_64/initramfs-linux.img to 192.168.0.110
如果一切顺利,您应该会看到来自 PXE 目标的 darkhttpd 上的活动;此时,内核将加载到 PXE 目标上,并在 init 中
1348347586 192.168.0.110 "GET /arch/aitab" 200 678 "" "curl/7.27.0" 1348347587 192.168.0.110 "GET /arch/x86_64/root-image.fs.sfs" 200 107860206 "" "curl/7.27.0" 1348347588 192.168.0.110 "GET /arch/x86_64/usr-lib-modules.fs.sfs" 200 36819181 "" "curl/7.27.0" 1348347588 192.168.0.110 "GET /arch/any/usr-share.fs.sfs" 200 63693037 "" "curl/7.27.0"
在通过 HTTP 下载根文件系统后,您最终将进入正常的 live 系统 root zsh 提示符。
启动后
除非您希望所有流量都通过您的 PXE 服务器路由(除非您正确设置它,否则这无论如何都行不通),否则您需要停止 dnsmasq.service
并获取安装目标的新租约,这取决于您的网络布局。
您也可以终止 darkhttpd 进程;目标已经下载了根文件系统,因此不再需要它。同时,您也可以卸载安装镜像
# umount /mnt/archiso
此时,您可以按照安装指南进行操作。
低内存系统
copytoram
initramfs 选项可用于控制是否应在早期启动时将根文件系统完整地复制到内存中。
强烈建议您保留此选项的默认设置,只有在完全必要时才应禁用它(内存小于约 256MB 的系统)。如果您希望这样做,请在您的内核命令行中附加 copytoram=n
。
copytoram=n
和 archiso_pxe_http
是互斥的。与 PXE 客户端共享互联网连接
如果您的 PXE 客户端网络是私有的(例如,192.168.1.0/24),并且您希望它们能够访问互联网(例如,用于软件包安装),您应该正确配置伪装/源网络地址转换 (NAT)。您的 PXE 服务器必须具有单独的网卡连接到互联网。您可以使用以下命令将互联网连接传递给客户端
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
要使此规则在重启后仍然有效,请运行以下命令
iptables-save -f /etc/iptables/iptables.rules
并启用 iptables.service
。
有关更多信息,请参阅简单有状态防火墙#设置 NAT 网关和互联网共享#启用 NAT。
故障排除
DHCP 接口重命名错误
FS#36749 导致默认的可预测网络接口命名失败,然后导致 DHCP 客户端因此失败。一种解决方法是添加内核启动参数 net.ifnames=0
以禁用可预测的接口名称。
VirtualBox 无法启动,而真实机器可以
当使用 VirtualBox 测试您的配置时,虚拟机可能会卡在
Probing EDD (edd=off to disable)... ok
而使用真实机器进行 PXE 启动却可以正常工作。问题可能是因为您为客户端机器设置了多个 CPU 核心,并且您将其类型设置为其他,版本设置为其他/未知 (64 位)。因此,VirtualBox 默认情况下不知道要使用哪个半虚拟化接口。
将 loglevel=7
添加到内核参数可以让您看到它实际卡在了哪里
[ 0.063697] smp: Bringing up secondary CPUs... [ 0.103768] x86: Booting SMP configuration:
要解决此问题,请使用单核 CPU,或者转到虚拟机 > 设置 > 系统 > 加速,并设置以下半虚拟化接口之一:Minimal、Hyper-V 或 KVM。