Andras Korn
2013-10-04 21:24:06 UTC
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
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.
At some point in the project you're going to have
to break down and finally define the problem.