Preboot Execution Environment
来自 Wikipedia:Preboot Execution Environment
- Preboot eXecution Environment (PXE,最常读作 pixie) 规范描述了一个标准化的客户端-服务器环境,它在支持 PXE 的客户端上启动从网络检索到的软件程序集。在客户端,它只需要一个支持 PXE 的网络接口控制器 (NIC),并使用一组标准的行业网络协议,如 DHCP 和 TFTP。
在本指南中,PXE 用于启动安装介质,其中包含支持目标机器上的 PXE 的适当的选项 ROM。当您已经设置好服务器时,这会非常有用。
准备工作
概述
为了理解 #服务器设置、客户端的 #安装 以及所需的 Arch Linux 文件,了解 PXE 启动过程的概览是很有帮助的。
客户端首先广播数据包,请求 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
您也可以使用 网络管理器 来配置静态 IP。
DHCP + TFTP
您需要一个 DHCP 服务器和一个 TFTP 服务器来配置安装目标的网络,并促进服务器和客户端之间文件的传输。dnsmasq 可以同时完成这两项任务,并且非常容易设置。
安装 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 风格启动的 netboot 镜像,请使用
pxe-service=BC_EFI, "Boot from network BC EFI", ipxe.efi pxe-service=X86-64_EFI, "Boot from network X86-64 EFI", ipxe.efi
如果使用 netboot,服务器设置部分其余关于 Arch ISO 的内容将不再适用。
传输 archiso 根文件系统
得益于 archiso 中的 archiso_pxe_http、archiso_pxe_nfs 和 archiso_pxe_nbd initcpio hook,可以使用 HTTP、NFS 或 NBD 进行启动。这三种方法的启动时间大致相同,但 HTTP 方法允许您以百分比的形式查看 airootfs.sfs 的下载状态。
HTTP
在所有选项中,darkhttpd 是最容易设置(也是最轻量级)的。
首先,安装 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
安装 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= 参数,以指示内核在尝试通过网络挂载安装介质之前启动网络接口。当客户端有多个有线接口和/或您希望 resolv.conf 在已引导的 archiso 中已经配置好时,需要传递 BOOTIF=。您可以使用 sysappend mask 3(即 1+2)来自动传递这些参数。有关可用的引导参数,请参阅 README.bootparams。
安装
对于这一部分,您需要弄清楚如何告诉客户端尝试 PXE 启动;在屏幕角落的正常开机信息旁边,通常会有提示按哪个键先尝试 PXE 启动。在 IBM x3650 上,F12 会调出启动菜单,其第一个选项是 *Network*;在 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
加载 pxelinux.0 和 archiso.cfg 通过 TFTP 后,您(希望)会看到一个 syslinux 启动菜单,其中包含多个选项,您可以选择 *Boot 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
如果一切顺利,您应该会在 darkhttpd 上看到来自 PXE 目标的活动;此时内核将加载到 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 选项可用于控制是否应在早期启动时将根文件系统完全复制到 ram 中。
强烈建议不要更改此选项,并且仅在绝对必要时(物理内存少于约 256MB 的系统)禁用。如果您希望这样做,请将 copytoram=n 添加到您的内核行。
copytoram=n 和 archiso_pxe_http 是互斥的。与 PXE 客户端共享互联网
如果您的 PXE 客户端网络是私有的(例如,192.168.1.0/24),并且您希望它们能够访问互联网(例如,用于安装软件包),您应该正确配置地址伪装/源 NAT。您的 PXE 服务器必须有一个单独的 NIC 连接到互联网。您可以使用此命令将互联网流量转发给客户端
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
要使此规则在重启后持久化,请运行以下命令
iptables-save -f /etc/iptables/iptables.rules
并启用 iptables.service。
有关更多信息,请参阅 Simple stateful firewall#Setting up a NAT gateway 和 Internet sharing#Enable NAT。
故障排除
DHCP 接口重命名错误
FS#36749 导致默认的 可预测网络接口重命名 失败,进而导致 DHCP 客户端失败。一种解决方法是添加内核引导参数 net.ifnames=0 来禁用可预测的网络接口名称。
VirtualBox 无法启动,而真实机器可以
当使用 VirtualBox 测试您的配置时,虚拟机可能会卡在
Probing EDD (edd=off to disable)... ok
而使用真实机器进行 PXE 启动则一切正常。问题可能出在您为客户端机器设置了多个 CPU 核心,并且将其类型设置为 *Other*,版本设置为 *Other/Unknown (64 bit)*。因此,VirtualBox 默认不知道使用哪种半虚拟化接口。
将 loglevel=7 添加到 内核参数中,可以让您看到它实际卡在哪里
[ 0.063697] smp: Bringing up secondary CPUs... [ 0.103768] x86: Booting SMP configuration:
要解决此问题,请使用单个 CPU 核心,或转到 *Machine > Settings > System > Acceleration*,并设置以下半虚拟化接口之一:*Minimal*、*Hyper-V* 或 *KVM*。