|
本帖最后由 hhh333 于 2021-4-16 06:29 编辑
iPXE网启确实够快,而且在不停更新,不得不每次按自己的意愿编译定制,时间一长又忘记,干脆记下来以免重新捡起时又走弯路。前面都在UOS中编译,刚好caocaofff提点在WSL环境中可能更方便,摸索了一下,不对之处请大佬们指正。
一、这是iPXE网站上有关编译的信息https://ipxe.org/download
You will need to have at least the following packages installed in order to build iPXE:
gcc
binutils
make
perl
liblzma or xz header files
mtools
mkisofs or genisoimage or xorrisofs (needed only for building .iso images)
syslinux (for isolinux, needed only for building .iso images)
二、WSL中搭建iPXE编译环境
WSL是win10的可选安装组件,因此要先安装WSL,如果不清楚,可以上网搜索安装方法,也是超简单的。可以参考这篇https://www.daehub.com/archives/9561.html
安装好后就可以启动进入Ubuntu,设定用户和密码,根据提示进行必要的升级就可进入编译环境搭建,在Ubuntu命令窗口中发下述命令安装组件:
- sudo apt install git
- sudo apt install git-core #不装这个编译时会出现文件找不到
- sudo apt install liblzma-dev #不装会出现lzma.h错误
- sudo apt install gcc
- sudo apt install make
- sudo apt install mtools #DOS命令模拟器
- sudo apt install mkisofs #不生成ISO不需要
- sudo apt install syslinux #不生成ISO不需要
- binutils和perl提示系统中已经存在不需要安装
复制代码 可见与网站上的提示有所出入。
三、编译
1、使用git下载iPXE源代码
git clone git://git.ipxe.org/ipxe.git
这个不要用sudo,否则会没操作权限
2、进入ipxe/src先做些准备工作
先要了解究竟需要编译哪些文件,这个分两种情况,一种是适用于BIOS启动环境,另一种是EFI环境,以下是编译命令,可以存成BASH的批处理文件
- #!/bin/bash
- #编译前清空文件
- make clean
- #====BIOS编译命令,ipxe.lkrn不预置脚本调用时指定,undionly.kpxe可以内置脚本,也可以不内置脚本由网络启动器指定
- make bin/ipxe.lkrn
- make bin/undionly.kpxe EMBED=biosrom.txt
- #====EFI编译命令,ipxe.efi包含网卡驱动较大,snponly只含通用驱动小=====
- #64位
- make bin-x86_64-efi/ipxe.efi EMBED=efirom.txt
- make bin-x86_64-efi/snponly.efi EMBED=efirom.txt
- #32位
- make bin-i386-efi/ipxe.efi EMBED=efirom32.txt
- make bin-i386-efi/snponly.efi EMBED=efirom32.txt
- #====收集编译的文件=====
- mkdir -p myipxe/32
- mkdir -p myipxe/64
- cp bin/ipxe.lkrn myipxe
- cp bin/undionly.kpxe myipxe
- cp bin-x86_64-efi/ipxe.efi myipxe/64
- cp bin-x86_64-efi/snponly.efi myipxe/64
- cp bin-i386-efi/ipxe.efi myipxe/32
- cp bin-i386-efi/snponly.efi myipxe/32
复制代码 以上生成的文件的用途:
A、bin/ipxe.lkrn 用于其他PXE启动程序调用进入iPXE环境的启动程序,可以不用内置脚本而由PXE程序灵活配置,如下为PXELINUX调用这个程序的菜单
- LABEL bootiPXE
- MENU LABEL [^X] --转iPXE网启
- kernel /BOOT/IPXE.KRN
- append initrd=/BOOT/H3_iPXEM.LST
复制代码 下面是G4D调用
- title 转iPXE网启 Goto iPXE Menu\n可有更快的网启速度
- kernel /BOOT/IPXE.KRN
- initrd /BOOT/H3_iPXEM.LST
复制代码 这个IPXE.KRN是由ipxe.lkrn改名而来
B、bin/undionly.kpxe这个是iPXE作网络第一启动时使用,最好在内嵌脚本中指定查找启动脚本的位置,当然也可以在网启服务工具中指定。我一般是将这个文件改名为ipxe.0放网启服务器网启目录的根下。
(注:如果在启动文件中内嵌了脚本指定外置菜单,这个启动器指定就无效了)
C、ipxe.efi、snponly.efi用于EFI环境iPXE做第一启动时的启动文件,前者包含网卡驱动较大,后者只含通用驱动小。由于用于EFI环境所以分64位和32位版本,不可混用,编译后分别位于bin-x86_64-efi和bin-i386-efi目录。由于是EFI一启,必须在内嵌脚本中指定菜单文件。
以上文件的文件名在编译时是不能改名的,因为编译工具是用文件名来判断用于何种类型的启动的。编译后名称可以任意改,如上图中EFI网启文件H3_iPXE64.efi就是由64位的ipxe.efi或snponly.efi改名而来。
在以上编译命令中用到了内嵌脚本,这个脚本不是菜单,只是用来指定菜单的位置和名称,即到服务器的什么地方取什么文件作菜单。语法与外置的菜单是一样的,当然也可以直接将外置菜单内嵌。目前的逻辑是用一个小的内嵌脚本调用外置脚本,一般情况下修改外置菜单就可以了,不必重新编译。以下脚本用于BIOS编译时的biosrom.txt的内容:
- #!ipxe
- dhcp
- chain BOOT/H3_iPXEM.LST
复制代码 以下是EFI64的efirom.txt
- #!ipxe
- dhcp
- chain EFI/ipxe/H3_iPXEM.LST
复制代码 以下是EFI32的efirom32.txt
- #!ipxe
- dhcp
- set x32 32 #32位增加一个参数以方便后面菜单脚本编写
- chain EFI/ipxe/H3_iPXEM.LST
复制代码 这个很容易看懂,就不作过多解释了。
内嵌脚本编译时通过EMBED=xxx来指定,要提前编辑好,并放当前编译目录下,即ipxe/src下。准备好文件后就可进行编译了。
3、进行编译
准备好内嵌文件后就可以发命令进行编译了,最好一条一条来,以方便查看编译结果。
四、网启菜单的编写
这是我编写的BIOS-ipxe菜单
这是用于EFI的:
可见语法是较简单的:支持“:标号”和“goto",变量由"set"设置,用"${变量}"进行引用,”&&"表示“则”,“||”表示“否则”因此可以控制流程方向,“isset、iseq”用来判断......其他关键词可以看说明https://ipxe.org/docs。
五、注意事项
1、脚本的格式:内嵌菜单、外置菜单都可用ansi格式,但sh脚本最好在linux环境进行编辑,如果直接在windows下编辑再直接在WSL环境中用,是没有权限的要通过“chmod 744 文件名”赋权才能使用。
2、外置脚本中使用了背景菜单,以上直接编译的文件启动时会出错失败。因此还得改两个文件:src/config/general.h console.h把其中的两个参数去除注释才行#define CONSOLE_CMD #define CONSOLE_FRAMEBUFFER这两行前面的“//"要去掉。
3、实际上还有一个WSL与Win10之间互相存取文件的问题。我比较暴力,直接到用户目录下找到WSL安装位置,直接拷入拷出,但由win->WSL的文件要记得赋权限,不然WSL看得到拿不到,要特别注意格式,否则会出现不可见的乱字符。哦,对了,WSL在Win10的位置看下这个路径就知道了:C:\Users\hwg\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\hwg\ipxe\src。而Win10在WSL中的位置可以看下图
|
评分
-
查看全部评分
|