Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

PXE 網路開機自動化安裝 Linux:從原理到生產級部署

編輯:Linux 教學

PXE 核心原理

PXE (Preboot Execution Environment) 由 Intel 定義,讓電腦透過網路載入開機載入器、核心、根檔案系統,實現無光碟/無 USB 安裝。

三大支柱協議

  1. DHCP:分配 IP、指定 next-server (TFTP 伺服器)、filename (開機載入器路徑,如 pxelinux.0/grubx64.efi)
  2. TFTP (Trivial FTP):極簡 UDP 傳輸,下載 pxelinux.0、vmlinuz、initrd.img、選單配置
  3. HTTP/NFS/FTP:大型檔案傳輸 (安裝鏡像、套件倉庫、Kickstart/Autoyast/Preseed 腳本)

開機流程

BIOS/UEFI PXE ROM
    ↓ DHCP Discover/Offer/Request/ACK
    取得 IP、next-server、filename
    ↓ TFTP 下載 filename (pxelinux.0 / grubx64.efi)
    ↓ 載入器讀取選單配置 (pxelinux.cfg/default / grub.cfg)
    ↓ TFTP/HTTP 下載 vmlinuz + initrd.img
    ↓ 核心啟動,掛載 initrd,啟動安裝程式 (Anaconda/Debian Installer/Calamares)
    ↓ 讀取 Kickstart/Preseed/Autoyast 自動應答
    ↓ HTTP/NFS 下載套件安裝
    ↓ 寫入 GRUB、重啟

伺服器端部署 (CentOS/RHEL 7/8/9、Rocky/AlmaLinux)

1. 安裝套件

dnf install -y dhcp-server tftp-server syslinux httpd nfs-utils
# UEFI 需額外
dnf install -y grub2-efi-x64 shim-x64

2. 配置 TFTP

# /etc/xinetd.d/tftp
service tftp
{
    socket_type = dgram
    protocol = udp
    wait = yes
    user = root
    server = /usr/sbin/in.tftpd
    server_args = -s /var/lib/tftpboot -v
    disable = no
    per_source = 11
    cps = 100 2
    flags = IPv4
}

systemctl enable --now xinetd
systemctl enable --now tftp.socket  # systemd 方式

3. 準備開機檔案

# BIOS (SYSLINUX)
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /usr/share/syslinux/{menu.c32,vesamenu.c32,libutil.c32,libcom32.c32} /var/lib/tftpboot/
mkdir -p /var/lib/tftpboot/pxelinux.cfg

# UEFI (GRUB)
cp /boot/efi/EFI/redhat/grubx64.efi /var/lib/tftpboot/   # 或 shimx64.efi
mkdir -p /var/lib/tftpboot/grub2

# 核心與 initrd (從安裝 ISO 解壓)
mount -o loop Rocky-9-x86_64-dvd.iso /mnt/iso
cp /mnt/iso/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/
cp /mnt/iso/isolinux/*.msg /var/lib/tftpboot/ 2>/dev/null || true

4. 配置選單

BIOS: /var/lib/tftpboot/pxelinux.cfg/default

DEFAULT menu.c32
PROMPT 0
TIMEOUT 300
MENU TITLE PXE Boot Menu

LABEL linux
    MENU LABEL ^Install Rocky Linux 9
    KERNEL vmlinuz
    APPEND initrd=initrd.img inst.stage2=https://192.168.1.100/rocky9 ks=https://192.168.1.100/ks/rocky9.cfg ip=dhcp

LABEL rescue
    MENU LABEL ^Rescue Mode
    KERNEL vmlinuz
    APPEND initrd=initrd.img inst.stage2=https://192.168.1.100/rocky9 rescue

UEFI: /var/lib/tftpboot/grub2/grub.cfg

set timeout=30
menuentry 'Install Rocky Linux 9' {
    linuxefi /vmlinuz inst.stage2=https://192.168.1.100/rocky9 ks=https://192.168.1.100/ks/rocky9.cfg ip=dhcp
    initrdefi /initrd.img
}
menuentry 'Rescue Mode' {
    linuxefi /vmlinuz inst.stage2=https://192.168.1.100/rocky9 rescue
    initrdefi /initrd.img
}

5. 配置 DHCP

# /etc/dhcp/dhcpd.conf
authoritative;
ddns-update-style none;
option domain-name-servers 192.168.1.1, 8.8.8.8;
default-lease-time 600;
max-lease-time 7200;

subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.100 192.168.1.200;
    option routers 192.168.1.1;
    option broadcast-address 192.168.1.255;
    
    # BIOS PXE
    class "pxeclients" {
        match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
        next-server 192.168.1.10;
        filename "pxelinux.0";
    }
    
    # UEFI PXE (架構代碼 0x0007 = x86_64 UEFI)
    class "uefi-pxe-64" {
        match if substring(option vendor-class-identifier, 0, 20) = "PXEClient:Arch:00007";
        filename "grubx64.efi";
    }
}

systemctl enable --now dhcpd

6. HTTP 服務掛載安裝源與 Kickstart

# 掛載 ISO 到 HTTP 根目錄
mkdir -p /var/www/html/rocky9
mount -o loop,ro Rocky-9-x86_64-dvd.iso /var/www/html/rocky9
# 或解壓
# 7z x Rocky-9-x86_64-dvd.iso -o/var/www/html/rocky9

# Kickstart 檔案
mkdir -p /var/www/html/ks
cat > /var/www/html/ks/rocky9.cfg <<'EOF'
#version=RHEL9
install
url --url=https://192.168.1.100/rocky9
lang en_US.UTF-8
keyboard us
network --bootproto=dhcp --device=link --activate
rootpw --plaintext RedHat123
firewall --enabled --ssh
authselect --enableshadow --passalgo=sha512
selinux --enforcing
timezone --utc Asia/Taipei
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto"
zerombr
clearpart --all --initlabel --drives=sda
autopart --type=lvm
reboot

%packages --ignoremissing
@^minimal-environment
%end

%post
# 後安裝腳本
systemctl enable sshd
echo "PXE Auto Install Completed" > /root/install.log
%end
EOF

systemctl enable --now httpd
firewall-cmd --add-service={http,dhcp,tftp} --permanent
firewall-cmd --reload

7. NFS 替代方案 (大環境較佳效能)

# /etc/exports
/var/www/html/rocky9 192.168.1.0/24(ro,sync,no_root_squash)
/var/www/html/ks 192.168.1.0/24(ro,sync,no_root_squash)

systemctl enable --now nfs-server
firewall-cmd --add-service=nfs --permanent
firewall-cmd --reload

# Kickstart 中改用
# url --url=nfs://192.168.1.100:/var/www/html/rocky9
# ks=nfs://192.168.1.100:/var/www/html/ks/rocky9.cfg

UEFI Secure Boot 相容

  1. 使用 shimx64.efi 作為 filename (已由 Microsoft 簽名)
  2. grubx64.efi 需由發行版簽名 (Red Hat/Fedora/Ubuntu 皆有)
  3. 客戶端 BIOS 需載入 MOK (Machine Owner Key) 或關閉 Secure Boot

進階自動化:Cobbler / Foreman / MAAS

故障排查清單

# 1. 客戶端無法取得 IP
tcpdump -i eth0 port 67 or port 68 -nn
systemctl status dhcpd
journalctl -u dhcpd -f

# 2. TFTP 傳輸失敗/超時
tcpdump -i eth0 port 69 -nn
# 檢查防火牆 UDP 69
# 檢查 /var/lib/tftpboot 權限 (root:root, 644)
# SELinux: restorecon -R /var/lib/tftpboot

# 3. 選單不顯示/核心不載入
# 檢查 pxelinux.cfg/default 或 grub.cfg 路徑
# 確認 vmlinuz/initrd.img 存在於 TFTP 根目錄
# UEFI: 確認 grubx64.efi/shimx64.efi 架構正確

# 4. 安裝程式無法取得階段 2 (stage2)
# 檢查 HTTP/NFS 服務、防火牆、URL 路徑
# curl https://192.168.1.100/rocky9/.treeinfo 測試

# 5. Kickstart 不生效
# 核心參數 ks=... 拼寫正確
# 檢查 %pre/%post 腳本語法
# 安裝日誌: /tmp/anaconda.log, /tmp/packaging.log, /tmp/storage.log

現代替代:iPXE + HTTP/HTTPS/iSCSI

iPXE 是功能增強的 PXE 固韌體,支援:

  • HTTP/HTTPS/FTP/iSCSI/FCoE 協議
  • 腳本語言 (條件判斷、迴路、變數)
  • DNS、VLAN、802.1x、加密傳輸
  • 嵌入式腳本燒錄進網卡 ROM 或鏈式載入
# iPXE 腳本範例 (boot.ipxe)
#!ipxe
dhcp
set base-url https://192.168.1.100
kernel ${base-url}/vmlinuz initrd=initrd.img inst.stage2=${base-url}/rocky9 ks=${base-url}/ks/rocky9.cfg ip=dhcp
initrd ${base-url}/initrd.img
boot

生產建議:DHCP + TFTP (pxelinux.0/grubx64.efi) + HTTP (stage2/ks) + Kickstart/Preseed/Autoyast + 版本控管 (Git) + 測試環境驗證。

Copyright © Windows教程網 All Rights Reserved
工具特色適用場景
Cobbler輕量、CLI/Web、支援 PXE/Kickstart/Preseed/Autoyast、電源管理中小規模、手動維護
Foreman完整生命週期、Puppet/Ansible 整合、多租戶、API、Smart Proxy企業級、配置管理整合
MAAS (Metal as a Service)Canonical 開發、硬體發現、IPMI/Redfish、Kubernetes 整合裸機雲、Ubuntu 生態