Building Kernel DEB packages

From pristine source

Recent kernel versions (as of 2013) no longer need tinkering to get usable headers.

Newer versions

Schematic steps:

  1. Download sources
  2. Decompress sources
  3. Patch (see Patches)
  4. Import and update configuration OR configure
  5. Set the revision (local version, build iteration)
  6. Build debs (see Notes)

Preparations:

  • To build as normal user in /usr/src, assign the user to the src group

Example 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

Older versions

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. FIXME 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.

Headers

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).

From Debian-packaged sources

  1. Download kernel sources and building stuff
  2. Decompress sources
    • Important The package will contain a couple symlinks to the build location (its real path), so use an appropriate directory name under /usr/src. Using headers will allow a linux-headers package to fill in the links.
  3. Patch (see Patches)
  4. Import and update configuration OR configure
  5. Build debs (see Notes)
  # 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

Notes

Huge package/modules

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

Patches

TuxOnIce

  1. Download TOI patch for the appropriate kernel version from http://www.tuxonice.net/. If not available, a close enough version MIGHT work.
  2. Apply patch to kernel sources
  # 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.

Debian-packaged

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.

1) Where $KVER is the kernel version, $ARCH is the host architecture codename and $REV is the revision
debian/kerneldeb.txt · Last modified: 2013/03/15 19:26 by Toni Corvera
 
Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki