How to add nic driver to pxe boot initrd
文章目录
1. 概述
initrd (initial ramdisk) 是一种临时根文件系统,它可以通过BootLoader引导加载到内存中的作为临时根文件系统,并运行不同的程序,它可以用作 Linux 启动过程的一部分。
在pxe装机过程中,BootLoader 引导加载vmlinuz及initrd后,将initrd做为初始化文件系统,并从网络文件共享服务器(nfs/http/vsftp)中加载文件系统进行装机,但旧的Linux发行版的initrd由于缺少一些新的NIC驱动,无法正确识别NIC设备,这时候如果要正确通过PXE安装OS,需要将该⽹卡的驱动程式打包到initrd的镜像file中。
此文档分别以centos/redhat 7系列添加Mellaxon CX6 NIC Driver、debian9.9添加Boadcom NIC Driver为例,其他型号网卡驱动添加也可参考此文档进行。
2. 准备工作
- ISO镜像包
- NIC Driver package
3. 如何添加nic驱动
3.1 Redhat/CentOS 7系列添加Mellaxon CX6 NIC Driver
- 通过U盘或webUI安装OS到SUT
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)
- 在SUT安装网卡驱动
[root@localhost ~]# ls MLNX_OFED_LINUX-5.7-1.0.2.0-rhel7.6-x86_64.tgz MLNX_OFED_LINUX-5.7-1.0.2.0-rhel7.6-x86_64.tgz [root@localhost ~]# tar zxvf MLNX_OFED_LINUX-5.7-1.0.2.0-rhel7.6-x86_64.tgz [root@localhost ~]# cd MLNX_OFED_LINUX-5.7-1.0.2.0-rhel7.6-x86_64/ [root@localhost MLNX_OFED_LINUX-5.7-1.0.2.0-rhel7.6-x86_64]# ls common_installers.pl distro LICENSE RPM-GPG-KEY-Mellanox uninstall.sh common.pl docs mlnx_add_kernel_support.sh RPMS create_mlnx_ofed_installers.pl is_kmp_compat.sh mlnxofedinstall src [root@localhost MLNX_OFED_LINUX-5.7-1.0.2.0-rhel7.6-x86_64]# ./mlnxofedinstall --force
- 解压原始initrd
- 将OS镜像挂载到本地
[root@localhost ~]# mount -o loop -t iso9660 CentOS-7.6-x86_64-DVD-1810.iso /mnt/
- 为新的initrd创建挂载点
[root@localhost ~]# mkdir initrd_mlx5
- 拷⻉ISO镜像⾥原始的initrd.img
[root@localhost ~]# cp /mnt/images/pxeboot/initrd.img /root/initrd_mlx5/
- 解压原始的initrd.img
[root@localhost ~]# cd /root/initrd-mlx5/ [root@localhost initrd_mlx5]# mkdir tmp #创建tmp是为了将解压后的files暂时存放这⾥ [root@localhost initrd_mlx5]# cd tmp [root@localhost tmp]# xz -dc ../initrd.img | cpio -id 271820 blocks [root@localhost tmp]# ls bin dev etc init lib lib64 proc root run sbin shutdown sys sysroot tmp usr var
- 将OS镜像挂载到本地
- 拷贝网卡驱动到解压后的initrd中
- 查看驱动文件路径及依赖驱动信息
[root@localhost tmp]# modinfo mlx5_core | egrep "filename|depends" filename: /lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko depends: mlx_compat,auxiliary,devlink,ptp,mlxfw,psample [root@localhost tmp]# modinfo mlx_compat | egrep "filename|depends" filename: /lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/compat/mlx_compat.ko depends: [root@localhost tmp]# modinfo auxiliary | egrep "filename|depends" filename: /lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/drivers/base/auxiliary.ko depends: mlx_compat [root@localhost tmp]# modinfo devlink | egrep "filename|depends" filename: /lib/modules/3.10.0-957.el7.x86_64/kernel/net/core/devlink.ko.xz depends: [root@localhost tmp]# modinfo ptp | egrep "filename|depends" filename: /lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/ptp/ptp.ko.xz depends: pps_core [root@localhost tmp]# modinfo pps_core | egrep "filename|depends" filename: /lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/pps/pps_core.ko.xz depends: [root@localhost tmp]# modinfo mlxfw | egrep "filename|depends" filename: /lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/drivers/net/ethernet/mellanox/mlxfw/mlxfw.ko depends: [root@localhost tmp]# modinfo psample | egrep "filename|depends" filename: /lib/modules/3.10.0-957.el7.x86_64/kernel/net/psample/psample.ko.xz depends:
- 将上面所有需要的驱动拷⻉到 /root/initrd-mlx5/tmp/lib/modules/3.10.0-
862.el7.x86_64,注意位置需要⼀⼀对应。[root@localhost tmp]# mkdir -p lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/drivers/net/ethernet/mellanox/mlx5/core [root@localhost tmp]# cp /lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/drivers/net/ethernet/mellanox/mlx5/core/ [root@localhost tmp]# mkdir -p lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/compat/ [root@localhost tmp]# cp /lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/compat/mlx_compat.ko lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/compat/ [root@localhost tmp]# mkdir -p lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/drivers/base/ [root@localhost tmp]# cp /lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/drivers/base/auxiliary.ko lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/drivers/base/ [root@localhost tmp]# mkdir -p lib/modules/3.10.0-957.el7.x86_64/kernel/net/core [root@localhost tmp]# cp /lib/modules/3.10.0-957.el7.x86_64/kernel/net/core/devlink.ko.xz lib/modules/3.10.0-957.el7.x86_64/kernel/net/core/ [root@localhost tmp]# mkdir -p lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/ptp/ [root@localhost tmp]# cp /lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/ptp/ptp.ko.xz lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/ptp/ [root@localhost tmp]# mkdir -p lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/pps/ [root@localhost tmp]# cp /lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/pps/pps_core.ko.xz lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/pps/ [root@localhost tmp]# mkdir -p lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/drivers/net/ethernet/mellanox/mlxfw/ [root@localhost tmp]# cp /lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/drivers/net/ethernet/mellanox/mlxfw/mlxfw.ko lib/modules/3.10.0-957.el7.x86_64/extra/mlnx-ofa_kernel/drivers/net/ethernet/mellanox/mlxfw/ [root@localhost tmp]# mkdir -p lib/modules/3.10.0-957.el7.x86_64/kernel/net/psample/ [root@localhost tmp]# cp /lib/modules/3.10.0-957.el7.x86_64/kernel/net/psample/psample.ko.xz lib/modules/3.10.0-957.el7.x86_64/kernel/net/psample/
- 查看驱动文件路径及依赖驱动信息
- 更新驱动信息模块modules.symbol/modules.alias/modules.dep
[root@localhost tmp]# cat /lib/modules/3.10.0-957.el7.x86_64/modules.symbols | egrep "mlx5_core$|mlx_compat$|devlink$|ptp$|mlxfw$|psample$|pps_core$" >> lib/modules/3.10.0-957.el7.x86_64/modules.symbols [root@localhost tmp]# cat /lib/modules/3.10.0-957.el7.x86_64/modules.alias | egrep "mlx5_core$|mlx_compat$|devlink$|ptp$|mlxfw$|psample$|pps_core$" >> lib/modules/3.10.0-957.el7.x86_64/modules.alias [root@localhost tmp]# depmod -b /root/initrd_mlx5/tmp -a -v * 创建依赖列表并重新映射
- 重新打包initrd 镜像file
[root@localhost ~]# cd /root/initrd_mlx5/tmp/ [root@localhost tmp]# find . -print | cpio -o -H newc | xz --format=lzma > ../initrd-cx6.img 276695 blocks [root@localhost tmp]# cd .. [root@localhost initrd_mlx5]# ls initrd-cx6.img initrd.img tmp
- 将打包好的initrd-cx6.img 拷贝到pxe server, 并修改引导菜单
[root@simonlinux ~]# vim /var/lib/tftpboot/uefi/grub.cfg set default="0" set timeout=60 menuentry '1.Install CentOS 7.6 via http[With 100G CX6]' --class fedora --class gnu-linux --class gnu --class os { linuxefi /boot/ctos/7.6/vmlinuz inst.repo=http://www.httpboot.local/pxeimg/centos/7.6/os/x86_64 ipv6only=1 quiet #linuxefi /images/pxeboot/vmlinuz inst.repo=http://[2001:db8:ffff:100::10]/pxeimg/centos/8.5/os/x86_64 initrdefi /boot/ctos/7.6/initrd-cx6.img #initrdefi /boot/ctos/7.6/initrd.img }
3.2 Debian9系列添加Broadcom NIC Driver
- 通过U盘或webUI安装OS到SUT
root@debian:~# cat /etc/issue Debian GNU/Linux 9 \n \l root@debian:~# uname -a Linux debian 4.9.0-9-amd64 #1 SMP Debian 4.9.168-1 (2019-04-12) x86_64 GNU/Linux root@debian:~#
- 在SUT安装网卡驱动
root@debian:~# ls -l bnxt_en-1.10.2-221.0.114.0.tar.gz -rw-r--r-- 1 root root 603657 Oct 21 21:47 bnxt_en-1.10.2-221.0.114.0.tar.gz root@debian:~# tar zxvf bnxt_en-1.10.2-221.0.114.0.tar.gz root@debian:~# cd bnxt_en-1.10.2-221.0.114.0/ root@debian:~/bnxt_en-1.10.2-221.0.114.0# ls bnxt.c bnxt_debugfs_cpt.c bnxt_ethtool_compat.c bnxt_lfc.h bnxt_tc.c ChangeLog bnxt_compat.h bnxt_debugfs.h bnxt_ethtool.h bnxt_lfc_ioctl.h bnxt_tc_compat.h COPYING bnxt_compat_link_modes.c bnxt_devlink.c bnxt_extra_ver.h bnxt_netlink.c bnxt_tc.h find_src.awk bnxt_compat_link_modes.h bnxt_devlink.h bnxt_fw_hdr.h bnxt_netlink.h bnxt_ulp.c Makefile bnxt_coredump.c bnxt_dim.c bnxt.h bnxt_nvm_defs.h bnxt_ulp.h MANIFEST bnxt_coredump.h bnxt_dim.h bnxt_hsi.h bnxt_ptp.c bnxt_vfr.c README.TXT bnxt_dcb.c bnxt_eem.c bnxt_hwrm.c bnxt_ptp.h bnxt_vfr.h bnxt_dcb.h bnxt_eem.h bnxt_hwrm.h bnxt_sriov.c bnxt_xdp.c bnxt_debugfs.c bnxt_ethtool.c bnxt_lfc.c bnxt_sriov.h bnxt_xdp.h root@debian:~/bnxt_en-1.10.2-221.0.114.0# make;make install
- 解压原始initrd
- 下载对应版本的netboot到SUT
root@debian:~# ls netboot.tar.gz root@debian:~# cd debian-installer/ root@debian:~# tree -L 2 . └── amd64 ├── bootnetx64.efi ├── boot-screens ├── grub ├── initrd.gz ├── linux ├── pxelinux.0 └── pxelinux.cfg
- 为新的initrd创建挂载点
root@debian:~# mkdir initrd_bnxt
- 拷⻉netboot⾥原始的initrd.gz
root@debian:~# mkdir initrd_bnxt root@debian:~# cp debian-installer/amd64/initrd.gz initrd_bnxt/ root@debian:~# cd initrd_bnxt/ root@debian:~/initrd_bnxt# ls initrd.gz
- 解压原始的initrd.gz
root@debian:~# cd /root/initrd_bnxt/ root@debian:~/initrd_bnxt# gunzip initrd.gz root@debian:~/initrd_bnxt# mkdir tmp #创建tmp是为了将解压后的files暂时存放这⾥ root@debian:~/initrd_bnxt# cd tmp root@debian:~/initrd_bnxt/tmp# cpio -i -F ../initrd 139458 blocks root@debian:~/initrd_bnxt/tmp# ls bin dev etc init lib lib64 proc root run sbin shutdown sys sysroot tmp usr var
- 下载对应版本的netboot到SUT
- 拷贝网卡驱动到解压后的initrd中
- 查看驱动文件路径及依赖驱动信息
root@debian:~/initrd_bnxt/tmp# modinfo bnxt_en | egrep "filename|depends" filename: /lib/modules/4.9.0-9-amd64/updates/bnxt_en.ko depends: ptp root@debian:~/initrd_bnxt/tmp# modinfo ptp | egrep "filename|depends" filename: /lib/modules/4.9.0-9-amd64/kernel/drivers/ptp/ptp.ko depends: pps_core root@debian:~/initrd_bnxt/tmp# modinfo pps_core | egrep "filename|depends" filename: /lib/modules/4.9.0-9-amd64/kernel/drivers/pps/pps_core.ko depends:
- 将上面所有需要的驱动拷⻉到 /root/initrd_bnxt/tmp/ib/modules/4.9.0-9-amd64/,注意位置需要⼀⼀对应。
# copy bnxt_en root@debian:~/initrd_bnxt/tmp# mkdir lib/modules/4.9.0-9-amd64/updates root@debian:~/initrd_bnxt/tmp# cp /lib/modules/4.9.0-9-amd64/updates/bnxt_en.ko lib/modules/4.9.0-9-amd64/updates/. # copy ptp root@debian:~/initrd_bnxt/tmp# cp /lib/modules/4.9.0-9-amd64/kernel/drivers/ptp/ptp.ko lib/modules/4.9.0-9-amd64/kernel/drivers/ptp/ptp.ko # copy pps_core.ko root@debian:~/initrd_bnxt/tmp# cp /lib/modules/4.9.0-9-amd64/kernel/drivers/pps/pps_core.ko lib/modules/4.9.0-9-amd64/kernel/drivers/pps/pps_core.ko
- 查看驱动文件路径及依赖驱动信息
- 更新驱动信息模块modules.symbol/modules.alias/modules.dep
root@debian:~/initrd_bnxt/tmp# cd lib/modules/4.9.0-9-amd64/ root@debian:~/initrd_bnxt/tmp/lib/modules/4.9.0-9-amd64# cat /lib/modules/4.9.0-9-amd64/modules.symbols | grep "bnxt_en$" >> modules.symbols root@debian:~/initrd_bnxt/tmp/lib/modules/4.9.0-9-amd64# cat /lib/modules/4.9.0-9-amd64/modules.alias | grep -i bnxt_en >> modules.alias root@debian:~/initrd_bnxt/tmp/lib/modules/4.9.0-9-amd64# depmod -b /root/initrd_bnxt/tmp -a -v * 创建依赖列表并重新映射
- 重新打包initrd 镜像file
root@debian:~# cd /root/initrd_bnxt/tmp/ root@debian:~/initrd_bnxt/tmp# find . -print | cpio -o -H newc -O ../initrd-bnxt 159523 blocks root@debian:~/initrd_bnxt/tmp# gzip -c ../initrd-bnxt > ../initrd-bnxt.gz root@debian:~/initrd_bnxt# ls initrd initrd-bnxt initrd-bnxt.gz tmp root@debian:~/initrd_bnxt#
- 将打包好的initrd-bnxt.gz 拷贝到pxe server, 并修改引导菜单
[root@simonlinux ~]# vim /var/lib/tftpboot/uefi/grub.cfg set default="0" set timeout=60 submenu '03 Debian os Install'{ menuentry 'Install Debian9.9 under UEFI mode via Preseed' { set background_color=black linuxefi /debian9/debian-installer/amd64/linux vga=788 debian-installer/allow_unauthenticated=true url=http://192.168.15.10/ks_cfg/preseed-uefi.cfg auto=true priority=critical interface=auto ---quiet initrdefi /debian9/debian-installer/amd64/initrd-bnxt.gz #initrdefi /debian9/debian-installer/amd64/initrd.gz } }