[Grml] [HOWTO] Packaging up out of tree Intel network drivers and adding them to grml
Andras Korn
korn-grml at elan.rulez.org
Fri Oct 4 23:24:06 CEST 2013
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 .*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.
More information about the Grml
mailing list