PXE

出自 Arch Linux 中文维基

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

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

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

準備[編輯 | 編輯原始碼]

這裏下載最新的官方安裝鏡像並掛載:

# mkdir -p /mnt/archiso
# mount -o loop,ro archlinux-2013.11.01-dual.iso /mnt/archiso

伺服器搭建[編輯 | 編輯原始碼]

為了配置網絡、加載 pxelinux/kernel/initramfs 並最終加載根文件系統,您需要分別搭建 DHCP、IFTP 和 HTTP 伺服器。

網絡[編輯 | 編輯原始碼]

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

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

DHCP + TFTP[編輯 | 編輯原始碼]

為了在安裝目標上配置網絡並在 PXE 服務端和客戶端之間傳輸文件,需要搭建 DHCP 和 TFTP 伺服器;dnsmasq 能做到這兩點,也很容易配置。

官方軟件倉庫安裝 dnsmasq

配置 dnsmasq:

# /etc/dnsmasq.conf
port=0
interface=eth0
bind-interfaces
dhcp-range=192.168.0.50,192.168.0.150,12h
dhcp-boot=/arch/boot/syslinux/lpxelinux.0
dhcp-option-force=209,boot/syslinux/archiso.cfg
dhcp-option-force=210,/arch/
dhcp-option-force=66,192.168.0.1
enable-tftp
tftp-root=/mnt/archiso

參見 dnsmasq systemd 服務.

HTTP[編輯 | 編輯原始碼]

ArchISO的改進使其能從 HTTP(archiso_pxe_http initcpio hook)或 NFS(archiso_pxe_nfs initcpio hook)啟動;在所有備選方案中,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/

安裝[編輯 | 編輯原始碼]

在本小節,您需要知道如何讓客戶端進行 PXE 啟動。屏幕顯示 POST 信息時,某個角落通常會有提示,按哪個鍵進行 PXE 啟動。在 IBM x3650 上,F12 會調出啟動菜單,第一個選項就是 Network;在 Dell PE 1950/2950 上,按下 F12 會直接開始 PXE 啟動。

啟動[編輯 | 編輯原始碼]

通過journald,可以查看 PXE 伺服器早期 PXE 啟動過程的信息:

# journalctl -u dnsmasq -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/arch/boot/syslinux/pxelinux.0 to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso.cfg to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/whichsys.c32 to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_pxe_choose.cfg to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/ifcpu64.c32 to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_pxe_both_inc.cfg to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_head.cfg to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_pxe32.cfg to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_pxe64.cfg to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_tail.cfg to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/vesamenu.c32 to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/splash.png to 192.168.0.110

加載完 pxelinux.0archiso.cfg 文件後,您會看到 syslinux 啟動菜單。

根據 CPU 構架,選擇 Boot Arch Linux (x86_64) (HTTP)Boot Arch Linux (i686) (HTTP)

接着會傳送內核和 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/archiso.img to 192.168.0.110

如果一切順利,就能從 PXE 目標機器上看到 darkhttpd 活動了:這時,內核就能在 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"

根文件系統下載完後就能看到使用 grmlzsh 的提示符了。

啟動後工作[編輯 | 編輯原始碼]

除非想讓所有流量都走 PXE 伺服器(沒有恰當的配置這是不可能的),請停止 dnsmasq 服務並在新安裝的系統上重新獲取適合當前網絡架構的租約。

systemctl stop dnsmasq.service

您也可以關閉 darkhttpd;因為目標機器已經下載好根文件系統了,它也就不再需要了。同時您也可以卸載安裝鏡像了:

# umount /mnt/archiso

接着請跳轉至安裝指南

備用方法[編輯 | 編輯原始碼]

syslinux 菜單中暗含着其他方法:

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 鏡像會複製根文件系統到引導主機(booting host)。這需要一定的額時間。一旦複製完成,您就有可運作的系統了。

NBD[編輯 | 編輯原始碼]

安裝 nbd 並配置:

# vim /etc/nbd-server/config
[generic]
[archiso]
    readonly = true
    exportname = /srv/archlinux-2013.02.01-dual.iso

啟動服務 nbd

已有的 PXE 伺服器[編輯 | 編輯原始碼]

如果已經有了 syslinux 系統的 PXE 伺服器(BIND+DHCPd+TFTPd), 可以將下面內容加入 pxelinux.cfg 配置文件,這樣就可以用需要的方式啟動 Arch。

# vim /srv/tftp/arch.menu
LABEL 2
        MENU LABEL Arch Linux x86_64
        LINUX /path/to/extracted/Arch/ISO/arch/boot/x86_64/vmlinuz
        INITRD /path/to/extracted/Arch/ISO/arch/boot/intel_ucode.img,/path/to/extracted/Arch/ISO/arch/boot/x86_64/archiso.img
        APPEND archisobasedir=arch archiso_nfs_srv=${nfsserver}:/path/to/extracted/Arch/ISO/ ip=:::::eth0:dhcp
        SYSAPPEND 3
        TEXT HELP
        Arch Linux 2016.03 x86_64
        ENDTEXT

要啟動 32 位系統,將 x86_64 替換為 i686。還可以將 archiso_nfs_srv 替換為其它支持的方式。為了在掛載安裝介質前啟動網絡,需要使用 ip= 參數。

DHCP interface rename bug[編輯 | 編輯原始碼]

As of November 2015 there is FS#36749 that 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.

小內存[編輯 | 編輯原始碼]

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

強烈建議不去改動該選項,且只在必要的時候禁用(物理內存小於 ~256MB)。 如果要這麼做,向內核參數加入 copytoram=n。請注意,該選項不支持通過 HTTP 傳輸文件;必須使用 NFS 或 NBD。