👁 474

速查表:你要干嘛 → 拿哪个文件
| 场景 | 拿这个文件 | 为什么 | 树里位置 |
|---|---|---|---|
| 普通 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.efi | arm32 / 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.sbi | SBI 固件引导格式 | riscv64/ |
| 龙芯(LoongArch)机器 | ipxe.efi | loong64 专属 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
💖 打赏支持
如果这篇文章帮到了你,欢迎打赏支持
微信扫一扫,赞赏支持
发表回复