--- /dev/null
+Title: Debian Jessie, PXE and automatic firmware installation
+Tags: english, debian, isenkram, sysadmin
+Date: 2014-10-17 14:10
+
+<p>When PXE installing laptops with Debian, I often run into the
+problem that the WiFi card require some firmware to work properly.
+And it has been a pain to fix this using preseeding in Debian.
+Normally something more is needed. But thanks to
+<a href="https://packages.qa.debian.org/i/isenkram.html">my isenkram
+package</a> and its recent tasksel extension, it has now become easy
+to do this using simple preseeding.</p>
+
+<p>The isenkram-cli package provide tasksel tasks which will install
+firmware for the hardware found in the machine (actually, requested by
+the kernel modules for the hardware). (It can also install user space
+programs supporting the hardware detected, but that is not the focus
+of this story.)</p>
+
+<p>To get this working in the default installation, two preeseding
+values are needed. First, the isenkram-cli package must be installed
+into the target chroot (aka the hard drive) before tasksel is executed
+in the pkgsel step of the debian-installer system. This is done by
+preseeding the base-installer/includes debconf value to include the
+isenkram-cli package. The package name is next passed to debootstrap
+for installation. With the isenkram-cli package in place, tasksel
+will automatically use the isenkram tasks to detect hardware specific
+packages for the machine being installed and install them, because
+isenkram-cli contain tasksel tasks.</p>
+
+<p>Second, one need to enable the non-free APT repository, because
+most firmware unfortunately is non-free. This is done by preseeding
+the apt-mirror-setup step. This is unfortunate, but for a lot of
+hardware it is the only option in Debian.</p>
+
+<p>The end result is two lines needed in your preseeding file to get
+firmware installed automatically by the installer:</p>
+
+<p><blockquote><pre>
+base-installer base-installer/includes string isenkram-cli
+apt-mirror-setup apt-setup/non-free boolean true
+</pre></blockquote></p>
+
+<p>The current version of isenkram-cli in testing/jessie will install
+both firmware and user space packages when using this method. It also
+do not work well, so use version 0.15 or later. Installing both
+firmware and user space packages might give you a bit more than you
+want, so I decided to split the tasksel task in two, one for firmware
+and one for user space programs. The firmware task is enabled by
+default, while the one for user space programs is not. This split is
+implemented in the package currently in unstable.</p>
+
+<p>If you decide to give this a go, please let me know (via email) how
+this recipe work for you if you decide to give it a go. :)</p>
+
+<p>So, I bet you are wondering, how can this work. First and
+foremost, it work because tasksel is modular, and driven by whatever
+files it find in /usr/lib/tasksel/ and /usr/share/tasksel/. So the
+isenkram-cli package place two files for tasksel to find. First there
+is the task description file (/usr/share/tasksel/descs/isenkram.desc):</p>
+
+<p><blockquote><pre>
+Task: isenkram-packages
+Section: hardware
+Description: Hardware specific packages (autodetected by isenkram)
+ Based on the detected hardware various hardware specific packages are
+ proposed.
+Test-new-install: show show
+Relevance: 8
+Packages: for-current-hardware
+
+Task: isenkram-firmware
+Section: hardware
+Description: Hardware specific firmware packages (autodetected by isenkram)
+ Based on the detected hardware various hardware specific firmware
+ packages are proposed.
+Test-new-install: mark show
+Relevance: 8
+Packages: for-current-hardware-firmware
+</pre></blockquote></p>
+
+<p>The key parts are Test-new-install which indicate how the task
+should be handled and the Packages line referencing to a script in
+/usr/lib/tasksel/packages/. The scripts use other scripts to get a
+list of packages to install. The for-current-hardware-firmware script
+look like this to list relevant firmware for the machine:
+
+<p><blockquote><pre>
+#!/bin/sh
+#
+PATH=/usr/sbin:$PATH
+export PATH
+isenkram-autoinstall-firmware -l
+</pre></blockquote></p>
+
+<p>With those two pieces in place, the firmware is installed by
+tasksel during the normal d-i run. :)</p>
+
+<p>If you want to test what tasksel will install when isenkram-cli is
+installed, run <tt>DEBIAN_PRIORITY=critical tasksel --test
+--new-install</tt> to get the list of packages that tasksel would
+install.</p>
+
+<p><ahref="https://wiki.debian.org/DebianEdu/">Debian Edu</a> will be
+pilots in testing this feature, as isenkram is used to install
+firmware now.</p>