This Page is about Rebuilding an official Debian kernel package

There is the Kernel Handbook about this:

We are following section 4.2: Rebuilding an official Debian kernel package

What you'll get is exactly the kernel that Debian releases but with those added changes.

Add a Patch to linux-2.6

First get the orig tar ball from buildserver, see [DebianKernel], unpack it:

~/src$ tar xzf linux-2.6_2.6.24~rc6.orig.tar.gz

Get latest Debian patches + config settings:

~/src/linux-2.6-2.6.24-rc6$  svn export svn://

Now you can start adding patches inside the patches dir. To have them applied don't forget to add them to the series file.

~/src/linux-2.6-2.6.24~rc6$ cp ~/special-fix.patch debian/patches/bugfix/
~/src/linux-2.6-2.6.24~rc6$ echo "+ bugfix/special-fix.patch" \
  >> debian/patches/series/1~experimental.1 

Do not forget to document the new patch in a new stanza at the top of debian/changelog. You will likely want to append some string to the version, using ~ or + to ensure your change does not conflict with existing or future official kernel packages.

Now check that your patchset still applies and fix any conflicts

~/src/linux-2.6-2.6.24~rc6$ make -f debian/rules source-all

Then build with appropriate DEBIAN_KERNEL_JOBS according to the box core cpu number:

~/src/linux-2.6-2.6.24~rc6$ DEBIAN_KERNEL_JOBS=${NR_CPUS} debuild

8 easy (albeit time consuming) steps

Assuming you are just interested in building one flavor of a kernel-image.

  1. Create the directory where you will build the kernel package as a normal user.
  2. Get the package source. For this to work, you need to have deb-src lines for the official archive in /etc/apt/sources.list:

apt-get source linux-2.6

Now your tree holds the source and all changes Debian made to it.

  1. Add your patch into the debian/patches directory, as per the above. It may be a good idea to name the new series accordingly. For instance, when adding the "foo" patch, you might want to add a reference to the patch (see above) to debian/patches/series/1+foo.1, assuming debian/patches/series/1 is the latest file. By abusing the ABI field for this, one guards against possible confusion when such custom kernel packages are installed on otherwise pristine Debian systems.

  2. If you haven't yet, document your change in debian/changelog, e.g. with the dch tool from the devscripts package, and append the same string ("+foo.1") to the package version as you appended to the ABI field.

dch --local +foo.
  1. Now prepare the rules file for the one build you want to make:

fakeroot make -f debian/rules.gen setup_i386_none_k7

This presumes you are only interested in building a k7 AMD processor image! If you where interested in a 686 processor image do:

fakeroot make -f debian/rules.gen setup_i386_none_686

This will build a tree in the debian/build/build-i386-none-k7 or debian/build/build-i386-none-686 directory. Cd to that directory.

  1. Change the .config file. Do:

make menuconfig

and make any changes you had in mind. E.g the changes mentioned above in Reasons for doing this. An alternative is to run

make oldconfig

which uses the currently running configuration of the machine on which you are building. Also this is the time to add additional patches, e.g. the Debian Logo patch.

  1. Compile the kernel and generate the image and headers debs. Replace $NR_CPUS with the number of CPUs of the build machine (keeping it all on the same line) and run either

fakeroot make -f debian/rules.gen binary-arch_i386_none_k7 DEBIAN_KERNEL_JOBS=${NR_CPUS}


fakeroot make -f debian/rules.gen binary-arch_i386_none_686 DEBIAN_KERNEL_JOBS=${NR_CPUS}

On a 2.0GHz CPU the compile will take 1 hour and 20 minutes and 2 deb files will be generated: the image file and the headers file, e.g.

  1. Install them with dpkg and now you have installed the stock Debian kernel with your changes in it. Congratulations ;-)