====== 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: - Download sources - Decompress sources - Patch (see [[#Patches]]) - Import and update configuration OR configure - Set the revision (local version, build iteration) - Build debs (see [[#Notes]]) Preparations: * To build as normal user in /usr/src, assign the user to the ''src'' group Example commands ((Where $KVER is the kernel version, $ARCH is the host architecture codename and $REV is the revision)): # 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 [[debian:toikerneldeb|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 ===== - Download kernel sources and building stuff - 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. - Patch (see [[#Patches]]) - Import and update configuration OR configure - 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 ==== - Download TOI patch for the appropriate kernel version from http://www.tuxonice.net/. If not available, a close enough version MIGHT work. - 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''.