The following section describes how to add and reconfigure hardware using kudzu. The section after that describes how to manage loadable modules when hardware isn't being detected and configured properly.
When you add or remove hardware from your computer and reboot Fedora, a window appears during the reboot process advising that hardware has either been added or removed and asking if you want to reconfigure it. The program that detects and reconfigures your hardware is called kudzu.
The kudzu program is a hardware autodetection and configuration tool that runs automatically at boot time. If you like, you can also start kudzu while Fedora is running. In either case, here is what kudzu does:
It checks the hardware connected to your computer.
It compares the hardware it finds to the database of hardware information stored in the /etc/sysconfig/hwconf file.
It prompts you to change your system configuration, based on new or removed hardware that was detected.
The following is a list of hardware that kudzu can detect (according to the kudzu README file), followed by a description of what kudzu does to configure the device. Other devices may be detected as well (such as USB devices).
Network devices — Adds an Ethernet interface alias (eth0, eth1, and so on) if necessary and either migrates the old device configuration or creates a new one.
SCSI — Adds an alias for scsi_hostadapter.
Sound card — Runs the sndconfig command to configure and test the sound card.
Mouse — Links the new mouse device to /dev/mouse and runs the mouseconfig command to configure and test the mouse.
Modem — Links the new modem device to /dev/modem.
CD-ROM — Links the CD-ROM device to /dev/cdrom.
Scanner — Links the new scanner device to /dev/scanner.
Keyboard — Runs the kbdconfig command to reconfigure the keyboard. Also, if you are using a serial console, it makes sure /etc/inittab and /etc/securetty are configured to be used by a serial console.
The following is a list of actions kudzu takes when a device is removed:
Network — Removes the alias for the Ethernet interface (eth0, eth1, and so on).
SCSI — Removes the alias for the SCSI host adapter (scsi_hostadapter).
Mouse — Removes the link to /dev/mouse.
Modem — Removes the link to /dev/modem.
CD-ROM — Removes the link to /dev/cdrom.
Scanner — Removes the link to /dev/scanner.
To run kudzu, either reboot (during the reboot, kudzu is run automatically) or switch to a virtual terminal (Ctrl+Alt+F2), log in as root, and run the kudzu command. For any hardware that has been added or removed since the last time kudzu was run, you are asked if you want to configure it, not configure it, or do nothing.
In a perfect world, after installing and booting Linux, all of your hardware should be detected and available for access. While Fedora and other Red Hat Linux systems are rapidly moving closer to that world, there are times when you must take special steps to get your computer hardware working.
Fedora systems come with tools for configuring the drivers that stand between the programs you run (such as CD players and Web browsers) and the hardware they use (such as CD-ROM drives and network cards). The intention is to have the drivers your system needs most often built into the kernel; these are called resident drivers. Other drivers that are added dynamically as needed are referred to as loadable modules.
If you have installed the Linux kernel source code that comes with Fedora (as described in Chapter 27), source code files for available drivers are stored in subdirectories of the /usr/src/redhat/BUILD/kernel-*/linux-2.6*/drivers directory. There are several ways of finding information about these drivers:
make menuconfig — With linux-2.6* as your current directory, type make menuconfig from a Terminal window on the desktop. Select the category of module you are interested in and select Help for the driver that interests you. The help information that appears tells you the module name and a description of the driver.
Documentation — The linux-2.6*/Documentation directory contains lots of plain-text files describing different aspects of the kernel and related drivers.
kernel-doc — The kernel-doc software package (available on the DVD that comes with this book) contains a large set of documents describing the kernel and drivers. These documents are stored in the /usr/share/doc/kernel-doc* directory.
After modules have been built, they are installed in the /lib/modules/2.6* directory. The name of the directory is based on the current release number of the kernel. Modules that are in that directory can then be loaded and unloaded as they are needed.
In previous releases, Fedora and other Red Hat Linux systems stored modules in the /lib/modules directory, rather than the /lib/modules/2.6* directory. This new structure allows you to store modules on your system that relate to different kernel versions you may be running.
To see which modules are currently loaded into the running kernel on your computer, you can use the lsmod command. Here’s an example:
# lsmod Module Size Used by snd_seq_oss 38912 0 snd_seq_midi_event 9344 1 snd_seq_oss snd_seq 67728 4 snd_seq_oss,snd_seq_midi_event snd_seq_device 8328 2 snd_seq_oss,snd_seq . . . autofs 16512 0 ne2k_pci 9056 0 8390 13568 1 ne2k_pci ohci1394 41860 0 ieee1394 284464 1 ohci1394 floppy 65712 0 sg 36120 0 scsi_mod 124600 1 sg parport_pc 39724 0 parport 47336 1 parport_pc ext3 128424 2 jbd 86040 1 ext3
This output shows a variety of modules that have been loaded on a Linux system. The modules loaded on this system include several to support the ALSA sound system, including some that provide OSS compatibility (snd_seq_oss).
To find information about any of the loaded modules, you can use the modinfo command. For example, you could type the following:
# modinfo snd-seq-oss filename: /lib/modules/2.6.8-1.541/kernel/sound/core/seq/oss/snd- seq-oss.ko author: Takashi Iwai <email@example.com> description: OSS-compatible sequencer module license: GPL alias: sound-service-?-1 alias: sound-service-?-8 parm: seq_oss_debug:debug option parm: maxqlen:maximum queue length vermagic: 2.6.8-1.541 686 REGPARM 4KSTACKS gcc-3.4 depends: snd,snd-seq,snd-seq-midi-event,snd-seq-device
This output tells you the location of the module (filename), the author, and description, among other information. The output describes snd-seq-oss as an OSS-compatible sequencer module. You can use the -d option to list just the description, the -a option to see the author of the module or -n to see the object file representing the module. The author information often has the e-mail address of the driver's creator, so you can contact the author if you have problems or questions about it.
You can load any module that has been compiled and installed (to the /lib/modules directory) into your running kernel using the modprobe command. The most common reasons for loading a module are that you want to use a feature temporarily (such as loading a module to support a special file system on a floppy you want to access) or to identify a module that will be used by a particular piece of hardware that could not be autodetected.
Here is an example of the modprobe command being used to load the parport module. The parport module provides the core functions to share parallel ports with multiple devices.
# modprobe parport
After parport is loaded you can load the parport_pc module to define the PC-style ports available through the interface. The parport_pc module lets you optionally define the addresses and IRQ numbers associated with each device sharing the parallel port. For example:
# modprobe parport_pc io=0x3bc irq=auto
In the previous example, a device is identified as having an address of 0x3bc. The IRQ for the device is autodetected.
The modprobe command loads modules temporarily. At the next system reboot, the modules you enter disappear. To permanently add the module to your system, add the modprobe command line to one of the start-up scripts that are run a boot time.
An alternative to using modprobe is the insmod command. The advantage of using modprobe, however, is that insmod will only load the module you request, while modprobe will try to load other modules that the one you requested is dependent on.
You can remove a module from a running kernel using the rmmod command. For example, to remove the module parport_pc from the current kernel, type the following:
# rmmod parport_pc
If the module is not currently busy, the parport_pc module is removed from the running kernel.