|
| 1 | +# PXE 使用说明 |
| 2 | + |
| 3 | +本文档用于指导在当前仓库中使用 `runner.sh pxe` 部署和维护 PXE 服务,实现: |
| 4 | + |
| 5 | +- 在全新环境中通过单条命令完成 PXE 基础部署 |
| 6 | +- 自动生成 `dnsmasq` 配置并准备 TFTP 启动文件 |
| 7 | +- 统一通过 `runner.sh` 管理 PXE 的安装、启动、停止和状态查看 |
| 8 | +- 将 PXE 服务部署与业务 `kernel` 发布解耦 |
| 9 | + |
| 10 | +--- |
| 11 | + |
| 12 | +## 1. 适用场景 |
| 13 | + |
| 14 | +- 需要在一台 Linux 主机上快速搭建 PXE 启动服务。 |
| 15 | +- 希望统一使用 `runner.sh` 管理,而不再单独维护 `pxe.sh` 主逻辑。 |
| 16 | +- 需要将仓库中的 PXE 模板文件渲染后部署到系统目录,例如: |
| 17 | + - `github-runners/pxe-boot/pxe-physical.conf` → `/etc/dnsmasq.d/pxe-physical.conf` |
| 18 | + - `github-runners/pxe-boot/boot.ipxe` → `<tftp-root>/boot.ipxe` |
| 19 | + - `github-runners/pxe-boot/grub-embedded.cfg` → 动态生成 `grubx64.efi` |
| 20 | + |
| 21 | +--- |
| 22 | + |
| 23 | +## 2. 前置条件 |
| 24 | + |
| 25 | +- 一台 Linux 主机。 |
| 26 | +- 具备 `root` 或 `sudo` 权限。 |
| 27 | +- 目标网卡已经配置 IPv4 地址。 |
| 28 | +- 仓库中已包含 PXE 模板目录: |
| 29 | + |
| 30 | +```text |
| 31 | +github-runners/ |
| 32 | +├── runner.sh |
| 33 | +└── pxe-boot/ |
| 34 | + ├── pxe-physical.conf |
| 35 | + ├── boot.ipxe |
| 36 | + ├── grub-embedded.cfg |
| 37 | + └── ipxe-mb.efi |
| 38 | +``` |
| 39 | + |
| 40 | +> 注意:`pxe --install` 现在默认不会发布 `kernel`。它负责准备 PXE 服务、iPXE 和 GRUB 引导链;`kernel` 或 `grub.cfg` 可以在后续由其他流程放入 TFTP 目录。 |
| 41 | +
|
| 42 | +--- |
| 43 | + |
| 44 | +## 3. 命令入口 |
| 45 | + |
| 46 | +统一入口为: |
| 47 | + |
| 48 | +```bash |
| 49 | +./runner.sh pxe [options] |
| 50 | +``` |
| 51 | + |
| 52 | +--- |
| 53 | + |
| 54 | +## 4. 快速开始 |
| 55 | + |
| 56 | +推荐首次部署命令: |
| 57 | + |
| 58 | +```bash |
| 59 | +sudo ./runner.sh pxe --install |
| 60 | +``` |
| 61 | + |
| 62 | +如果需要指定网卡和模式: |
| 63 | + |
| 64 | +```bash |
| 65 | +sudo ./runner.sh pxe \ |
| 66 | + --install \ |
| 67 | + --interface eno1np0 \ |
| 68 | + --mode proxy |
| 69 | +``` |
| 70 | + |
| 71 | +部署完成后查看状态: |
| 72 | + |
| 73 | +```bash |
| 74 | +./runner.sh pxe --status |
| 75 | +``` |
| 76 | + |
| 77 | +--- |
| 78 | + |
| 79 | +## 5. 常用命令 |
| 80 | + |
| 81 | +### 5.1 安装并部署 |
| 82 | + |
| 83 | +```bash |
| 84 | +sudo ./runner.sh pxe --install |
| 85 | +``` |
| 86 | + |
| 87 | +### 5.2 启动服务 |
| 88 | + |
| 89 | +```bash |
| 90 | +sudo ./runner.sh pxe --start |
| 91 | +``` |
| 92 | + |
| 93 | +### 5.3 停止服务 |
| 94 | + |
| 95 | +```bash |
| 96 | +sudo ./runner.sh pxe --stop |
| 97 | +``` |
| 98 | + |
| 99 | +### 5.4 查看状态 |
| 100 | + |
| 101 | +```bash |
| 102 | +./runner.sh pxe --status |
| 103 | +``` |
| 104 | + |
| 105 | +### 5.5 清理环境 |
| 106 | + |
| 107 | +```bash |
| 108 | +sudo ./runner.sh pxe --clean |
| 109 | +``` |
| 110 | + |
| 111 | +跳过确认: |
| 112 | + |
| 113 | +```bash |
| 114 | +sudo ./runner.sh pxe --clean --yes |
| 115 | +``` |
| 116 | + |
| 117 | +--- |
| 118 | + |
| 119 | +## 6. 参数说明 |
| 120 | + |
| 121 | +| 参数 | 说明 | 默认值 | |
| 122 | +|------|------|--------| |
| 123 | +| `--install` | 安装依赖、渲染配置、准备 TFTP 文件并启动服务 | - | |
| 124 | +| `--start` | 启动 `dnsmasq` PXE 服务 | - | |
| 125 | +| `--stop` | 停止 `dnsmasq` PXE 服务 | - | |
| 126 | +| `--clean` | 清理 PXE 配置,并可选删除 TFTP 根目录 | - | |
| 127 | +| `--status` | 查看当前 PXE 状态 | - | |
| 128 | +| `--interface NAME` | 监听的网卡名 | `eno1np0` | |
| 129 | +| `--server-ip IP` | 服务端 IP;实际部署时会校正为网卡当前 IPv4 | 自动探测 | |
| 130 | +| `--client-ip IP` | 可选的静态客户端 IP,仅在需要为 GRUB 强制指定地址时使用 | 空 | |
| 131 | +| `--mode MODE` | DHCP 模式:`proxy`、`exclusive`、`none` | `proxy` | |
| 132 | +| `--tftp-root DIR` | TFTP 根目录 | `/home/root/test/x86_64-pc` | |
| 133 | +| `--yes` | 清理时跳过确认 | `false` | |
| 134 | + |
| 135 | +--- |
| 136 | + |
| 137 | +## 7. 部署产物 |
| 138 | + |
| 139 | +执行 `--install` 后,脚本会完成以下工作: |
| 140 | + |
| 141 | +### 7.1 安装依赖 |
| 142 | + |
| 143 | +自动检查并按需安装: |
| 144 | + |
| 145 | +- `dnsmasq` |
| 146 | +- `iproute2` |
| 147 | +- `grub-efi-amd64-bin` |
| 148 | +- `ipxe` |
| 149 | + |
| 150 | +### 7.2 生成系统配置 |
| 151 | + |
| 152 | +将模板渲染并写入: |
| 153 | + |
| 154 | +```text |
| 155 | +/etc/dnsmasq.d/pxe-physical.conf |
| 156 | +``` |
| 157 | + |
| 158 | +同时确保 `/etc/dnsmasq.conf` 启用了: |
| 159 | + |
| 160 | +```text |
| 161 | +conf-dir=/etc/dnsmasq.d/,*.conf |
| 162 | +``` |
| 163 | + |
| 164 | +### 7.3 准备 TFTP 目录 |
| 165 | + |
| 166 | +在 `<tftp-root>` 下准备: |
| 167 | + |
| 168 | +- `ipxe-mb.efi` |
| 169 | +- `undionly.kpxe`(若系统存在) |
| 170 | +- `ipxe.efi`(若系统存在) |
| 171 | +- `boot.ipxe` |
| 172 | +- `autoexec.ipxe` |
| 173 | +- `grubx64.efi` |
| 174 | + |
| 175 | +默认不会主动复制 `kernel` 到 `<tftp-root>`。 |
| 176 | + |
| 177 | +--- |
| 178 | + |
| 179 | +## 8. DHCP 模式说明 |
| 180 | + |
| 181 | +### 8.1 `proxy` 模式 |
| 182 | + |
| 183 | +```bash |
| 184 | +sudo ./runner.sh pxe --install --mode proxy |
| 185 | +``` |
| 186 | + |
| 187 | +特点: |
| 188 | + |
| 189 | +- 推荐默认模式。 |
| 190 | +- 适合网络中已存在 DHCP 服务器的场景。 |
| 191 | +- 当前主机只负责 PXE 引导相关响应,不直接分配完整地址池。 |
| 192 | + |
| 193 | +### 8.2 `exclusive` 模式 |
| 194 | + |
| 195 | +```bash |
| 196 | +sudo ./runner.sh pxe --install --mode exclusive |
| 197 | +``` |
| 198 | + |
| 199 | +特点: |
| 200 | + |
| 201 | +- 当前主机独占提供 DHCP 服务。 |
| 202 | +- 会生成完整地址池配置。 |
| 203 | +- 不适合与已有 DHCP 服务器同时工作。 |
| 204 | + |
| 205 | +### 8.3 `none` 模式 |
| 206 | + |
| 207 | +```bash |
| 208 | +sudo ./runner.sh pxe --install --mode none |
| 209 | +``` |
| 210 | + |
| 211 | +特点: |
| 212 | + |
| 213 | +- 仅提供 TFTP,不主动提供 DHCP 地址池。 |
| 214 | +- 适合由外部 DHCP 统一下发地址和 `next-server` 的场景。 |
| 215 | + |
| 216 | +--- |
| 217 | + |
| 218 | +## 9. 启动链说明 |
| 219 | + |
| 220 | +当前默认启动链为: |
| 221 | + |
| 222 | +1. UEFI 固件通过 PXE 下载 `ipxe-mb.efi` |
| 223 | +2. iPXE 加载 `boot.ipxe`(兼容场景下也可走 `autoexec.ipxe`) |
| 224 | +3. `boot.ipxe` 链接到 `grubx64.efi` |
| 225 | +4. `grubx64.efi` 优先尝试加载 `(tftp,<server-ip>)/grub.cfg` |
| 226 | +5. 如果没有 `grub.cfg`,则尝试加载 `(tftp,<server-ip>)/kernel` |
| 227 | +6. 如果两者都不存在,则停留在 GRUB 供人工调试 |
| 228 | + |
| 229 | +说明: |
| 230 | + |
| 231 | +- 默认情况下,GRUB 只执行 `net_bootp` 获取地址,不再写死 `net_default_ip` |
| 232 | +- 这对 `proxy` 模式更友好,因为 `proxy` 模式下客户端 IP 来自上游 DHCP,部署阶段通常无法预先知道 |
| 233 | +- 只有在特殊调试场景下,才建议显式传 `--client-ip` |
| 234 | + |
| 235 | +--- |
| 236 | + |
| 237 | +## 10. 目录与模板说明 |
| 238 | + |
| 239 | +PXE 相关模板位于: |
| 240 | + |
| 241 | +- [runner.sh](/home/root/github-runners/runner.sh) |
| 242 | +- [pxe-physical.conf](/home/root/github-runners/pxe-boot/pxe-physical.conf) |
| 243 | +- [autoexec.ipxe](/home/root/github-runners/pxe-boot/autoexec.ipxe) |
| 244 | +- [grub-embedded.cfg](/home/root/github-runners/pxe-boot/grub-embedded.cfg) |
| 245 | +- [boot.ipxe](/home/root/github-runners/pxe-boot/boot.ipxe) |
| 246 | + |
| 247 | +其中: |
| 248 | + |
| 249 | +- 必需的源文件:`pxe-physical.conf`、`boot.ipxe`、`autoexec.ipxe`、`grub-embedded.cfg`、`ipxe-mb.efi` |
| 250 | +- 运行期生成文件:`grubx64.efi` |
| 251 | +- `pxe-boot/` 中若存在 `grubx64.efi`,它更适合作为备份参考,不是部署时必须依赖的源文件 |
| 252 | + |
| 253 | +模板中的以下字段会在部署时动态替换: |
| 254 | + |
| 255 | +- `__INTERFACE__` |
| 256 | +- `__SERVER_IP__` |
| 257 | +- `__CLIENT_IP__` |
| 258 | +- `__DHCP_RANGE_LINE__` |
| 259 | +- `__DHCP_HOST_LINE__` |
| 260 | +- `__NO_DHCP_INTERFACE_LINE__` |
| 261 | +- `__BIOS_BOOT_LINE__` |
| 262 | +- `__FALLBACK_EFI_BOOT_LINE__` |
| 263 | + |
| 264 | +--- |
| 265 | + |
| 266 | +## 11. 常见问题 |
| 267 | + |
| 268 | +### 11.1 执行时报错 “Network interface does not exist” |
| 269 | + |
| 270 | +说明指定的网卡名不存在,可先查看系统网卡: |
| 271 | + |
| 272 | +```bash |
| 273 | +ip -o link show |
| 274 | +``` |
| 275 | + |
| 276 | +然后重新指定: |
| 277 | + |
| 278 | +```bash |
| 279 | +sudo ./runner.sh pxe --install --interface <your-iface> --kernel /path/to/kernel |
| 280 | +``` |
| 281 | + |
| 282 | +### 11.2 执行时报错找不到 `kernel` |
| 283 | + |
| 284 | +`pxe --install` 本身不再要求 `kernel`。如果后续需要自动引导业务镜像,有两种方式: |
| 285 | + |
| 286 | +```bash |
| 287 | +cp /path/to/kernel <tftp-root>/kernel |
| 288 | +``` |
| 289 | + |
| 290 | +或提供: |
| 291 | + |
| 292 | +```bash |
| 293 | +cp /path/to/grub.cfg <tftp-root>/grub.cfg |
| 294 | +``` |
| 295 | + |
| 296 | +### 11.3 `dnsmasq` 启动失败 |
| 297 | + |
| 298 | +先检查配置测试: |
| 299 | + |
| 300 | +```bash |
| 301 | +sudo dnsmasq --test |
| 302 | +``` |
| 303 | + |
| 304 | +再查看服务日志: |
| 305 | + |
| 306 | +```bash |
| 307 | +sudo journalctl -u dnsmasq -n 50 --no-pager |
| 308 | +``` |
| 309 | + |
| 310 | +### 11.4 BIOS 客户端无法启动 |
| 311 | + |
| 312 | +当前实现会优先从系统中查找 `undionly.kpxe`。如果系统未安装对应文件,部署会继续,但 BIOS 引导能力会被禁用。 |
| 313 | + |
| 314 | +可重新执行安装以补齐依赖: |
| 315 | + |
| 316 | +```bash |
| 317 | +sudo ./runner.sh pxe --install |
| 318 | +``` |
| 319 | + |
| 320 | +--- |
| 321 | + |
| 322 | +## 12. 推荐操作流程 |
| 323 | + |
| 324 | +日常推荐流程: |
| 325 | + |
| 326 | +```bash |
| 327 | +sudo ./runner.sh pxe --install --interface eno1np0 --mode proxy |
| 328 | +./runner.sh pxe --status |
| 329 | +``` |
| 330 | + |
| 331 | +如果只替换内核文件,可重新执行安装命令覆盖生成产物;如果只想重启服务,可执行: |
| 332 | + |
| 333 | +```bash |
| 334 | +sudo ./runner.sh pxe --stop |
| 335 | +sudo ./runner.sh pxe --start |
| 336 | +``` |
0 commit comments