Linux Kernel

From Blue-IT.org Wiki

Revision as of 13:32, 23 December 2007 by Apos (talk | contribs) (Compile the module)

Ubuntu

Links

Get the kernel

apt-get install linux-source

Alternatively you can get your own kernel from kernel org

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.YOUR-KERNEL-VERSION.tar.bz2
tar xjvf linux-2.6.YOUR-KERNEL-VERSION.tar.bz2
ln -s linux-linux-source-2.6.22 linux

Install additional packages

apt-get update
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 
# apt-get install libncurses5 cpp make build-essential

apply patches

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc4.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1

Configure the kernel

cd /usr/src/linux
cp /boot/config-`uname -r` .config
make menuconfig

Build the custom kernel, headers and modules

Now we are ready to compile the kernel_image and kernel_headers:

make-kpkg clean
fakeroot make-kpkg --initrd \
--append-to-version=-nfs3-with-acl-support \
kernel_image kernel_headers [modules_image]**
    • If you downloaded source files for modules (e.g. nvidia, lirc etc.) which are located in /usr/src/modules, then you should add modules_image to the line above.

Install the custom kernel

cd /usr/src
dpkg -i linux-image-2.6*.deb
dpkg -i linux-headers-2.6*.deb

Check grub & reboot

vim /boot/grub/menu.lst

Build custom modules afterwards

Download the source packages, e.g.

apt-get install nvidia-legacy-kernel-source

Go to /usr/src and unpack it.

tar xzvf nvidia-legacy-kernel-source.tar.gz

Go tho the kernel directory and build the module image. Be aware that you use the same "append-to-version" information like for the custom kernel you compiled before. E.g.

cd /usr/src/linux
fakeroot make-kpkg --append_to_version=-nfs3-with-acl-support modules_image

You can also easily do

# this will configure/check the build system
m-a prepare 
# this will install your driver
m-a a-i your_driver

Module assistant

A very good tool for managing source installations is the module-assistant - a relict from the debian roots of ubuntu.

apt-get install module-assistant

Recompile a single Kernel module

This part assumes correct installed kernel-sources!

Edit Makefile

Copy the config

cp /boot/config-`uname -r` /usr/src/linux/.config

Edit the toplevel kernel Makefile and edit the correct version of your current kernel (uname -r):

vim /usr/src/linux/Makefile
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 24
EXTRAVERSION = -2-generic


Prepare the kernel configuration

Edit the config file and change what you need to change with menuconfig

make menuconfig

Prepare the kernel

make prepare
make scripts

Compile the module

Now you only need to know, where your module(s) are. The pattern is always the same:

make modules M=directory/to_modules

That's all ;)

The modules option is important. It triggers the creation of the right Module.symvers file. In some howto's you'll miss this resulting in a not usable kernel module!

If you for example want to recompile the nfs-server module, just do

make modules M=fs/nfsd

And copy it to the right directory.

Here's a script if you like to compile more than one module

#!/bin/sh
#
for MYMODDIR in "fs/nfs" "fs/nfs_common" "fs/nfs" "fs/exportfs" "fs/lockd" "net/sunrpc"
do
  make modules M="$MYMODDIR"
done

# Do here what ever needed ...
MOD_PATH=/lib/modules/`uname -r`/kernel

cp fs/nfs/*.ko "$MOD_PATH"/fs/nfs/.
cp fs/nfs_common/*.ko "$MOD_PATH"/fs/nfs/.
cp fs/nfsd/*.ko "$MOD_PATH"/fs/nfsd/.
cp fs/exportfs/*.ko "$MOD_PATH"/fs/exportfs/.
cp fs/lockd/*.ko "$MOD_PATH"/fs/lockd/.
cp net/sunrpc/*.ko "$MOD_PATH"/net/sunrpc/.