跳至內容

PXE

出自 Arch Linux 中文维基

維基百科:預啟動執行環境

預啟動執行環境(Preboot eXecution Environment,PXE,也被稱為預執行環境)提供了一種使用網絡接口(Network Interface)啟動計算機的機制。這種機制讓計算機的啟動可以不依賴本地數據存儲設備(如硬碟)或本地已安裝的作業系統。

在本指南中,PXE 用於通過支持 PXE 的 Option ROM 在目標機器上啟動安裝介質,適用於安裝了伺服器的情況。

準備

[編輯 | 編輯原始碼]

概覽

[編輯 | 編輯原始碼]

在開始前,需要先了解下 PXE 啟動流程,以理解#伺服器搭建,目標設備上的#安裝流程以及所需的 Arch Linux 文件。

目標設備會先廣播數據包,請求 DHCP 伺服器並包含特定的 PXE 選項。接下來,DHCP 伺服器會發送包含網絡信息(分配給目標設備的 IP 地址)的回應,並通過 DHCP 的特定引導協議(bootstrap protocol,BOOTP)參數提供如 TFTP 伺服器地址,初始網絡引導程序(initial network bootstrap program,NBP)的下載路徑或啟動配置文件名稱等額外信息。

NBP 會通過 TFTP 從 PXE 伺服器傳輸到目標設備上,然後加載到內存中並執行。內核以及 initramfs 也是通過一樣的方式進行傳輸。

接下來根文件系統會通過以下協議之一進行傳輸:HTTP,NFS 或 NBD。

警告:PXELINUX 不支持以任何形式對通過 TFTP 或 HTTP 收到的數據進行驗證,具體信息請參考 RFC 5071 section8。替代方法是使用網絡引導(Netboot)映像,它可以使用 iPEX 中嵌入的代碼簽名憑證來驗證簽名。注意,網絡引導映像需要放置在本地設備上。

啟動安裝介質

[編輯 | 編輯原始碼]

首先從下載頁獲取最新的官方安裝映像,以獲取啟動時需要從伺服器傳輸到客戶端的文件。

接下來需要掛載映像:

# 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 網絡引導映像可以在系統啟動時即時下載最新發布的 Arch Linux 版本。請下載適用於你的配置的版本。

注意:Arch 網絡引導映像同時支持 BIOSUEFI 引導方式。

Pixiecore

[編輯 | 編輯原始碼]

pixiecore 提供了一體化解決方案:

  1. 安裝 pixiecore-gitAUR
  2. 以根用戶身份執行 pixiecore quick arch --dhcp-no-bind
  3. 通過 PXE 進行引導

伺服器搭建

[編輯 | 編輯原始碼]

你需要搭建一個 DHCP 伺服器和一個 TFTP 伺服器來傳輸 NBP,以及下列服務之一來傳輸根文件系統:HTTP 伺服器NFS 或 NBD。

網絡

[編輯 | 編輯原始碼]

激活網卡,並分配一個合適的地址。

# ip link set eth0 up
# ip addr add 192.168.0.1/24 dev eth0

你還可以使用網絡管理器來配置靜態 IP。

DHCP + TFTP

[編輯 | 編輯原始碼]

為了在安裝目標上配置網絡並在 PXE 服務端和客戶端之間傳輸文件,需要搭建 DHCPTFTP 伺服器。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

要發送如配置文件路徑等特定引導協議(bootstrap protocol,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,如果使用了網絡引導(netboot),那以下部分將不再適用。

傳送 archiso 根文件系統

[編輯 | 編輯原始碼]

得益於 archiso 中的 archiso_pxe_httparchiso_pxe_nfsarchiso_pxe_nbd initcpio 鉤子,你可以選擇使用 HTTP,NFS 或 NBD 進行啟動。這三種方式的啟動時間基本沒有區別,但使用 HTTP 方式能以百分比形式查看 airootfs.sfs 的下載進度。

在所有備選方案中,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 埠。如果你沒有以根用戶啟動 darkhttpd,那麼它會默認使用 8080 埠,導致目標設備嘗試訪問無效的 80 埠並啟動失敗。

您需搭建 NFS 伺服器並將安裝鏡像的掛載點作為出口(export)。如果您按照#準備段落做了的話,出口就是 /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 bootstrap 鏡像會通過 NFS 複製根文件系統到引導主機(booting host)。這需要一定的時間。一旦複製完成,您就有可運作的系統了。

安裝 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 伺服器

[編輯 | 編輯原始碼]

如果已經有了 PXELINUX 配置(例如 DHCP + TFTP)的 PXE 伺服器,可以通過在 /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,那麼必須通過 TFTP 傳輸內核及 initramfs。以 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 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

在通過 TFTP 加載了 pxelinux.0archiso.cfg 後,應該會出現帶有多個選項的 syslinux 菜單,這時候需選擇 Boot Arch Linux (x86_64) (HTTP)

接下來將通過 TFTP 傳輸架構對應的內核與 initramfs:

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 目標設備將加載內核並初始化:

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 環境的根用戶 zsh 提示符。

啟動後

[編輯 | 編輯原始碼]

除非你想讓所有流量都路由過 PXE 伺服器(在正確配置前都無法使用),否則就需要停止 dnsmasq.service 服務,並根據網絡環境為安裝目標獲取新的租約。

你還可以殺掉 darkhttpd:目標已經下載好了根文件系統,不再需要該進程。在進行該操作時,可以順便卸載掉安裝映像:

# umount /mnt/archiso

這時候就可以根據安裝指南進行安裝了。

小內存設備

[編輯 | 編輯原始碼]

copytoram initramfs 選項可以控制在啟動早期時是否將整個根文件系統複製到內存中。

強烈建議不去改動該選項,且只在必要的時候禁用(物理內存小於 ~256MB)。如果要這麼做,需向內核參數加入 copytoram=n 設置。

注意:由於該操作需要從已掛載的遠程文件系統循環掛載 squashfs,因此 copytoram=narchiso_pxe_http 不能同時使用。

與 PXE 目標設備共享網絡

[編輯 | 編輯原始碼]

如果 PXE 目標設備使用的是內部網絡(例如 192.168.1.0/24),但還需要訪問網際網路(如需要安裝軟體包),那麼就需要配置 masquerade/source nat。PXE 伺服器上必須有連接到網際網路的單獨網卡。可以使用如下命令讓目標設備訪問到網際網路:

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網絡分享#啟用 NAT

排障

[編輯 | 編輯原始碼]

DHCP interface rename bug

[編輯 | 編輯原始碼]

FS#36749 causes default predictable network interface renaming to fail and then DHCP client to fail because of it. A workaround is to add the kernel boot parameter net.ifnames=0 to disable predictable interface names.

VirtualBox cannot boot while real machines can

[編輯 | 編輯原始碼]

When using VirtualBox to test your configuration, the virtual machine may get stuck at:

Probing EDD (edd=off to disable)... ok

While PXE booting with a real machine works fine. The problem may be because you have set several CPU cores to your client machine, and you set its type as Other and version as Other/Unknown (64 bit). So VirtualBox does not know which paravirtualization interface to use by default.

Adding loglevel=7 to the kernel parameters lets you see where it actually got stuck:

[    0.063697] smp: Bringing up secondary CPUs...
[    0.103768] x86: Booting SMP configuration:

To resolve this, either use one CPU core, or go to Machine > Settings > System > Acceleration and set one of the following paravirtualization interface: Minimal, Hyper-V or KVM.