BBS水木清华站∶精华区
发信人: reden (鱼 ~ 君子律己以利人), 信区: Linux
标 题: Linux Kernel Installation
发信站: BBS 水木清华站 (Mon Oct 5 00:13:15 1998) WWW-POST
"Linux Gazette...making Linux just a little more fun!"
A Linux Journal Review: This article appeared in the November 1997 issue of
Linux Journal.
Linux Kernel Installation
By David A. Bandel
Linux is many users' introduction to a truly powerful, configurable operating
system. In the past, a Unix-like operating system was
out of reach for most. If it wasn't the operating system's 4-digit price tag,
it was the hardware. Even the now
free-for-personal-use SCO Unixware requires a system with SCSI drives, and
most of us are using IDE to keep costs down.
Along with the power that Linux brings comes the need to perform a task users
have not had to do on simpler operating systems:
configure the kernel to your hardware and operations.
Previous installation kernels from 1.2.x and before suggested that you
rebuild; however, with the new 2.0.x kernel, rebuilding has
almost become a necessity. The kernel that comes with the installation
packages from Red Hat, Caldera, Debian and most others,
is a generic, ``almost everything is included'' kernel. While rebuilding a
kernel may seem like a daunting task and living with the
installed kernel may not be too bad, rebuilding is a good introduction to
your system.
Why Roll Your Own?
The standard installation kernels are an attempt to make as many systems as
possible usable for the task of installing a workable
Linux system. As such, the kernel is bloated and has a lot of unnecessary
code in it for the average machine. It also does not have
some code a lot of users want.
Then, of course, there's always the need to upgrade the kernel because you've
bought new hardware, etc. Upgrading within a
series is usually very straightforward. When it comes to upgrading, say from
1.2.something to 2.0.something, now the task is
beyond the scope of this article and requires some savvy. Better to get a new
distribution CD and start fresh--this is also true for
upgrading to the experimental 2.1.x kernels.
Kernel Version Numbering
All Linux kernel version numbers contain three numbers separated by periods
(dots). The first number is the kernel version. We
are now on the third kernel version, 2. Some of you may be running a version
1 kernel, and I am aware of at least one running
version 0 kernel.
The second number is the kernel major number. Major numbers which are even
numbers (0 is considered an even number) are
said to be stable. That is, these kernels should not have any crippling bugs,
as they have been fairly heavily tested. While some
contain small bugs, they can usually be upgraded for hardware compatibility
or to armor the kernel against system crackers. For
example, kernel 2.0.30, shunned by some in favor of 2.0.29 because of
reported bugs, contains several patches including one to
protect against SYN denial of service attacks. The kernels with odd major
numbers are developmental kernels. These have not
been tested and often as not will break any software packages you may be
running. Occasionally, one works well enough that it
will be adopted by users needing the latest and greatest support before the
next stable release. This is the exception rather than
the rule, and it requires substantial changes to a system.
The last number is the minor number and is increased by one for each release.
If you see kernel version 2.0.8, you know it's a
kernel 2.0, stable kernel, and it is the ninth release (we begin counting
with 0).
Assumptions
I hate to make any assumptions; they always seem to come back to bite me. So
I need to mention a few things so that we're
working off the same sheet of music. In order to compile a kernel, you'll
need a few things. First, I'll assume you've installed a
distribution with a 2.0.x kernel, all the base packages and perhaps a few
more. You'll also need to have installed gcc version 2.7
and all the supporting gcc libraries. You'll also need the libc-dev library
and the binutils and bin86 packages (normally installed as
part of a standard distribution install). If you download the source or copy
it from a CD, you'll also need the tar and gunzip
packages. Also, you'll need lots of disk real estate. Plan on 7MB to
download, another 20MB to unpack this monster and a few
more to compile it.
Needless to say, many of the things we will discuss require you to be logged
in as root. If you've downloaded the kernel as a
non-privileged user and you have write permission to the /usr/src
subdirectory, you can still do much of this task without becoming
root. For the newcomers to Linux, I highly recommend you do as much as
possible as a non-privileged user and become root
(type: su - face) only for those jobs that require it. One day, you'll be
glad you acquired this habit. Remember, there are two
kinds of systems administrators, those who have totally wrecked a running
setup inadvertently while logged in as root, and those
who will.
Obtaining/Upgrading the Source
Kernel sources for Linux are available from a large number of ftp sites and
on almost every Linux distribution CD-ROM. For
starters, you can go to ftp.funet.fi, the primary site for the Linux kernel.
This site has a list of mirror sites from which you can
download the kernel. Choosing the site nearest you helps decrease overall
Internet traffic.
Once you've obtained the source, put it in the /usr/src directory. Create a
subdirectory to hold the source files once they are
unpacked using tar. I recommend naming the directories something like
linux-2.0.30 or kernel-2.0.30, substituting your version
numbers. Create a link to this subdirectory called linux using the following
command:
ln -sf linux-2.0.30 linux
I included the -f in the link command because if you already have a kernel
source in /usr/src, it will contain this link too, and we
want to force it to look in our subdirectory. (On some versions of ln
(notably version 3.13), the force option (-f) does not work.
You'll have to first remove the link then establish it again. This works
correctly by version 3.16.) The only time you may have a
problem is if linux is a subdirectory name, not a link. If you have this
problem, you'll have to rename the subdirectory before
continuing:
mv linux linux-2.0.8
Now issue the command:
tar xzvf linux-kernel-source.tar.gz
I have a habit of always including w (wait for confirmation) in the tar
option string, then when I see that the .tar.gz or .tgz file is
going to unpack into its own subdirectory, I ctrl-C out and reissue the
command without the w. This way I can prevent
corrupted archives from unpacking into the current directory.
Once you have the kernel unpacked, if you have any patches you wish to apply,
now is a good time. Let's say you don't wish to
run kernel 2.0.30, but you do want the tcp-syn-cookies. Copy the patch
(called tcp-syn-cookies-patch-1) into the /usr/src directory
and issue the command:
patch < tcp-syn-cookies-patch-1
This command applies the patch to the kernel. Look for files with an .rej
extension in in the /usr/src directory. These files didn't
patch properly. They may be unimportant, but peruse them anyway. If you
installed a Red Hat system with some but not all of the
kernel source (SPARC, PowerPC, etc.), you'll see some of these files. As long
as they're not for your architecture, you're okay.
Preparation
As a final note, before we change (cd) into the kernel source directory and
start building our new kernel, let's check some links
that are needed. In your /usr/include directory, make sure you have the
following soft links:
asm - /usr/src/linux/include/asm
linux - /usr/src/linux/include/linux
scsi - /usr/src/linux/include/scsi
Now, you see another reason to standardize the location of the kernel. If you
don't put the latest kernel you wish to install in
/usr/src/linux (via a link), the above links will not reach their intended
target (dangling links), and the kernel may fail to compile.
How to proceed
Once everything else is set up, change directories into /usr/src/linux.
Although you may want to stop off and peruse some of the
documentation in the Documentation directory, particularly if you have any
special hardware needs. Also, several of the CD-ROM
drivers need to be built with customized settings. While they usually work as
is, these drivers may give warning messages when
loaded. If this doesn't bother you and they work as they should, don't worry.
Otherwise, read the appropriate .txt, .h (header) files
and .c (c code) files. For the most part, I have found them to be well
commented and easy to configure. If you don't feel brave,
you don't have to do it. Just remember you can always restore the original
file by unpacking the gzipped tar file (or reinstalling the
.rpm files) again.
Beginning to Compile
The first command I recommend you issue is:
make mrproper
While this command is not necessary when the kernel source is in pristine
condition, it is a good habit to cultivate. This command
ensures that old object files are not littering the source tree and are not
used or in the way.
Configuring the Kernel
Now, you're ready to configure the kernel. Before starting, you'll need to
understand a little about modules. Think of a module as
something you can plug into the kernel for a special purpose. If you have a
small network at home and sometimes want to use it
(but not always), maybe you'll want to compile your Ethernet card as a
module. To use the module, the machine must be running
and have access to the /lib/modules This means that the drive (IDE, SCSI,
etc., but could be an ethernet card in the case of nfs),
the file system (normally ext2 but could be nfs) and the kernel type
(hopefully elf) must be compiled in and cannot be modules.
Modules aren't available until the kernel is loaded, the drive (or network)
accessed, and the file system mounted. These files must
be compiled into the kernel or it will not be able to mount the root
partition. If you're mounting the root partition over the network,
you'll need the network file system module, and your Ethernet card compiled.
Why use modules? Modules make the kernel smaller. This reduces the amount of
protected space never given up by the kernel.
Modules load and unload and that memory can be reallocated. If you use a
module more than about 90% of the time the machine
is up, compile it. Using a module in this case can be wasteful of memory,
because while the module takes up the same amount of
memory as if it were compiled, the kernel needs a little more code to have a
hook for the module. Remember, the kernel runs in
protected space, but the modules don't. That said, I don't often follow my
own advice. I compile in: ext2, IDE and elf support only.
While I use an Ethernet card almost all the time, I compile everything else
as modules: a.out, java, floppy, iso9660, msdos, minix,
vfat, smb, nfs, smc-ultra (Ethernet card), serial, printer, sound, ppp, etc.
Many of these only run for a few minutes at a time here
and there.
The next step is to configure the kernel. Here we have three choices--while
all do the same thing, I recommend using one of the
graphical methods. The old way was to simply type: make config. This begins a
long series of questions. However, if you
make a mistake, your only option is to press ctrl-C and begin again. You also
can't go back in the sequence, and some
questions depend on previous answers. If for some reason you absolutely can't
use either of the graphical methods, be my guest.
I recommend using either make menuconfig or make xconfig. In order to use
menuconfig, you must have installed the
ncurses-dev and the tk4-dev libraries. If you didn't install them and you
don't want to use the next method, I highly recommend
that you install them now. You can always uninstall them later.
To run make xconfig, you must install and configure X. Since X is such a
memory hog, I install, configure and startx only for
this portion of the process, going back to a console while the kernel
compiles so it can have all the memory it needs. The xconfig
menu is, in my opinion, the best and easiest way to configure the kernel.
Under menuconfig, if you disable an option, any
subordinate options are not shown. Under xconfig, if you disable an option,
subordinate options still show, they are just greyed out.
I like this because I can see what's been added since the last kernel. I may
want to enable an option to get one of the new
sub-options in order to to experiment with it.
I'm going to take some space here to describe the sections in the kernel
configuration and tell you some of the things I've
discovered--mostly the hard way.
The first section is the code-maturity-level option. The only question is
whether you want to use developmental drivers and code.
You may not have a choice if you have some bleeding edge hardware. If you
choose ``no'', the experimental code is greyed out or
not shown. If you use this kernel for commercial production purposes, you'll
probably want to choose ``no''.
The second section concerns modules. If you want modules, choose ``yes'' for
questions 1 and 3. If you want to use proprietary
modules that come with certain distributions, such as Caldera's OpenLinux for
their Netware support, also answer ``yes'' to the
second question since you won't be able to recompile the module.
The third section is general setup. Do compile the kernel as ELF and compile
support for ELF binaries. Not compiling the proper
support is a definite ``gotcha''. You'll get more efficient code compiling
the kernel for the machine's specific architecture (Pentium
or 486), but a 386 kernel will run in any 32-bit Intel compatible clone; a
Pentium kernel won't. An emergency boot disk for a large
number of computers (as well as distribution install disks) is best compiled
as a 386. However, a 386 will not run a kernel compiled
for a Pentium.
Next comes block devices--nothing special here. If your root device is on an
IDE drive, just make sure you compile it.
Then comes networking. For computers not connected to a network, you won't
need much here unless you plan to use one
computer to dial-out while others connect through it. In this case, you'll
need to read up on such things as masquerading and follow
the suggested guidelines.
SCSI support is next, though why it doesn't directly follow block devices I
don't know. If your root partition is on a SCSI device,
don't choose modules for SCSI support.
SCSI low-level drivers follow general SCSI support. Again, modules only for
devices that don't contain the root partition.
The next section takes us back to networking again. Expect to do a lot of
looking for your particular card here as well as some
other support such as ppp, slip, etc. If you use nfs to mount your root
device, compile in Ethernet support.
For those lucky enough to be needing ISDN support, the ISDN subsection will
need to be completed.
Older CD-ROMs may require support from the next section. If you're using a
SCSI or IDE CD-ROM, you can skip this one.
Next comes file systems. Again, compile what you need, in most cases ext2 and
use modules for the rest.
Character devices are chosen next. Non-serial mice, like the PS/2 mouse are
supported. Look on the bottom of your mouse. Many
two-button mice are PS/2 type, even though they look and connect like serial
mice. You'll almost certainly want serial support
(generic) as a minimum. Generic printer support is also listed here.
The penultimate section is often the most troubling: sound. Choose carefully
from the list and read the available help. Make sure
you've chosen the correct I/O base and IRQs for your card. The MPU I/O base
for a SoundBlaster card is listed as 0. This is
normally 330 and your sound module will complain if this value is incorrect.
Don't worry. One of the nice things about modules is
you can recompile and reinstall the modules as long as the kernel was
compiled with the hook. (Aren't modules great?).
The final section contains one question that should probably be answered as
``no, kernel hacking''.
Save your configuration and exit.
I have, on several occasions, had trouble editing the numbers in menuconfig
or xconfig to values I knew were correct. For
whatever reason, I couldn't change the number or config wouldn't accept the
number, telling me it was invalid. For example,
changing the SoundBlaster IRQ from the config default of 7 to 5, and the MPU
base I/O from 0 to 300. If you experience this
problem, but everything else went well, don't despair. The file you just
wrote when you did a ``Save'' and ``Exit'' is an editable text
file. You may use your text editor of choice: Emacs, vi, CrispLite, joe, etc.
Your configuration file is in the /usr/src/linux directory
and is called .config. The leading dot causes the file to be hidden during a
normal directory listing (ls), but it shows up when
the -a option is specified. Just edit the numbers in this file that you had
trouble with in the configuration process. Next, type
make dep to propagate your configurations from the .config file to the proper
subdirectories and to complete the setup. Finally,
type make clean to prepare for the final kernel build.
Building the Kernel
We're now ready to begin building the kernel. There are several options for
accomplishing this task:
make zImage: makes the basic, compressed kernel and leaves it in the
/usr/src/linux/arch/i386/boot directory as zImage.
make zlilo: Copies the zImage to the root directory (unless you edited
the top-level Makefile) and runs LILO. If you
choose to use this option, you'll have to ensure that /etc/lilo.conf is
preconfigured.
make zdisk: Writes zImage to a floppy disk in /dev/fd0 (the first floppy
drive--the a: drive in DOS). You'll need the disk
in the drive before you start. You can accomplish the same thing by
running make zImage and copying the image to a
floppy disk cp /usr/src/linux/arch/i386/boot/zImage /dev/fd0 Note that
you'll need to use a
high-density disk. The low density 720k disks will reportedly not boot
the kernel.
make boot: Works just the same as the zImage option.
make bzImage: Used for big kernels and operates the same as zImage. You
will know if you need this option, because
make will fail with a message that the image is too big.
make bzdisk: Used for big kernels and operates the same as zdisk. You
will know if you need this option, because
make will fail with a message that the image is too big.
Other make options are available, but are specialized, and are not covered
here. Also, if you need specialized support, such as for
a RAM disk or SMP, read the appropriate documentation and edit the Makefile
in /usr/src/linux (also called the top-level Makefile)
accordingly. Since all the options I discussed above are basically the same
as the zImage option, the rest of this article deals with
make zImage--it is the easiest way to build the kernel.
For those of you who wish to speed up the process and won't be doing other
things (such as configuring other applications), I
suggest you look at the man page for make and try out the -j option (perhaps
with a limit like 5) and also the -l option.
If you chose modules during the configuration process, you'll want to issue
the commands:
make modules
make modules_install
to put the modules in their default location of /lib/modules/2.0.x/, x being
the kernel minor number. If you already have this
subdirectory and it has subdirectories such as block, net, scsi, cdrom, etc.,
you may want to remove 2.0.x and everything below it
unless you have some proprietary modules installed, in which case don't
remove it. When the modules are installed, the
subdirectories are created and populated.
You could just as easily have combined the last three commands:
make zImage; make modules; make modules_install
then returned after all the disk churning finished. The ; (semicolon)
character separates sequential commands on one line and
performs each command in order so that you don't have to wait around just to
issue the next command.
Once your kernel is built and your modules installed, we have a few more
items to take care of. First, copy your kernel to the root
(or /boot/ or /etc/, if you wish):
cp /usr/src/linux/arch/i386/boot/zImage /zImage
You should also copy the /usr/src/linux/System.map file to the same directory
as the kernel image. Then change (cd) to the /etc
directory to configure LILO. This is a very important step. If we don't
install a pointer to the new kernel, it won't boot. Normally,
an install kernel is called vmlinuz. Old-time Unix users will recognize the
construction of this name. The trailing ``z'' means the
image is compressed. The ``v'' and ``m'' also have significance and mean
``virtual'' and ``sticky'' respectively and pertain to
memory and disk management. I suggest you leave the vmlinuz kernel in place,
since you know it works.
Edit the /etc/lilo.conf file to add your new kernel. Use the lines from the
image=/vmlinuz line to the next image= line or the
end. Duplicate what you see, then change the first line to image=/zImage
(assuming your kernel is in the root directory) and
choose a different name for the label=. The first image in the file is the
default, others will have to be specified on the
command line in order to boot them. Save the file and type:
lilo
You will now see the kernel labels, and the first one will have an asterisk.
If you don't see the label that you gave your new kernel
or LILO terminates with an error, you'll need to redo your work in
/etc/lilo.conf (see LILO man pages).
We're almost ready to reboot. At this point, if you know your system will
only require one reboot to run properly, you might want
to issue the command:
depmod -a 2.0.x
where x is the minor number of the kernel you just built. This command
creates the dependencies file some modules need. You'll
also want to make sure you don't boot directly into xdm. For Red Hat type
systems, this means ensuring the /etc/inittab file doesn't
have a default run level of 5, or that you remember to pass LILO the run
level at boot time. For Debian systems, you can just type:
mv /etc/init.d/xdm /etc/init.d/xdm.orig
for now and move it back later.
Normal Rebooting the New Kernel
Reboot your machine using:
shutdown -r now
While typing reboot or pressing the ctrl+alt+del key combination usually
works, I don't recommend either one. Under
some circumstances, the file systems won't be properly unmounted and could
corrupt open files. At the LILO prompt, if you need
to boot the old kernel or pass some parameters for bootup and you don't see
the boot: prompt, you can try pressing either the
shift or ctrl key, and the boot: prompt should appear. Once you have it,
press tab to see the available kernel labels. Type
the label and optionally enter any parameters for bootup. Normally, however,
the default kernel should boot automatically after the
timeout interval specified in the /etc/lilo.conf file. During bootup, you may
see a few error messages containing: SIOCADDR or
the like. These usually indicate that a module (normally a network module)
didn't load. We'll handle this shortly. If you got the
error, ``VFS, cannot mount root'', you didn't compile the proper disk or
file-system support into the kernel.
Troubleshooting
Due to the different ways in which each distribution handles daemon startup
from /etc/inittab, it is difficult in this article to cover all
the possible reasons your bootup may not have gone smoothly and the reasons
why. However, I can tell you where to start
looking.
First, run depmod -a to ensure you have an up-to-date, module dependency file
(it will be created in the appropriate
subdirectory). If you get a string of errors about unresolved dependencies,
old modules are present in the modules subdirectories,
and you didn't configure the kernel with ``Module Versions'' enabled. This is
not a fatal error. The modules you compiled and
installed are good. Check the /etc/conf.modules file and make sure that any
lines pointing to /lib/modules are complete:
/lib/modules/`uname -r`/xx
(Note: the grave quote on each side of uname -r is located above the Tab key
in the upper left corner of the keyboard on a
U.S. keyboard).
Make sure kerneld is running and that it is loaded early in the bootup
process. If it is, then the system doesn't need to explicitly
load modules, kerneld will handle it. Be careful about calling kerneld too
early in the first rc script. kerneld will stop the bootup
process forcing a hard reboot via the reset button or power switch, if it is
called before the system knows its host name. If this
happens to you, you can reboot passing LILO the -b argument which prevents
init from executing any rc scripts. Next, look in
/etc/rc.d/ at the rc, rc.sysinit and rc.modules files. One or more may point
to a directory such as /etc/modules/`uname -r`/`uname
-v` where a list of bootup modules are located. You can just copy the old
file over to the new directory;
mkdir /etc/modules/`uname -r` ;
cp /etc/modules/2.0.xx/g#1 Thu 3 Sep 1997.\
default /etc/modules/`uname -r`/\
`uname -v`.default""
Your system will almost certainly have a different date for the modules file.
Your system also may or may not use the default
extension. Pay close attention to the use of grave quotes and double quotes
in the above example, since both are needed in the
proper places. Once you have found the keys to your system, you should be
able to reboot into a properly functioning system. If
you experience further problems, the best place to get quick, expert advice
is on a mailing list dedicated to your particular
distribution. Those successfully running a particular distribution usually
delight in assisting novices with problems they may
encounter. Why? Because they hit the same brick walls when they were novices
and received help with many problems. Lurk a
few days on a list, and if your question isn't asked by someone else, ask it
yourself. Check the mail-list archives first, if any are
present. These archives contain answers to frequently asked questions (FAQ).
Conclusion
While building a kernel tailored to your system may seem a daunting challenge
for new administrators, the time spent is worth it.
Your system will run more efficiently, and more importantly, you will have
the satisfaction of building it yourself.
The few areas where you may encounter trouble are in remembering to rerun
LILO after installing the new kernel, but you didn't
overwrite your old one (or did you?), so you can always revert to one that
worked from the lilo: prompt. Distribution specific
problems during bootup may also be encountered during the first reboot but
are usually easily resolved. Help is normally only an
e-mail away for those distributions that don't come with technical support.
--
白马带著她一步步的回到中原。白马已经老了,只能慢慢的走,
但终是能回到中原的。江南有杨柳、桃花,有燕子、金鱼……
汉人中有的是英俊勇武的少年,倜傥潇洒的少年……但这个美
丽的姑娘就像古高昌国人那样固执:
「那都是很好很好的,可是我偏不喜欢。」
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.99.18.67]
BBS水木清华站∶精华区