1

I have been trying to load an updated initrd.img file with updated drivers on booting the Centos 7.6 ISO, however it seems to still load the old driver even though I have replaced the driver.

Steps taken:

Extracted initrd image from ISO:

  1. Mounted CentOS 7.6 ISO
  2. Copied the initrd.img from isolinux/initrd.img to temporary folder (/tmp/image)
  3. Created a new folder at /tmp/image/initrd
  4. Extracted the initrd.img the folder by running
xz -dc < ../initrd.img | cpio -idmv

Created the e1000e.ko.kz driver file

  1. Download the latest e1000e NIC driver from the Intel website: e1000e download link
  2. Extracted the tar file
    tar xvf e1000e-3.6.0.tar.gz
    
  3. Make the source code, ensuring that gcc and kernel-devel libraries are installed

    cd e1000e-3.6.0/src
    make install
    

    Note: this driver was compiled on a linux environment created by the CentOS 7.6 ISO.

  4. Copy the created e1000e.ko file to the temporary folder (/tmp/image)

  5. Compress it to .kz format

    xz -k e1000e.ko
    

    Replace old driver and repack initrd.img image

  6. Copy the compressed driver file to replace the existing driver

    cp e1000e.ko.kz /tmp/image/initrd/files/lib/modules/3.10.0.957.el7.x86_64/kernel/drivers/net/ethernet/intel/e1000e
    
  7. Repack the initrd.img
    cd /tmp/image/initrd
    find . 2>/dev/null | cpio -c -o | xz -9 --check=crc32 > ../initrd.img
    
  8. Copy the generated initrd.img back into the ISO at isolinux/initrd.img and images/pxe/initrd.img

Expected Results

After updating the driver in the initrd.img and copying it into the ISO, I expect the new driver (e1000e version 3.6.0) to be loaded in after the ISO install boot process is complete.

Actual Results

I am able to boot from the ISO and install Centos 7 from it, however after installing Centos, running the following command:

modinfo e1000e

Gives the old version of the driver that was on the initrd.img initially (e1000e version 3.2.6) rather than version 3.6.0 which I loaded onto the initrd.img image.

I am not too sure what I am doing wrong, whether I am creating the driver incorrectly, loading the driver incorrectly, creating the initrd.img incorrectly or anything else.

Any help would be appreciated as I have been trying to get this working for the past few days. This is my first post, so let me know if I am doing anything wrong or if any additional information is required debug this issue.

Cheers

4
  • You probably also need to update the files/usr/lib/modules/3.10.0.957.el7.x86_64/modules.dep with the new module name and path (usually handled by depmod). I think you'd do something like depmod -b /tmp/image/initrd/usr 3.10.0.957.el7.x86_64 but please check if I'm wrong.
    – jsbillings
    Commented Apr 8, 2020 at 15:17
  • I didn't include a brand new driver, the e1000e driver module already existed in the initrd.img that I pulled from the ISO. I just updated the existing driver with a newer version, i.e. the module name and path didn't change for the new driver.
    – luj
    Commented Apr 8, 2020 at 23:00
  • I was trying to follow your same approach, but it looks like the e100e driver is not enough when dealing with a new network card that was not supported before. kmod-e1000e-3.8.4-2.el7_8.elrepo.x86_64.rpm does support more, but adding the driver to the initrd is not enough. Any idea?
    – djuarez
    Commented Jan 29, 2021 at 16:57
  • Did you do anything with the pci.updates?
    – djuarez
    Commented Feb 1, 2021 at 13:38

1 Answer 1

1

Just figured this out. The drivers are also in the LiveOS/squashfs.img rootfs.img. So the initrd modules get overlayed with rootfs.img. This is during the installation process but once the installed system boots the driver comes from an installed RPM (probably the kernel in this case) so initrd has nothing to do with it anymore. You would need to update that RPM or add a separate RPM with the updated driver for it to work on the installed system.

0

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .