预启动执行环境
来自 维基百科:预启动执行环境
- 预启动执行环境 (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。
从安装介质启动
为了收集将从服务器传输到客户端以进行启动的文件,请从下载页面获取最新的官方安装镜像。
接下来挂载镜像
# 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 风格启动的 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 钩子,可以使用 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 选项可用于控制是否应在早期启动时将根文件系统完整地复制到 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
。
有关更多信息,请参阅 简单状态防火墙#设置 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”。