Linux From Scratch: Version 5.0-pre1
Prev | Chapter 6. Installing basic system software | Next

# Installing Linux-2.4.22 headers

    Estimated build time:           0.1 SBU
    Estimated required disk space:  142 MB

## Contents of Linux

(Last checked against version 2.4.18.)

The Linux kernel is at the core of every Linux system. It's what makes Linux tick. When a computer is turned on and boots a Linux system, the very first piece of Linux software that gets loaded is the kernel. The kernel initializes the system's hardware components: serial ports, parallel ports, sound cards, network cards, IDE controllers, SCSI controllers and a lot more. In a nutshell the kernel makes the hardware available so that the software can run.

Linux installs the following files:

### Program Files

kernel and kernel headers

##

## Linux Installation Dependencies

(Last checked against version 2.4.17.)

Bash: sh
Binutils: ar, as, ld, nm, objcopy
Coreutils: basename, cat, cp, date, expr, ln, md5sum, mkdir, mv,
pwd, rm, sort, stty, tail, touch, uname, whoami, yes
Findutils: find, xargs
Gawk: awk
GCC: cc1, collect2, cpp0, gcc
Grep: grep
Gzip: gzip
Make: make
Modutils: depmod, genksyms
Net-tools: dnsdomainname, hostname
Sed: sed

##

## Installation of the kernel headers

We won't be compiling a new kernel yet -- we'll do that when we have finished the installation of all the packages. But as some packages need the kernel header files, we're going to unpack the kernel archive now, set it up and copy the header files so they can be found by these packages.

It is important to note that the files in the kernel source directory are not owned by root. Whenever you unpack a package as user root (like we do here inside chroot), the files end up having the user and group IDs of whatever they were on the packager's computer. This is usually not a problem for any other package you install because you remove the source tree after the installation. But the Linux kernel source tree is often kept around for a long time, so there's a chance that whatever user ID the packager used will be assigned to somebody on your machine and then that person would have write access to the kernel source.

In light of this, you might want to run `chown -R 0:0` on the `linux-2.4.22` directory to ensure all files are owned by user root.

Prepare for header installation:

    make mrproper

This ensures that the kernel tree is absolutely clean. The kernel team recommends that this command be issued prior to each kernel compilation. You shouldn't rely on the source tree being clean after untarring.

Create the `include/linux/version.h` file:

    make include/linux/version.h

Create the platform-specific `include/asm` symlink:

    make symlinks

Install the platform specific-header files:

    cp -HR include/asm /usr/include
    cp -R include/asm-generic /usr/include

Install the cross-platform kernel header files:

    cp -R include/linux /usr/include

There are a few kernel header files which make use of the `autoconf.h` header file. Since we do not yet configure the kernel, we need to create this file ourselves in order to avoid compilation failures. Create an empty `autoconf.h` file:

    touch /usr/include/linux/autoconf.h

##

## Why we copy the kernel headers and don't symlink them

In the past it was common practice to symlink the `/usr/include/{linux,asm}` directories to `/usr/src/linux/include/{linux,asm}`. This was a bad practice, as the following extract from a post by Linus Torvalds to the Linux Kernel Mailing List points out:

    I would suggest that people who compile new kernels should:

     - not have a single symbolic link in sight (except the one that the
       kernel build itself sets up, namely the "linux/include/asm" symlink
       that is only used for the internal kernel compile itself)

    And yes, this is what I do. My /usr/src/linux still has the old 2.2.13
    header files, even though I haven't run a 2.2.13 kernel in a _loong_
    time. But those headers were what glibc was compiled against, so those
    headers are what matches the library object files.

    And this is actually what has been the suggested environment for at
    least the last five years. I don't know why the symlink business keeps
    on living on, like a bad zombie. Pretty much every distribution still
    has that broken symlink, and people still remember that the linux
    sources should go into "/usr/src/linux" even though that hasn't been
    true in a _loong_ time.

The essential part is where Linus states that the header files should be the ones which glibc was compiled against. These are the headers that should be used when you later compile other packages, as they are the ones that match the object-code library files. By copying the headers, we ensure that they remain available if later you upgrade your kernel.

Note, by the way, that it is perfectly all right to have the kernel sources in `/usr/src/linux`, as long as you don't have the `/usr/include/{linux,asm}` symlinks.

Prev | Home | Next
Creating devices (Makedev-1.7) | Up | Installing Man-pages-1.60