Skip to content

Commit cfdc506

Browse files
committed
feat: move pxe operate into runner script
1 parent 882c033 commit cfdc506

File tree

8 files changed

+924
-6
lines changed

8 files changed

+924
-6
lines changed

docs/PXE部署说明.md

Lines changed: 336 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,336 @@
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+
```

pxe-boot/autoexec.ipxe

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!ipxe
2+
echo ===================================
3+
echo ArceOS Boot via GRUB
4+
echo ===================================
5+
echo Loading GRUB EFI bootloader...
6+
chain tftp://192.168.1.2/grubx64.efi

pxe-boot/boot.ipxe

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!ipxe
2+
echo ===================================
3+
echo ArceOS Boot via GRUB
4+
echo ===================================
5+
echo Loading GRUB EFI bootloader...
6+
chain tftp://__SERVER_IP__/grubx64.efi

pxe-boot/grub-embedded.cfg

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
serial --unit=0 --speed=115200
2+
terminal_input console serial
3+
terminal_output console serial
4+
5+
net_bootp
6+
__NET_DEFAULT_IP_LINE__
7+
set net_default_server=__SERVER_IP__
8+
9+
if [ -f (tftp,__SERVER_IP__)/grub.cfg ]; then
10+
configfile (tftp,__SERVER_IP__)/grub.cfg
11+
fi
12+
13+
if [ -f (tftp,__SERVER_IP__)/kernel ]; then
14+
multiboot (tftp,__SERVER_IP__)/kernel
15+
boot
16+
fi
17+
18+
echo No grub.cfg or kernel found on TFTP server.
19+
echo Entering GRUB shell for manual debugging.

pxe-boot/grubx64.efi

704 KB
Binary file not shown.

pxe-boot/ipxe-mb.efi

1.1 MB
Binary file not shown.

0 commit comments

Comments
 (0)