1、下载ipxe源码
https://git.ipxe.org/ipxe.git/tree
2、编译ipxe
1) 先使用lspci -nn|grep -i eth查询当前网卡的device id,如:
2)编译ipxe,可以选择编译legacy的rom,也可以选择编译uefi的rom:
#如 legacy rom
make bin/8086100e.rom
#如 uefi rom
make bin-x86_64-efi/8086100e.efirom
3、修改网卡
1)工具
烧录网卡需要用到intel的两个工具:
1、bootutil64e,下载地址:
bootutil64e下载地址
2、eeupdate64e,该软件需要intel账号才能下载:
eeupdate64e下载地址
2)烧录前准备工作
1、用bootutil64e将网卡升级为pxe
因测试的是legacy环境,暂未测试uefi
bootutil64e -nic=1 -up=pxe -file=BootIMG.FLB
bootutil64e -e
- 显示结果如下:
c
Port Network Address Series WOL Flash Firmware Version
==== =============== ======= === =================== =======
1 001B210A7760 Gigabit YES PXE 1.0.13
2 001B210A7761 Gigabit YES PXE 1.0.13
2、用eeupdate64e dump网卡固件:
eeupdate64e -nic=1 -dump
可以看到当前目录生成了一个001B210A7760.bin的文件,该文件即为网卡固件。
3、修改固件
此部分将区分网卡:
1、网卡如果是intel 82599、intel x520,那么不需要操作,此步跳过
2、网卡如果是intel i210,由于i210比较老,因此工具校验的不是那么严格,可以参考文档Intel i210网卡使用iPXE固件直接进行烧录
3、网卡如果是intel x540、intel x550/x552、 intel x722等等,则需要修改固件,将步骤2中的导出的网卡固件里面的pxe rom部分替换为ipxe的rom。
替换方式如下(下面以x722为例):
使用UltraEdit打开步骤2中生成的bin文件
由于intel固件中都是以word形式读写数据,因此需要找到0x5地址的值,0x5地址为指向option rom的实际存放地址,即上图中的数据DE 83,word值即为0x83de,而高位表示指针的type
即网卡pxe option rom的地址为:0x3de * 4k = 0x3de0000
可以看到此地址的数据内容确实是PXE的option rom启动信息。
4、将pxe信息替换为ipxe信息
#其中3960 * 1K 即为 偏移地址 0x3de000
dd if=808637d0.bin of=001B210A7760.bin bs=1K seek=3960 conv=notrunc
5、 修改pxe版本信息
此部分不是强制要求,不修改也不影响
PXE的版本信息位于固件地址0x32,如上图中的版本即为1.1.09,可以修改为ipxe自身的版本号,但需要注意两点:
1、修改后,固件地址0x3f为checksum,必须重新计算更新
2、几乎每个网卡固件的配置部分都是有一个shadow的,以x722为例,x722的网卡固件配置大小为64K,因此shadow的起始位置也为64K即0x10000
如果要修改版本信息最好两部分配置一起修改一起更新各自的checksum。
这里就不详细讲checksum计算方法了。
4、烧录网卡固件
此部分也区分网卡进行说明:
1、网卡如果是intel 82599、intel x520,因为82599的网卡配置和option rom是分别存放于eeprom和flash中,所以可以直接使用eeupdate64e包中的lanconf64e工具,选择flash,选择文件808610f8.rom进行烧录到flash中
2、网卡如果是intel i210,那么可以参考文档Intel i210网卡使用iPXE固件
3、网卡如果是intel x540、intel x550/x552,此类网卡配置和option rom都是位于同一个flash当中,需要使用烧录器将网卡flash取下,再修改过的ipxe 固件001B210A7760.bin重新烧回到flash当中。
【注意】:此处无法使用eeupdate64e再将001B210A7760.bin重新刷回网卡,因为本身001B210A7760.bin固件添加了签名校验,修改了ipxe后校验值已经对不上了,而这个校验只在升级时eeupdate64e使用,eeupdate64e检查到校验不正确时会返回烧写失败。使用烧录器重新烧录后,不管是bios还是系统当中都只会校验0x3f地址的checksum,不会再校验签名,因此不影响使用
4、intel x722,此网卡比较特殊,该网卡没有自身网卡的flash,而是和bios共用flash,因此网卡固件需要包入到bios当中,但在bios中存放的位置是固定的,因此可以使用烧录器将整个bios一起读出来,然后计算偏移值,使用dd命令替换对应网卡固件的区域,然后再用烧录器重新烧回bios flash当中
dd if=001B210A7760.bin of=bios.bin bs=1K seek=xxxx conv=notrunc