文章头图

最近捡了台 OpenWrt 的便携路由,一直在桌角吃灰总觉得有些浪费,尝试着在这台路由上搭建 PXE 网络启动。

PXE(Pre-boot eXecution Environment,预启动执行环境) 由 Intel 公司开发,工作于 Client/Server 的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用 TFTP(trivial file transfer protocol)或 MTFTP(multicast trivial file transfer protocol) 协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端基本软件设置,从而引导预先安装在服务器中的终端操作系统。1

SYSLINUX 是一个轻量级的引导程序套装,其中的 PXELINUX 用于网络引导 (bootloader)。但是 SYSLINUX 很久没有更新了,对 UEFI 的支持不是很好,故不使用其作为 UEFI 的网络启动引导。

启动过程

https://www.cnblogs.com/zhangxingeng/p/9560221.html

1)client向pxe server上的dhcp发送IP地址请求消息,dhcp检测client是否合法,同事将pxe环境下的boot loader文件pxelinux.0的位置信息发给client
2)client向pxe server上的tftp请求pxelinux.0,tftp收到消息向client发送pxelinux.0大小信息,试探client是否满意,当tftp收到client发回的统一大小信息后,发送pxelinux.0.
3)client执行接收到的pxelinux.0
4)client向TFTP请求pxelinux.cfg文件(其实是目录,里面放了启动菜单,即grub的配置文件),TFTP将配置文件发回client,继而client根据配置文件执行后续的操作
5)client向TFTP发送linux内核请求信息,TFTP发送内核
6)client向TFTP发送根文件请求信息,TFTP接受到消息之后返回linux根文件系统
7)client加载linux内核(启动参数已经在4中的配置文件中设置好了)2

OpenWrt 环境配置

如果你没有 OpenWrt 的路由器,也可以考虑使用虚拟机作为测试平台,OpenWrt 主要目的是提供 DHCP 和 TFTP 服务,只要实现这两项服务使用其他 OS 也是 OK 的。

设置并挂载外部储存

不再阐述操作方法,将外置储存挂载在/mnt目录下

配置 Dnsmasq

修改 DHCP 设置并开启 TFTP 服务

备份后修改/etc/dnsmasq.conf 3

vim /etc/dnsmasq.conf

# 在文件末尾添加以下内容
enable-tftp
tftp-root=/mnt/sda1/PXEboot
dhcp-boot=bios/lpxelinux.0

重启 Dnsmasq 服务

/etc/init.d/dnsmasq restart

PXELINUX Bootloader

在之前 Dnsmasq 配置文件中,dhcp-boot指向 PXELINUX 的引导文件,接下来准备 PXELINUX 的相关组件

获取并解压 SYSLINUX

wget https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.zip
unzip syslinux-6.03.zip
cd syslinux-6.03

复制 BIOS 启动需要的组件

mkdir -p /mnt/sda1/PXEboot/bios
cp ./bios/core/lpxelinux.0 /mnt/PXEboot/sda1/bios/ #这里是lpxelinux.0,pxelinux.0只支持TFTP协议
cp ./bios/com32/elflink/ldlinux/ldlinux.c32 /mnt/sda1/PXEboot/bios/
cp ./bios/com32/lib/libcom32.c32 /mnt/sda1/PXEboot/bios/
cp ./bios/com32/libutil/libutil.c32 /mnt/sda1/PXEboot/bios/
cp ./bios/com32/menu/vesamenu.c32 /mnt/sda1/PXEboot/bios/

menu.c32:图形化菜单
vesamenu.c32:图形化菜单
pxelinux.0:bootloader
pxelinux.cfg/default:开机菜单设定

配置文件

mkdir -p /mnt/sda1/PXEboot/bios/pxelinux.cfg/
vim /mnt/sda1/PXEboot/bios/pxelinux.cfg/default

DEFAULT vesamenu.c32
MENU TITLE OpenWRT PXE-Boot Menu
PROMPT 0
TIMEOUT 100

label winpe http
        kernel memdisk
        append raw iso initrd=http://192.168.x.x/iso/winpe.iso

label maxdos
        kernel memdisk
        append initrd=iso/MAXDOS.IMG
        
label debian netboot
        kernel http://mirrors.aliyun.com/debian/dists/buster/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux
        initrd http://mirrors.aliyun.com/debian/dists/buster/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz
  1. 使用自带的 Lighttpd 服务提供的 HTTP 加载 Windows PE 镜像,将镜像文件夹链接到 /www 就可以直接下载啦,非常的方便(偷懒)😄

    mkdir -p /mnt/sda1/PXEboot/iso/
    ln -s /mnt/sda1/PXEboot/iso/ /www/iso/
  2. 因为 maxdos 的镜像不大,直接用 TFTP 协议传输,但是传输速度并不是很理想,测试在 10 mbps 左右,建议大文件使用 FTP HTTP NFS 等协议传输。
  3. 使用镜像站的 debian netboot 镜像进行网络安装

创建软链接

PXELINUX 启动时会读取当前目录下的配置文件 pxelinux.cfg/default

cd /mnt/sda1/PXEboot/bios
ln -s ../pxelinux.cfg/
ln -s ../OS/

启动测试

使用 VMware Workstation 或 VirtualBox 创建一个虚拟机,不加载 ISO镜像,这里以 VirtualBox 为例

  1. 把启动顺序中的网络调整到首位
  2. 网卡设置为桥接模式,并选择连接到路由器的网卡

  1. 启动虚拟机


参考和链接

文章头图

PXELINUX - Syslinux Wiki

使用openwrt的tftp(pxe)及smb服务安装win7/10

padavan设置DHCP+TFTP+http+ftp急速启动(PXE)winpe电脑维护