1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
|
<!--startcut ==========================================================-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title>Mastering Kernel Modules with Caldera LG#29</title>
</head>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#A000A0"
ALINK="#FF0000">
<!--endcut ============================================================-->
<H4>
"Linux Gazette...<I>making Linux just a little more fun!</I>"
</H4>
<P> <HR> <P>
<!--===================================================================-->
<center>
<h1><font color="maroon">Mastering Kernel Modules with Caldera</font></h1>
<H4>By <a href="mailto:nelson@er.doe.gov">David Nelson</a></H4>
</center>
<P> <HR> <P>
You shouldn't have to read this article. The concept of Linux kernel
modules is fairly simple. Unfortunately, information needed to compile,
install and use modules is scattered over several HOWTOs, READMEs,
and man pages. Plus, the files which need to be modified are in several
obscure directories.
<p>
I finally wrote this cookbook approach to get myself, and you, started.
Once you are up and running with modules, you can dig into the details
later. I tested this material on an X86 processor running Caldera Open
Linux 1.1, which is close to Red Hat 4.2. You mileage with other
processors and distributions may vary.
<p>
Why use modules? Modules let you compile a small, fast kernel, then
install and remove device drivers on demand. Without modules the Linux
kernel could bloat to resemble a certain commercial OS.
<p>
First, I recommend that you compile a base kernel
that includes all essential capabilities for your system without
modules. I know this sounds like we are going backwards, but you don't
want to lose the ability to boot up because you messed up your modules.
The README in usr/src/linux is your guide, but basically you execute
the command:
<pre>
make mrproper; make xconfig
</pre>
(or <tt>menuconfig</tt> or <tt>config</tt>) to include
all needed capabilities, then run:
<pre>
make dep; make clean; make zImage
</pre>
Save your kernel configuration to a file named kernelconf.base, in case you need to
recompile. The xconfig menu prompts you to save and load configuration
files. If you use menuconfig or config, the current configuration is in
the file /usr/src/linux/.config; copy that file to kernelconf.base. If you
configured too big a kernel, final compilation will fail. If this
happens, execute <tt>make bzImage</tt> instead of zImage.
Your compiled
kernel will be in the directory /usr/src/linux/arch/i386/boot.
<p>
You might have made a mistake in compiling your base kernel, so don't
throw away your old one. If you are running LILO, rename your new
kernel to zImage.base and copy it to the location of your current kernel,
usually / or /boot. Add a section to /etc/lilo.conf that lets you
select either your default or base kernel on boot up. My lilo.conf
is shown here minus some comment lines:
<pre>
# general section
boot = /dev/hda3
install = /boot/boot.b
message = /boot/message
prompt
timeout = 50
# default entry
image = /bzImage
label = linux
root = /dev/hda3
read-only
# base kernel
image = /zImage.base
label = base
root = /dev/hda3
read-only
</pre>
The important addition to lilo.conf is the last section
(<tt>#base kernel</tt>) which tells LILO about your new kernel.
Also, be sure lilo.conf
has <tt>prompt</tt> and <tt>timeout</tt> lines. Now execute
<tt>lilo</tt> and then reboot.
LILO will pause giving the prompt <tt>boot:</tt>. If you hit TAB, you will be
given the choices <tt>linux</tt> and <tt>base</tt>. Enter
<tt>base</tt>, and your new kernel will
boot. You may get complaining messages about bad module dependencies,
but if your base kernel is complete that shouldn't bother you. If
something goes wrong, reboot and enter <tt>linux</tt> (or just wait the
timeout interval) and your old kernel will boot. Make sure you have a
working base kernel before proceeding. With this approach you
never burn your bridges (or kernel) behind you.
<p>
If you don't use LILO, make a boot floppy for your base kernel. To do
this, insert a floppy and execute <tt>make zdisk</tt>, instead of zImage.
<p>
You are now ready to compile a kernel with modules tailored to your
system. Execute the same commands as above, but when you execute xconfig or
menuconfig pick some features to compile as modules. I suggest
you experiment first by picking nice-to-have, but not-necessary,
modules to add to zImage.base. Good choices might be printer support or
floppy support (unless you are booting from the floppy). Save your
configuration as kernelconf.mod in case you need to go back. Also,
write down which modules you are compiling. To know exactly which
modules are compiled, I suggest you move or delete your old modules (if
any). The Caldera release includes a lot of modules. They are in
/lib/modules/2.0.29. I moved my old ones into subdirectories rather
than deleting them in case I needed to back up. If you are working
with a different release of the kernel, instead of subdirectory 2.0.29
you will have a subdirectory corresponding to your release number.
<p>
After executing <tt>make zImage</tt>, run:
<pre>
make modules; make modules_install
</pre>
As before, move (using <b>cd</b>) to the directory containing zImage,
rename it zImage.mod and
move it to the directory where LILO will look for it. Put a new section at
the bottom of lilo.conf to let you boot this kernel with the label
<tt>modules</tt>. If you don't use LILO, make another zDisk.
<p>
Now, execute
<tt>depmod -aq</tt>. This creates /lib/modules/2.0.29/modules.dep, needed by
module utilities. Next, execute the following:
<pre>
modprobe -c | grep -v '^path' > /etc/conf.modules
</pre>
This command sets up another file needed by the module utilities.
<p>
Now reboot, choosing label <tt>modules</tt> at the boot prompt.
Next, move to the
/etc/modules/2.0.29 directory. It should contain a file with a very long name
like the following:
<pre>
#1 Tue Feb 11 20:36:48 MET 1997.default
</pre>
This file is read at boot time by /etc/rc.d/rc.modules. It contains a
list of the default modules loaded when the kernel boots. You
need to change both the name and the contents. Fixing the name is the hard
part. In directory /etc/modules/2.0.29 execute the commands:
<pre>
FILE=i`uname -v`.default
cp "#1 Tue"* "$FILE"
</pre>
This magic creates a file with the name that rc.modules will look for
on bootup. The name is based on the time when the kernel was compiled.
If you recompile the kernel, you must repeat the magic.
<p>
Edit this file to contain just the modules you want loaded at bootup.
For example, it might contain the lines
<pre>
floppy
lp
</pre>
which would load the floppy and printer modules, assuming you compiled
them as modules. To get your editor to accept this file, you may need to put
quotes around the name.
<p>
To load a module manually, execute
<tt>insmod 'modname'</tt>. To remove it execute
<tt>rmmod 'modname'</tt>. To tell which
modules are currently loaded, execute <tt>lsmod</tt>.
<p>
The best toy is <b>kerneld</b>; it automatically loads and unloads modules as
needed. Assume you have compiled the floppy driver as a module. Check
whether it is loaded by executing lsmod. If it is, remove it by
executing <tt>rmmod floppy</tt>. Then execute
<tt>kerneld</tt>.
Now execute <tt>mount /mnt/floppy</tt>
(or whatever mounts your floppy). Magically, kerneld
installs the floppy module when needed. It will also uninstall modules
which haven't been used for a while, keeping your kernel lean and mean.
<p>
You now know enough to experiment with modules without crashing your
kernel on bootup. Read the Module mini-HOWTO, the kerneld mini-HOWTO, and
the man pages for the utilities to become a real expert. Happy
moduling!
<p><HR> <P>
<h3>Resources</h3>
<p><HR> <P>
<A HREF="http://www.linuxresources.com/LDP/HOWTO/mini/Modules.html">
Module mini-HOWTO</A>
<p>
<A HREF="http://www.linuxresources.com/LDP/HOWTO/mini/Kerneld.html">
kerneld mini-HOWTO</A>
<!--===================================================================-->
<P> <hr> <P>
<center><H5>Copyright © 1998, David Nelson <BR>
Published in Issue 29 of <i>Linux Gazette</i>, June 1998</H5></center>
<!--===================================================================-->
<P> <hr> <P>
<A HREF="./lg_toc29.html"><IMG ALIGN=BOTTOM SRC="../gx/indexnew.gif"
ALT="[ TABLE OF CONTENTS ]"></A>
<A HREF="../lg_frontpage.html"><IMG ALIGN=BOTTOM SRC="../gx/homenew.gif"
ALT="[ FRONT PAGE ]"></A>
<A HREF="./prelz.html"><IMG SRC="../gx/back2.gif"
ALT=" Back "></A>
<A HREF="./coldiron.html"><IMG SRC="../gx/fwd.gif" ALT=" Next "></A>
<P> <hr> <P>
<!--startcut ==========================================================-->
</BODY>
</HTML>
<!--endcut ============================================================-->
|