The Linux Kernel HOWTO: Quick Steps - Kernel Compile
Next
Previous
Contents
This section is written by
Al Dev (alavoor@yahoo.com)
The latest version of this section is at
http://www.aldev.8m.com and click on
"Quick Steps to recompile linux kernel". Mirror sites are at -
http://aldev0.webjump.com,
angelfire,
geocities,
virtualave,
50megs,
theglobe,
NBCi,
Terrashare,
Fortunecity,
Freewebsites,
Tripod,
Spree,
Escalix,
Httpcity,
Freeservers.
These sites have lots of linux goodies and tips.
Kernel re-compile is required in order to make the kernel very lean
and which will result in FASTER operating system . It is also
required to support any new devices.
Note: Below 'bash#' denotes the bash prompt, you should type
the commands that appear after the 'bash#' prompt. Below are commands
tested on Redhat Linux, but it should work for other distributions with
very minor changes.
- Note: You can have many kernel images on your system. By following the steps below
you do not overwrite or damage your existing kernel. These steps are very safe
and your current kernel will be intact and will not be touched.
- Login in as 'root' throughout all these steps. Mount Redhat linux cdrom and install the linux kernel source rpm
bash$ su - root
bash# cd /mnt/cdrom/RedHat/RPMS
bash# rpm -i kernel-headers*.rpm
bash# rpm -i kernel-source*.rpm
bash# rpm -i dev86*.rpm
bash# rpm -i bin86*.rpm
(The bin86*.rpm and 'as86' is required only for OLDER Linux systems like redhat 5.x.
Get Intel assembler 'as86' command from
dev86*.rpm on cdrom or from
bin86-mandrake
,
bin86-kondara
).
-
The "make xconfig" or "make menuconfig" brings up a user friendly GUI interface.
You can load the
configuration file from /usr/src/linux/.config (dot config file. Note the dot
before config).
- Within 'make xconfig' you must do these to avoid problems -
- Save and Exit "make xconfig".
All the options which you selected is now saved into configuration file
at /usr/src/linux/.config (dot config file).
And now, do -
bash# make dep
bash# make clean
- Read the following file (to gain some knowledge about kernel building. Tip: Use
the color editor
gvim
for better readability.
bash# gvim -R /usr/src/linux/arch/i386/config.in
bash# man less
bash# less /usr/src/linux/arch/i386/config.in
Type 'h' for help and to navigate press i, j, k, l, h or arrow, page up/down keys.
- Now, give the make command -
bash# cd /usr/src/linux
bash# man nohup
bash# nohup make bzImage &
bash# tail -f nohup.out (.... to monitor the progress)
This will put the kernel in /usr/src/linux/arch/i386/boot/bzImage
bash# man tail
- After bzImage is successful, copy the kernel image to /boot directory.
You must copy the new kernel image to /boot directory, otherwise the
new kernel MAY NOT boot.
And then read the manual page on lilo
(see also
http://www.linuxdoc.org/HOWTO/LILO-crash-rescue-HOWTO.html)
and see the
sample lilo.conf file.
Always give a date extension to the filename, because it tells you when you built the
kernel, as shown below:
bash# cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage.myker.26mar2001
bash# man lilo
bash# man lilo.conf
And edit /etc/lilo.conf file and put these lines -
image=/boot/bzImage.myker.26mar2001
label=myker
root=/dev/hda1
read-only
You can check device name for 'root=' with the command -
bash# df /
- Now give
bash# lilo
bash# lilo -q
You must re-run lilo even if entry 'myker' exists, everytime you create a new bzImage.
- Reboot the machine and at lilo press tab key and
type 'myker' If it boots then you did a good job! Otherwise at lilo
select your old kernel, boot and re-try all over again. Your old kernel
is still INTACT and SAFE at say /boot/vmlinuz-2.0.34-0.6
- If your new kernel 'myker' boots and works properly, you can create the
boot disk. Insert a blank floppy into floppy drive and -
bash# cd /usr/src/linux
bash# make bzdisk
See also mkbootdisk -
bash# rpm -i mkbootdisk*.rpm
bash# man mkbootdisk
- LOADABLE MODULES:
This step is required ONLY if you had enabled Loadable module support in
step 3 above.
Loadable module are located in /lib/modules. You MUST do this step if you enabled or
disabled any modules, otherwise you will get 'unresolved symbols' errors during
or after kernel boot.
Check for insmod command which is extensively used for loading the modules.
bash# cd /usr/src/linux
bash# make modules
bash# make modules_install
bash# man insmod
bash# insmod
This will copy the modules to /lib/modules directory.
No init found
The following mistake is commited very frequently by new users.
If your new kernel does not boot and you get -
Warning: unable to open an initial console
Kernel panic: no init found. Try passing init= option to kernel
The problem is that you
did not set the "root=" parameter properly
in the /etc/lilo.conf. In my case, I used root=/dev/hda1 which is
having the root partition "/". You must properly point the root device in your
lilo.conf, it can be like /dev/hdb2 or /dev/hda7.
The kernel looks for the init command which is located in /sbin/init.
And /sbin directory lives on the root partition.
For details see -
bash# man init
Kernel does not load module - Unresolved symbol error messages
When you boot kernel and system tries to load any modules and
you get "Unresolved symbol : __some_function_name" then it means
that you did not clean compile the modules and kernel. It is mandatory that
you should do make clean and make the modules. Do this -
bash# cd /usr/src/linux
bash# make dep
bash# make clean
bash# nohup make bzImage &
bash# tail -f nohup.out (.... to monitor the progress)
bash# make modules
bash# make modules_install
Kernel fails to load a module
If the kernel fails to load a module (say loadable module for network card
or other devices), then you may want to try to build the driver for device
right into the kernel. Sometimes loadable module will NOT
work and the driver
needs to be built right inside the kernel. For example - some network cards do not
support loadable module feature - you MUST build the driver of the network card
right into linux kernel. Hence, in 'make xconfig' you MUST not select loadable
module for this device.
Loadable modules
You can install default loadable modules with -
The step given below may not be required but is needed ONLY FOR EMERGENCIES where
your /lib/modules files are damaged. If you already have
the /lib/modules directory and in case you
want replace them use the --force to replace the package and
select appropriate cpu architecture.
For new versions of linux redhat linux 6.0 and later, the kernel modules are
included with kernel-2.2*.rpm. Install the loadable modules and the kernel with
This will list the already installed package.
bash# rpm -qa | grep -i kernel
bash# rpm -U --force /mnt/cdrom/Redhat/RPMS/kernel-2.2.14-5.0.i686.rpm
(or)
bash# rpm -U --force /mnt/cdrom/Redhat/RPMS/kernel-2.2.14-5.0.i586.rpm
(or)
bash# rpm -U --force /mnt/cdrom/Redhat/RPMS/kernel-2.2.14-5.0.i386.rpm
This is only for old versions of redhat linux 5.2 and before.
Boot new kernel and install the loadable
modules from RedHat Linux "contrib" cdrom
bash# rpm -i /mnt/cdrom/contrib/kernel-modules*.rpm
....(For old linux systems which do not have insmod pre-installed)
After successfully building and booting the Linux kernel, you may be required
to do these additional steps to make some of the devices to work with Linux.
(The steps below were tested on Redhat Linux but should work with other distributions
as well.)
Video card/Monitor configuration:
- Please see the video card manual which is usually shipped with the PC.
You should look for a "Technical Specifications" page.
- Please see the monitor's manual and look for a "Technical Specifications" page.
You can configure the Video card and monitor by using these commands:
bash$ su - root
bash# man Xconfigurator
bash# /usr/bin/X11/Xconfigurator --help
bash# /usr/bin/X11/Xconfigurator
bash# /usr/bin/X11/Xconfigurator --expert
If your card is not detected automatically, then you can use the --expert option
and select the "Unlisted card". If your monitor is not listed then select the generic
monitor type SVGA 1024x768.
Sound card configuration:
- Connect your external speakers to the sound card's audio port.
- Connect your CDROM audio wire to sound card's audio 4-pin socket. (Otherwise
your cdrom drive will not play the music from your music cd)
- Refer to HOWTO docs on 'Sound' at
http://www.linuxdoc.org
bash$ su - root
bash# man sndconfig
bash# /usr/sbin/sndconfig
Then start X-window 'KDE desktop' with 'startx' command.
Click on 'K Start->ControlCenter->SoundServer->General->Test Sound'. This should
play the test sound. Then click on 'K Start->MultiMedia->SoundMixer->SoundVolumeSlider'
and adjust the sound volume.
Network card configuration:
Configure Firewall and IP Masquerading :
For Linux kernel version 2.4 and above, the firewall and IP Masquerading is
implemented by NetFilter package. Hence in kernel config you should enable
Netfilter and run the Firewall/IPMasq script. Download the scripts from
Firewall-IPMasq scripts
, main page of Netfilter is at
http://netfilter.samba.org.
Related materials at
firewalling-matures
and
Netfilter-FAQ.
For kernel version below 2.4 you should install the firewall rpms from
rpmfind.net
or
firewall.src.rpm.
Configuration of other devices:
Refer to HOWTO docs relating to your devices at
http://www.linuxdoc.org
Given below is a sample /etc/lilo.conf file. You should follow the
naming conventions like ker2217 (for kernel 2.2.17), ker2214 (for kernel 2.2.14).
You can have many kernel images on the same /boot system.
On my machine I have something like:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
default=firewall
image=/boot/vmlinuz-2.2.14-5.0
label=ker2214
read-only
root=/dev/hda9
image=/boot/vmlinuz-2.2.17-14
label=ker2217
read-only
root=/dev/hda9
#image=/usr/src/linux/arch/i386/boot/bzImage
# label=myker
# root=/dev/hda7
# read-only
image=/boot/bzImage.myker.11feb2001
label=myker11feb
root=/dev/hda9
read-only
image=/boot/bzImage.myker.01jan2001
label=myker01jan
root=/dev/hda9
read-only
image=/boot/bzImage.myker-firewall.16mar2001
label=firewall
root=/dev/hda9
read-only
Next
Previous
Contents