Skip to content

Instantly share code, notes, and snippets.

@noslin005
Created July 16, 2020 03:32
Show Gist options
  • Save noslin005/9651076a759f4dd1adcaf1d3b300155c to your computer and use it in GitHub Desktop.
Save noslin005/9651076a759f4dd1adcaf1d3b300155c to your computer and use it in GitHub Desktop.

Hi,

I packaged a few of Intel's out of tree NIC drivers from http://sourceforge.net/projects/e1000/ as dkms based .debs and included them in a custom grml image.

I'll explain how; if there is interest, I can also share my packages (although, as you'll see, they're likely sub-par, because I did not take the time to really understand what I was doing; in particular, I fear the e1000e module may not always build correctly at grml-live time, while it builds correctly on the live system).

1. I grabbed some tarballs from http://sourceforge.net/projects/e1000/:

-rw-r--r-- 1 root root   269997 Sep  5 16:25 e1000e-2.5.4.tar.gz
-rw-r--r-- 1 root root   303648 Sep 17 02:23 igb-5.0.6.tar.gz
-rw-r--r-- 1 root root   362747 Sep 30 23:21 ixgbe-3.18.7.tar.gz
-rw-r--r-- 1 root root   140096 Sep 30 23:31 ixgbevf-2.11.3.tar.gz

2. I extracted each.

3. I moved the contents of foo-1.2.3/src to foo-1.2.3 itself in each.

4. I created a dkms.conf like the following in the root of every driver root directory (i.e. foo-1.2.3/):

AUTOINSTALL="yes"
BUILT\_MODULE\_NAME\[0\]="igb"
CLEAN="make clean"
DEST\_MODULE\_LOCATION="/updates"
DEST\_MODULE\_NAME\[0\]="igb"
PACKAGE_NAME="igb"
PACKAGE_VERSION="5.0.6"

5. I made sure the Makefiles get the kernel version to build for from the KERNELRELEASE ennvar (not BUILD_KERNEL or similar), because this is what dkms sets:

sed -i 's/BUILD_KERNEL/KERNELRELEASE/g' Makefile

(In at least one case, I also replaced an #ifdef CONFIG_PM_SLEEP with #ifdef CONFIG_PM in netdev.c because the module didn't build for my kernel otherwise, but this problem doesn't manifest with the grml kernel because it defines either both or neither.)

6. I issued the following dkms commands (from the source directories):

dkms add -m foo -v 1.2.3
dkms mkdeb -m foo -v 1.2.3 --source-only

(Naturally, you have to replace 'foo' with the name of the module and 1.2.3 with the actual version number.)

The second command will create a .deb and dump it somewhere under /var/lib/dkms/.

7. I imported the .debs into my private repository (managed by reprepro).

8. I installed grml-live. I created a new fai 'class', called EXTRANIC. This involved creating the following files:

/etc/grml/fai/config/hooks/instsoft.EXTRANIC (mode 755):

#!/bin/bash
set -u
set -e
. "$GRML\_LIVE\_CONFIG"
$ROOTCMD apt-get --yes --force-yes install \
	dkms build-essential linux-headers-3.10-1-grml-amd64

(You'll note this is inelegant because it hardcodes the kernel version; the point here is to make sure the kernel-headers are already installed by the time the driver packages are installed.)

/etc/grml/fai/config/scripts/EXTRANIC/50-dkms (mode 755):

#!/bin/zsh
set -u
set -e
. "$GRML\_LIVE\_CONFIG"
for kernelversion in $(${=ROOTCMD} sh -c 'ls -1 /boot/vmlinuz-*' \
	| sed '[s at .](http://ml.grml.org/mailman/listinfo/grml)*boot/vmlinuz-@@'); do
		echo "Building dkms modules for kernel $kernelversion."
		${=ROOTCMD} /etc/kernel/postinst.d/dkms "$kernelversion"
done

(This may not be necessary. It attempts to build all dkms modules once more, after all requested packages have been installed.)

/etc/grml/fai/config/package_config/EXTRANIC:

e1000e-dkms
igb-dkms
ixgbe-dkms
ixgbevf-dkms
broadcom-sta-dkms
r8168-dkms

(Yeah, so not just Intel. The others come from regular Debian.)

/etc/grml/fai/config/files/etc/apt/sources.list.d/myrepo.list/EXTRANIC:

(Contains the deb http://... line for my repository.)

/etc/grml/fai/config/package_config/ZFSONLINUX.asc:

(Contains the public key of the repository signing key; I'm not sure this is really the correct way of injecting it in the build process.)

9. In /etc/grml/grml-live.local, I have:

OUTPUT=/tmp/grml/grml-live SUITE="sid" FAI_DEBOOTSTRAP="sid http://cdn.debian.net/debian" VERSION=$(date +%F) RELEASENAME="grml64-extranic" GRML_NAME="grml64-extranic" HOSTNAME="grml-extranic" ARCH="amd64" DISTRI_NAME="grml-extranic" NO_ADDONS_BSD4GRML='1' EXIT_ON_MISSING_PACKAGES='1' DEFAULT_BOOTOPTIONS="ssh=sekrit" # Be sure you understand what this does before using it

10. I built a new iso using the following command:

echo 'y\nn\ny\ny'
| env -u TMPDIR -u TMP
nice -n 20
grml-live -A -u -e /path/to/grml64-full_sid_20131001.iso
-c DEBORPHAN,GRMLBASE,RELEASE,AMD64,IGNORE,EXTRANIC

I'm posting this in the hope someone finds it useful. I'm not subscribed to the list, so please Cc: me on replies.

The resulting image is larger than regular grml as it includes build-essential and its dependencies; if that's a problem, I suppose you can add a script after 50-dkms that purges now-unneeded packages.

Incidentally, zfsonlinux can be added to grml in much the same way (that was the original point of the exercise for me).

András

-- At some point in the project you're going to have to break down and finally define the problem.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment