Skip to content

Commit 3c26d0c

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

8 files changed

Lines changed: 932 additions & 6 deletions

File tree

docs/PXE部署说明.md

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

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)