使用 OpenWRT 配置 PXE 启动

在家庭服务器环境或小型机房中,通过网络(PXE)启动服务器可以显著简化设备的安装流程。本文将介绍如何在 OpenWRT 路由器 + 一台内网 Linux 服务器的组合下,搭建可用于 UEFI 启动的 PXE 环境,并支持 iPXE、HTTP 启动等现代特性。

本文实验成功的环境:

  • 路由器:OpenWRT(系统版本 24.10)
  • TFTP / HTTP 服务器:一台内网 Linux 服务器(安装 Ubuntu 系统)
  • 客户端:支持 UEFI PXE 的服务器主板

PXE 启动原理

PXE(Preboot eXecution Environment)启动主要由以下步骤组成:

  1. 客户端通过网络发送 DHCP Discover
  2. DHCP 服务器返回 IP 地址,并附加 PXE 相关字段:
    • next-server(TFTP server 的 IP)
    • filename(要下载的启动文件,如 snponly.efi
  3. 客户端向 TFTP 服务器请求文件
  4. 使用下载到的引导器加载后续启动流程,例如:
    • iPXE(支持 HTTP、iSCSI 等)
    • Linux kernel + initrd

OpenWRT 的 dnsmasq 内置了 PXE 支持,并且可以方便地通过 LuCI 界面配置。

配置 TFTP 服务

首先,在内网 Linux 服务器上安装 TFTP 服务,用于提供必要的文件。以 tftpd-hpa 为例:

1
sudo apt install tftpd-hpa

编辑 /etc/default/tftpd-hpa

1
2
3
4
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"

重启服务:

1
sudo systemctl restart tftpd-hpa

配置 HTTP 服务

以 Nginx 为例:

1
sudo apt install nginx

重启服务:

1
sudo systemctl restart nginx

准备文件

为了实现 UEFI PXE 启动,我们需要准备相关启动文件。可以预先下载一个完整的 Ubuntu 安装镜像,例如ubuntu-22.04.5-desktop-amd64.iso,然后从中进行提取。

通过 TFTP 提供的文件

以下文件需要放置在 TFTP 服务器目录 /srv/tftp/ 下:

  1. snponly.efi,这是 iPXE 引导文件,可以通过https://boot.ipxe.org/snponly.efi链接下载
  2. autoexec.ipxe,这是snponly.efi启动之后会自动加载的配置,可以写入以下内容:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!ipxe
    echo Booting via HTTP script...
    dhcp

    set server_ip 192.168.x.x
    set base_url http://${server_ip}/pxe

    kernel ${base_url}/vmlinuz ip=dhcp url=${base_url}/ubuntu-22.04.5-desktop-amd64.iso
    initrd ${base_url}/initrd.img
    boot
    将此处的192.168.x.x替换为你的 HTTP 服务器 IP,镜像的文件名也可以根据需要修改。这样,启动程序就会进一步通过 HTTP 加载必要的文件。

为了验证 TFTP 是否配置正确,可以使用 tftp 命令测试下载 snponly.efi 文件:

1
tftp 127.0.0.1 -c get snponly.efi

通过 HTTP 提供的文件

在顺利启动后,iPXE 会根据autoexec.ipxe的内容,通过 HTTP 加载内核和 initrd 文件。我们可以准备以下文件放在 Nginx HTTP 服务器目录 /var/www/html/pxe/ 下:

  1. vmlinuzinitrd,这是 Ubuntu 安装镜像中的内核和初始内存盘文件。可以通过挂载 ISO 镜像来提取:
    1
    2
    3
    4
    5
    6
    mkdir /mnt/iso
    sudo mount -o loop ubuntu-22.04.5-desktop-amd64.iso /mnt/iso
    cp /mnt/iso/casper/vmlinuz /var/www/html/pxe/
    cp /mnt/iso/casper/initrd /var/www/html/pxe/
    sudo umount /mnt/iso
    rmdir /mnt/iso
  2. ubuntu-xxx.iso,将完整的 ISO 镜像文件也放在 /var/www/html/pxe/ 目录下。

配置 OpenWRT

登录 OpenWRT,进入「网络」 → 「DHCP/DNS」 → 「PXE/TFTP」进行配置。可以参考下图:

OpenWRT PXE 配置界面

「文件名」「服务器名称」「服务器地址」和「强制」选项都需要配置,否则 PXE 启动可能无法正常工作。

配置完成后,登陆 OpenWRT 重启 dnsmasq 即可:

1
/etc/init.d/dnsmasq restart

测试 PXE 启动

将新的服务器主板设置为从网络启动,确保其连接到同一局域网内。启动后,设备应通过 DHCP 获取 IP 地址,并从 TFTP 服务器下载 snponly.efi 文件,随后加载 iPXE 并通过 HTTP 获取内核和 initrd 文件,最终进入 Ubuntu 安装界面。

PXE 启动成功截图

如果出现问题,可以查看 OpenWRT 的日志,或者通过抓包工具(如 Wireshark)分析 DHCP 和 TFTP 交互过程,找出问题所在。

顺利的话,此时就可以成功进入 Ubuntu 界面,使用ubiquity或者ubuntu-desktop-installer程序进行系统安装了。