跳转至内容

Preboot Execution Environment

来自 ArchWiki

来自 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。

警告 PXELINUX 不支持任何安全机制来验证它接收到的(通过 TFTP 或 HTTP)是否是预期的。参见 RFC 5071 section8。替代方案是使用 Netboot 镜像,它们可以 验证 签名与嵌入在 iPXE 二进制文件中的代码签名证书。请注意,Netboot 镜像需要放置在本地系统上。

从安装介质启动

为了收集将从服务器传输到客户端以进行启动的文件,请从 下载页面 获取最新的官方安装镜像。

接下来挂载镜像

# mount --mkdir -o loop,ro archlinux-release_date-x86_64.iso /mnt/archiso

其中 release_date 是 ISO 文件名中的发布日期,例如 2022.10.01

注意 Arch ISO 目前仅支持 **BIOS** 风格的 PXE 启动。有关更多信息,请参阅 archlinux/archiso#55

从网络启动

Arch Linux netboot 镜像可在系统启动时按需下载最新的 Arch Linux 版本。下载与您的配置兼容的镜像。

注意 Arch netboot 支持 **BIOS** 和 **UEFI** 启动。

Pixiecore

一个集成解决方案由 pixiecore 提供

  1. 安装 pixiecore-gitAUR
  2. 以 root 身份运行 pixiecore quick arch --dhcp-no-bind
  3. 通过 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_httparchiso_pxe_nfsarchiso_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

LINUXINITRD 路径相对于 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.0archiso.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 添加到您的内核行。

注意 由于这需要从已挂载的远程文件系统 loop-mount squashfs,因此 copytoram=narchiso_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 gatewayInternet 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*。