Recent kernel versions (as of 2013) no longer need tinkering to get usable headers.
Schematic steps:
Preparations:
src
groupExample commands 1):
# 1 $ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-$KVER.tar.xz # 2 $ cd /usr/src $ tar xvf linux-$KVER.tar.xz # 3: Patches, see below # 4.1 $ cd /usr/src/linux-$KVER $ cp /boot/config-`uname -r` .config $ make oldconfig # OR 4.2 $ cd /usr/src/linux-$KVER $ make xconfig # make config for textual interface, make menuconfig for curses interface # 5: The configuration option CONFIG_LOCALVERSION defines a string attached to the kernel version, e.g. "-1" $ sed 's/CONFIG_LOCALVERSION=.*$/CONFIG_LOCALVERSION="-1"/' .config # 6 $ make deb-pkg
This will produce:
linux-image-$KVER$REV_$KVER$REV$REV_$ARCH.deb # Kernel and modules linux-headers-$KVER$REV_$KVER$REV$REV_$ARCH.deb # Headers necessary to build external modules linux-firmware-image_$KVER$REV$REV_$ARCH.deb # Firmware files from the kernel sources as of version $KVER linux-libc-dev_$KVER$REV$REV_$ARCH.deb # Kernel-related headers
NOTE These instructions are copied from the old guide I used to have here.
Source: http://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-kernel-org-package
With semi-modern kernels it's very simple. Here the version will include the pathlevel (2.6.x.y instead of 2.6.x), and AFAIK you can change the package revision but not install different builds of the same 2.6.x.y version in parallel.
I'm not yet too used to this method so I might be missing something. I don't yet know if there's a standard way to create a headers deb.
$ wget http://kernel.org/pub/linux/kernel/v2.6/linux-$KVER.tar.bz2 $ tar jxvf linux-$KVER.tar.bz2 && cd linux-$KVER (patches) (make config) $ fakeroot make KDEB_PKGVERSION=$KVER+$REV deb-pkg (KDEB_PKGVERSION *must* start with a number)
Example:
With KVER=2.6.32.41 and REV=toi-1 this will produce packages linux-image-2.6.32.41_2.6.32.41+toi-1_amd64.deb
and linux-firmware-image_2.6.32.41+toi-1_all.deb
.
Where kernel package name is linux-image-2.6.32.41
and version 2.6.32.41+toi-1
.
Kernel version ($ uname -r
) will be 2.6.32.41, modules will go into /lib/modules/2.6.32.41
.
NOTE This notes have not much hand-holding, don't mess with this unless you know what you're doing.
Debian's linux-headers
packages (used to build out-of-tree modules) won't be created from an older pristine kernel.
To have a viable homebrewed tree to build modules, clean the tree and remove unneeded files:
(Replace $YOURARCH with your architecture, x86_64 users should use x86)
$ cd /usr/src/.../linux-source-$KVER $ make clean prepare # prepare is required for building out-of-tree modules $ mkdir /usr/src/linux-headers-$KVER+$REV $ tar -c --exclude '*.c' --exclude '*.o' --exclude '*.ko' arch/$YOURARCH include scripts Makefile .config Module.symvers | ( cd /usr/src/linux-headers-$KVER+$REV ; tar xv )
Note this self-baked tree contains much more cruft than a proper linux-headers package, but I'm unsure on what to remove.
You'll have to fix the /lib/modules/$KVER/build link unless you build the package in the correct path (/usr/src/linux-headers-$KVER+$REV).
/usr/src
. Using headers will allow a linux-headers
package to fill in the links. # 1 # apt-get install linux-source-$KVER build-essential kernel-package fakeroot # 2 $ cd /usr/src $ mkdir linux-headers-$KVER-$REV $ tar -jxv --strip-components=1 -C linux-headers-$KVER-$REV -f linux-source-$KVER.tar.bz2 # 3: Patches, see below # 4.1 $ cd /usr/src/linux-$KVER $ cp /boot/config-`uname -r` .config $ make oldconfig # OR 4.2 $ cd /usr/src/linux-$KVER $ make xconfig # make config for textual interface, make menuconfig for curses interface # 5 $ make-kpkg --rootcmd fakeroot --revision $EPOCH:$KVER~$X --append-to-version -$X-$ARCH --arch_in_name --initrd -j $NCPUS kernel_image kernel_headers
E.g.
$ make-kpkg --rootcmd fakeroot --revision 2:2.6.32~3+toi --append-to-version -3-amd64+toi --arch_in_name --initrd -j 2 kernel_image kernel_headers
will produce
linux-image-2.6.32-3-amd64+toi_2.6.32~3+toi_amd64.deb # Kernel and modules linux-headers-2.6.32-3-amd64+toi_2.6.32~3+toi_amd64.deb # Kernel headers to build modules
Using an epoch ensures no Debian package will overwrite the customised version.
Package linux-image-*
will contain a couple links to the build location, if the corresponding linux-headers-*
isn't installed these links will be removed. You can recreate the links by installing linux-headers-$KVER-$REV and re-installing linux-image-$KVER-$REV
.
After installing the customised linux-image package you might need to manually create an initrd if it wasn't done automatically.
# update-initramfs -k $VER-$REV -c # update-grub # Run ALWAYS after calling update-initramfs
Beware when importing configuration from a Debian kernel, if debugging symbols are enabled (CONFIG_DEBUG_KERNEL
option), the resulting package will be huge.
Quick way to re-configure it:
$ sed -i '/CONFIG_DEBUG_KERNEL/d' .config
# 1 $ cd /usr/src && wget http://www.tuxonice.net/downloads/all/tuxonice-$TUXONICEVER-for-$KVER.patch.bz2 # 2 $ cd linux-$KVER $ bzcat ../tuxonice-$TUXONICEVER-for-$KVER.patch.bz2 | patch -p1
Installing tuxonice-userui
package is a good idea.
Some patches are available as debian packages, e.g. linux-patch-debianlogo
.
The patch files can be found at /usr/src/kernel-patches/diffs/$PATCHNAME/$PATCH-$CLOSESTVERSION.gz
.