此篇文章介紹 PXE & iPXE 的開機流程
PXE
首先以下圖說明一下傳統 PXE 的流程:
PXE 的開機流程,簡單來說就是幾個步驟:
network client 從 DHCP service 取得 IP & 其他 metadata(例如:TFTP 資訊 & NBP 檔名)
network client 從 TFTP 取得 NBP(Network Boot Program,上面中的
pxelinux.0
),並啟動network client 使用 NBP 載入 configs, scripts, 以及執行 OS 需要的 kernel(範例中的
kernel.vmlinuz
) & ramfs image(上圖中的initrd.cpio.gz
)
Network Boot Program (NBP, 也稱為 bootloader)
CoreOS 可用多種不同的 bootloader 開機 & 設定,如果是一個全新的設定環境,iPXE 是個不錯的選擇。
PXELINUX
PXELINUX 是個相當普遍被使用的 bootloader(檔名為 pxelinux.0
),會自動從 /tftp_bootdir/pxelinux.cfg
目錄中載入設定檔。
若要控制特定機器使用特定的設定檔,可以利用 network client 的 UUID、MAC address、IP or default 來進行設定,因此設定檔就會變成如下面的範例:
1 | /tftp_bootdir/pxelinux.cfg/b8945908-d6a6-41a9-611d-74a6ab80b83d |
按照上圖的流程,可以很清楚知道,設定檔的內容肯定就是會包含了像是 config / script / kernel / ramfs image …. 等檔案的位置資訊(可能還會包含開機選單),以下是個簡單範例:
1 | default coreos |
上面範例中的檔案若沒有指定目錄,就表示應該將其放在
/tftp_bootdir
目錄中
其中設定了一個簡單的 menu、顯示訊息、kernel(coreos_production_pxe.vmlinuz)、ramfs(coreos_production_pxe_image.cpio.gz) & 設定 CoreOS 用的 cloud-config.yaml
PXE 雖然普遍使用,但的確是有些缺點存在的,例如:
TFTP 速度慢
若有許多針對不同機器的客製化設定檔需求,會需要撰寫很多份 pxelinux config
iPXE
iPXE 可是視為加強版的 PXE bootloader,使用的並非是設定檔,而是 iPXE script,而且 iPXE script & image 都可以透過 HTTP 下載
以下是 iPXE 開機流程示意圖:
從上圖可以看出,為了可以運作在原有的環境中,使用了一個名稱為 undionly.kpxe 的 bootloader 來協助開機,接著會發生以下的事情:
bootloader undionly.kpxe 會提供給 machine 上網 & 處理後續 iPXE script 的能力
透過網路取得 iPXE script
boot.ipxes
並會使用檔名為
boot.ipxe
(來源可以是 HTTP) 的 iPXE script 來繼續執行後續的開機流程
以下是個簡單的 iPXE script 範例:
1 | #!ipxe |
透過 iPXE script,可以用程式化的方式進行更多動態的開機設定
在 iPXE 開機環境 for CoreOS 的架構中,有一些事情是值得注意一下的:
TFTP 只用來提供 undionly.kpxe bootloader,目的是為了讓老舊的 PXE firmware client 也可以使用 iPXE
CoreOS 提供了 [bootcfg](coreos-baremetal/bootcfg.md at master · coreos/coreos-baremetal) 工具,可根據硬體的屬性,用來產生相對應的 iPXE script (把 iPXE script 的來源指向 bootcfg iPXE endpoint)