Linux 版 (精华区)
发信人: netiscpu (说不如做), 信区: Linux
标 题: [B] Red Hat Linux Unleashed (38)
发信站: 紫 丁 香 (Sat Jul 25 05:01:06 1998), 转信
Devices and Device Administration
_________________________________________________________________
o Character and Block Mode Devices
# Major and Minor Device Numbers
# The mknod Command
o Printer Administration
# The lpd Printing Daemon
# Following a Print Request
# The /etc/printcap File and Spooling Directories
# Adding Printer Devices with mknod
# Managing Printers with lpc
# Managing the Printer Queue with lpq and lprm
o Terminals
# Using Multiport Cards
# Adding Serial Port Terminals
# The Login Process
# What Are /sbin/getty and /etc/gettydefs?
# Terminal Files /etc/ttys and /etc/inittab
# Terminal Definitions The /etc/termcap File
# Adding a Terminal
# Using stty and tset
# Resetting a Screwy Terminal
o Adding a Modem
o Summary
_________________________________________________________________
38
Devices and Device Administration
This chapter is devoted to devices that might be attached to your
Linux system, such as terminals, modems, and printers. It shows you
how to add and manage the different devices, and it also looks at many
of the Linux commands you will need to properly administer your
system.
In this chapter, you will learn the following:
* What a device driver is
* The difference between block mode and character mode devices
* Major and minor device numbers
* The mknod command
* How to manage printers and the print spooler
* How to add a printer
* How to add a terminal and modem
* The configuration files used by terminals
* The startup sequence used to permit logins
All of this information is necessary if you are to have a smoothly
running system. Even if you don't intend to add terminals or modems,
you should know about the startup process and how the configuration
files are handled.
Character and Block Mode Devices
Everything attached to the computer you are using to run Linux is
treated as a device by the operating system. It doesn't matter whether
the device is a terminal, a hard disk, a printer, a CD-ROM drive, or a
modem. Everything that accepts or sends data to the operating system
is a device.
The concept of treating everything on the system as a device is one of
the benefits of the UNIX architecture. Each device has a special
section in the kernel, called a device driver, which includes all the
instructions necessary for Linux to communicate with the device. When
a new device is developed, it can be used with Linux by writing a
device driver, which is usually a set of instructions that explains
how to send and receive data.
Device drivers allow the Linux kernel to include only the operating
system and support software. By having the instructions for talking to
devices within a set of files, they can be loaded as needed (in the
case of rarely used devices), or kept in memory all the time when the
operating system boots. As refinements are made to a peripheral, small
changes to the device driver file can be linked into the kernel to
keep the operating system informed of the new features and
capabilities.
When an application instructs a device to perform an action, the Linux
kernel doesn't have to worry about the mechanism. It simply passes the
request to the device driver and lets it handle the communications.
Similarly, when you're typing at the keyboard, your terminal's device
driver accepts the keystrokes and passes them to the shell or
application, filtering out any special codes that the kernel doesn't
know how to handle by translating them into something the kernel can
perform.
Linux keeps device files in the /dev directory by default and
convention. It is permissible to keep device files anywhere on the
file system, but keeping them all in /dev makes it obvious that they
are device files.
Every type of device on the Linux system communicates in one of two
ways: character by character or as a set of data in a predefined chunk
or block. Terminals, printers, and asynchronous modems are character
devices, using characters sent one at a time and echoed by the other
end. Hard drives and most tape drives, on the other hand, use blocks
of data, because this is the fastest way to send large chunks of
information. These peripherals are called either character mode or
block mode devices, based on the way they communicate.
______________________________________________________________
NOTE: Another way to differentiate between character and block mode
devices is by how the buffering to the device is handled. Character
mode devices want to do their own buffering. Block mode devices,
which usually communicate in chunks of 512 or 1,024 bytes, have the
kernel perform the buffering.
Some devices can be both character and block mode devices. Some
tape drives, for example, can handle both character and block
modes, and therefore have two different device drivers. The device
driver that is used depends on how the user wants to write data to
the device.
______________________________________________________________
The device file has all the details about whether the device is a
character mode or block mode device. There is an easy way to tell
which type of device a peripheral is: Look at the output of the
listing command that shows file permissions (such as ls -l). If the
first character is a b, the device is a block mode device; a c
indicates a character mode device.
Device files are usually named to indicate the type of device they
are. Most terminals, for example, have a device driver with the name
tty followed by two or more letters or numbers, such as tty1, tty1A,
or tty04. The letters tty identify the file as a terminal (tty stands
for teletype), and the numbers or letters identify the specific
terminal referred to. When coupled with the directory name /dev, the
full device driver name becomes /dev/tty01.
Major and Minor Device Numbers
There might be more than one device of the same type on a system. For
example, your Linux system might have a multiport card (multiple
serial ports) with 10 Wyse 60 terminals hanging off it. Linux can use
the same device driver for each of the terminals because they are all
the same type of device.
However, there must be a method for the operating system to
differentiate which one of the 10 terminals you want to address.
That's where device numbers are used. Each device is identified by two
device numbers: The major number identifies the device driver to be
used, and the minor number identifies the device number. For example,
the 10 Wyse 60 terminals on the multiport card can all use a device
file with the same major number, but each will have a different minor
number, thereby uniquely identifying it to the operating system.
Every device on the system has both major and minor device numbers
assigned in such a way as to ensure that they are unique. If two
devices are assigned the same number, Linux can't properly communicate
with them.
Some devices use the major and minor device numbers in a strange way.
Some tape drives, for example, use the minor number to identify the
density of the tape and adjust its output in that manner.
Device files are created with the command mknod (make node) and
removed with the standard rm command.
The mknod Command
The mknod (make node) command is used for several different purposes
in Linux. It can create a FIFO (first in first out) pipe or a
character or block mode device file. The format of this com-mand is
mknod [options] device b|c|p|u major minor
The options can be one of the following:
—help displays help information and then exits.
-m [mode] sets the mode of the file to mode instead of the default
0666 (only symbolic notation is allowed).
—version displays version information, then exits.
The argument after the device or pathname specifies whether the file
is a block mode device , character mode device , FIFO device (p), or
unbuffered character mode device (u). One of these arguments must be
present on the command line.
Following the type of file argument are two numbers for the major and
minor device numbers assigned to the new file. Every device on a UNIX
system has a unique number that identifies the type of device (the
major number) and the specific device itself (the minor number). Both
a major and a minor number must be specified for any new block,
character, or unbuffered mode device. Device numbers are not specified
for a type p device.
Examples of using the mknod command are shown in several sections
later in this chapter, when devices are added to the system.
Printer Administration
Printers are commonly used devices that can cause a few problems for
system administrators. They are quite easy to configure as long as you
know something about the hardware. Managing printer queues is also
quite easy, but like many things in Linux, you must know the tricks to
make the system work easily for you.
Linux is based on the BSD version of UNIX, which unfortunately is not
the most talented UNIX version when it comes to printer
administration. However, because it's unlikely that the Linux system
will be used on very large networks with many printers, administration
tasks can be reduced to the basics. Be warned, though, that the BSD
UNIX printer administration and maintenance commands have a reputation
for quirky and inconsistent behavior!
The lpd Printing Daemon
All printing on the Linux system is handled by the lpd daemon, which
is usually started when the system boots. During the startup process,
the lpd daemon reads through the file /etc/printcap to identify the
sections that apply to any of the printers known to be attached to the
system. The lpd daemon uses two other processes, called listen and
accept, to handle incoming requests for printing and to copy them to a
spooling area.
In most cases, you won't have to modify the lpd daemon. However, there
might be times when you have to stop it manually and restart it. The
command to load lpd is
lpd [-l] [port]
The -l option invokes a logging system that notes each print request.
This option can be useful when you're debugging the printer system.
The port number allowed in the lpd command line is used to specify the
Internet port number if the system configuration information is to be
overridden. You will probably never have to use it.
The size of the print spool area is set by an entry in the file
minfree in each spool directory (each printer has its own spool
directory). The contents of minfree show the number of disk blocks to
keep reserved so that spooling large requests doesn't fill up the hard
drive. The contents of the file can be changed with any editor.
Access to the lpd daemon to allow printing of a user request must pass
a quick validation routine. Two files are involved: /etc/hosts.equiv
and /etc/hosts.lpd. If the machine name of the sending user is not in
either file, the print requests are refused. Because the local machine
is always in hosts.equiv (as localhost), users on the Linux machine
should always have their print requests granted.
Following a Print Request
To understand how the print daemon works, as well as how print
requests are managed by Linux, it is instructive to follow a print
request. When a user requests a print job with the lpr command, lpr
assembles the data to be printed and copies it into the spooling
queue, where lpd can find it.
______________________________________________________________
NOTE: The lpr program is the only one in the Linux system that can
actually queue files for printing. Any other program that offers
printing capabilities does so by calling lpr.
______________________________________________________________
As part of its spooling task, lpr also checks for instructions on how
to print the file. It can get the information from three sources: the
command line (supplied as arguments), environment variables (set by
the shell or the user), or the system's default values.
The lpr program knows which spool to put the print request in because
of the destination printer designation. The printer destination can be
specified on the lpr command line, or through an environment variable.
When the destination printer name has been determined, lpr checks the
file /etc/printcap to look up the printer's information, including the
spool directory. The spool directory is usually of the form
/usr/spool/printer_name, such as /usr/spool/lp1.
Within the spool directory, lpr creates two files. The first has the
letters cf (control file) followed by a print ID number. The cf file
contains information about the print job, including the owner's name.
The second file starts with df (data file) and has the actual contents
of the file to be printed with it. When lpr has finished creating the
df file, it sends a signal to lpd that informs the daemon that a print
job is waiting in the spool directory.
When lpd gets the signal from lpr, it checks the file /etc/printcap to
see whether the printer is for a local or remote printer. If the print
job is for a remote printer (one attached to another machine on the
network), lpd opens a connection to the remote machine, transfers both
the control and data files, and deletes the local copies.
If the print job is for a local printer, lpd checks to make sure the
printer exists and is active, and then sends the print request to the
printing daemon running that queue.
The /etc/printcap File and Spooling Directories
The /etc/printcap file is consulted by both the user's print command
lpr and the lpd print daemon. It contains information about every
printer that is accessible from the Linux machine.
The format of /etc/printcap is straightforward (and similar to the
/etc/termcap file for terminal descriptions). The following is an
extract from /etc/printcap:
# HP Laserjet
lp|hplj|laserjet-acctng|HP LaserJet 4M in Room 425:\
:lp=/dev/lp0:\
:sd=/usr/spool/lp0:\
:lf=/usr/spool/errorlog:\
:mx#0:\
:of=/usr/spool/lp0/hpjlp:\
The first field in each entry is a list of all the allowable names for
the printer. These can be used with the environment variables set by a
user's shell or by the system, as well as with options on the lpr
command line with a destination printer specified. Valid names are
separated by a vertical bar.
Usually, each entry includes at least three names: a short name that
is four characters or less (such as hplj); a more complete name with
an owner, if necessary (such as laserjet-acctng); and a full,
descriptive name with any other information necessary to identify the
printer (such as HP LaserJet 4M in Room 425).
______________________________________________________________
NOTE: If a print job is submitted without a destination name, and
one can't be determined from environment variable values, it is
routed to the printer lp. Therefore, one of the printers (usually
the system default printer) should also have the name lp as part of
its identifier.
______________________________________________________________
A comment in the file is shown with a pound symbol (sometimes called a
hash mark) as the first character. Following the printer name is a set
of two-character parameters and values used by the printer. The format
of these entries is always one of the following:
NN A Boolean value
NN=string Set equal to string
NN#number Set not equal to number
When a Boolean value is used (no assignment follows the two-character
identifier), the value is set to True by default. If the value of
False was required, the two-character identifier would not be included
in the description.
Most assignments are shown with colons beginning and ending each
definition to enhance readability and make the file easier for the
print utilities to parse. Null values are valid assignments employed
by putting two colons together.
A few of the parameters in the /etc/printcap file are worth
highlighting because they are useful for administration purposes. Not
all of these parameters might be present in every printer definition
in the /etc/printcap file, but most appear:
sd The spool directory
lf The log directory for error messages
af Accounting log file
mx Determines the type of files that can be printed
of Output filter program to be used when printing
All printers should have their own spool directories, usually under
the printer name in /usr/spool, such as /usr/spool/hplj. Spool
directories are necessary for both remote and local printers. When a
new printer is added to the system, the spool directory might have to
be created manually (using mkdir). The permissions for the spool
directory should be set to 775. The directory must be owned by root or
daemon. The group ID should be set to root or daemon, too. In both
cases, daemon theoretically is the better ID for user and group,
although root will work also.
The error log file can be located anywhere on the system. It can be
shared by all printers, if desired, because each log entry includes
the name of the printer.
The accounting log file is used to record printouts for systems in
which users are charged. If accounting records are not to be used on
the system, ignore the entry entirely in the /etc/printcap file. The
file can also be used for generating statistics, however. Some heavily
used systems might want to have the accounting file for those purposes
even when charges are not incurred by the users. An entry is written
to the accounting log file after a print job has completed. Account
information can be displayed with the Linux pac command. (Use the man
pac command to display the man pages for more information about pac.)
The mx character enables you to identify the types of files to be
printed. Usually this is set to mx#0, meaning that there are no
restrictions on the types of files.
Output filters modify the format of the outgoing file to the printer
to fit its requirements. For example, many laser printers can't handle
66 lines per page, so the output filter repaginates to 60 lines (or
whatever the number of lines per page is set to). Sometimes, special
codes must be added to force line feeds, font changes, or paper bin
selections. All these items are part of the output filter. Several
other types of filters are available, but the output filter is the one
most commonly encountered.
Within each spool directory, there may be two status files: status and
lock. Each file is one line long and can be modified with an editor.
These files contain a description of the current state of the printer.
They are created and managed by the lpd printer daemon and used by
several printer commands for status information.
Adding Printer Devices with mknod
Linux supports both parallel and serial printer devices. Both parallel
and serial printers are character mode devices. Unfortunately, most
Linux distributions do not have an easy-to-use printer installation
and configuration utilities like many UNIX versions. Instead, the
printer devices must be created and set up manually.
Parallel printers are referred to as devices lp0, lp1, or lp2,
depending on the address of the parallel port they are used with. (The
most common is the single parallel port on a PC, which is /dev/lp0.)
Valid parallel port devices, their addresses, and their usual
equivalents under MS-DOS are as follows:
/dev/lp0 0x03bc LPT1
/dev/lp1 0x0378 LPT2
/dev/lp2 0x0278 LPT3
______________________________________________________________
NOTE: To determine the address of a parallel port, you can use a
diagnostic utility (such as DOS's MSD.EXE). Some BIOS versions
display port addresses when the system is booting. If you are
unsure, try the ports starting with /dev/lp0, and wait to see
whether a printout is possible. The first parallel port on a PC is
typically set to address 0x03bc.
______________________________________________________________
Linux uses the mknod (make node) command to create a parallel printer
device file. After the device has been made, the ownership of the
device driver file must be altered to root or daemon.
The following is a command to make a parallel printer device on the
first parallel port (/dev/lp0):
mknod -m 620 /dev/lp0 c 6 0
chown root.daemon /dev/lp0
In this example, the file permissions are set to mode 620, the device
/dev/lp0 is created, and it is set to be a character mode device with
a major device number of 6 and a minor device number of 0. Usually,
minor device numbers start at 0 and are incremented upward; therefore,
because this is the first printer added, the minor device number is
set to 0.
______________________________________________________________
NOTE: The ownership root.daemon is a special Linux convention for
the daemons run by root. The entry root.daemon does not appear in
the /etc/passwd file. This uses a convention that lets the first
part of the entry (before the period) indicate the user and the
second part (after the period) represent the group.
______________________________________________________________
If a different device is configured, the device name itself must be
changed to the device number. For each possible parallel port, the
mknod commands are as follows:
mknod -m 620 /dev/lp0 c 6 0
mknod -m 620 /dev/lp1 c 6 1
mknod -m 620 /dev/lp2 c 6 2
In these examples, the minor device numbers have been incremented to
correspond to the port number. This is not necessary, but it can help
with identification.
After the mknod and chown commands have been issued, it is advisable
to manually check to ensure that the ownerships are set properly and
that a spool directory has been created. If the spool directory
doesn't exist, you have to create it manually. The permissions and
ownership requirements of the spool directory were given earlier, in
the section "The /etc/printcap File and Spooling Directories."
Managing Printers with lpc
Printers are controlled through a utility called lpc. The lpc program
lets you perform several important functions pertaining to the
printers used on your Linux system:
* Display printer status information
* Enable or disable the printer
* Enable or disable the printer queue
* Remove all print requests from a printer's queue
* Promote a particular print request to the top of the queue
* Make changes to the lpd printer daemon
The lpc program can't be used for remote printers. It affects only
those directly attached and configured on the local machine.
______________________________________________________________
NOTE: Be warned that lpc is one of the most unpredictable and
unreliable programs included with the Linux operating system! It
can hang up for no obvious reason, and it can also display
erroneous status messages. In some cases, the only way to fix a
severely screwed-up printer system is to reset the machine
completely!
______________________________________________________________
When used without any arguments, lpc prompts you for a command. The
following are several valid lpc commands and their arguments (a
vertical bar indicates a choice of arguments):
abort printer_name | all Is similar to the stop command, except
it doesn't allow any print job that is currently being
printed to finish before stopping the printer. When used with
the all argument, all printers are stopped. Any job that is
abnormally terminated by the abort command is requeued when
the printer is started again. See the stop command for more
details about the printer daemon and lock files.
clean printer_name | all Removes all print jobs that are queued,
including any active print jobs. In many cases, the currently
printing job proceeds normally because it has been passed to
the printer daemon or the printer's buffer. All other jobs
are removed, though. If the all argument is used, all
printers have their print queues cleaned.
disable printer_name | all Disables the spooling of print
requests to the printer (or all printers, depending on the
argument). Any jobs that are already queued are unaffected.
Any user trying to send a print job to the disabled printer
receives a message indicating that the printer is disabled,
and the print job is refused. Printers are enabled and
disabled through changes in the lock file in the spool
directory.
down printer_name message Is used to take a printer completely
offline, usually for an extended period. If a message is
included, it can be as long as you want. It is placed in the
status file in the spool directory and displayed to users
trying to queue to the printer. The down command is usually
used when a printer has serious problems and must be removed
from the system for more than a day.
enable printer_name | all Enables the spooling of print requests
to the printer or all printers.
exit Exits from lpc (the same as quit).
help or ? Shows a short list of all lpc commands. If an argument
is supplied, it displays a one-line description of that
command (such as help abort).
quit Exits from lpc (the same as exit).
restart printer_name | all Restarts the printer daemon, and is
usually used after it has died for an inexplicable reason
(which the BSD printer daemons tend to do). If the argument
all is supplied, all printer daemons are restarted.
start printer_name Starts the printer, allowing it to print
requests. This command starts the printer queue daemon for
that printer.
status printer_name Displays the printer name, whether it has the
spool queue enabled, whether printing is enabled, the number
of entries in the print queue, and the status of the daemon
for that printer. If there are no entries in the queue, no
printer daemon will be active. However, if there are entries
in the queue and the printer daemon shows as no daemon
present, the daemon has died and must be started again with
the restart command.
stop printer_name Stops the printer. Print requests can still be
spooled, but they are not printed until the printer is
started. If a job is being printed when the stop command is
issued, the job completes the print process and then stops
printing. The start and stop commands alter the contents of
the lock file in the print spool directories. The stop
command also kills the daemon for spooling to that printer.
topq printer_name print_ID Moves the print request with print_ID
to the top of the print queue.
topq printer_name username Moves all print requests owned by
username to the top of the queue. (This is very handy for
system administrators who don't want to wait!)
up printer_name Is used to reactivate a printer that was taken
down. See the down command for more information.
The lpc utility isn't very user-friendly, but it's the only way to
handle printers and their queues in Linux. Several front-end
menu-driven utilities are beginning to appear that simplify this task.
Managing the Printer Queue with lpq and lprm
Several commands help you administer the printer queue specifically,
instead of relying on the lpc command. Two tasks are commonly required
by a system administrator: displaying the current queue and removing
print jobs in a queue.
To display the current print queue for any printer, use the lpq
command. It has the following syntax:
lpq [-l] [-Pprinter_name] [job_ID ...] [username ...]
With no arguments at all, lpq displays information about the current
printer queues. The lpq command normally displays information about
who queued the print job, where it is in the queue, the files being
printed, and the total size of the files. The -l option displays more
information about each entry in the printer queue. Usually, only one
line of information is displayed.
A specific printer can be displayed with the -P option, followed by
the printer's name. If no name is supplied, the default system printer
is displayed. If one or more job_IDs or usernames are provided, only
information about the job or jobs queued by the user is shown.
______________________________________________________________
NOTE: Because users can't access the Linux printer spooling
directories, they can remove queued print jobs only with the lprm
command. If you are a system administrator, you might want to let
all system users know how to use this command to keep unwanted
print jobs from printing.
______________________________________________________________
The lprm command is used to remove files from a printer queue. This
command is often mistyped as lpr, which doesn't remove the file from
the queue. To use lprm, you must know the print job ID; or, if you are
logged in as root, you can remove all jobs for a particular printer.
The syntax of the lprm command is as follows:
lprm [-Pprinter_name] [-] [job_ID ...] [username ...]
If the single hyphen argument is used, lprm removes all jobs owned by
the user who issues the command. If you are logged in as root, all
print jobs are removed. A particular printer's jobs can be removed by
using the -P option. For example, the command
lprm -Phplj -
removes all print jobs queued on the printer hplj by the user who
issues the command, or all print jobs for that printer if issued by
root.
______________________________________________________________
NOTE: It is easy to accidentally remove all print jobs for a
printer when you use the lprm command as root. Take care to use the
proper syntax, or you may get frustrated at having to requeue all
the jobs!
______________________________________________________________
If a print job ID or a username is supplied as an argument, lprm
removes that job or all jobs submitted by the user. If no arguments
are supplied at all, the currently active job submitted by the user is
deleted.
When lprm removes files from the queue, it echoes a message to the
display. If there are no files to remove, nothing is echoed (and you
will be left wondering what, if anything, happened).
If you try to use lprm on a job that is currently being printed, it
might not be terminated properly because the file might already reside
in the printer's buffer. In some cases, terminating a job that is
currently printing can cause the printer to lock, because some output
format files can't handle the termination instructions and freeze when
the lock file in the spool directory changes. In cases such as this,
the ps command must be used to find the output filter process ID, and
then it must be killed.
______________________________________________________________
NOTE: In cases of printer lockup that don't seem to solve
themselves with the lpc utility, try killing the lpd daemon and
restarting it. If that doesn't work, you will probably have to
reboot the entire system.
______________________________________________________________
Terminals
Most Linux systems use only the system console that came with the PC
(the PC's screen and keyboard act as the system console). You won't
have to make any configuration changes to Linux to use the system
console effectively.
Some system administrators want to add remote terminals to allow other
users to work with Linux simultaneously (it is a multiuser system,
after all). New terminals can be added to the system in one of two
ways: through a serial port on the back of the PC or through a
multiport card with many serial ports on it.
Using Multiport Cards
Multiport cards provide an easy and effective method of adding many
serial ports to your system. Multiport cards are offered by dozens of
vendors in different configurations. They provide from two to 32
additional serial ports per card (for terminals, modems, or printers),
and can use several different types of connectors (such as DB25
connectors, DB9 connectors, or RJ11 wide telephone-style jacks).
If you are going to use a multiport card, make sure you can find one
with software device drivers that are designed to work with Linux. You
can't use any multiport card designed for other versions of UNIX (or
Xenix) without modification. Because multiport card device drivers are
complex binaries, modification is beyond the scope of most people's
programming abilities.
Multiport cards come with complete instructions for installing the
device drivers for the multiport card, as well as configuring the
terminals. Because the details of the configurations change depending
on the manufacturer of the multiport card, you should consult the
documentation accompanying the card for more information.
Adding Serial Port Terminals
You can use the serial ports on the PC to add remote terminals. The
terminal can be a dedicated terminal or another PC running terminal
emulation software. Linux doesn't really care about the identity of
the remote machine, except when it comes to sending instructions for
screen displays.
The wiring of cables between the remote terminal and the PC hosting
the Linux operating system depends on the type of connectors at both
ends. In most cases, the cable is a DTE- (Data Terminal Equipment)
to-DTE type, although some terminals and PC serial ports require DCE
(Data Communications Equipment) cabling. As a general rule, terminals
and remote computers use DTE, and modems use DCE. The difference
between DTE and DCE cabling is in the way the wires run from each end
connector.
A typical DCE cable (such as for a modem) uses straight-through
wiring, meaning that pin 1 on the PC end goes to pin 1 on the modem
end, pin 2 goes through to pin 2, and so on. This is called a straight
cable (also called a modem cable by some).
When connecting a terminal, however, some of the pins must be crossed
to permit signals to pass properly. The wiring of such a cable (often
called a null modem cable or hard-wired cable) requires several
crosses or shorts to make the connection valid. Serial port connectors
on a PC are either a DB9 (9-pin) or a DB25 (25-pin) connector. Not all
of the wires in the 25-pin (or the 9-pin, for that matter) are
required for a terminal device. A complete terminal cable can be made
of only three pins (send, receive, and ground), although Linux also
uses the Carrier Detect wire to tell when a terminal is attached and
active.
The important pins and their meanings for DTE (computer to terminal)
25-pin cables are shown in Table 38.1. The cable numbers are changed
for 9-pin connectors, but the crossings are the same.
Table 38.1. DTE cables for a 25-pin connector.
Terminal Pin Computer Pin Meaning
1 1 Ground
2 3 Transmit data / receive data
3 2 Receive data / transmit data
4 4 Ready to send
5 5 Clear to send
6 20 Data set ready / data terminal ready
7 7 Ground
8 20 Carrier detect / data terminal ready
20 6, 8 Data terminal ready / data set ready, carrier detect
Because most users want to purchase premade cables to connect remote
terminals, we won't deal with building your own cables. Instead,
simply visit your local computer store and explain the equipment at
both ends, as well as whether you have DB9 (9-pin) or DB25 (25-pin)
connectors at each end. Also note whether the connectors at each end
are male (pins sticking out) or female (no pins). Usually, the PC has
male serial port connectors (requiring a female end on the cable), and
a terminal has female connectors (requiring a male connector on the
cable); but, if you're connecting a remote PC, you need female
connectors at both ends.
______________________________________________________________
NOTE: If the wiring of a cable isn't clearly indicated and the
vendor doesn't know whether it's a straight-through or null modem
cable, you might need to purchase a null modem device. A null modem
is a short connector that has the pin crossings within it,
effectively converting a straight-through cable to a null modem
cable, and vice versa.
______________________________________________________________
The Login Process
To understand the files involved in a terminal configuration, it is
useful to look at the process that occurs whenever a login occurs.
The process begins with the /etc/init daemon executing when the Linux
system is booted. The init daemon is responsible for running the
/etc/getty program for each terminal that is connected to the system.
The init daemon knows whether a terminal is connected because of
entries in two files: /etc/ttys and /etc/inittab. The /etc/ttys file
lists all ports on the system and the type of terminal that is
connected. The /etc/inittab file has a compete list of all terminals
and their parameters. We'll look at both files in more detail later,
in the section "Terminal Files: /etc/ttys and /etc/inittab."
When the /etc/ttys and /etc/inittab files indicate that a terminal is
connected and active, the init daemon runs the /etc/getty program for
that terminal. The getty program sets the communications parameters
for the terminal and displays the login prompt on the screen.
When a user logs in on the terminal, the getty process executes the
login program to request a password. The login program then validates
the username and password against the entries in the /etc/passwd file.
If the login is valid, the login program displays the message of the
day (stored in the file /etc/motd) and executes whatever shell the
user is supposed to run (as specified in /etc/passwd). Finally, login
sets the TERM environment variable and exits.
When the login process terminates, the shell continues to execute and
reads the startup files; then, it generates the shell prompt and waits
for the user to issue instructions.
As you have seen, many files are involved in the startup process, all
in the /etc directory. We can look at the important files (at least
for terminal characteristics) in more detail.
What Are /sbin/getty and /etc/gettydefs?
The /sbin/getty (/etc/getty on some systems) program is referred to
quite a lot when dealing with terminals, but people often don't
clearly understand what the program does. Quite simply, /sbin/getty is
a binary program that sets the communications parameters between Linux
and a terminal, including the speed, protocol, and any special
handling of the cable.
The /sbin/getty program is called by /etc/init when a user is logging
in. When called, /sbin/getty then opens the serial port or other
connection to the terminal and sets the communications parameters
based on information in the file /etc/gettydefs (getty definitions).
The getty process then generates the login prompt on the remote
terminal.
Many special handling and command options are available with the getty
process, but most of them are of little interest to users and casual
system administrators. If you want complete information on the getty
command, consult the man pages that accompany Linux.
The /etc/gettydefs file is used to supply the settings getty uses for
communications. The format of each line in the gettydefs file is as
follows:
label:initial flags: final flags: login prompt: next label
The label is used to identify each line, so that when /sbin/getty is
started with an argument (as it usually is, transparent to the user),
the argument is used to match the label and provide the configuration
information. The initial and final flags are used to set any behavior
for the connection before and after the login program has executed.
The login prompt is the prompt to be displayed on the terminal.
Usually it is just login:, but it can be any string. Finally, the next
label is used to send getty to another line, in case it can't use the
current one. This is typically used with modem lines, which start at a
high speed (such as 9600 baud) and go to 4800, 2400, and 1200 in
sequence, trying to connect at each step. For terminals, the next
label is usually a pointer back to the line's first label.
An extract from a sample /etc/gettydefs file looks like this:
console# B19200 OPOST ONLCR TAB3 BRKINT IGNPAR ISTRIP IXON IXANY PARENB ECHO
ECHOE ECHOK ICANON ISIG CS8 CREAD # B19200 OPOST ONLCR TAB3 BRKINT IGNPAR ISTRI
P
IXON IXANY PARENB ECHO ECHOE ECHOK ICANON ISIG CS8 CREAD #Console Login: #conso
le
9600H# B9600 # B9600 SANE IXANY PARENB TAB3 HUPCL #login: #4800H
4800H# B4800 # B4800 SANE IXANY PARENB TAB3 HUPCL #login: #2400H
2400H# B2400 # B2400 SANE IXANY PARENB TAB3 HUPCL #login: #1200H
1200H# B1200 # B1200 SANE IXANY PARENB TAB3 HUPCL #login: #300H
300H# B300 # B300 SANE IXANY PARENB TAB3 HUPCL #login: #9600H
If you look at the file that accompanies your Linux system, you see
that there are many more lines, but they all have the same format as
the preceding samples. The easiest lines to look at are the shorter
ones (the last five lines in the preceding extract), but they all have
the same format as the preceding samples.
These lines are for a modem, starting at 9600 baud. The initial flag
is set to B9600, which sets the baud rate at 9600 baud. The final
flags, used when a connection has been established, set the
characteristics of the line (such as a TAB meaning three spaces).
Finally, the field at the end points to the next lower speed to
provide checks for slower modems or poor lines that prevent fast
logins.
The first line in the preceding extract is typical for a terminal. It
sets many initial and final flags that control how the terminal
behaves. The reference at the end of the line is back to the same
definition, because the terminal is hardwired to the system.
______________________________________________________________
NOTE: You shouldn't have to change the entries in the gettydefs
file, because the default file contains many different
configurations. You should examine the file carefully to find an
entry that will work with the terminal you are using. If you do
make changes to the gettydefs file, you should run the command
getty -c gettydefs to make the changes effective.
______________________________________________________________
Terminal Files /etc/ttys and /etc/inittab
Terminal configuration information is stored in the files /etc/ttys
and /etc/inittab. These files can be modified by any editor. Some
menu-driven programs are now appearing that perform changes to the
files for you.
______________________________________________________________
NOTE: Before making any changes to the terminal configuration
files, make a safe copy in case the changes aren't effective and
the file can't be returned to its original state easily. Simply
copy the two files to new names such as /etc/tty.original and
/etc/inittab.original.
______________________________________________________________
The /etc/ttys file has two columns. The first shows the type of
terminal, and the second shows the device name. A typical /etc/ttys
file from a new installation of Linux looks like this:
console tty1
console tty2
console tty3
console tty4
console tty5
console tty6
vt100 ttyp0
vt100 ttyp1
vt100 ttyp2
vt100 ttyp3
The terminal type in the first column is used to set the TERM
environment variable when you log in, unless you override the value.
The /etc/inittab file is used to set the behavior of each terminal.
The format of the /etc/inittab file follows this pattern:
ID:runlevel:action:process
The ID is a one- or two-character string that uniquely identifies the
entry. In most cases, this corresponds to the device name, such as 1
for tty1.
The runlevel decides the capabilities of the terminal with the various
states that the Linux operating system can be in (run levels vary from
0 to 6, and A, B, and C). If no entry is provided, all runlevels are
supported. Multiple runlevels may be mentioned in the field.
The action section shows how to handle the process field. The action
field has several valid entries:
boot Runs when inittab is first read.
bootwait Runs when inittab is first read.
initdefault Sets initial run level.
off Terminates the process if it is running.
once Starts the process once.
ondemand Always keeps the process running (the same as respawn).
powerfail Executes when init gets a power fail signal.
powerwait Executes when init gets a power fail signal.
sysinit Executes before accessing the console.
respawn Always keeps the process running.
wait Starts the process once.
The action indicates the behavior of the terminal device when the
system starts and when a getty process is terminated on it.
A simple /etc/inittab file (taken from an earlier version of Linux for
clarity's sake because the latest version complicates the lines a
little) looks like this:
# inittab for Linux
id:1:initdefault:
rc::bootwait:/etc/rc
1:1:respawn:/etc/getty 9600 tty1
2:1:respawn:/etc/getty 9600 tty2
3:1:respawn:/etc/getty 9600 tty3
4:1:respawn:/etc/getty 9600 tty4
The first two lines (after the comment) are used when the system
boots. The second line tells the system to run /etc/rc in order to
boot. The rest of the lines indicate that a getty process should be
started for tty1 through tty4 at 9600 baud.
Terminal Definitions The /etc/termcap File
The /etc/termcap file holds the instructions for communicating with
different terminals. Most terminals that are supported by the
operating system have an entry inside this file. The termcap (terminal
capabilities) file can be quite large. If you are going to make
changes, copy a version to a safe filename first.
The contents of the termcap file are similar to the printer definition
file /etc/printcap. Each entry in the termcap file has a name with
several variations, as well as a set of codes and values for different
terminal characteristics. Because terminals use many different codes
for different actions, many codes can be used with some of the more
talented terminals.
An extract from a termcap file shows the definitions for two fairly
simple terminals, the Wyse 30 and Wyse 85:
w0|wy30-vb|wyse30-vb|wyse 30 Visible bell:\
:vb=\E'8\E'\072\E'9:\
:tc=wy30:
wc|wy85|wyse85|Wyse 85 in 80 column mode, vt100 emulation:\
:is=\E[61"p\E[13l\E>\E[?1l\E[?3l\E[?7h\E[?16l\E[?5W:\
:co#80:li#24:am:cl=\E[;H\E[2J:bs:cm=\E[%i%d;%dH:nd=2\E[C:up=2\E[A:\
:ce=\E[0K:cd=\E[0J:so=2\E[7m:se=2\E[m:us=2\E[4m:ue=2\E[m:\
:ku=\E[A:kd=\E[B:kr=\E[C:kl=\E[D:\
:kh=\E[H:xn:\
:im=:CO=\E[?25h:CF=\E[?25l:ic=\E[1@:dc=\E[1P:\
:dl=\E[1M:al=\E[1L:GS=\EF:GE=\EG:pt:
The meaning of each set of codes is not really of interest to most
users and system administrators. You have to start changing or
rewriting terminal entries only if you are adding a terminal type that
doesn't exist in the termcap file already.
______________________________________________________________
NOTE: Most terminals offer multiple emulations. If you can't find
the terminal type in the termcap file, look for an emulation that
is supported. It's easier to emulate a different terminal than to
write a termcap entry for a new type.
______________________________________________________________
The terminal characteristics in the /etc/termcap file are used by the
/etc/ttys file. The first column of the ttys file gives the default
terminal type used to set the TERM environment variable. Essentially,
the startup routine uses a pattern-matching utility to find a matching
line in the termcap file, and then reads the codes that follow.
Adding a Terminal
Terminals are added to Linux in much the same manner as printers:
using the mknod command. To add a terminal, you must decide which port
the terminal will be connected to. The serial ports on a PC are
referred to by Linux as /dev/ttyS0 (for COM1 in DOS terms), /dev/ttyS1
(for COM2), and so on.
Most PC systems have one or two serial ports, although up to four can
be accommodated (ttyS0 to ttyS3). Linux uses the serial ports based on
their addresses in the BIOS. The usual addresses for the serial ports
are as follows:
ttyS0 (COM1) 0x03f8
ttyS1 (COM2) 0x02f8
ttyS2 (COM3) 0x03e8
ttyS3 (COM4) 0x02e8
If you're not sure which serial port is which, you might have to
either use a DOS-based diagnostic utility (such as MS-DOS's MSD.EXE)
or start at the lowest address and work up, testing the terminal each
time. If the PC has only one port, it is almost always configured as
COM1.
To create a new terminal device, you must run the mknod (make node)
command to create the new device driver file, and then change the
permissions on the file to let it be run by root or daemon. Most Linux
distributions include the terminal devices already.
______________________________________________________________
NOTE: The mknod command was covered in detail earlier in this
chapter. Check out the section "The mknod Command."
______________________________________________________________
A typical command for creating a new terminal device is
mknod -m 660 /dev/ttyS0 c 4 64
The -m 660 sets the permissions on the file. /dev/ttyS0 specifies the
first serial port on the machine (COM1). The c indicates that the
terminal is a character device (almost all terminals, except very
high-speed high-end models, are character devices). The major device
number is set to 4, while the minor device number is set to 64. For
the other serial ports on the PC (COM1 through COM4), the commands
would be as follows:
mknod -m 660 /dev/ttyS1 c 4 65
mknod -m 660 /dev/ttyS2 c 4 66
mknod -m 660 /dev/ttyS3 c 4 67
The changes in the minor device number with the preceding different
commands are not required, but there must be a unique minor device
number for each terminal.
After the mknod command has been executed, the device driver must be
set to the proper ownership. Issue the command
chown root.tty /dev/ttyS0
replacing the /dev/ttyS0 with whatever device the command applies to.
The ownership is set to root.tty.
You also want to change the entry in the /etc/ttys file to include the
terminal type and device that you have added so that the startup of
the terminal can be performed properly. Because the /etc/inittab file
already contains entries for the standard serial ports, you can edit
the entry for your new terminal's port (if necessary) to set the baud
rate and other parameters that may be required.
Using stty and tset
The stty command enables you to change and query a terminal option.
The stty command is very complex, with dozens of options that modify
the behavior of the terminal device driver. Luckily, only the most
intense system administrators have to use the many options, so in this
chapter we will ignore most of the details.
To see the current settings of a terminal, use the stty command
without any arguments. It displays a set of parameters. You can use
this to verify that the terminal has read the configuration
information properly from the /etc/inittab and /etc/gettydefs files.
Like stty, the tset command has many options, most of which are seldom
used (especially if you are not dealing with strange terminals and
weird connectors). The tset command is used to initialize the terminal
driver. If the tset command is given with a specific argument, it uses
that. Otherwise, the value in the TERM environment variable is used.
You can use tset within the startup files of a user who always logs in
from a remote terminal (through a modem). If you put the command
tset -m dialup:vt100
in the shell startup file (.profile, .cshrc, and so on), the terminal
type will be set to vt100 every time a connection is made through the
modem. Of course, this sets the terminal type even if someone isn't
using a VT100 terminal, so you can use the command
tset -m dialup:?vt100
to have the user connecting through the modem prompted for the
terminal type. The prompt looks like this:
TERM=(vt100)?
If the user presses Enter, the TERM variable is set to vt100. If the
user doesn't want to use that value, she can enter the correct string
at the prompt.
So far, tset seems to be quite simple, but in fact it has a very
complex structure when dealing with hard wired terminals. To properly
configure a terminal connected through a serial port, you need a
command such as this:
eval 'tset -s -Q -m dialup:?vt100 -m switch:z29'
The full details of this type of command are unimportant for most
system administrators. If you want more information, check the man
pages for tset and stty that came with your Linux system.
Resetting a Screwy Terminal
Every now and then a terminal connected through a serial port starts
acting screwy, either not showing a prompt or generating garbage.
There are two quick ways to try to reset the terminal. If they don't
work, the terminal should be shut down and restarted. (You might have
to kill the processes that were running on the terminal.)
The first approach is to issue a set of Ctrl-J characters on the
screwy terminal, and then type stty sane followed by another Ctrl-J.
The command stty sane should reset the terminal characteristics to
normal. You probably won't see the letters you are typing, so enter
them carefully.
If the terminal isn't behaving at this point, try typing reset and
pressing Enter or Ctrl-J. If this doesn't work, the terminal has hung
and should be reset manually.
Adding a Modem
The process for adding a modem is very similar to that for adding a
terminal. In most cases, the procedure outlined earlier in "Adding a
Terminal" can be followed.
Modems are used for several purposes on a Linux system, such as
networking, connecting to remote systems, and accepting incoming
calls. If the modem is to act as a conduit into the Linux system for
remote terminals to connect, the procedure given in "Adding a
Terminal" is followed, except for the entries that will be selected in
the /etc/inittab file. In the case of a modem, find a set of lines
that move through the different baud rates the modem supports.
Modems that are to be used for networking through the UUCP utility are
dealt with in Chapter 42, "Networking," and Chapter 43, "UUCP." It
includes information on setting the different configuration files
properly.
For modems used to call out of the system, Linux has a menu-driven
configuration utility as part of the setup command, which can set the
proper configuration information automatically.
Summary
This chapter has shown you the basics of devices, device management,
and how to add new devices to your Linux system. The information
presented applies to most distributions of Linux, although there might
be some slight changes in options and arguments as the different
utilities are enhanced or streamlined. If you want more information
about any of the commands, refer to the man pages that came with
Linux, or consult a comprehensive system administration book.
--
Enjoy Linux!
-----It's FREE!-----
※ 修改:.netiscpu 于 Jul 25 06:00:49 修改本文.[FROM: mtlab.hit.edu.cn]
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: fengyun.hit.edu.]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:819.298毫秒