PXE
- 預啟動執行環境(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。
首先從下載頁獲取最新的官方安裝映像,以獲取啟動時需要從伺服器傳輸到客戶端的文件。
接下來需要掛載映像:
# mount --mkdir -o loop,ro archlinux-release_date-x86_64.iso /mnt/archiso
其中 release_date 是 ISO 文件名中的發布日期,例如 2022.10.01。
Arch Linux 網絡引導映像可以在系統啟動時即時下載最新發布的 Arch Linux 版本。請下載適用於你的配置的版本。
pixiecore 提供了一體化解決方案:
- 安裝 pixiecore-gitAUR
- 以根用戶身份執行
pixiecore quick arch --dhcp-no-bind - 通過 PXE 進行引導
你需要搭建一個 DHCP 伺服器和一個 TFTP 伺服器來傳輸 NBP,以及下列服務之一來傳輸根文件系統:HTTP 伺服器,NFS 或 NBD。
激活網卡,並分配一個合適的地址。
# ip link set eth0 up # ip addr add 192.168.0.1/24 dev eth0
你還可以使用網絡管理器來配置靜態 IP。
為了在安裝目標上配置網絡並在 PXE 服務端和客戶端之間傳輸文件,需要搭建 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。
在配置文件中,使用 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 引導的網絡引導映像),請使用:
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_pxe_http,archiso_pxe_nfs 和 archiso_pxe_nbd initcpio 鉤子,你可以選擇使用 HTTP,NFS 或 NBD 進行啟動。這三種方式的啟動時間基本沒有區別,但使用 HTTP 方式能以百分比形式查看 airootfs.sfs 的下載進度。
在所有備選方案中,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)。這需要一定的時間。一旦複製完成,您就有可運作的系統了。
/etc/nbd-server/config
[generic]
[archiso]
readonly = true
exportname = /srv/archlinux-release_date-x86_64.iso
其中 release_date 是 ISO 文件名中的發布日期,例如 2022.10.01。
啟動 nbd.service。
如果已經有了 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 設置。
copytoram=n 和 archiso_pxe_http 不能同時使用。如果 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。
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.
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.