架构概述
PxeLab 的系统组成、引导流程与关键设计取舍。
服务架构
PxeLab 是一个单二进制程序,内部按服务划分,由服务管理器统一调度:
┌─────────────────────────────────────────────────────┐
│ PxeLab Binary │
├──────────┬──────────┬──────────┬──────────┬─────────┤
│ HTTP │ DHCP │ TFTP │ DNS │ NFS │
│ :8080 │ :67 │ :69 │ :53 │ :2049 │
│ TCP │ UDP │ UDP │ UDP │ TCP │
├──────────┴──────────┴──────────┴──────────┴─────────┤
│ Service Manager (生命周期管理) │
├─────────────────────────────────────────────────────┤
│ SQLite (pxelab.db) │ Event Bus │ Log Bus │
├─────────────────────────────────────────────────────┤
│ Config (config.yaml) │
└─────────────────────────────────────────────────────┘| 服务 | 默认端口 | 协议 | 默认自启 | 说明 |
|---|---|---|---|---|
| HTTP | 8080 | TCP | ✅ | Web UI + API + 引导文件服务 |
| DHCP | 67 | UDP | 取决于配置 | IP 地址分配 + PXE 选项 |
| ProxyDHCP | 4011 | UDP | 取决于配置 | 仅 PXE 选项(叠加模式) |
| TFTP | 69 | UDP | ❌ | NBP 文件传输 |
| DNS | 53 | UDP | ❌ | 本地 DNS 解析 |
| NFS | 2049 | TCP | ❌ | NFSv3 文件共享 |
各服务可独立启停、互不影响;配置变更支持热重载,多数场景无需重启进程。
两阶段网络引导
PXE ROM 的能力有限,PxeLab 用两阶段引导把它升级到功能完整的 iPXE:
Stage 1 Stage 2
┌─────────────┐ TFTP/HTTP ┌──────────┐ HTTP ┌──────────────┐
│ PXE ROM ├───────────────►│ iPXE ├───────────►│ 引导菜单 │
│ (BIOS/UEFI)│ undionly.kpxe │ (自定义 │ /boot/ │ (内核+initrd│
│ │ /ipxe.efi │ 编译) │ ipxe/ │ /WIM/Chain │
└─────────────┘ │ │ script │ /Local) │
└──────────┘ └──────────────┘Stage 1:客户端 PXE ROM 发送 DHCP 请求 → PxeLab 响应 IP、next-server 与 NBP 文件名 → 客户端经 TFTP 下载 NBP(如 ipxe.efi)并执行。
Stage 2:iPXE 启动后自动执行内置脚本(dhcp → chain http://server:8080/boot/ipxe/script)→ 从 PxeLab 获取引导菜单 → 用户选择引导项(安装系统、本地启动等)。
逐环节细节(PXELinux/GRUB2 兼容、架构映射、sanboot 无盘)见引导架构与无盘启动。
关键设计取舍
| 取舍 | 做法 | 收益 |
|---|---|---|
| 单二进制 | Go 静态编译,前端与引导文件全部内嵌 | 零依赖、部署即一个文件;升级只需替换文件,无路径/权限问题 |
| 服务管理器 | 所有服务统一实现生命周期接口 | 独立启停、优雅关闭、配置热重载 |
| 事件总线 | 服务间通过发布/订阅解耦(DHCP 租约、引导事件、WOL 等) | 松耦合、易扩展、日志审计可追踪 |
| 存储接口分离 | 数据层基于接口,SQLite 与内存两种实现 | 测试用内存存储快速隔离;生产用 SQLite 轻量可靠 |
| 依赖注入 | 入口处显式构造所有服务依赖 | 依赖关系清晰、无全局单例、便于测试 |
| 现代前端 | React + CSS 变量主题 + 路由级代码分割 | 暗/亮主题全组件适配、首屏加载快 |
技术栈
| 层级 | 技术 |
|---|---|
| 后端 | Go 1.25+(chi 路由、SQLite/GORM) |
| 前端 | React 19 + TypeScript + Tailwind CSS 4 + Vite |
| 打包发布 | GoReleaser(多平台二进制) |