知识的荒漠

不积跬步无以至千里,不积小流无以成江海;千里之行,始于足下!

用户工具

站点工具


服务器:路由器:ipxe

路由器联想NEW WIFI2 D1刷Padavan后,已实现了tftp,pxe启动(ftp,http均已支持),但最近看到ipxe,可自己编译,并支持广域网启动,就深入研究了下;
ipxe跟pe其实一个理念;ipxe启动后(编译未带EMBED参数),按ctrl+b进入命令行模式,这时候依赖于ipxe的http,https,ftp,dns支持,直接可以使用dhcp,chain命令加载远程的ipxe启动菜单
ipxe.iso,ipxe.usb主要给不支持pxe启动的电脑使用(或虚拟机),使不支持pxe启动的电脑开机进入到ipxe环境
运行流程说明:使用电脑自带的pxe,tftp,引导文件(或使用ipxe.iso,ipxe.usb)进入到ipxe环境,在访问本地或远程ipxe启动菜单,就是这么的简单
要实现的功能:padavan根据客户端bios情况推送ipxe启动文件,启动文件放置于路由器/media/AiCard_01/PXE/里面;路由器ip地址为192.168.1.1.目录文件及镜像等放置于web服务器http://192.168.1.4/down/pxe/里面;

启动文件 说明 放置位置
undionly.kpxe 传统BIOS的引导文件 路由器
ipxe.efi 32位uEFI的引导文件 路由器
snponly.efi 64位uEFI的引导文件 路由器
menu.ipxe 启动菜单 路由器,web服务器均可(最好放在路由器,因为路由从不关机)
其余文件 路由器及服务器均放置一份

为了考虑稳定性,路由器及J3455服务器均放置一份,内容保持一致

Padavan设置

打开路由器,内部网络(LAN)→DHCP服务器→自定义配置文件 “dnsmasq.conf”,修改如下

### Set the root directory for files available via TFTP.
tftp-root=/media/AiCard_01/PXE
 
### Make the TFTP server more secure
#tftp-secure
 
### Set the boot filename for netboot/PXE
#dhcp-boot=bios/lpxelinux.0
 
#-----以下为增加内容
# dhcp-boot 的格式为 dhcp-boot=(条件), 启动文件名, TFTP 服务器名 (可以任意指定), TFTP 服务器 IP (如果 TFTP 服务器就位于本机的话,则可以不指定)
# 以下定义了检测到 PXE 客户端计算机采用传统 BIOS 的引导方式 (client-arch 为 0) 进行启动的情况下,启动位于名为 padavan、IP 地址为 192.168.1.1 上的 unionly.kpxe。
dhcp-match=set:bios,option:client-arch,0
dhcp-boot=tag:bios,undionly.kpxe,padavan,192.168.1.1
# 以下定义了检测到 PXE 客户端计算机采用 32 位 uEFI 的引导方式 (client-arch 为 6) 进行启动的情况下,启动位于名为 padavan、IP 地址为 192.168.1.1 上的 ipxe.efi。
dhcp-match=set:efi-ia32,option:client-arch,6
dhcp-boot=tag:efi-ia32,ipxe.efi,padavan,192.168.1.1
# 以下定义了检测到 PXE 客户端计算机采用 64 位 uEFI 的引导方式 (client-arch 为 7 或 9) 进行启动的情况下,启动位于名为 padavan、IP 地址为 192.168.1.1 上的 snponly.efi。
dhcp-match=set:efi-x86_64,option:client-arch,7
dhcp-match=set:efi-x86_64,option:client-arch,9
dhcp-boot=tag:efi-x86_64,snponly.efi,padavan,192.168.1.1
# 以下定义了检测到 PXE 客户端已经进入 iPXE 环境下后,下载并执行 ftp://192.168.1.1/down/pxe/menu.ipxe
dhcp-match=set:ipxe,175
#dhcp-boot=tag:ipxe,http://192.168.1.4/down/pxe/menu.ipxe
dhcp-boot=tag:ipxe,ftp://192.168.1.1/AiCard_01/PXE/menu.ipxe

因路由已做好ddns,外网访问启动菜单地址为:

https://www.zjzj.xyz/down/pxe/menu.ipxe
http://zjzj.xyz:82/down/pxe/menu.ipxe
ftp://www.zjzj.xyz/AiCard_01/PXE/menu.ipxe

启动文件编译

编译环境为virtualbox新安装的lubuntu(lubuntu-19.04-desktop-amd64.iso)
把ftp,http,https都编译进去,打开终端

cd ~
sudo apt-get install liblzma-dev liblzma-doc #当前版本编译仅缺此组件
git clone git://git.ipxe.org/ipxe.git
cd ipxe/src
nano config/general.h
#开启ftp和https后保存退出
#define DOWNLOAD_PROTO_TFTP /* Trivial File Transfer Protocol */
#define DOWNLOAD_PROTO_HTTP /* Hypertext Transfer Protocol */
#define DOWNLOAD_PROTO_HTTPS /* Secure Hypertext Transfer Protocol */
#define DOWNLOAD_PROTO_FTP /* File Transfer Protocol */
#undef DOWNLOAD_PROTO_SLAM /* Scalable Local Area Multicast */
#undef DOWNLOAD_PROTO_NFS /* Network File System Protocol */
 
nano chain.ipxe
#输入以下内容后保存退出,加指令编译启动ipxe后会自动访问本地或远程ipxe启动菜单,不加也可实现,参路由设置
#chain https://www.zjzj.xyz/down/pxe/menu.ipxe 自动访问J3455服务器上的启动菜单
#chain ftp://www.zjzj.xyz/AiCard_01/PXE/menu.ipxe 自动访问路由器上的启动菜单
#如果自动访问内网,就和改成内网ip地址即可(参考路由处的)
 
#!ipxe
dhcp
chain https://www.zjzj.xyz/down/pxe/menu.ipxe
 
make bin/ipxe.iso EMBED=chain.ipxe #构建iso镜像,启动后自动执行chain.ipxe里的命令
make bin/ipxe.usb EMBED=chain.ipxe #构建usb镜像,启动后自动执行chain.ipxe里的命令
make bin/undionly.kpxe EMBED=chain.ipxe #构建pxe启动文件,启动后自动执行chain.ipxe里的命令
make bin-x86_64-efi/ipxe.efi EMBED=chain.ipxe #构建efi启动文件,启动后自动执行chain.ipxe里的命令
make bin/undionly.kpxe #仅构建ipxe启动文件,用此文件,因为路由器判断加载ipxe成功后,在自动访问web服务器上的*.ipxe菜单
make bin-x86_64-efi/ipxe.efi #仅构建efi启动文件

把编译好的undionly.kpxe等上传到路由器/media/AiCard_01/PXE/,并放置好相关文件,结构目录如下

ipxe启动菜单修改

新建menu.ipxe供内网访问,内容如下:

#!ipxe
#check platform (pcbios or efi)
echo Platform: ${platform}
set menu-timeout 20000
dhcp
#isset www.zjzj.xyz || set next-server www.zjzj.xyz  #自行指定服务器ip
iseq ${platform} pcbios && set start BIOS_MENU || set start EFI_MENU
goto ${start}
 
:BIOS_MENU
set menu-default USBOS
menu iPXE BIOS Boot Menu
  item --gap --             -------------------------------- H3 PE TOOL ---------------------------
  item Win8PE              HTTP_WinPE_Win8_ALL
  item WePE                 HTTP_WePE_32_V2.0
  item Clonezilla           HTTP_clonezilla
  item Win10PEx64      HTTP_Win10PEx64_10586_fish2006
  item Win8PE1               FTP_WinPE_Win8_ALL
  item WePE1                  FTP_WePE_32_V2.0
  item Clonezilla1            FTP_clonezilla
  item Diskgenius         Diskgenius 4.9.6
  item maxdos             Maxdos Tool
  item Ghost                Ghost
  item plpbt                 PLPBT USB2.0 Driver
  item memtest            Memtest 86
  item USBOS               USBOS V3.0 2018.12.24
  item CentOS6.10           CentOS 6.10
  item CentOS7              CentOS 7.6
  item Ubuntu               Ubuntu
# item --gap --  
# item --gap --             ------------------------------- systeminfo ---------------------------
# item --gap --             next-server:${next-server}
# item --gap --             DHCP Server: ${dhcp-server}
#  item --gap --             IP: ${ip}
# item --gap --             MAC: ${mac}
# item --gap --             netmask: ${netmask}
# item --gap --             Gateway: ${gateway}
# item --gap --             DNS: ${dns}
# item --gap --             UUID: ${uuid}
# item --gap --             initiator-iqn: ${initiator-iqn}
  item --gap --             -------------------------------- Advanced -----------------------------
  item --key c config       [C] Configure settings
  item --key s shell        [S] Drop to iPXE shell
  item --key r reboot       [R] Reboot computer
  item --key x exit         [X] Exit iPXE and continue BIOS boot
  choose --timeout ${menu-timeout} --default ${menu-default} selected
  goto ${selected}
 
:shell
  echo Type 'exit' to get the back to the menu
  shell
  goto start
 
:failed
  echo Booting failed, dropping to shell
  goto shell
 
:reboot
  reboot
 
:exit
  exit
 
:config
  config
  goto start
 
:Win8PE
  initrd http://192.168.1.4/down/pxe/iso/win8pe.iso
  chain http://192.168.1.4/down/pxe/Boot/MEMDISK iso raw || goto failed
 
:WePE
  initrd http://192.168.1.4/down/pxe/iso/WePE_32_V2.0.iso
  chain http://192.168.1.4/down/pxe/Boot/MEMDISK iso raw || goto failed
 
:Clonezilla
  initrd http://192.168.1.4/down/pxe/iso/clonezilla-live-1.2.12-10-i686-pae.iso
  chain http://192.168.1.4/down/pxe/Boot/MEMDISK iso raw || goto failed
 
:Win10PEx64
  initrd http://192.168.1.4/down/pxe/iso/Win10PEx64_10586_fish2006.iso
  chain http://192.168.1.4/down/pxe/Boot/MEMDISK iso raw || goto failed
 
:Win8PE1
  initrd ftp://192.168.1.1/AiCard_01/PXE/iso/win8pe.iso
  chain ftp://192.168.1.1/AiCard_01/PXE/Boot/MEMDISK iso raw || goto failed
 
:WePE1
  initrd ftp://192.168.1.1/AiCard_01/PXE/iso/WePE_32_V2.0.iso
  chain ftp://192.168.1.1/AiCard_01/PXE/Boot/MEMDISK iso raw || goto failed
 
:Clonezilla1
  initrd ftp://192.168.1.1/AiCard_01/PXE/iso/clonezilla-live-1.2.12-10-i686-pae.iso
  chain ftp://192.168.1.1/AiCard_01/PXE/Boot/MEMDISK iso raw || goto failed
 
:Diskgenius
  initrd ftp://192.168.1.1/AiCard_01/PXE/iso/Diskgenius_4.9.6.iso
  chain ftp://192.168.1.1/AiCard_01/PXE/Boot/MEMDISK iso raw || goto failed
 
:maxdos
  initrd ftp://192.168.1.1/AiCard_01/PXE/iso/MAXDOS.IMG
  chain ftp://192.168.1.1/AiCard_01/PXE/Boot/MEMDISK || goto failed
 
:Ghost
  initrd ftp://192.168.1.1/AiCard_01/PXE/iso/ghost.img
  chain ftp://192.168.1.1/AiCard_01/PXE/Boot/MEMDISK || goto failed
 
:plpbt
  chain ftp://192.168.1.1/AiCard_01/PXE/Boot/PLPBT.BIN
  goto start
 
:memtest
  initrd ftp://192.168.1.1/AiCard_01/PXE/iso/MEMTEST.IMG || goto failed  #http://boot.ipxe.org/memtest.bin
  chain ftp://192.168.1.1/AiCard_01/PXE/Boot/MEMDISK || goto failed
  goto start
 
:USBOS
  kernel http://192.168.1.4/down/pxe/Boot/wimboot                               #http://git.ipxe.org/releases/wimboot/wimboot-latest.zip
  initrd http://192.168.1.4/down/pxe/iso/usbos/BOOT8PE BOOTMGR
  initrd http://192.168.1.4/down/pxe/iso/usbos/BCB BCB
  initrd http://192.168.1.4/down/pxe/iso/usbos/BOOT.SDI BOOT.SDI
  initrd http://192.168.1.4/down/pxe/iso/usbos/NT63PEX86.WIM NT63PEX86.WIM
  boot || goto failed
  goto start
 
:CentOS6.10
  set base http://mirrors.aliyun.com/centos/6/os/i386
  kernel ${base}/images/pxeboot/vmlinuz initrd=initrd.img repo=${base}
  initrd ${base}/images/pxeboot/initrd.img
  boot || goto failed
 
:CentOS7
  set base http://mirrors.aliyun.com/centos/7/os/x86_64
  kernel ${base}/images/pxeboot/vmlinuz initrd=initrd.img repo=${base}
  initrd ${base}/images/pxeboot/initrd.img
  boot || goto failed
 
:Ubuntu
  set base http://mirrors.163.com/ubuntu/dists/bionic-updates/main/installer-amd64/current/images/netboot
  kernel ${base}/ubuntu-installer/amd64/linux initrd=initrd.gz
  initrd ${base}/ubuntu-installer/amd64/initrd.gz
  imgargs linux initrd=initrd.gz root=/dev/nfs boot=casper netboot=nfs
  boot || goto failed
 
:Ubuntu1
  set base http://mirrors.163.com/ubuntu/dists/bionic-updates/main/installer-amd64/current/images/netboot
  initrd ${base}/mini.iso
  chain  ftp://192.168.1.1/AiCard_01/PXE/Boot/MEMDISK iso raw
 
:EFI_MENU
set menu-default Win8EFI
menu iPXE EFI Boot Menu
item --gap --             -------------------------------- WINPE TOOL ---------------------------
item Win8EFI                1.USBOS Win8x64PE
item Win10EFI               2.USBOS Win10x64PE
item --gap --             -------------------------------- Advanced -----------------------------
item --key s shell         [S] Drop to iPXE Shell
item --key r reboot        [R] Reboot the Computer
item --key x exit          [X] Exit iPXE and Continue UEFI Booting
 
choose --timeout ${menu-timeout} --default ${menu-default} selected
goto ${selected}
 
:shell
  echo Type 'goto start' to go back to the menu.
  shell
 
:reboot
  reboot
 
:exit
  exit 1
 
:failed
  echo Booting failed, dropping to [Shell]
  goto shell
 
:Win8EFI
kernel http://192.168.1.4/down/pxe/Boot/wimboot
initrd http://192.168.1.4/down/pxe/EFI/BOOT/BOOTX64.EFI                                bootx64.efi
initrd http://192.168.1.4/down/pxe/EFI/MICROSOFT/BCD                                   bcd
initrd http://192.168.1.4/down/pxe/EFI/MICROSOFT/BOOT/FONTS/CHS_BOOT.TTF               chs_boot.ttf
initrd http://192.168.1.4/down/pxe/EFI/MICROSOFT/BOOT/FONTS/WGL4_BOOT.TTF              wgl4_boot.ttf
initrd http://192.168.1.4/down/pxe/EFI/BOOT/USBOS.SDI                                  USBOS.sdi
initrd http://192.168.1.4/down/pxe/iso/usbos/NT63PEX64.WIM                              NT63PEX64.wim
boot || goto failed
goto start
 
:Win10EFI
kernel http://192.168.1.4/down/pxe/Boot/wimboot
initrd http://192.168.1.4/down/pxe/EFI/BOOT/BOOTX64.EFI                            bootx64.efi
initrd http://192.168.1.4/down/pxe/EFI/MICROSOFT/boot/BCD                          BCD
initrd http://192.168.1.4/down/pxe/EFI/MICROSOFT/BOOT/FONTS/CHS_BOOT.TTF           chs_boot.ttf
initrd http://192.168.1.4/down/pxe/EFI/MICROSOFT/BOOT/FONTS/WGL4_BOOT.TTF          wgl4_boot.ttf
initrd http://192.168.1.4/down/pxe/EFI/BOOT/USBOS.SDI                              USBOS.sdi
initrd http://192.168.1.4/down/pxe/iso/usbos/NT10PEX64.WIM                          NT10PEX64.wim
boot || goto failed
goto start  goto start  to start  10PEX64.wim
boot || goto failed
goto start  goto start  to start  || goto failed
goto start  goto start  to start    rt        start  to start    rt       led
goto start  goto start  to start    rt           

新建menu1.ipxe供外网访问,这里使用http://zjzj.xyz:82/作为访问地址,代码详下载目录

启动效果及外网访问

虚拟机里桥接网卡,内网测试

虚拟机网络设置桥接网卡,系统启动顺序设置网络为第一位,开机如图



可以看到,Features:DNS FXP HTTP HTTPS…均支持,已连接上路由的tftp服务器并ftp加载路由器上的menu.ipxe菜单成功

使用官网的ipxe.iso文件测试

下载地址:http://boot.ipxe.org/
参考上图,修改网络设置网络地址转换(NAT),系统启动顺序设置光驱为第一位,分配下载的ipxe.iso

#根据提示ctrl+b进入命令行模式;注意,官网的默认不支持ftp和https访问...晕
#注意不能访问menu.ipxe(内网用),mune1.ipxe里不能使用ftp和https,原因同上
#自行编译iso文件可以解决上面问题,其它命令:ipstat 获取网络状态
dhcp
chain http://zjzj.xyz:82/down/pxe/menu1.ipxe


不带外置存储的padavan路由器使用方法

因ipxe比较小且支持外网访问,所以只要在路由器中开启tftp,发送undionly.kpxe(efi不考虑了…)到主机启动ipxe,在访问远程菜单启动即可
win­scp登录路由器,上传undionly.kpxe/etc/storage/bin/pxe, 设置权限为 755
登录路由器网页,内部网络(LAN)→DHCP服务器→自定义配置文件 “dnsmasq.conf”,修改如下(注意这台路由器的ip地址为192.168.123.1)

### Enable built-in TFTP server
enable-tftp
 
### Set the root directory for files available via TFTP.
tftp-root=/etc/storage/bin/pxe
 
### Make the TFTP server more secure
#tftp-secure
 
### Set the boot filename for netboot/PXE
#dhcp-boot=pxelinux.0
 
dhcp-match=set:bios,option:client-arch,0
dhcp-boot=tag:bios,undionly.kpxe,padavan,192.168.123.1
dhcp-match=set:efi-ia32,option:client-arch,6
dhcp-boot=tag:efi-ia32,ipxe.efi,padavan,192.168.123.1
dhcp-match=set:efi-x86_64,option:client-arch,7
dhcp-match=set:efi-x86_64,option:client-arch,9
dhcp-boot=tag:efi-x86_64,snponly.efi,padavan,192.168.123.1
dhcp-match=set:ipxe,175
dhcp-boot=tag:ipxe,http://zjzj.xyz:82/down/pxe/menu1.ipxe
 
 
# 过滤 IPv6(AAAA)查询请求
#filter-aaaa

保存,进入:系统管理→恢复/导出/上传设置,点击保存/etc/storage/内容到闪存旁的提交
虚拟机测试下连接情况




终于全部搞定~~~

错误解决

1.virtualbox通过ipxe启动iso的pe时

勾选启用PAE/NX即可解决

服务器/路由器/ipxe.txt · 最后更改: 2020/09/25 21:20 由 caiweizhi