Size: 7555
Comment: warn that build might take around 10 GB of disk space
|
Size: 7705
Comment: add some disk space usage estimates
|
Deletions are marked like this. | Additions are marked like this. |
Line 65: | Line 65: |
0. Make sure you have at least 40 GB of disk space free (version 2.6.32-17 took 30 GB). |
|
Line 71: | Line 73: |
0. Make sure you have at least 10 GB of disk space free. | 0. Make sure you have at least 10 GB of disk space free (setup_amd64_none_amd64 took 7.3 GB in version 2.6.32-17). |
Building custom kernel packages
(this wiki page should be renamed/moved to better reflect the actual content)
This page is about rebuilding an official Debian kernel package with custom changes. There is the Kernel Handbook about this: http://kernel-handbook.alioth.debian.org/ (which explains how to "Rebuild an official Debian linux kernel package", hopefully : http://kernel-handbook.alioth.debian.org/ch-common-tasks.html ch 4.2 : "Rebuilding an official Debian kernel package").
We are following section 4.2: Rebuilding an official Debian kernel package
Reasons to do this:
Modifying the Debian configuration to change the preemption model.
Modifying the Debian configuration to change the timer frequency.
- Add a patch fix.
- Add your favorite patchset.
What you'll get is exactly the kernel that Debian releases but with those added changes. The new packages will not step on the official kernel images' toes.
Add a patch to linux-2.6 and build new kernel packages
Create the directory where you will build the kernel package as a normal user and make sure you have all necessary packages installed:
apt-get install fakeroot build-essential devscripts apt-get build-dep linux-2.6
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 cd linux-2.6-*
Now you are in the tree that holds the source and all changes Debian made to it. As an alternative, you could get a kernel tarball, e.g. from buildserver (see DebianKernel), unpack it, and get the latest Debian patches + config settings:
tar xzf linux-2.6_2.6.24~rc6.orig.tar.gz cd linux-2.6-* svn export svn://svn.debian.org/svn/kernel/dists/trunk/linux-2.6/debian
Start a new stanza at the top of debian/changelog and use an appropriate version number. Ensure that the distribution is not set to the regular release names. Change it to something like UNRELEASED. If you are adding a single patch "foo", you might want to append "+foo.1". If you are adding multiple patches for your company or yourself, use "+somename.1". You could do this with the dch tool from the devscripts package like so:
dch --local +foo.
Append the same string to the abi.abiname field in debian/config/defines to ensure that your custom kernel package name doesn't bite with the official ones. In our case, we're now creating linux-image-2.6.xx-y+foo.1-zzz.
Put your patch into the debian/patches directory and create a new series file to match the Debian revision; assuming you are basing your work on the -1 package, you would create a file named 1+foo.1:
cp ~/special-fix.patch debian/patches/bugfix/ echo "+ bugfix/special-fix.patch" >> debian/patches/series/1+foo.1
Optional : If it's not the first build attempt, and should you need to clean things in case of build failures :
make -f debian/rules clean
- Now check that your patchset still applies and fix any conflicts: Note: on the first run, the target fails. Make sure you run it twice.
This target is made to fail intentionally, to make sure that it is NEVER run during the automated build. Please ignore the following error, the debian/control file has been generated SUCCESSFULLY.
make -f debian/rules source-all
Document the addition of this patch in the new stanza in debian/changelog.
Building all kernel-related packages
- Make sure you have at least 40 GB of disk space free (version 2.6.32-17 took 30 GB).
Assuming you want to build all kernel-related packages, build with the appropriate DEBIAN_KERNEL_JOBS parameter (the number of processors you can use for the build):
~/src/linux-2.6-2.6.24~rc6$ debuild -e DEBIAN_KERNEL_JOBS=${NR_CPUS}
Building only a single kernel variant
- Make sure you have at least 10 GB of disk space free (setup_amd64_none_amd64 took 7.3 GB in version 2.6.32-17).
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 were 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. Go to that directory.
Change the .config file, using e.g.
make menuconfig cd ../../..
Compile the kernel and generate the kernel packages. 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 binary-indep \ DEBIAN_KERNEL_JOBS=${NR_CPUS}
or
fakeroot make -f debian/rules.gen binary-arch_i386_none_686 binary-indep \ DEBIAN_KERNEL_JOBS=${NR_CPUS}
On a 2.0GHz CPU the compile will take 1 hour and 20 minutes and 8 package files will be generated, e.g.:
linux-image-2.6.24-1+foo.1-686_2.6.24-5+foo.1_i386.deb linux-headers-2.6.24-1+foo.1-686_2.6.24-5+foo.1_i386.deb linux-support-2.6.24-1+foo.1-686_2.6.24-5+foo.1_i386.deb linux-tree-2.6.24_2.6.24-5+foo.1_i386.deb linux-patch-debian-2.6.24_2.6.24-5+foo.1_i386.deb linux-source-2.6.24_2.6.24-5+foo.1_i386.deb linux-manual-2.6.24_2.6.24-5+foo.1_i386.deb linux-doc-2.6.24_2.6.24-5+foo.1_i386.deb
Problem: In this case, linux-headers-2.6.24-1+foo.1-common will be missing. One needs to invoke the binary-arch_i386 target, which will yield all feature sets (Xen, VServer) and flavours to be generated, and obviously takes a lot longer. See this thread.
If you apply further changes to the source package and need to rebuild the binary packages without rebuilding each and every binary objects, you can remove the build stamp before running the above mentioned building command.
rm debian/stamps/build_i386_none_k7_plain
or
rm debian/stamps/build_i386_none_686_plain
The story of linux-kbuild-2.6
The linux-headers-* packages created with the above method depend on linux-kbuild-*, which is a not built from the linux-2.6 source package, but from linux-kbuild-2.6.
Often, when a new kernel comes around, linux-kbuild-2.6.xx isn't yet available in the archive, so you either have to build it yourself, or wait.
How to build linux-kbuild-2.6 yourself
Fetch the sources from SVN:
svn co svn://svn.debian.org/kernel/dists/trunk/linux-kbuild-2.6
Then, fetch the vanilla kernel tarball (important: the 2.6.x version, no 2.6.x.y version):
wget http://ftp.de.kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.tar.bz2
Now, you can prepare the package:
cd linux-kbuild-2.6 ./debian/bin/genorig.py ../linux-2.6.27.tar.bz2 cd .. tar xzf orig/linux-kbuild-2.6_2.6.27.orig.tar.gz cd linux-kbuild-2.6-2.6.27/ cp -a ../linux-kbuild-2.6/* ./ ./debian/bin/gencontrol.py dch -i
Now adjust the version, and add a comment like "New upstream version" or something, and build the package itself, after you installed eventually missing build-dependencies:
make -f debian/rules clean dpkg-checkbuilddeps dpkg-buildpackage -us -uc
and you are done.