Problem #2: How to add a wireless module to a d-i image?
Slightly longer version: As reported in #686605, a whole wireless module family is missing from the linux kernel udebs, meaning they’re missing from the d-i images. Please note the hypothesis here is that the regular linux kernel images contain the relevant modules, only the udebs don’t.
Recipe #2: Craft a local udeb!
- The following assumes one is interested in adding a wireless
module, but that can be adapted to other module families. The
relevant udeb base name is
nic-wireless-modules
. - When it comes to linux kernel modules, picking the right ones is
important, so one has to consider the ABI. Right now, the current
ABI in
testing
is3.2.0-3-amd64
. The complete udeb name is thereforenic-wireless-modules-3.2.0-3-amd64-di
. - If you’re running a kernel with the same ABI, all good, relevant
modules should be available under
/lib/modules/$(uname -r)
, which is what will be assumed below. Otherwise, one would have to download a properlinux-image-$ABI
package, and extract it into a temporary directory to grab the wanted module(s). Determine the relevant module and its dependencies. As an example, I’ll pick a Realtek module:
rtl8192cu.ko
. If it’s loaded, one can use the following to detect its dependencies:$ lsmod|grep rtl8192cu rtl8192cu 78863 0 rtlwifi 81350 1 rtl8192cu rtl8192c_common 52602 1 rtl8192cu mac80211 192768 4 iwlwifi,rtl8192c_common,rtlwifi,rtl8192cu cfg80211 137140 3 mac80211,iwlwifi,rtlwifi usbcore 128498 7 ehci_hcd,usbhid,uvcvideo,rtlwifi,rtl8192cu
But it isn’t even needed to load the module to get those dependencies:
$ /sbin/modinfo /lib/modules/3.2.0-3-amd64/kernel/drivers/net/wireless/rtlwifi/rtl8192cu/rtl8192cu.ko|grep ^depends depends: rtlwifi,mac80211,rtl8192c-common,usbcore
Compared to what the d-i image contains, only
rtlwifi
andrtl8192c-common
are missing.Fetch the udeb using http://packages.debian.org/ or browsing your favourite mirror if you know the paths by heart.
Extract the udeb into a temporary
data/
directory, along with its meta data:dpkg -x nic-wireless-modules-3.2.0-3-amd64-di_3.2.23-1_amd64.udeb data dpkg --control nic-wireless-modules-3.2.0-3-amd64-di_3.2.23-1_amd64.udeb data/DEBIAN
Copy the 3 modules under the relevant subdirectory under
data/
.- Update the version in
data/DEBIAN/control
, for example by adding the+local1
suffix. Build a new binary package, using
fakeroot
to avoid owner/group noise in the diff:fakeroot dpkg -b data nic-wireless-modules-3.2.0-3-amd64-di_3.2.23-1+local1_amd64.udeb
Use
debdiff
to check the results:$ debdiff nic-wireless-modules-3.2.0-3-amd64-di_3.2.23-1*_amd64.udeb Files in second .deb but not in first ------------------------------------- -rw-r--r-- root/root /lib/modules/3.2.0-3-amd64/kernel/drivers/net/wireless/rtlwifi/rtl8192cu/rtl8192c-common.ko -rw-r--r-- root/root /lib/modules/3.2.0-3-amd64/kernel/drivers/net/wireless/rtlwifi/rtl8192cu/rtl8192cu.ko -rw-r--r-- root/root /lib/modules/3.2.0-3-amd64/kernel/drivers/net/wireless/rtlwifi/rtlwifi.ko Control files: lines which differ (wdiff format) ------------------------------------------------ Version: [-3.2.23-1-] {+3.2.23-1+local1+}
Put the resulting udeb under
localudebs/
in your d-i build tree, and rebuild your image as usual. Almost-tada!
Why “almost”? Because a firmware is needed, so one can go back to the
7th step, extract the proper file (lib/firmware/rtlwifi/rtl8192cufw.bin
)
from the non-free firmware-realtek
package, and add it under
data/lib/firmware/realtek/
. Rebuild the udeb, rebuild the d-i image. Then: tada!