How add nic driver to initrd

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

  1. 通过U盘或webUI安装OS到SUT
    [root@localhost ~]# cat /etc/redhat-release
    CentOS Linux release 7.6.1810 (Core)
    
  2. 在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
    
  3. 解压原始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
      
  4. 拷贝网卡驱动到解压后的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/
      
  5. 更新驱动信息模块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 * 创建依赖列表并重新映射
    
  6. 重新打包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
    
  7. 将打包好的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

  1. 通过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:~#
    
  2. 在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
    
  3. 解压原始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
      
  4. 拷贝网卡驱动到解压后的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
      
  5. 更新驱动信息模块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 * 创建依赖列表并重新映射
    
  6. 重新打包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#
    
    
  7. 将打包好的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
    }
    }
    
    
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值