|
|
Kernel Hacking Lesson #1: Get the Source
Now, you need to get the Linux source. There are many different ways
of getting the Linux source, but I'll list them in order of
preference. You only need to choose one of these options.
While it's easiest to just install the source on your
distribution CD, you'll need to stay up to date with the latest
version of the Linux source if you want to participate in kernel
development.
Linus
recommends not having a /usr/src/linux symbolic link to your
kernel source tree.
However, the /usr/src/linux link will sometimes be used as a default
by some modules that compile outside the kernel. If you need it, make sure it
points to the correct kernel tree. If it doesn't, modules that compile outside
the kernel may use the wrong header files.
Use BitKeeper to clone a Linux source repository. This is what I
use, and it's what many other kernel hackers use, including the
entire PowerPC team, Ted T'so, Rik van Riel, and Linus
himself. Be warned, this requires downloading many megabytes of data,
so don't use it if you have a slow link. This option also requires at
least 1 GB of free disk space, which is significantly more than
the other options.
First, get BitKeeper:
http://www.bitmover.com/cgi-bin/download.cgi
Follow the instructions and it will tell you how to download and
install BitKeeper.
Then, clone the main Linux tree using BitKeeper:
$ cd /usr/src
(or wherever you would like to work)
$ bk clone bk://linux.bkbits.net/linux-2.6 linux-2.6
$ cd linux-2.6
$ bk -r co
And now you have a kernel source tree! Learn more about how to use
BitKeeper here:
http://www.bitkeeper.com/Test.html
FTP the kernel source from ftp.kernel.org. This is another
bandwidth intensive operation, so don't use it if you have a slow
link.
FTP to your local kernel mirror, which is named:
ftp.<country code>.kernel.org
For example, I live in the US, so I do:
$ ftp ftp.us.kernel.org
Login (if necessary) with username ftp or anonymous. Change
directory to pub/linux/kernel/v2.6 and download the latest kernel.
For example, if the latest version is 2.6.9, download the file
named:
linux-2.6.9.tar.gz
Usually there is a file named LATEST-IS-<version> to tell you what
the latest version is. I recommend the gzipped format (filename
ending in .gz) instead of bzip2 format (filename ending in
.bz2) since bzip2 takes a long time to decompress.
Untar and uncompress the file in the directory where you are
planning to work.
You now have your Linux kernel source.
Install the kernel source from your distribution CD. If you
already have a directory named /usr/src/linux and it contains more
than one directory, you already have the source installed. If you
don't, read on.
Mount your installation CDROM. On a RedHat based system, the
source RPM is usually in <DistributionName>/RPMS/ and is named:
kernel-source-<version>.<arch>.rpm
One way to find the kernel source package is to run this command,
assuming your CD is mounted at /mnt/cdrom:
$ find /mnt/cdrom -name \*kernel-\*
Install the RPM using:
$ rpm -iv <pathname>/kernel-source-<version>.<arch>.rpm
The v switch will tell you if it fails or not.
If your system is not RPM-based, please let us know how to install
the kernel source from your distribution CD.
There are various other ways to get the kernel source, involving
CVS or rsync. If you would like to write instructions for one of
these other methods of getting the kernel source, go ahead and
we'll include them here.
Why do I recommend BitKeeper over ftp, and ftp over vendor source?
BitKeeper handles creating patches for you. (A patch contains the
differences between one source tree and another source tree.)
BitKeeper also applies the latest changes for you. When I want to
update my tree, I just type:
$ bk pull
And most of the time, it just works. The only time I have to do work
is if I have written code that conflicts with the new code downloaded
from the parent tree.
When I want to make a patch to send to somebody, I just type:
$ bk citool
$ bk -hr<latest revision number> | bk gnupatch > newpatch
When I want to undo my latest changes, I type:
$ bk undo -r<latest revision number>
BitKeeper has all kinds of pretty GUI tools to make debugging and
merging code easier.
I like BitKeeper so much I wrote a paper about it. You can find
the paper and some slides on my web page:
http://www.nmt.edu/~val
I prefer the vanilla kernel source from ftp.kernel.org over the vendor
source because you never know what changes the vendor has made to the
source. Most of the time, the vendor has improved the tree, but often
they make changes of dubious value to a kernel hacker. For example,
RedHat 6.2 shipped a kernel that compiled differently depending on
whether you were running an SMP kernel at the time of compilation.
This makes sense if you are just recompiling a kernel for that
machine, but it was useless if you were trying to compile a kernel for
a different machine.
The other reason to use vanilla source instead of vendor source is if
you want to create and send patches to other kernel developers. If
you create a patch and send it to the Linux kernel mailing list for
inclusion in the main kernel tree, it had better be against the latest
vanilla source tree. If you create a patch on a vendor source tree,
it's unlikely to apply to a vanilla source tree.
The one place where vendor source is crucial is for non-x86
architectures. The vanilla source almost never builds and boots on an
architecture other than x86. Often, the best place to get a working
kernel for a non-x86 is the vendor source. Each architecture usually
has some quirky way of getting the latest source in addition to the
vendor-supplied source.
|