预启动执行环境

来自 ArchWiki
(重定向自 PXE)

来自 维基百科:预启动执行环境

预启动执行环境 (PXE,通常发音为 pixie) 规范描述了一个标准化的客户端-服务器环境,该环境在启用 PXE 的客户端上启动从网络检索的软件组件。在客户端,它仅需要一个支持 PXE 的网络接口控制器 (NIC),并使用一小部分行业标准网络协议,例如 DHCP 和 TFTP。

在本指南中,PXE 用于使用支持目标上 PXE 的适当选项 ROM 从安装介质启动。当您已经设置了服务器时,这效果很好。

准备工作

概述

概述 PXE 启动过程对于理解 #服务器设置、客户端的 #安装 以及所需的 Arch Linux 文件非常有用。

客户端首先广播数据包,请求 DHCP 服务器并包含特定的 PXE 选项。DHCP 服务器使用网络信息(分配给客户端的 IP 地址)进行响应,并且还通过使用 DHCP 的特定 引导程序协议 (BOOTP) 参数,提供其他信息,例如 TFTP 服务器地址、要下载的初始网络引导程序 (NBP) 的路径或引导配置文件名。

NBP 使用 TFTP 从 PXE 服务器传输到客户端,以便加载到内存中并执行。内核和 initramfs 也以这种方式传输。

然后使用以下协议之一传输根文件系统:HTTP、NFS 或 NBD。

警告: PXELINUX 不支持任何安全机制来验证其接收的内容(通过 TFTP 或 HTTP)是否是预期的内容。请参阅 RFC 5071 第 8 节。另一种选择是使用 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 支持 BIOSUEFI 启动。

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

您还可以使用 dhcpcd 来配置静态 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 钩子,可以使用 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= 参数以指示内核在尝试通过网络挂载安装介质之前启动网络接口。当客户端有多个有线接口和/或您希望在启动的 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.0archiso.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 选项可用于控制是否应在早期启动时将根文件系统完整地复制到 ram 中。

强烈建议保持此选项不变,只有在绝对必要时才应禁用它(物理内存少于约 256MB 的系统)。如果您希望这样做,请将 copytoram=n 附加到您的内核行。

注意: 由于这需要从挂载的远程文件系统循环挂载 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

有关更多信息,请参阅 简单状态防火墙#设置 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 核心,要么转到“虚拟机”>“设置”>“系统”>“加速”,并设置以下半虚拟化接口之一:“最小”、“Hyper-V”或“KVM”。