Skip to content

Commit

Permalink
pxe: update docs
Browse files Browse the repository at this point in the history
根据今日整理的信息更新文档。
  • Loading branch information
taoky committed May 19, 2024
1 parent 8b89a45 commit 55ab8ca
Showing 1 changed file with 115 additions and 10 deletions.
125 changes: 115 additions & 10 deletions docs/services/pxe/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,33 +12,138 @@

!!! info "关于 FAQ"

<https://lug.ustc.edu.cn/wiki/server/pxe/faq/> 太老了,如果有时间的话建议写个新的
<https://lug.ustc.edu.cn/wiki/server/pxe/faq/> 实在是年头太久远了,无法更新。新的内容记录在本文档中

一般的启动流程是:

1. iPXE 加载 GRUB 相关文件。
2. GRUB 加载 Linux 内核与 initramfs。
1. iPXE,或者主板上获取的 DHCP 启动信息的固件下载并加载 GRUB 相关文件。
2. 如果 MAC 地址不为指定值,那么加载菜单并显示;然后加载 Linux 内核与 initramfs 等事项由 GRUB 负责
3. Initramfs 从启动参数挂载 NFS 为 rootfs,进行下一步的启动。

## 使用/调试

PXE 在校园网中直接可用,因为学校的 DHCP 服务器经过了配置。

如果需要在虚拟机中调试,下载 IPXE 的 ISO(<http://boot.ipxe.org/ipxe.iso>),挂载在虚拟机中测试。
如果需要在虚拟机中调试,可以:

!!! todo "推荐使用的虚拟机方案"
- 下载 IPXE 的 ISO(<http://boot.ipxe.org/ipxe.iso>),挂载在虚拟机中测试。
- 或者直接使用打包后的 ISO:<https://ftp.lug.ustc.edu.cn/PXE/image/ustc.ipxe.iso>

PXE 能够成功运行与否和虚拟机环境(特别是虚拟网卡型号)高度相关。需要找到一个稳定的配置方案(比如用 qemu?)
!!! note "推荐使用的虚拟机方案"

其中主要使用的是新 PXE 方案(pxelinux.0,simple-pxe)
PXE 能够成功运行与否有可能和虚拟机环境(特别是虚拟网卡型号)高度相关。推荐使用 QEMU

~~老 PXE 方案(lpxelinux.0)目前仅用于图书馆查询机。~~
其中主要使用的是基于 GRUB2 和 simple-pxe 的新 PXE 方案。主板固件使用 TFTP 协议获取 GRUB2 程序(core.0 或者 core.efi)之后,GRUB2 会通过 HTTP 协议获取剩下所有的文件。

!!! note "TFTP"

和 FTP active 模式一样,TFTP 是一个有点麻烦的协议,如果你的虚拟机无法不经过 NAT 连接 PXE 服务器,那么就需要调整网络配置,会很麻烦,再加上对校外访问需求的考量,因此目前的考虑是尽量使用 HTTP。

基于 SYSLINUX 的老 PXE 方案(lpxelinux.0 -> bin/lpxelinux.0)目前仍可启动,但是不使用。

### SYSLINUX 更新

虽然不维护了,但是以下内容仍作记录:

```shell
wget https://mirrors.ustc.edu.cn/fedora/releases/40/Everything/x86_64/os/Packages/s/syslinux-tftpboot-6.04-0.26.fc40.noarch.rpm
# decompress
rpm2cpio syslinux-tftpboot-6.04-0.26.fc40.noarch.rpm | cpio -idmv
cd tftpboot
ln -s lpxelinux.0 pxelinux.0
ln -s lpxelinux.0 undionly.kpxe
```

得到的 tftpboot 目录替代原先的 tftp/bin 目录。启动 VM 的时候可以 Wireshark 看看它下载了哪些文件。同时还有个 `pxeknife`,目前只在 SYSLINUX 的 PXE 方案中可用。

!!! todo "pypxe"

pypxe 似乎只在 SYSLINUX 方案中使用。

### 使用 UEFI 直接启动

QEMU 一般使用的 UEFI 固件 OVMF 支持直接从 HTTP 启动。在写作时,Arch Linux 打包的 OVMF 没编译此特性,其他的发行版也有可能不支持,因此需要:

1.<https://www.kraxel.org/repos/jenkins/edk2/> 下载 x64 版本的 rpm 并解压
2. 然后使用以下命令启动 QEMU:

```shell
qemu-system-x86_64 -L . --bios ../ovmf-x64/OVMF-pure-efi.fd
```

启动后马上按下 ESC,进入配置界面,然后阅读 <https://github.com/tianocore/tianocore.github.io/wiki/HTTP-Boot> 做进一步配置。

### 制作 GRUB2 镜像

旧版本的 GRUB2 可能有 bug(例如 <https://github.com/ustclug/discussions/issues/456>),因此有时候需要升级。

更新策略考虑使用 Debian stable 的 grub2。启动容器并且将外面的目录 bind mount:

```shell
docker run -it --rm -v $(pwd)/tftp:/srv/tftp ustclug/debian:12
```

然后在容器中执行:

```shell
apt update && apt install grub-common grub-pc grub-efi-amd64-signed
grub-mknetdir
grub-mkimage -d /usr/lib/grub/i386-pc -O i386-pc-pxe -o /srv/tftp/boot/grub/i386-pc/core.0 -p '(http,202.38.93.94)/boot/tftp/grub/' pxe http
grub-mkimage -d /usr/lib/grub/x86_64-efi -O x86_64-efi -o /srv/tftp/boot/grub/x86_64-efi/core.efi -p '(http,202.38.93.94)/boot/tftp/grub/' efinet http
```

最后两个 `grub-mkimage` 是因为 `grub-mknetdir` 生成的镜像使用 tftp 协议,在调试时可能会有问题。我们希望 GRUB2 能够全程使用 HTTP 做剩下的工作。

更换文件的时候**别把配置覆盖了**

### 构建 iPXE ISO

参考 <https://ipxe.org/embed>

```ipxe
#!ipxe
# Generated by GPT-4
dhcp
set 210:string http://202.38.93.94/boot/tftp/
# UEFI boot?
iseq ${platform} efi && goto uefi || goto bios
:uefi
echo "UEFI boot detected"
chain ${210:string}bootx64.efi
exit
:bios
echo "BIOS boot detected"
chain ${210:string}pxelinux.0
exit
```

clone ipxe/ipxe 仓库,进入 src 目录,然后执行:

```shell
# https://github.com/ipxe/ipxe/pull/50
make bin-x86_64-efi/ipxe.efi bin/ipxe.lkrn
./util/genfsimg -o ustc.ipxe.iso -s ../../ustc.ipxe bin-x86_64-efi/ipxe.efi bin/ipxe.lkrn
```

## 架构

新 PXE 方案的 HTTP 服务器为 Apache(Nginx 可能是以前弃用的配置)。URL 中的 boot2 对应 /nfsroot/pxe
新 PXE 方案的 HTTP 服务器为 Apache + Nginx。URL 中的 boot2 对应 /nfsroot/pxe。

!!! todo "处理 web 服务器"

目前 PXE 机器的 web 服务器有点诡异,Apache2 监听 80,Nginx 监听 443,后续需要调整处理。

!!! todo "文件跳转配置"

Apache2 中配置了一些 alias 跳转,同样的,TFTP 也有类似的配置(`/etc/xinetd.d/tftp``server_args` 里面有 `-m /home/pxe/tftp/REMAP`)。

需要检查一致性。

如果出现问题需要调试,建议抓包(可以使用 Wireshark)看是否正常。
如果出现问题需要调试,建议抓包(可以使用 Wireshark 查看 TFTP 或 HTTP 协议)看是否正常。

每天凌晨,pxe 用户的 crontab 任务会执行 <https://github.com/ustclug/simple-pxe/blob/master/simple-pxe-in-docker>(文件位于 pxe 用户的 home 中),实现 PXE 相关文件的更新。

Expand Down

0 comments on commit 55ab8ca

Please sign in to comment.