前一陣子筆者想要給家裡的一台主機重灌 Windows 10 系統,首先就想到了使用 USB 隨身碟製作啟動磁碟,尋找一番之無果後才發現我把所有的隨身碟都忘在了學校。最終採用了網路引導的方法成功安裝!接下來是筆者整理的安裝步驟與注意事項。

裝置、檔案、程式與先決條件

注意: 下面列出的裝置、檔案等,為筆者重灌系統時使用,僅供讀者參考。若有不一致的情形,應自行搜尋替代指令或程式。

安裝步驟

注意: 下面的步驟,為筆者重灌系統時使用,僅供讀者參考。若有不一致的情形,應自行搜尋替代指令或程式。

確認並啟用用戶端 PXE 網路啟動

  1. 主機按一下開機鍵後,連續按鍵盤 DEL 鍵,進入 BIOS/UEFI 介面。

  2. 進入 Advanced 選單,選中 No Disk (PXE) 並進入,將 Onboard LAN Controller 設定為 EnabledPXE Function Support 設定為 OnBoard。即啟用板載網路卡之 PXE 功能。

    BIOS 進入 Advanced - No Disk (PXE) 選單後的介面
  3. 進入 Startup 選單,將 PXE 網路引導調整為第一順位 (#1),伺服器端主機暫時配置完畢。

下載並配置伺服器端 iPXE 檔案

注意: 筆者的主機板為 H61 晶片組,採用 Legacy BIOS 啟動。近幾年的晶片組應均為 UEFI 啟動,讀者應自行確認主機板的啟動方式。本教學基於 Legacy BIOS 啟動編寫,關於二者的指令與檔案差異,參見末尾的 附錄:BIOS 與 UEFI 之區別與調整

  1. 安裝必要的軟體包:

    1
    yay -S dnsmasq ipxe wimboot samba

  2. 檔案與驅動準備

    1. 建立工作目錄

      1
      2
      sudo mkdir -p /srv/tftp/win10
      sudo mkdir -p /srv/tftp/driver

    2. 掛載 Windows ISO 到這個目錄(唯讀掛載即可)

      1
      sudo mount -o loop,ro /path/to/win10.iso /srv/tftp/win10

    3. 拷貝 iPXE 引導檔案和 wimboot 程式

      1
      2
      3
      # 這個步驟是為了讓 PXE 能夠載入 iPXE,再由 iPXE 載入 wimboot
      sudo cp /usr/share/ipxe/ipxe.efi /srv/tftp/
      sudo cp /usr/share/wimboot/wimboot /srv/tftp/

    4. 拷貝網卡驅動程式,並解壓縮(這裡以 Realtek 的網路卡為例)

      1
      2
      3
      4
      # Realtek 的驅動安裝程式事實上是自解壓縮檔,我們使用 7z 指令解開
      sudo mv /path/to/Install_Win11_Win10_10079_DMAROFF_01262026.zip /srv/tftp/driver/driver.zip
      sudo unzip /srv/tftp/driver/driver.zip
      sudo 7z x Install_Win11_Win10_10079_DMAROFF_01262026.exe

    5. 在指定的路徑下尋找網卡驅動,並注入 boot.wim

      1
      2
      3
      4
      5
      # 不要直接修補映像檔掛載的 boot.wim,而是應當拷貝一份新檔,並賦予 777 (rwxrwxrwx) 權限
      sudo cp /srv/tftp/win10/sources/boot.wim /srv/tftp/boot_patched.wim
      chmod 777 /srv/tftp/boot_patched.wim
      wimlib-imagex update /srv/tftp/boot_patched.wim 2 --command "add /srv/tftp/driver/WIN10/64 /Realtek"
      wimlib-imagex update /srv/tftp/boot_patched.wim 1 --command "add /srv/tftp/driver/WIN10/64 /Realtek"

  3. 配置網路服務

    我們要在伺服器端同時開啟 Samba (檔案共用) 與 Dnsmasq (配置 IP 與 網路引導)。

    1. 配置 Samba 網路芳鄰共享

      • 編輯 /etc/samba/smb.conf,在末尾加入:

        1
        2
        3
        4
        5
        [install]
        path = /srv/tftp/win10
        browsable = yes
        readonly = yes
        guest ok = yes

      • 啟動服務:

        1
        sudo systemctl restart smb

    2. 準備 iPXE 引導指令 編寫 /srv/tftp/boot.ipxe,內容如下:

      1
      2
      3
      4
      5
      6
      #!ipxe
      kernel wimboot
      initrd win10/boot/bcd BCD
      initrd win10/boot/boot.sdi boot.sdi
      initrd boot_patched.wim boot.wim
      boot

    3. 啟動 Dnsmasq

      注意: 現在是將兩台電腦連線到同一區域網路的最後時機。使用網線將兩台電腦直接連線。

      • 確認與用戶端主機連線所使用的網路卡,使用以下指令列出目前電腦的所有網路卡介面:

        1
        2
        # 列出電腦所有網路卡介面
        ip a

        指令輸出應類似於:

        1
        2
        3
        4
        5
        6
        7
        ❯ ip a
        1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback ...
        2: enp3s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
        link/ether ...
        3: wlp0s20f3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether ...

      • 若伺服器端透過網線與用戶端主機連線,則尋找類似 enp3s0eth0 的名稱,這代表這是一個有線網卡介面。

      • 類似 wlp0s20f3 的名稱,這代表這是一個無線網卡介面。

        記下剛剛找到的正確的網卡介面名稱。

      • 當前的有線網卡尚未被配置 IP 位址,執行下列指令來手動配置:

        1
        2
        3
        4
        5
        # 1. 先啟動網路卡介面(防止其仍是 down 的狀態)
        sudo ip link set enp3s0 up

        # 2. 配置一個閘道器 IP(例如 192.168.50.1)
        sudo ip addr add 192.168.50.1/24 dev enp3s0

      • 啟動 Dnsmasq(在 --interface= 後填寫正確的網卡介面名稱):

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        sudo dnsmasq \       
        --interface=enp3s0 \
        --bind-interfaces \
        --dhcp-range=192.168.50.100,192.168.50.200,12h \
        --enable-tftp \
        --tftp-root=/srv/tftp \
        --dhcp-option=66,192.168.50.1 \
        --no-daemon \
        --dhcp-match=set:ipxe,175 \
        --dhcp-boot='tag:!ipxe,ipxe.pxe' \
        --dhcp-boot='tag:ipxe,boot.ipxe'

安裝 Windows 10

  1. 操作用戶端主機,進入 Save & Exit 選單,保存並退出 BIOS/UEFI。此時應當自動進入 PXE 網路引導:

    • 螢幕顯示開始下載 ipxe.pxe

    • 進入 iPXE 介面,開始下載 boot_patched.wim

    • 進入 Windows 藍色的安裝程式介面。

  2. 手動安裝網卡驅動、掛載安裝程式:

    1. 不要按「立即安裝」,而是按一下 Shift + F10 打開命令提示字元。

    2. 手動載入網卡驅動、初始化網卡:

      1
      2
      3
      4
      5
      drvload X:\Realtek\rt640x64.inf

      wpeutil initializeNetwork

      ipconfig

      ipconfig 指令的輸出有 192.168.50.x 的 IP 位址,則說明網路卡啟用成功。可以開始掛載共用資料夾了。

    3. 掛載共用資料夾:

      1
      net use z: \\192.168.50.1\install /user:guest

    提示: 由於系統映像檔為網路掛載的緣故,我們不能使用 Z:\setup.exe 自動化安裝程式。我們透過命令來手動安裝。

  3. 手動進行磁碟分割:

    危險: 磁碟分割的部分指令具有危險性,會導致硬碟所有資料丟失!請在進行磁碟分割前,提前做好資料備份!

    在命令提示字元中輸入:

    1
    diskpart

    會進入 DISKPART> 提示字元,隨後依次輸入:

    1. 列出所有磁碟、選中要被分割的硬碟:

      1
      2
      3
      list disk
      :: 筆者只有一塊硬碟,編號為 0
      select disk 0

    2. 抹除硬碟、轉換為 MBR (BIOS) / GPT (UEFI) 並格式化硬碟

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      :: 建立一個主要分割區
      create partition primary

      :: 設定為使用中(僅 MBR)
      active

      :: 格式化為 NTFS,標籤為 OS
      format fs=ntfs quick label="OS"

      :: 指派磁碟機代號 C
      assign letter=C

    3. 退出 Diskpart:

      1
      exit

  4. 解壓縮系統映像 (DISM)

    現在我們利用 DISM 命令列工具,把映像檔中的檔案直接「釋出」到 C 槽。

    1. 查看映像版本:某些系統映像的 install.wim 包含多個版本(例如 LTSC, IoT LTSC)可以使用這個指令查看想要安裝的版本索引 (index):

      1
      dism /Get-WimInfo /WimFile:Z:\sources\install.wim

      記下想要安裝的版本的 Index 編號,筆者這裡使用 2

    2. 開始解開:輸入以下指令:

      1
      dism /Apply-Image /ImageFile:Z:\sources\install.wim /Index:2 /ApplyDir:C:\

      • Index:2:這裡的數字修改為剛剛記下的編號。

      • /ApplyDir:C:\:釋出到剛剛分割完畢的 C 槽。

      耐心等待進度到 100% 完成。

    3. 寫入系統開機檔案 (BCDBoot) 系統檔案已經解開並釋出,但是還沒有開機引導檔案。需要手動寫入 BCD 開機檔案。

      輸入以下指令:

      1
      bcdboot C:\Windows /s C: /f BIOS

      • /s C::指定引導分割區為 C 槽(Legacy 模式下,引導分割區與系統分割區通常為同一個)。

      • /f BIOS:強制使用 Legacy BIOS 引導格式(避免使用 UEFI 格式)

    4. 收尾並重新啟動

      1. 拔出網線防止再次從 PXE 啟動。

      2. 在命令提示字元執行 wpeutil reboot,重新啟動主機。

      3. 可能會重新啟動電腦數次,再次開機會從硬碟啟動,開始設定區域、語言、鍵盤等。

附錄:BIOS 與 UEFI 之區別與調整

隨著硬體更新,現代電腦主機板大多採用 UEFI 啟動模式,而非本教學中使用的 Legacy BIOS。若讀者的設備較新(約 2012 年後出廠),請務必參考以下差異進行調整,否則將無法順利啟動安裝程式。

  1. 核心差異對照表

    項目 Legacy BIOS(舊款) UEFI(現代)
    硬碟分割表 MBR GPT
    開機引導檔案 undionly.kpxeipxe.pxe ipxe.efi
    BCD 引導路徑 /boot/bcd /efi/microsoft/boot/bcd
    獨立引導分割區 不需要 (通常與 C 槽共用) 需要 (ESP 分割區, FAT32 格式)
    BCDBoot 參數 /f BIOS /f UEFI
  2. 伺服器端配置調整 (boot.ipxe)

    在 UEFI 模式下,Windows Boot Manager 需要讀取不同的 BCD 路徑,且強烈建議載入字型檔以免選單顯示亂碼。請修改 /srv/tftp/boot.ipxe

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!ipxe
    kernel wimboot

    # --- 差異點 1: BCD 路徑變更 ---
    # Legacy 指向 /boot/bcd
    # UEFI 必須指向 /efi/microsoft/boot/bcd
    initrd win10/efi/microsoft/boot/bcd BCD

    # --- 差異點 2: (建議) 載入字型檔 ---
    # 若無此列,UEFI 開機選單可能會顯示為方塊亂碼
    # 該檔案通常位於 ISO 的 /efi/microsoft/boot/fonts/ 目錄下
    initrd win10/efi/microsoft/boot/fonts/segmono_boot.ttf segmono_boot.ttf

    # --- 以下保持不變 ---
    initrd win10/boot/boot.sdi boot.sdi
    initrd boot_patched.wim boot.wim
    boot

    注意: Linux 系統對檔案名稱大小寫敏感。請務必檢查 ISO 解壓後的目錄(例如 EFI vs efi),確保腳本中的路徑與實際檔案完全一致。

  3. 用戶端 Diskpart 分割指令調整

    UEFI 系統必須使用 GPT 分割表,並且需要一個獨立的 ESP (EFI System Partition) 分割區來存放開機檔案。

    Diskpart 階段,請將原本的指令替換為:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    select disk 0
    clean

    :: --- 差異點 1: 轉換為 GPT ---
    convert gpt

    :: --- 差異點 2: 建立 ESP 引導分割區 (約 256MB) ---
    create partition efi size=256
    format fs=fat32 quick label="ESP"
    assign letter=S

    :: --- 差異點 3: 建立系統分割區 ---
    create partition primary
    format fs=ntfs quick label="OS"
    assign letter=C
  4. BCDBoot 引導修復指令調整

    在最後寫入開機檔案時,我們需要將引導檔案寫入到剛剛建立的 S 槽 (ESP 分割區),並指定韌體類型為 UEFI。

    1
    2
    3
    :: /s S: 指定引導檔案寫入 S 槽
    :: /f UEFI 指定使用 UEFI 格式
    bcdboot C:\Windows /s S: /f UEFI

寫在最後

Legacy 是為了與過去相容的一種妥協,而 UEFI 才是現代硬體的歸宿。

在 PXE 指令碼中,這僅僅體現為一列 BCD 路徑的差異,但是在作業系統的底層,卻是從真實模式到保護模式、從 BIOS 中斷到 EFI 驅動的巨大跨越。