PXE - Arch Linux 中文维基

跳至內容

# PXE

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Preboot Execution Environment，最近一次同步於 2025-07-28，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- Diskless System

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

  預啟動執行環境（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 網絡引導映像同時支持 BIOS 和 UEFI 引導方式。

## 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 服務端和客戶端之間傳輸文件，需要搭建 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

要發送如配置文件路徑等特定引導協議（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_http`，`archiso_pxe_nfs` 和 `archiso_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` 埠。如果你沒有以根用戶啟動 darkhttpd，那麼它會默認使用 `8080` 埠，導致目標設備嘗試訪問無效的 80 埠並啟動失敗。

#### NFS

您需搭建 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

安裝 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

其中 `LINUX` 和 `INITRD` 路徑是相對於 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.0` 和 `archiso.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=n` 和 `archiso_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.

分類：​

- 安裝過程
- 網絡
- 啟動過程

PXE
新增話題