👁 474

OpenWrt 集成 iPXE 网络引导
📌 本页定位:iPXE 资源导航 + 完整配置教程
路由器玩家来这页就干三件事:按架构找引导器 → 按用途选文件 → 要配置就看教程。资源按分类摆好,点卡片直接跳。

速查表:你要干嘛 → 拿哪个文件

场景拿这个文件为什么树里位置
普通 UEFI 电脑网络启动snponly.efi借用 UEFI 自带网卡驱动,280KB TFTP 秒传,兼容最稳x86_64-efi/
老机器 UEFI 网卡驱动不全ipxe.efi完整版约 1MB,内置全部网卡驱动x86_64-efi/
老 BIOS 机器undionly.kpxe传统 BIOS PXE 引导专用x86_64-pcbios/
ARM 开发板 / 树莓派(UEFI)snponly.efiarm32 / arm64 各有独立 efi 目录arm64-efi/
安全启动(Secure Boot)机器ipxe.efi + testsign.crt-efi-sb 目录是签名版x86_64-efi-sb/
纯 Linux 内核直启ipxe.linux不用 EFI 固件,内核直接引导x86_64-linux/
RISC-V 机器ipxe.sbiSBI 固件引导格式riscv64/
龙芯(LoongArch)机器ipxe.efiloong64 专属 efi 目录(含安全启动版)loong64-efi/
📖 完整配置教程(原理 + 四步走 + 菜单模板)— 点击展开

先说这玩意能干嘛

局域网里想给某台电脑装系统、进 PE 维护,不用再满世界找 U 盘:开机按 F12 从网络启动,自动弹一个菜单,选「WinPE 维护系统」或者「Ubuntu 桌面版」,几秒后直接进系统。这就是 iPXE 网络引导——把引导器和系统镜像都放路由器/局域网服务器上,电脑开机”去网上取”。

OpenWrt(含 ImmortalWrt)自带 TFTP 服务和 PXE 支持,不用装任何额外软件,配好就能用。这篇先把路由器这边的设置写清楚,电脑那边简单带过——详细图文等我在实机上跑一遍再补。

原理:三句话

① 电脑 UEFI 固件发起网络启动 → ② 路由器 DHCP 应答,告诉它「去 tftp://[路由器]/snponly.efi 拿引导器」 → ③ 电脑下载并执行 iPXE 引导器,iPXE 再拉取 HTTP 上的菜单脚本 menu.ipxe,你在菜单里选 ISO / PE,下载并启动。

关键认知:路由器只是”指路牌”不是”送货车”——它只下发引导器地址,镜像文件是电脑自己去 HTTP 服务拉取的。所以大镜像一定要走 HTTP(快),TFTP 只负责传几 MB 的小引导器。

准备文件:三件套

文件作用放哪怎么拿
snponly.efi网络引导器(iPXE 精简版,借用 UEFI 自带网卡驱动,兼容性最稳)TFTP 根目录Debian 官方 ipxe 包 / 网上搜 ipxe-snponly.efi
menu.ipxe启动菜单脚本(iPXE 启动后自动拉取)HTTP 目录自己写,本文有现成模板
ISO / boot.wim系统镜像 / WinPE 镜像HTTP 目录官方镜像站 / PE 成品

snponly.efi 全称是「SNP-only」版(SNP = Simple Network Protocol),它不内置网卡驱动,直接借用 UEFI 固件自带的,体积只有 280 KB 左右,TFTP 秒传。如果你的 UEFI 固件驱动不完整(老机器),换完整版 ipxe.efi(约 1 MB)即可,用法一样。

OpenWrt 设置:四步走

第一步:开 TFTP 服务 + 放引导器

进 LuCI 后台 →「网络」→「DHCP/DNS」→「PXE/TFTP」页签:

  • 勾选 Enable TFTP server(启用内置 TFTP 服务)
  • TFTP server root 填引导器所在目录,比如 /tmp/tftp
  • 把 snponly.efi 传进这个目录(scp / WinSCP 都行)

第二步:给电脑”指路”(IPv4 方式,最简单)

同一个「PXE/TFTP」页签里:

  • Network boot image(dhcp_boot)填 snponly.efi

这样 dnsmasq 会在 DHCP 应答里带上启动文件名,电脑拿到就去 TFTP 拉。局域网走 IPv4 的话,这一步就够了,IPv6 PXE 可以不配。

第二步(备选):IPv6 PXE 方式

如果机器走 IPv6 才能 PXE(部分 UEFI 固件设置),在「DHCP/DNS」→「odhcpd」→「IPv6 PXE」页签新增一行:

  • 地址:tftp://[路由器IPv6地址]/snponly.efi(IPv6 地址要加方括号)
  • 架构:07: x64 UEFI(普通 PC)

对应 UCI 配置是 config boot6 段:

config boot6 'pxe'
	option url 'tftp://[fd11::1]/snponly.efi'
	option arch '7'

第三步:开 HTTP 服务放菜单和镜像

OpenWrt 自带 uhttpd,网页目录默认 /www。建两个子目录:

mkdir -p /www/pxe        # menu.ipxe 放这里
mkdir -p /www/pxe/iso    # ISO / boot.wim 放这里

把 menu.ipxe 传进 /www/pxe/,镜像丢进 /www/pxe/iso/。访问地址就是 http://路由器IP/pxe/menu.ipxe。

第四步:重启生效

「系统」→「启动项」里重启 dnsmasq 和 odhcpd(或直接重启路由器),完事。

menu.ipxe 菜单脚本模板

把下面的内容存成 menu.ipxe 放 HTTP 目录,IP 换成你路由器的:

#!ipxe
menu 选择要启动的系统
item --key 1 winpe    Windows PE 维护系统
item --key 2 ubuntu   Ubuntu 22.04 桌面版
item --key 3 shell    iPXE 命令行
choose target && goto ${target}

:winpe
kernel wimboot
initrd --name boot.wim http://192.168.1.1/pxe/iso/boot.wim
boot

:ubuntu
kernel http://192.168.1.1/pxe/iso/ubuntu/vmlinuz
initrd http://192.168.1.1/pxe/iso/ubuntu/initrd
imgargs vmlinuz initrd=initrd ip=dhcp boot=casper quiet splash
boot

:shell
shell

两类镜像是不同的引导姿势,别混:

  • PE 维护系统:必须 wimboot 方式加载 boot.wim,不能直接 boot ISO
  • Linux ISO:把 ISO 里的 vmlinuz + initrd 抽出来,kernel/initrd 直引(模板里 Ubuntu 就是这么干的)
  • 老 BIOS 机器:可用 memdisk / sanboot 直接挂 ISO

电脑那边怎么进引导

简单说:UEFI 固件里把「网络启动 / IPv6 PXE」打开(或开机狂按 F12 / F11 选网络启动),电脑就会自动走上面的流程。不同主板入口不一样,详细的图文步骤等我在实机上实测后再补上来——这篇先解决路由器侧,电脑侧到时候按实测截图写。

踩坑提示

  • 大镜像别走 TFTP:TFTP 单包 512 字节往返,传系统镜像能等到怀疑人生,镜像全走 HTTP
  • 架构别填错:普通 PC 是 07 (x64 UEFI),填成 00 (BIOS) / 06 (IA32) 会启动失败
  • 同网段才能访问:iPXE 拉文件用的是路由器地址,跨网段记得放行防火墙
  • IPv6 地址必须加方括号:tftp://[fd11::1]/xxx.efi,漏了方括号直接解析失败

配好之后局域网任何一台支持 UEFI 网络启动的机器,开机 F12 就能进菜单选系统。路由器从此多一个”装机台”身份,家里捣鼓系统再也不用插 U 盘了。

附:iPXE 文件包清单(官方包完整目录)

📁 iPXE files(23 个目录 / 69 个文件)— 点击展开完整目录树
.
├── 1mb
├── errors
├── hw.ipxe
├── ipxe-legacy.iso
├── ipxe-legacy.lkrn
├── ipxe-legacy.pxe
├── ipxe-legacy.usb
├── ipxe.iso
├── ipxe.lkrn
├── ipxe.png
├── ipxe.pxe
├── ipxe.usb
├── ipxeboot.tar.gz
├── niclist.txt
├── relnotes.md
├── shimaa64.efi
├── shimx64.efi
├── texture.png
├── tinycore.ipxe
├── undionly.kpxe
├── version.txt
├── arm32-efi
│   ├── ipxe-legacy.efi
│   ├── ipxe.efi
│   └── snponly.efi
├── arm32-linux
│   └── ipxe.linux
├── arm64-efi
│   ├── ipxe-legacy.efi
│   ├── ipxe.efi
│   └── snponly.efi
├── arm64-efi-sb
│   ├── ipxe.efi
│   ├── snponly.efi
│   └── testsign.crt
├── arm64-linux
│   └── ipxe.linux
├── demo
│   └── boot.php
├── i386-efi
│   ├── ipxe-legacy.efi
│   ├── ipxe.efi
│   └── snponly.efi
├── i386-linux
│   └── ipxe.linux
├── loong64-efi
│   ├── ipxe-legacy.efi
│   ├── ipxe.efi
│   └── snponly.efi
├── loong64-efi-sb
│   ├── ipxe.efi
│   ├── snponly.efi
│   └── testsign.crt
├── loong64-linux
│   └── ipxe.linux
├── riscv32
│   ├── ipxe.lkrn
│   └── ipxe.sbi
├── riscv32-efi
│   ├── ipxe-legacy.efi
│   ├── ipxe.efi
│   └── snponly.efi
├── riscv32-linux
│   └── ipxe.linux
├── riscv64
│   ├── ipxe.lkrn
│   └── ipxe.sbi
├── riscv64-efi
│   ├── ipxe-legacy.efi
│   ├── ipxe.efi
│   └── snponly.efi
├── riscv64-efi-sb
│   ├── ipxe.efi
│   ├── snponly.efi
│   └── testsign.crt
├── riscv64-linux
│   └── ipxe.linux
├── x86_64-efi
│   ├── ipxe-legacy.efi
│   ├── ipxe.efi
│   └── snponly.efi
├── x86_64-efi-sb
│   ├── ipxe.efi
│   ├── snponly.efi
│   └── testsign.crt
├── x86_64-linux
│   └── ipxe.linux
└── x86_64-pcbios
    ├── ipxe.lkrn
    ├── ipxe.pxe
    └── undionly.kpxe