折腾PXE网络启动 pxe 双引导bios&uefi模式 OPENWRT

简介:#

前两篇已经折腾了pxe引导bios和uefi,甭管启动的是啥,已经可以网络引导了。

但是同时面对这两种系统的时候怎么办?需要通过dhcp的参数来控制谁启动什么。

核心内容#

RFC 4578: Dynamic Host Configuration Protocol (DHCP) Options for the Intel Preboot eXecution Environment (PXE) (rfc-editor.org)

RFC4578定义了architecture types,

Type  Architecture Name
----   -----------------
0    Intel x86PC
1    NEC/PC98
2    EFI Itanium
3    DEC Alpha
4    Arc x86
5    Intel Lean Client
6    EFI IA32
7    EFI BC
8    EFI Xscale
9    EFI x86-64

DHCP服务器可以根据这个来决定返回哪些信息给客户端。

 #

TFTP ROOT#

创建TFTP主目录,同时包含了bios,uefi的启动文件。

 发布TFTP主目录

 

 分别测试启动正常

 

BIOS & UEFI#

tftpd就算了,它的DHCP太简单了。

现在的实验环境是openwrt的主路由,就打它的主意。

[OpenWrt Wiki] OpenWRT Multi-Arch TFTP boot  

它的示例文件是用别的引导的,我们先不考虑那么多,先引导我们的maxdos,grub4dos uefi。

一行一行敲肯定不舒服,写成shell脚本吧。 

修改参数:

tftp_root,TFTP发布主目录
filename='tag:bios,grldr'  bios启动文件
filename='tag:efi32,BOOTX64.EFI' uefi32启动文件,可以删除
filename='tag:efi64,BOOTX64.EFI' uefi64启动文件。
复制代码
#!/bin/sh
uci set dhcp.@dnsmasq[0].logdhcp='1'
uci set dhcp.@dnsmasq[0].enable_tftp='1'
uci set dhcp.@dnsmasq[0].tftp_root='/etc/luci-uploads/tftp-root'
uci add dhcp match
uci set dhcp.@match[-1].networkid='bios'
uci set dhcp.@match[-1].match='60,PXEClient:Arch:00000'
uci add dhcp match
uci set dhcp.@match[-1].networkid='efi32'
uci set dhcp.@match[-1].match='60,PXEClient:Arch:00006'
uci add dhcp match
uci set dhcp.@match[-1].networkid='efi64'
uci set dhcp.@match[-1].match='60,PXEClient:Arch:00007'
uci add dhcp match
uci set dhcp.@match[-1].networkid='efi64'
uci set dhcp.@match[-1].match='60,PXEClient:Arch:00009'
uci add dhcp boot
uci set dhcp.@boot[-1].filename='tag:bios,grldr'
uci set dhcp.@boot[-1].serveraddress="$(uci get network.lan.ipaddr)"
uci set dhcp.@boot[-1].servername="$(uci get system.@system[0].hostname)"
uci add dhcp boot
uci set dhcp.@boot[-1].filename='tag:efi32,BOOTX64.EFI'
uci set dhcp.@boot[-1].serveraddress="$(uci get network.lan.ipaddr)"
uci set dhcp.@boot[-1].servername="$(uci get system.@system[0].hostname)"
uci add dhcp boot
uci set dhcp.@boot[-1].filename='tag:efi64,BOOTX64.EFI'
uci set dhcp.@boot[-1].serveraddress="$(uci get network.lan.ipaddr)"
uci set dhcp.@boot[-1].servername="$(uci get system.@system[0].hostname)"
uci commit dhcp
service dnsmasq reload
复制代码

执行批处理,openwrt就可以根据客户端的类型,来分配不同的启动文件了。

 #

BIOS抓包验证#

MAC地址:08::::::B3

发现#

包含93参数:0

提供#

含参数66,67。

但是66写入了Next server IP address,67没有写入Boot file name。

请求#

验证2.194是否被占用

接受#

含参数66,67。

但是66写入了Next server IP address,67没有写入Boot file name。

UEFI#

MAC地址:08::::::35

发现#

包含93参数:7

 

提供#

含参数66,67。

但是66写入了Next server IP address,67没有写入Boot file name。

请求#

验证2.180是否被占用

接受#

 总结#

抓包没找到需要的东西,就要多解开几层,TFTP实验时,总是显示在第二层,下图的Next server ip address,Boot file name。

Openwrt Dnsmasq,又写在Option。虽然客户端都能解析,但是我看的时候还以为有什么错误,排查了两天。

 

 

主要参考资料

pxe 如何应对复杂的服务器硬件环境 | lvbibir's Blog

作者:上官飞鸿

出处:https://www.cnblogs.com/jackadam/p/18117806

版权:本作品采用「知识共享-署名-非商业性-禁止演绎(CC-BY-NC-ND)」许可协议进行许可。

posted @   上官飞鸿  阅读(1096)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2018-04-06 深入研究sqlalchemy连接池
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示