FDP - FreeBSD Handbook (Covers R4.8 and 5.1) - 2003 - (By Laxxuss) PDF
FDP - FreeBSD Handbook (Covers R4.8 and 5.1) - 2003 - (By Laxxuss) PDF
FreeBSD Handbook
by The FreeBSD Documentation Project
Published February 1999
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 The FreeBSD Documentation Project
Welcome to FreeBSD! This handbook covers the installation and day to day use of FreeBSD 4.8-RELEASE and
FreeBSD 5.1-RELEASE. This manual is a work in progress and is the work of many individuals. Many sections do
not yet exist and some of those that do exist need to be updated. If you are interested in helping with this project,
send email to the FreeBSD documentation project mailing list
(http://lists.FreeBSD.org/mailman/listinfo/freebsd-doc). The latest version of this document is always available from
the FreeBSD web site (../../../../index.html). It may also be downloaded in a variety of formats and compression
options from the FreeBSD FTP server (ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/) or one of the numerous
mirror sites. If you would prefer to have a hard copy of the handbook, you can purchase one at the FreeBSD Mall
(http://www.freebsdmall.com/). You may also want to search the handbook (../../../../search/index.html).
FreeBSD is a registered trademark of Wind River Systems, Inc. This is expected to change soon.
UNIX is a registered trademark of The Open Group in the US and other countries.
Sun, Sun Microsystems, SunOS, Solaris, and Java are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and
other countries.
Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations
appear in this book, and the FreeBSD Project was aware of the trademark claim, the designations have been followed by the symbol.
Redistribution and use in source (SGML DocBook) and compiled forms (SGML, HTML, PDF, PostScript, RTF and so forth) with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code (SGML DocBook) must retain the above copyright notice, this list of conditions
and the following disclaimer as the first lines of this file unmodified.
2. Redistributions in compiled form (transformed to other DTDs, converted to PDF, PostScript, RTF and other
formats) must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
Important: THIS DOCUMENTATION IS PROVIDED BY THE FREEBSD DOCUMENTATION PROJECT "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
NO EVENT SHALL THE FREEBSD DOCUMENTATION PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
Table of Contents
Preface............................................................................................................................................................................. i
I. Getting Started ........................................................................................................................................................... i
1 Introduction ........................................................................................................................................................ 1
1.1 Synopsis................................................................................................................................................. 1
1.2 Welcome to FreeBSD! ........................................................................................................................... 1
1.3 About the FreeBSD Project ................................................................................................................... 4
2 Installing FreeBSD ............................................................................................................................................. 9
2.1 Synopsis................................................................................................................................................. 9
2.2 Pre-installation Tasks............................................................................................................................. 9
2.3 Starting the Installation........................................................................................................................ 15
2.4 Introducing Sysinstall .......................................................................................................................... 24
2.5 Allocating Disk Space ......................................................................................................................... 28
2.6 Choosing What to Install ..................................................................................................................... 45
2.7 Choosing Your Installation Media ....................................................................................................... 47
2.8 Committing to the Installation ............................................................................................................. 48
2.9 Post-installation ................................................................................................................................... 49
2.10 Supported Hardware .......................................................................................................................... 86
2.11 Troubleshooting................................................................................................................................. 86
2.12 Advanced Installation Guide ............................................................................................................. 88
2.13 Preparing Your Own Installation Media ............................................................................................ 90
3 Unix Basics ...................................................................................................................................................... 95
3.1 Synopsis............................................................................................................................................... 95
3.2 Permissions .......................................................................................................................................... 95
3.3 Directory Structure .............................................................................................................................. 97
3.4 Mounting and Unmounting File Systems ............................................................................................ 99
3.5 Processes............................................................................................................................................ 101
3.6 Daemons, Signals, and Killing Processes.......................................................................................... 102
3.7 Shells.................................................................................................................................................. 104
3.8 Text Editors........................................................................................................................................ 106
3.9 Devices and Device Nodes ................................................................................................................ 106
3.10 Virtual Consoles and Terminals....................................................................................................... 107
3.11 Binary Formats ................................................................................................................................ 110
3.12 For More Information...................................................................................................................... 111
4 Installing Applications: Packages and Ports .................................................................................................. 114
4.1 Synopsis............................................................................................................................................. 114
4.2 Overview of Software Installation ..................................................................................................... 114
4.3 Finding Your Application .................................................................................................................. 116
4.4 Using the Packages System ............................................................................................................... 116
4.5 Using the Ports Collection ................................................................................................................. 118
4.6 Post-installation Activities................................................................................................................. 125
4.7 Dealing with Broken Ports................................................................................................................. 126
5 The X Window System .................................................................................................................................. 127
5.1 Synopsis............................................................................................................................................. 127
5.2 Understanding X ................................................................................................................................ 127
5.3 Installing XFree86 ............................................................................................................................. 129
iv
vi
vii
viii
D. PGP Keys........................................................................................................................................................ ??
D.1 Officers................................................................................................................................................ ??
D.2 Core Team Members........................................................................................................................... ??
D.3 Developers .......................................................................................................................................... ??
Colophon...................................................................................................................................................................... ??
ix
List of Tables
2-1. Sample Device Inventory......................................................................................................................................... 9
2-2. Disk Device Codes ................................................................................................................................................ 33
2-3. Partition Layout for First Disk............................................................................................................................... 39
2-4. Partition Layout for Subsequent Disks .................................................................................................................. 40
2-5. Possible Security Profiles ...................................................................................................................................... 56
2-6. FreeBSD ISO Image Names and Meanings .......................................................................................................... 90
12-1. Physical Disk Naming Conventions .................................................................................................................. 312
13-1. Vinum Plex Organizations................................................................................................................................. 353
19-1. Wiring a Parallel Cable for Networking ............................................................................................................ 541
List of Figures
2-1. Kernel Configuration Menu................................................................................................................................... 18
2-2. The Kernel Device Configuration Visual Interface ............................................................................................... 19
2-3. Expanded Driver List............................................................................................................................................. 19
2-4. Driver Configuration With No Conflicts ............................................................................................................... 21
2-5. Sysinstall Main Menu............................................................................................................................................ 21
2-6. Typical Device Probe Results ................................................................................................................................ 22
2-7. Select Sysinstall Exit ............................................................................................................................................. 23
2-8. Selecting Usage from Sysinstall Main Menu ........................................................................................................ 24
2-9. Selecting Documentation Menu ............................................................................................................................ 24
2-10. Sysinstall Documentation Menu.......................................................................................................................... 25
2-11. Sysinstall Main Menu.......................................................................................................................................... 25
2-12. Sysinstall Keymap Menu..................................................................................................................................... 26
2-13. Sysinstall Main Menu.......................................................................................................................................... 26
2-14. Sysinstall Options ................................................................................................................................................ 27
2-15. Begin Standard Installation ................................................................................................................................. 27
2-16. Select Drive for FDisk ......................................................................................................................................... 36
2-17. Typical Fdisk Partitions before Editing ............................................................................................................... 37
2-18. Fdisk Partition Using Entire Disk........................................................................................................................ 37
2-19. Sysinstall Boot Manager Menu ........................................................................................................................... 38
2-20. Exit Select Drive.................................................................................................................................................. 39
2-21. Sysinstall Disklabel Editor .................................................................................................................................. 41
2-22. Sysinstall Disklabel Editor with Auto Defaults................................................................................................... 42
2-23. Free Space for Root Partition .............................................................................................................................. 43
2-24. Edit Root Partition Size ....................................................................................................................................... 43
2-25. Choose the Root Partition Type ........................................................................................................................... 44
2-26. Choose the Root Mount Point ............................................................................................................................. 44
2-27. Sysinstall Disklabel Editor .................................................................................................................................. 45
2-28. Choose Distributions ........................................................................................................................................... 45
2-29. Confirm Distributions .......................................................................................................................................... 46
2-30. Choose Installation Media ................................................................................................................................... 47
2-31. Selecting an Ethernet Device............................................................................................................................... 50
2-32. Set Network Configuration for ed0 ..................................................................................................................... 50
List of Examples
2-1. Using an Existing Partition Unchanged................................................................................................................. 11
2-2. Shrinking an Existing Partition.............................................................................................................................. 11
2-3. Sample Disk, Slice, and Partition Names .............................................................................................................. 34
2-4. Conceptual Model of a Disk .................................................................................................................................. 34
4-1. Downloading a Package Manually and Installing It Locally............................................................................... 116
6-1. Creating a Swapfile on FreeBSD 4.X .................................................................................................................. 168
6-2. Creating a Swapfile on FreeBSD 5.X .................................................................................................................. 168
7-1. boot0 Screenshot................................................................................................................................................ 172
7-2. boot2 Screenshot................................................................................................................................................ 173
xi
xii
Preface
Intended Audience
The FreeBSD newcomer will find that the first section of this book guides the user through the FreeBSD installation
process, and gently introduces the concepts and conventions that underpin Unix. Working through this section
requires little more than the desire to explore, and the ability to take on board new concepts as they are introduced.
Once you have travelled this far, the second, far larger, section of the Handbook is a comprehensive reference to all
manner of topics of interest to FreeBSD system administrators. Some of these chapters may recommend that you do
some prior reading, and this is noted in the synopsis at the beginning of each chapter.
For a list of additional sources of information, please see Appendix B.
A standard synopsis has been added to each chapter to give a quick summary of what information the chapter
contains, and what the reader is expected to know.
The content has been logically reorganized into three parts: Getting Started, System Administration, and
Appendices.
Chapter 2 (Installing FreeBSD) was completely rewritten with many screenshots to make it much easier for new
users to grasp the text.
Chapter 3 (Unix Basics) has been expanded to contain additional information about processes, daemons, and
signals.
Chapter 4 (Installing Applications) has been expanded to contain additional information about binary package
management.
Chapter 5 (The X Window System) has been completely rewritten with an emphasis on using modern desktop
technologies such as KDE and GNOME on XFree86 4.X.
Chapter 12 (Storage) has been written from what used to be two separate chapters on Disks and Backups.
We feel that the topics are easier to comprehend when presented as a single chapter. A section on RAID (both
hardware and software) has also been added.
Chapter 17 (Serial Communications) has been completely reorganized and updated for FreeBSD 4.X/5.X.
Chapter 20 (Electronic Mail) has been expanded to include more information about configuring sendmail.
Preface
Chapter 22 (Linux Compatibility) has been expanded to include information about installing Oracle and
SAP/R3.
ii
Preface
Chapter 8, Users and Basic Account Management
Describes the creation and manipulation of user accounts. Also discusses resource limitations that can be set on
users and other account management tasks.
Chapter 9, Configuring the FreeBSD Kernel
Explains why you might need to configure a new kernel and provides detailed instructions for configuring,
building, and installing a custom kernel.
Chapter 10, Security
Describes many different tools available to help keep your FreeBSD system secure, including Kerberos, IPsec,
OpenSSH, and network firewalls.
Chapter 11, Printing
Describes managing printers on FreeBSD, including information about banner pages, printer accounting, and
initial setup.
Chapter 12, Storage
Describes how to manage storage media and filesystems with FreeBSD. This includes physical disks, RAID
arrays, optical and tape media, memory-backed disks, and network filesystems.
Chapter 13, Vinum
Describes how to use Vinum, a logical volume manager which provides device-independent logical disks, and
software RAID-0, RAID-1 and RAID-5.
Chapter 14, Localization
Describes how to use FreeBSD in languages other than English. Covers both system and application level
localization.
Chapter 15, Desktop Applications
Lists some common desktop applications, such as web browsers and productivity suites, and describes how to
install them on FreeBSD.
Chapter 16, Multimedia
Shows how to setup sound and video playback support for your system. Also describes some sample audio and
video applications.
Chapter 17, Serial Communications
Explains how to connect terminals and modems to your FreeBSD system for both dial in and dial out
connections.
Chapter 18, PPP and SLIP
Describes how to use PPP, SLIP, or PPP over Ethernet to connect to remote systems with FreeBSD.
iii
Preface
Chapter 19, Advanced Networking
Describes many networking topics, including sharing an Internet connection with other computers on your
LAN, using network filesystems, sharing account information via NIS, setting up a name server, and much
more.
Chapter 20, Electronic Mail
Explains the different components of an email server and dives into simple configuration topics for the most
popular mail server software: sendmail.
Chapter 21, The Cutting Edge
Explains the differences between FreeBSD-STABLE, FreeBSD-CURRENT, and FreeBSD releases. Describes
which users would benefit from tracking a development system and outlines that process.
Chapter 22, Linux Binary Compatibility
Describes the Linux compatibility features of FreeBSD. Also provides detailed installation instructions for
many popular Linux applications such as Oracle, SAP/R3, and Mathematica.
Appendix A, Obtaining FreeBSD
Lists different sources for obtaining FreeBSD media on CDROM or DVD as well as different sites on the
Internet that allow you to download and install FreeBSD.
Appendix B, Bibliography
This book touches on many different subjects that may leave you hungry for a more detailed explanation. The
bibliography lists many excellent books that are referenced in the text.
Appendix C, Resources on the Internet
Describes the many forums available for FreeBSD users to post questions and engage in technical conversations
about FreeBSD.
Appendix D, PGP Keys
Lists the PGP fingerprints of several FreeBSD Developers.
Typographic Conventions
Italic
An italic font is used for filenames, URLs, emphasized text, and the first usage of technical terms.
Monospace
A monospaced font is used for error messages, commands, environment variables, names of ports, hostnames,
user names, group names, device names, variables, and code fragments.
iv
Preface
Bold
A bold font is used for applications, commands, and keys.
User Input
Keys are rendered in bold to stand out from other text. Key combinations that are meant to be typed simultaneously
are rendered with + between the keys, such as:
Ctrl+Alt+Del
Keys that are meant to be typed in sequence will be separated with commas, for example:
Ctrl+X, Ctrl+S
Would mean that the user is expected to type the Ctrl and X keys simultaneously and then to type the Ctrl and S
keys simultaneously.
Examples
Examples starting with E:\> indicate a MS-DOS command. Unless otherwise noted, these commands may be
executed from a Command Prompt window in a modern Microsoft Windows environment.
E:\> tools\fdimage floppies\kern.flp A:
Examples starting with # indicate a command that must be invoked as the superuser in FreeBSD. You can login as
root to type the command, or login as your normal account and use su(1) to gain superuser privileges.
# dd if=kern.flp of=/dev/fd0
Examples starting with % indicate a command that should be invoked from a normal user account. Unless otherwise
noted, C-shell syntax is used for setting environment variables and other shell commands.
% top
Acknowledgments
The book you are holding represents the efforts of many hundreds of people around the world. Whether they sent in
fixes for typos, or submitted complete chapters, all the contributions have been useful.
Several companies have supported the development of this document by paying authors to work on it full-time,
paying for publication, etc. In particular, BSDi (subsequently acquired by Wind River Systems
(http://www.windriver.com)) paid members of the FreeBSD Documentation Project to work on improving this book
full time leading up to the publication of the first printed edition in March 2000 (ISBN 1-57176-241-8). Wind River
Systems then paid several additional authors to make a number of improvements to the print-output infrastructure
and to add additional chapters to the text. This work culminated in the publication of the second printed edition in
November 2001 (ISBN 1-57176-303-1).
I. Getting Started
This part of the FreeBSD Handbook is for users and administrators who are new to FreeBSD. These chapters:
Show you how to install the wealth of third party applications available for FreeBSD.
Introduce you to X, the Unix windowing system, and detail how to configure a desktop environment that makes
you more productive.
We have tried to keep the number of forward references in the text to a minimum so that you can read this section of
the Handbook from front to back with the minimum of page flipping required.
Chapter 1 Introduction
Restructured, reorganized, and parts rewritten by Jim Mock.
1.1 Synopsis
Thank you for your interest in FreeBSD! The following chapter covers various aspects of the FreeBSD Project, such
as its history, goals, development model, and so on.
After reading this chapter, you will know:
Preemptive multitasking with dynamic priority adjustment to ensure smooth and fair sharing of the computer
between applications and users, even under the heaviest of loads.
Multi-user facilities which allow many people to use a FreeBSD system simultaneously for a variety of things.
This means, for example, that system peripherals such as printers and tape drives are properly shared between all
users on the system or the network and that individual resource limits can be placed on users or groups of users,
protecting critical system resources from over-use.
Strong TCP/IP networking with support for industry standards such as SLIP, PPP, NFS, DHCP, and NIS. This
means that your FreeBSD machine can interoperate easily with other systems as well as act as an enterprise server,
providing vital functions such as NFS (remote file access) and email services or putting your organization on the
Internet with WWW, FTP, routing and firewall (security) services.
Memory protection ensures that applications (or users) cannot interfere with each other. One application crashing
will not affect others in any way.
FreeBSD is a 32-bit operating system (64-bit on the Alpha and UltraSparc) and was designed as such from the
ground up.
Chapter 1 Introduction
The industry standard X Window System (X11R6) provides a graphical user interface (GUI) for the cost of a
common VGA card and monitor and comes with full sources.
Binary compatibility with many programs built for Linux, SCO, SVR4, BSDI and NetBSD.
Thousands of ready-to-run applications are available from the FreeBSD ports and packages collection. Why
search the net when you can find it all right here?
Thousands of additional and easy-to-port applications are available on the Internet. FreeBSD is source code
compatible with most popular commercial Unix systems and thus most applications require few, if any, changes to
compile.
Demand paged virtual memory and merged VM/buffer cache design efficiently satisfies applications with large
appetites for memory while still maintaining interactive response to other users.
A full complement of C, C++, Fortran, and Perl development tools. Many additional languages for advanced
research and development are also available in the ports and packages collection.
Source code for the entire system means you have the greatest degree of control over your environment. Why be
locked into a proprietary solution at the mercy of your vendor when you can have a truly open system?
FreeBSD is based on the 4.4BSD-Lite release from Computer Systems Research Group (CSRG) at the University of
California at Berkeley, and carries on the distinguished tradition of BSD systems development. In addition to the fine
work provided by CSRG, the FreeBSD Project has put in many thousands of hours in fine tuning the system for
maximum performance and reliability in real-life load situations. As many of the commercial giants struggle to field
PC operating systems with such features, performance and reliability, FreeBSD can offer them now!
The applications to which FreeBSD can be put are truly limited only by your own imagination. From software
development to factory automation, inventory control to azimuth correction of remote satellite antennae; if it can be
done with a commercial Unix product then it is more than likely that you can do it with FreeBSD too! FreeBSD also
benefits significantly from literally thousands of high quality applications developed by research centers and
universities around the world, often available at little to no cost. Commercial applications are also available and
appearing in greater numbers every day.
Because the source code for FreeBSD itself is generally available, the system can also be customized to an almost
unheard of degree for special applications or projects, and in ways not generally possible with operating systems
from most major commercial vendors. Here is just a sampling of some of the applications in which people are
currently using FreeBSD:
Internet Services: The robust TCP/IP networking built into FreeBSD makes it an ideal platform for a variety of
Internet services such as:
FTP servers
And more...
Chapter 1 Introduction
With FreeBSD, you can easily start out small with an inexpensive 386 class PC and upgrade all the way up to a
quad-processor Xeon with RAID storage as your enterprise grows.
Education: Are you a student of computer science or a related engineering field? There is no better way of
learning about operating systems, computer architecture and networking than the hands on, under the hood
experience that FreeBSD can provide. A number of freely available CAD, mathematical and graphic design
packages also make it highly useful to those whose primary interest in a computer is to get other work done!
Research: With source code for the entire system available, FreeBSD is an excellent platform for research in
operating systems as well as other branches of computer science. FreeBSDs freely available nature also makes it
possible for remote groups to collaborate on ideas or shared development without having to worry about special
licensing agreements or limitations on what may be discussed in open forums.
Networking: Need a new router? A name server (DNS)? A firewall to keep people out of your internal network?
FreeBSD can easily turn that unused 386 or 486 PC sitting in the corner into an advanced router with sophisticated
packet-filtering capabilities.
X Window workstation: FreeBSD is a fine choice for an inexpensive X terminal solution, either using the freely
available XFree86 server or one of the excellent commercial servers provided by Xi Graphics
(http://www.xig.com). Unlike an X terminal, FreeBSD allows many applications to be run locally if desired, thus
relieving the burden on a central server. FreeBSD can even boot diskless, making individual workstations even
cheaper and easier to administer.
Software Development: The basic FreeBSD system comes with a full complement of development tools including
the renowned GNU C/C++ compiler and debugger.
FreeBSD is available in both source and binary form on CDROM and via anonymous FTP. Please see Appendix A
for more information about obtaining FreeBSD.
Yahoo! (http://www.yahoo.com/)
Apache (http://www.apache.org/)
Netcraft (http://www.netcraft.com/)
Weathernews (http://www.wni.com/)
Supervalu (http://www.supervalu.com/)
Chapter 1 Introduction
Chapter 1 Introduction
We released FreeBSD 2.1.5 in August of 1996, and it appeared to be popular enough among the ISP and commercial
communities that another release along the 2.1-STABLE branch was merited. This was FreeBSD 2.1.7.1, released in
February 1997 and capping the end of mainstream development on 2.1-STABLE. Now in maintenance mode, only
security enhancements and other critical bug fixes will be done on this branch (RELENG_2_1_0).
FreeBSD 2.2 was branched from the development mainline (-CURRENT) in November 1996 as the
RELENG_2_2 branch, and the first full release (2.2.1) was released in April 1997. Further releases along the 2.2
branch were done in the summer and fall of 97, the last of which (2.2.8) appeared in November 1998. The first
official 3.0 release appeared in October 1998 and spelled the beginning of the end for the 2.2 branch.
The tree branched again on Jan 20, 1999, leading to the 4.0-CURRENT and 3.X-STABLE branches. From
3.X-STABLE, 3.1 was released on February 15, 1999, 3.2 on May 15, 1999, 3.3 on September 16, 1999, 3.4 on
December 20, 1999, and 3.5 on June 24, 2000, which was followed a few days later by a minor point release update
to 3.5.1, to incorporate some last-minute security fixes to Kerberos. This will be the final release in the 3.X branch.
There was another branch on March 13, 2000, which saw the emergence of the 4.X-STABLE branch, now
considered to be the current -stable branch. There have been several releases from it so far: 4.0-RELEASE was
introduced in March 2000, and the most recent 4.8-RELEASE came out in March 2003. There will be additional
releases along the 4.X-stable (RELENG_4) branch well into 2003.
The long-awaited 5.0-RELEASE was announced on January 19, 2003. The culmination of nearly three years of
work, this release started FreeBSD on the path of advanced multiprocessor and application thread support and
introduced support for the sparc64 and ia64 platforms. This release was followed by 5.1 in June of 2003. Besides a
number of new features, the 5.X releases also contain a number of major developments in the underlying system
architecture. Along with these advances, however, comes a system that incorporates a tremendous amount of new
and not-widely-tested code. For this reason, the 5.X releases are considered "New Technology" releases, while the
4.X series function as "Production" releases. In time, 5.X will be declared stable and work will commence on the
next development branch, 6.0-CURRENT.
For now, long-term development projects continue to take place in the 5.X-CURRENT (trunk) branch, and
SNAPshot releases of 5.X on CDROM (and, of course, on the net) are continually made available from the snapshot
server (ftp://current.FreeBSD.org/pub/FreeBSD/snapshots/) as work progresses.
Chapter 1 Introduction
Chapter 1 Introduction
Outside contributors
Last, but definitely not least, the largest group of developers are the users themselves who provide feedback and
bug fixes to us on an almost constant basis. The primary way of keeping in touch with FreeBSDs more
non-centralized development is to subscribe to the FreeBSD technical discussions mailing list
(http://lists.FreeBSD.org/mailman/listinfo/freebsd-hackers) where such things are discussed. See Appendix C
for more information about the various FreeBSD mailing lists.
The FreeBSD Contributors List (../../articles/contributors/article.html) is a long and growing one, so why not
join it by contributing something back to FreeBSD today?
Providing code is not the only way of contributing to the project; for a more complete list of things that need
doing, please refer to the FreeBSD Project web site (../../../../index.html).
In summary, our development model is organized as a loose set of concentric circles. The centralized model is
designed for the convenience of the users of FreeBSD, who are thereby provided with an easy way of tracking one
central code base, not to keep potential contributors out! Our desire is to present a stable operating system with a
large set of coherent application programs that the users can easily install and use, and this model works very well in
accomplishing that.
All we ask of those who would join us as FreeBSD developers is some of the same dedication its current people have
to its continued success!
Chapter 1 Introduction
provided as a pre-compiled package, which can be installed with a simple command (pkg_add) by those who do
not wish to compile their own ports from source.
A number of additional documents which you may find very helpful in the process of installing and using FreeBSD
may now also be found in the /usr/share/doc directory on any machine running FreeBSD 2.1 or later. You may
view the locally installed manuals with any HTML capable browser using the following URLs:
The FreeBSD Handbook
/usr/share/doc/handbook/index.html
You can also view the master (and most frequently updated) copies at http://www.FreeBSD.org/ (../../../../index.html).
2.1 Synopsis
FreeBSD is provided with a text-based, easy to use installation program called sysinstall. This is the default
installation program for FreeBSD, although vendors are free to provide their own installation suite if they wish. This
chapter describes how to use sysinstall to install FreeBSD.
After reading this chapter, you will know:
The questions sysinstall will ask you, what they mean, and how to answer them.
Read the supported hardware list that shipped with the version of FreeBSD you are installing, and verify that your
hardware is supported.
Note: In general, these installation instructions are written for i386 (PC compatible) architecture computers.
Where applicable, instructions specific to other platforms (for example, Alpha) will be listed.
IRQ
IO port(s)
Notes
N/A
N/A
CDROM
N/A
N/A
N/A
N/A
14
0x1f0
Network card
N/A
N/A
Intel 10/100
Modem
N/A
N/A
...
10
11
DKA0
DKC0
DKC100
DVA0
EWA0
PKC0
PQA0
PQB0
3476
0658
0015
5.27
This example is from a Digital Personal Workstation 433au and shows three disks attached to the machine. The first
is a CDROM drive called DKA0 and the other two are disks and are called DKC0 and DKC100 respectively.
Disks with names of the form DKx are SCSI disks. For example DKA100 refers to a SCSI disk with SCSI target ID 1
on the first SCSI bus (A), whereas DKC300 refers to a SCSI disk with SCSI ID 3 on the third SCSI bus (C).
Devicename PKx refers to the SCSI host bus adapter. As seen in the SHOW DEVICE output SCSI CDROM drives are
treated as any other SCSI hard disk drive.
IDE disks have names similar to DQx, while PQx is the associated IDE controller.
12
A CDROM or DVD
A tape
Floppy disks
Network
An NFS server
If you have purchased FreeBSD on CD or DVD then you already have everything you need, and should proceed to
the next section (Preparing the Boot Media).
If you have not obtained the FreeBSD installation files you should skip ahead to Section 2.13 which explains how to
prepare to install FreeBSD from any of the above. After reading that section, you should come back here, and read
on to Section 2.2.7.
13
2.
3.
Repeat this command for each .flp file, replacing the floppy disk each time, being sure to label the disks with
the name of the file that you copied to them. Adjust the command line as necessary, depending on where you
have placed the .flp files. If you do not have the CDROM, then fdimage can be downloaded from the tools
directory (ftp://ftp.FreeBSD.org/pub/FreeBSD/tools/) on the FreeBSD FTP site.
If you are writing the floppies on a Unix system (such as another FreeBSD system) you can use the dd(1)
command to write the image files directly to disk. On FreeBSD, you would run:
# dd if=kern.flp of=/dev/fd0
On FreeBSD, /dev/fd0 refers to the first floppy disk (the A: drive). /dev/fd1 would be the B: drive, and so
on. Other Unix variants might have different names for the floppy disk devices, and you will need to check the
documentation for the system as necessary.
14
The install can be exited at any time prior to the final warning without changing the contents of the hard drive. If
you are concerned that you have configured something incorrectly you can just turn the computer off before this
point, and no damage will be done.
2.3.1 Booting
2.3.1.1 Booting for the i386
1.
2.
Turn on the computer. As it starts it should display an option to enter the system set up menu, or BIOS,
commonly reached by keys like F2, F10, Del, or Alt+S. Use whichever keystroke is indicated on screen. In
some cases your computer may display a graphic while it starts. Typically, pressing Esc will dismiss the graphic
and allow you to see the necessary messages.
3.
Find the setting that controls which devices the system boots from. This is commonly shown as a list of devices,
such as Floppy, CDROM, First Hard Disk, and so on.
If you needed to prepare boot floppies, then make sure that the floppy disk is selected. If you are booting from
the CDROM then make sure that that is selected instead. In case of doubt, you should consult the manual that
came with your computer, and/or its motherboard.
Make the change, then save and exit. The computer should now restart.
4.
If you needed to prepare boot floppies, as described in Section 2.2.7 then one of them will be the first boot disc,
probably the one containing kern.flp. Put this disc in your floppy drive.
If you are booting from CDROM, then you will need to turn on the computer, and insert the CDROM at the first
opportunity.
If your computer starts up as normal, and loads your existing operating system then either:
1. The disks were not inserted early enough in the boot process. Leave them in, and try restarting your
computer.
15
FreeBSD will start to boot. If you are booting from CDROM you will see a display similar to this (version
information omitted):
Verifying DMI Pool Data ........
Boot from ATAPI CD-ROM :
1. FD 2.88MB System Type-(00)
Uncompressing ... done
BTX loader 1.00 BTX version is 1.01
Console: internal video/keyboard
BIOS drive A: is disk0
BIOS drive B: is disk1
BIOS drive C: is disk2
BIOS drive C: is disk3
BIOS 639kB/261120kB available memory
FreeBSD/i386 bootstrap loader, Revision 0.8
/kernel text=0x277391 data=0x3268c+0x332a8 |
|
Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [kernel] in 9 seconds... _
If you are booting from floppy disc, you will see a display similar to this (version information omitted):
Verifying DMI Pool Data ........
BTX loader 1.00 BTX version is 1.01
Console: internal video/keyboard
BIOS drive A: is disk0
BIOS drive C: is disk1
BIOS 639kB/261120kB available memory
FreeBSD/i386 bootstrap loader, Revision 0.8
/kernel text=0x277391 data=0x3268c+0x332a8 |
Please insert MFS root floppy and press enter:
Follow these instructions by removing the kern.flp disc, insert the mfsroot.flp disc, and press Enter.
6.
Irrespective of whether you booted from floppy or CDROM, the boot process will then get to this point:
Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [kernel] in 9 seconds... _
Either wait ten seconds, or press Enter. This will then launch the kernel configuration menu.
16
2.
3.
If you needed to prepare boot floppies, as described in Section 2.2.7 then one of them will be the first boot disc,
probably the one containing kern.flp. Put this disc in your floppy drive and type the following command to
boot the disk (substituting the name of your floppy drive if necessary):
>>>BOOT DVA0 -FLAGS -FILE
If you are booting from CDROM, insert the CDROM into the drive and type the following command to start the
installation (substituting the name of the appropriate CDROM drive if necessary):
>>>BOOT DKA0 -FLAGS -FILE
4.
FreeBSD will start to boot. If you are booting from a floppy disc, at some point you will see the message:
Please insert MFS root floppy and press enter:
Follow these instructions by removing the kern.flp disc, insert the mfsroot.flp disc, and press Enter.
5.
Irrespective of whether you booted from floppy or CDROM, the boot process will then get to this point:
Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [kernel] in 9 seconds... _
Either wait ten seconds, or press Enter. This will then launch the kernel configuration menu.
The kernel is the core of the operating system. It is responsible for many things, including access to all the devices
you may have on your system, such as hard disks, network cards, sound cards, and so on. Each piece of hardware
supported by the FreeBSD kernel has a driver associated with it. Each driver has a two or three letter name, such as
sa for the SCSI sequential access driver, or sio for the Serial I/O driver (which manages COM ports).
When the kernel starts, each driver checks the system to see whether or not the hardware it supports exists on your
system. If it does, then the driver configures the hardware and makes it available to the rest of the kernel.
This checking is commonly referred to as device probing. Unfortunately, it is not always possible to do this in a safe
way. Some hardware drivers do not co-exist well, and probing for one piece of hardware can sometimes leave
another in an inconsistent state. This is a basic limitation of the PC design.
Many older devices are called ISA devicesas opposed to PCI devices. The ISA specification requires each device
to have some information hard coded into it, typically the Interrupt Request Line number (IRQ) and IO port address
that the driver uses. This information is commonly set by using physical jumpers on the card, or by using a DOS
based utility.
17
The kernel configuration screen (Figure 2-2) is then divided into four sections.
18
At this point there will always be conflicts listed. Do not worry about this, it is to be expected; all the drivers are
enabled, and as has already been explained, some of them will conflict with one another.
You now have to work through the list of drivers, resolving the conflicts.
Resolving Driver Conflicts
1.
Press X. This will completely expand the list of drivers, so you can see all of them. You will need to use the
arrow keys to scroll back and forth through the active driver list.
Figure 2-3 shows the result of pressing X.
19
2.
Disable all the drivers for devices that you do not have. To disable a driver, highlight it with the arrow keys and
press Del. The driver will be moved to the Inactive Drivers list.
If you inadvertently disable a device that you need then press Tab to switch to the Inactive Drivers list,
select the driver that you disabled, and press Enter to move it back to the active list.
Important: Do not disable sc0. This controls the screen, and you will need this unless you are installing over
a serial cable.
Important: Only disable atkbd0 if you are using a USB keyboard. If you have a normal keyboard then you
must keep atkbd0.
3.
If there are no conflicts listed then you can skip this step. Otherwise, the remaining conflicts need to be
examined. If they do not have the indication of an allowed conflict in the message area, then either the
IRQ/address for device probe will need to be changed, or the IRQ/address on the hardware will need to be
changed.
To change the drivers configuration for IRQ and IO port address, select the device and press Enter. The cursor
will move to the third section of the screen, and you can change the values. You should enter the values for IRQ
and port address that you discovered when you made your hardware inventory. Press Q to finish editing the
devices configuration and return to the active driver list.
If you are not sure what these figures should be then you can try using -1. Some FreeBSD drivers can safely
probe the hardware to discover what the correct value should be, and a value of -1 configures them to do this.
The procedure for changing the address on the hardware varies from device to device. For some devices you may
need to physically remove the card from your computer and adjust jumper settings or DIP switches. Other cards
may have come with a DOS floppy that contains the programs used to reconfigure the card. In any case, you
should refer to the documentation that came with the device. This will obviously entail restarting your computer,
so you will need to boot back into the FreeBSD installation routine when you have reconfigured the card.
20
When all the conflicts have been resolved the screen will look similar to Figure 2-4.
Figure 2-4. Driver Configuration With No Conflicts
As you can see, the active driver list is now much smaller, with only drivers for the hardware that actually exists
being listed.
You can now save these changes, and move on to the next step of the install. Press Q to quit the device
configuration interface. This message will appear:
Save these parameters before exiting? ([Y]es/[N]o/[C]ancel)
Answer Y to save the parameters to memory (it will be saved to disk if you finish the install) and the probing
will start. After displaying the probe results in white on black text sysinstall will start and display its main menu
(Figure 2-5).
Figure 2-5. Sysinstall Main Menu
21
22
Check the probe results carefully to make sure that FreeBSD found all the devices you expected. If a device was not
found, then it will not be listed. If the devices driver required configuring with the IRQ and port address then you
should check that you entered them correctly.
If you need to make changes to the UserConfig device probing, its easy to exit the sysinstall program and start over
again. Its also a good way to become more familiar with the process.
Figure 2-7. Select Sysinstall Exit
Use the arrow keys to select Exit Install from the Main Install Screen menu. The following message will display:
User Confirmation Requested
Are you sure you wish to exit? The system will reboot
(be sure to remove any floppies from the drives).
23
No
The install program will start again if the CDROM is left in the drive and [Yes] is selected.
If you are booting from floppies it will be necessary to remove the mfsroot.flp floppy and replace it with
kern.flp before rebooting.
24
25
A different keyboard mapping may be chosen by selecting the menu item using up/down arrow keys and pressing
Space. Pressing Space again will unselect the item. When finished, choose the [ OK ] using the arrow keys and press
Enter.
Only a partial list is shown in this screen representation. Selecting [ Cancel ] will use the default keymap and return
to the Main Install Menu.
Figure 2-12. Sysinstall Keymap Menu
26
The default values are usually fine for most users and do not need to be changed. The release name will vary
according to the version being installed.
The description of the selected item will appear at the bottom of the screen highlighted in blue. Notice that one of the
options is Use Defaults to reset all values to startup defaults.
Press F1 to read the help screen about the various options.
Pressing Q will return to the Main Install menu.
27
28
29
Root
/
A1/
A2/
A filesystem must be mounted on to a directory in another filesystem. So now suppose that you mount filesystem B
on to the directory A1. The root directory of B replaces A1, and the directories in B appear accordingly:
Root
/
A1/
B1/
A2/
B2/
30
Root
/
A1/
A2/
B1/
B2/
Root
/
A1/
A2/
B1/
C1/
B2/
C2/
31
Root
/
C1/
A1/
A2/
C2/
B1/
B2/
If you are familiar with DOS, this is similar, although not identical, to the join command.
This is not normally something you need to concern yourself with. Typically you create filesystems when installing
FreeBSD and decide where to mount them, and then never change them unless you add a new disk.
It is entirely possible to have one large root filesystem, and not need to create any others. There are some drawbacks
to this approach, and one advantage.
Benefits of Multiple Filesystems
Different filesystems can have different mount options. For example, with careful planning, the root filesystem can
be mounted read-only, making it impossible for you to inadvertently delete or edit a critical file. Separating
user-writable filesystems, such as /home, from other filesystems also allows them to be mounted nosuid; this
option prevents the suid/guid bits on executables stored on the filesystem from taking effect, possibly improving
security.
FreeBSD automatically optimizes the layout of files on a filesystem, depending on how the filesystem is being
used. So a filesystem that contains many small files that are written frequently will have a different optimization to
one that contains fewer, larger files. By having one big filesystem this optimization breaks down.
FreeBSDs filesystems are very robust should you lose power. However, a power loss at a critical point could still
damage the structure of the filesystem. By splitting your data over multiple filesystems it is more likely that the
system will still come up, making it easier for you to restore from backup as necessary.
Filesystems are a fixed size. If you create a filesystem when you install FreeBSD and give it a specific size, you
may later discover that you need to make the partition bigger. This is not easily accomplished without backing up,
recreating the filesystem with the new size, and then restoring the backed up data.
Important: FreeBSD 4.4 and later versions feature the growfs(8) command, which makes it possible to
increase the size of filesystem on the fly, removing this limitation.
32
Filesystems are contained in partitions. This does not have the same meaning as the earlier usage of the term
partition in this chapter, because of FreeBSDs Unix heritage. Each partition is identified by a letter from a through
to h. Each partition can contain only one filesystem, which means that filesystems are often described by either their
typical mount point in the filesystem hierarchy, or the letter of the partition they are contained in.
FreeBSD also uses disk space for swap space. Swap space provides FreeBSD with virtual memory. This allows your
computer to behave as though it has much more memory than it actually does. When FreeBSD runs out of memory it
moves some of the data that is not currently being used to the swap space, and moves it back in (moving something
else out) when it needs it.
Some partitions have certain conventions associated with them.
Partition
Convention
Partition d used to have a special meaning associated with it, although that is now gone. To this
day, some tools may operate oddly if told to work on partition d, so sysinstall will not normally
create partition d.
Each partition-that-contains-a-filesystem is stored in what FreeBSD calls a slice. Slice is FreeBSDs term for what
were earlier called partitions, and again, this is because of FreeBSDs Unix background. Slices are numbered,
starting at 1, through to 4.
Slice numbers follow the device name, prefixed with an s, starting at 1. So da0s1 is the first slice on the first SCSI
drive. There can only be four physical slices on a disk, but you can have logical slices inside physical slices of the
appropriate type. These extended slices are numbered starting at 5, so ad0s5 is the first extended slice on the first
IDE disk. These devices are used by file systems that expect to occupy a slice.
Slices, dangerously dedicated physical drives, and other drives contain partitions, which are represented as letters
from a to h. This letter is appended to the device name, so da0a is the a partition on the first da drive, which is
dangerously dedicated. ad1s3e is the fifth partition in the third slice of the second IDE disk drive.
Finally, each disk on the system is identified. A disk name starts with a code that indicates the type of disk, and then
a number, indicating which disk it is. Unlike slices, disk numbering starts at 0. Common codes that you will see are
listed in Table 2-2.
When referring to a partition FreeBSD requires that you also name the slice and disk that contains the partition, and
when referring to a slice you should also refer to the disk name. Do this by listing the disk name, s, the slice number,
and then the partition letter. Examples are shown in Example 2-3.
Example 2-4 shows a conceptual model of the disk layout that should help make things clearer.
In order to install FreeBSD you must first configure the disk slices, then create partitions within the slice you will use
for FreeBSD, and then create a filesystem (or swap space) in each partition, and decide where that filesystem will be
mounted.
Table 2-2. Disk Device Codes
33
Meaning
ad
da
acd
cd
SCSI CDROM
fd
Floppy disk
Meaning
ad0s1a
The first partition (a) on the first slice (s1) on the first IDE disk (ad0).
da1s2e
The fifth partition (e) on the second slice (s2) on the second SCSI disk (da1).
34
!"
#$
$%&
')(+*
,-/.
4"5)
)
"+
6 7$8$
2$:9;
!
#$
%3"
4 "5)
)
"=<
71
>$-?@A
!
#$
%3<
0 $1
2
!"
#$
$%3
4"5)
)
"+
6 78$
B$C9EDF";
!
#$
%3"
4 5G
G
-
F 6 "7$!8
!
2$
"%!3"
4EG
G
H;
6 7$$
2$@9I71;
! $
#$
$%!3H
JEKMLON?NPLQSRUT!V WX
35
Press Enter as instructed. You will then be shown a list of all the hard drives that the kernel found when it carried out
the device probes. Figure 2-16 shows an example from a system with two IDE disks. They have been called ad0 and
ad2.
Figure 2-16. Select Drive for FDisk
You might be wondering why ad1 is not listed here. Why has it been missed?
Consider what would happen if you had two IDE hard disks, one as the master on the first IDE controller, and one as
the master on the second IDE controller. If FreeBSD numbered these as it found them, as ad0 and ad1 then
everything would work.
But if you then added a third disk, as the slave device on the first IDE controller, it would now be ad1, and the
previous ad1 would become ad2. Because device names (such as ad1s1a) are used to find filesystems, you may
suddenly discover that some of your filesystems no longer appear correctly, and you would need to change your
FreeBSD configuration.
To work around this, the kernel can be configured to name IDE disks based on where they are, and not the order in
which they were found. With this scheme the master disk on the second IDE controller will always be ad2, even if
there are no ad0 or ad1 devices.
36
What you do now will depend on how you want to slice up your disk.
If you want to use FreeBSD for the entire disk (which will delete all the other data on this disk when you confirm
that you want sysinstall to continue later in the installation process) then you can press A, which corresponds to the
Use Entire Disk option. The existing slices will be removed, and replaced with a small area flagged as unused
(again, an artifact of PC disk layout), and then one large slice for FreeBSD. If you do this then you should then select
the newly created FreeBSD slice using the arrow keys, and press S to mark the slice as being bootable. The screen
will then look very similar to Figure 2-18. Note the A in the Flags column, which indicates that this slice is active,
and will be booted from.
If you will be deleting an existing slice to make space for FreeBSD then you should select the slice using the arrow
keys, and then press D. You can then press C, and be prompted for size of slice you want to create. Enter the
appropriate figure and press Enter.
If you have already made space for FreeBSD (perhaps by using a tool such as Partition Magic) then you can press C
to create a new slice. Again, you will be prompted for the size of slice you would like to create.
37
When finished, press Q. Your changes will be saved in sysinstall, but will not yet be written to disk.
You have more than one drive, and have installed FreeBSD onto a drive other than the first one.
You have installed FreeBSD alongside another operating system on the same disk, and you want to choose
whether to start FreeBSD or the other operating system when you start the computer.
38
The Tab key toggles between the last drive selected, [ OK ], and [ Cancel ].
Press the Tab once to toggle to the [ OK ], then press Enter to continue with the installation.
Filesystem
Size
Description
39
Filesystem
Size
Description
100 MB
N/A
2-3 x RAM
/var
50 MB
The /var directory contains variable length files; log files, and
other administrative files. Many of these files are read-from or
written-to extensively during FreeBSDs day-to-day running.
Putting these files on another filesystem allows FreeBSD to
optimise the access of these files without affecting other files in
other directories that do not have the same access pattern.
/usr
Rest of disk
All your other files will typically be stored in /usr, and its
subdirectories.
If you will be installing FreeBSD on to more than one disk then you must also create partitions in the other slices that
you configured. The easiest way to do this is to create two partitions on each disk, one for the swap space, and one
for a filesystem.
Table 2-4. Partition Layout for Subsequent Disks
Partition
Filesystem
Size
Description
N/A
See description
40
Filesystem
Size
Description
/diskn
Rest of disk
Having chosen your partition layout you can now create it using sysinstall. You will see this message:
Message
Now, you need to create BSD partitions inside of the fdisk
partition(s) just created. If you have a reasonable amount of disk
space (200MB or more) and dont have any special requirements, simply
use the (A)uto command to allocate space automatically. If you have
more specific needs or just dont care for the layout chosen by
(A)uto, press F1 for more information on manual layout.
[ OK ]
[ Press enter or space ]
41
Disklabel can automatically create partitions for you and assign them default sizes. Try this now, by Pressing A. You
will see a display similar to that shown in Figure 2-22. Depending on the size of the disk you are using the defaults
may or may not be appropriate. This does not matter, as you do not have to accept the defaults.
Note: Beginning with FreeBSD 4.5, the default partitioning assigns the /tmp directory its own partition instead of
being part of the / partition. This helps avoid filling the / partition with temporary files.
To delete the suggested partitions, and replace them with your own, use the arrow keys to select the first partition,
and press D to delete it. Repeat this to delete all the suggested partitions.
To create the first partition (a, mounted as /), make sure the disk information at the top of the screen is selected, and
press C. A dialog box will appear prompting you for the size of the new partition (as shown in Figure 2-23). You can
42
The default size shown will create a partition that takes up the rest of the slice. If you are using the partition sizes
described earlier, then delete the existing figure using Backspace, and then type in 64M, as shown in Figure 2-24.
Then press [ OK ].
Figure 2-24. Edit Root Partition Size
43
Finally, because you are creating a filesystem, you must tell Disklabel where the filesystem is to be mounted. The
dialog box is shown in Figure 2-26. The root filesystems mount point is /, so type /, and then press Enter.
Figure 2-26. Choose the Root Mount Point
The display will then update to show you the newly created partition. You should repeat this procedure for the other
partitions. When you create the swap partition you will not be prompted for the filesystem mount point, as swap
partitions are never mounted. When you create the final partition, /usr, you can leave the suggested size as is, to use
the rest of the slice.
44
45
No
Select [ Yes ] with the arrow keys to install the ports collection or [ No ] to skip this option. Press Enter to continue.
The Choose Distributions menu will redisplay.
46
If satisfied with the options, select Exit with the arrow keys, ensure that [ OK ] is highlighted, and press Enter to
continue.
47
This option instructs FreeBSD to use Passive mode for all FTP operations. This allows the user to pass
through firewalls that do not allow incoming connections on random port addresses.
FTP via a HTTP proxy, Install from an FTP server through a http proxy
This option instructs FreeBSD to use the HTTP protocol (like a web browser) to connect to a proxy for all
FTP operations. The proxy will translate the requests and send them to the FTP server. This allows the user
to pass through firewalls that do not allow FTP at all, but offer a HTTP proxy. In this case, you have to
specify the proxy in addition to the FTP server.
For a proxy FTP server, you should usually give the name of the server you really want as a part of the
username, after an @ sign. The proxy server then fakes the real server. For example, assuming you want to
install from ftp.FreeBSD.org, using the proxy FTP server foo.example.com, listening on port 1024.
In this case, you go to the options menu, set the FTP username to ftp@ftp.FreeBSD.org, and the password to
your email address. As your installation media, you specify FTP (or passive FTP, if the proxy supports it), and the
URL ftp://foo.example.com:1234/pub/FreeBSD.
Since /pub/FreeBSD from ftp.FreeBSD.org is proxied under foo.example.com, you are able to install from that
machine (which will fetch the files from ftp.FreeBSD.org as your installation requests them).
No
48
This message is generated because nothing was installed. Pressing Enter will return to the Main Installation Menu to
exit the installation.
2.9 Post-installation
Configuration of various options follows the successful installation. An option can be configured by re-entering the
configuration options before booting the new FreeBSD system or after installation using /stand/sysinstall and
selecting Configure.
49
No
To configure a network device, select [ Yes ] and press Enter. Otherwise, select [ No ] to continue.
Figure 2-31. Selecting an Ethernet Device
Select the interface to be configured with the arrow keys and press Enter.
User Confirmation Requested
Do you want to try IPv6 configuration of the interface?
Yes
[ No ]
In this private local area network the current Internet type protocol (IPv4) was sufficient and [ No ] was selected with
the arrow keys and Enter pressed.
If you want to try the new Internet protocol (IPv6), choose [ Yes ] and press Enter. It will take several seconds to
scan for RA servers.
User Confirmation Requested
Do you want to try DHCP configuration of the interface?
Yes
[ No ]
If DHCP (Dynamic Host Configuration Protocol) is not required select [ No ] with the arrow keys and press Enter.
Selecting [ Yes ] will execute dhclient, and if successful, will fill in the network configuration information
automatically. Refer to Section 19.9 for more information.
The following Network Configuration screen shows the configuration of the Ethernet device for a system that will act
as the gateway for a Local Area Network.
50
Use Tab to select the information fields and fill in appropriate information:
Host
The fully-qualified hostname, e.g. k6-2.example.com in this case.
Domain
The name of the domain that your machine is in, e.g. example.com for this case.
IPv4 Gateway
IP address of host forwarding packets to non-local destinations. Fill this in only if the machine is a node on the
network. Leave this field blank if the machine is the gateway to the Internet for the network.
Name server
IP address of your local DNS server. There is no local DNS server on this private local area network so the IP
address of the providers DNS server (208.163.10.2) was used.
IPv4 address
The IP address to be used for this interface was 192.168.0.1
Netmask
The address block being used for this local area network is a Class C block ( 192.168.0.0 192.168.255.255). The default netmask is for a Class C network (255.255.255.0).
Extra options to ifconfig
Any interface-specific options to ifconfig you would like to add. There were none in this case.
Use Tab to select [ OK ] when finished and press Enter.
User Confirmation Requested
Would you like to Bring Up the ed0 interface right now?
51
[ Yes ]
No
Choosing [ Yes ] and pressing Enter will bring the machine up on the network and be ready for use after leaving the
installation.
No
If the machine will be acting as the gateway for a local area network and forwarding packets between other machines
then select [ Yes ] and press Enter. If the machine is a node on a network then select [ No ] and press Enter to
continue.
[ No ]
If [ No ] is selected, various services such telnetd will not be enabled. This means that remote users will not be able
to telnet into this machine. Local users will be still be able to access remote machines with telnet.
These services can be enabled after installation by editing /etc/inetd.conf with your favorite text editor. See
Section 19.13.1 for more information.
Select [ Yes ] if you wish to configure these services during install. An additional confirmation will display:
User Confirmation Requested
The Internet Super Server (inetd) allows a number of simple Internet
services to be enabled, including finger, ftp and telnetd. Enabling
these services may increase risk of security problems by increasing
the exposure of your system.
With this in mind, do you wish to enable inetd?
[ Yes ]
No
52
No
Selecting [ Yes ] will allow adding services by deleting the # at the beginning of a line.
Figure 2-33. Editing inetd.conf
After adding the desired services, pressing Esc will display a menu which will allow exiting and saving the changes.
[ No ]
53
Group:
The ftp root directory will be put in /var by default. If you do not have enough room there for the anticipated FTP
needs, the /usr directory could be used by setting the FTP Root Directory to /usr/ftp.
When you are satisfied with the values, press Enter to continue.
User Confirmation Requested
Create a welcome message file for anonymous FTP users?
[ Yes ]
No
If you select [ Yes ] and press Enter, an editor will automatically start allowing you to edit the message.
54
This is a text editor called ee. Use the instructions to change the message or change the message later using a text
editor of your choice. Note the file name/location at the bottom of the editor screen.
Press Esc and a pop-up menu will default to a) leave editor. Press Enter to exit and continue.
[ No ]
If there is no need for a Network File System server or client, select [ No ] and press Enter.
If [ Yes ] is chosen, a message will pop-up indicating that the exports file must be created.
Message
Operating as an NFS server means that you must first configure an
/etc/exports file to indicate which hosts are allowed certain kinds of
access to your local filesystems.
Press [Enter] now to invoke an editor on /etc/exports
[ OK ]
Press Enter to continue. A text editor will start allowing the exports file to be created and edited.
55
Use the instructions to add the actual exported filesystems now or later using a text editor of your choice. Note the
file name/location at the bottom of the editor screen.
Press Esc and a pop-up menu will default to a) leave editor. Press Enter to exit and continue.
[ No ]
With the arrow keys, select [ Yes ] or [ No ] as appropriate and press Enter.
Moderate
56
sendmail(8)
Extreme
Moderate
NO
YES
sshd(8)
NO
YES
portmap(8)
NO
MAYBE a
NFS server
NO
YES
securelevel(8)
YES b
NO
Notes: a. The portmapper is enabled if the machine has been configured as an NFS client or server earlier in the installation. b. If you
User Confirmation Requested
Do you want to select a default security profile for this host (select
No for "medium" security)?
[ Yes ]
No
Selecting [ No ] and pressing Enter will set the security profile to medium.
Selecting [ Yes ] and pressing Enter will allow selecting a different security profile.
Figure 2-37. Security Profile Options
57
No
To view and configure the options, select [ Yes ] and press Enter.
58
A commonly used option is the screen saver. Use the arrow keys to select Saver and then press Enter.
Figure 2-39. Screen Saver Options
Select the desired screen saver using the arrow keys and then press Enter. The System Console Configuration menu
will redisplay.
The default time interval is 300 seconds. To change the time interval, select Saver again. At the Screen Saver
Options menu, select Timeout using the arrow keys and press Enter. A pop-up menu will appear:
59
The value can be changed, then select [ OK ] and press Enter to return to the System Console Configuration menu.
Figure 2-41. System Console Configuration Exit
Selecting Exit and pressing Enter will continue with the post-installation configurations.
60
No
[ No ]
Select [ Yes ] or [ No ] according to how the machines clock is configured and press Enter.
Figure 2-42. Select Your Region
The appropriate region is selected using the arrow keys and then press Enter.
61
Select the appropriate country using the arrow keys and press Enter.
Figure 2-44. Select Your Time Zone
The appropriate time zone is selected using the arrow keys and pressing Enter.
Confirmation
Does the abbreviation EDT look reasonable?
[ Yes ]
No
Confirm the abbreviation for the time zone is correct. If it looks okay, press Enter to continue with the
post-installation configuration.
62
No
Selecting [ Yes ] and pressing Enter will allow running Linux software on FreeBSD. The install will proceed to add
the appropriate packages for Linux compatibility.
If installing by FTP, the machine will need to be connected to the Internet. Sometimes a remote ftp site will not have
all the distributions like the Linux binary compatibility. This can be installed later if necessary.
No
Select [ Yes ] for a non-USB mouse or [ No ] for a USB mouse and press Enter.
Figure 2-45. Select Mouse Protocol Type
63
The mouse used in this example is a PS/2 type, so the default Auto was appropriate. To change protocol, use the
arrow keys to select another option. Ensure that [ OK ] is highlighted and press Enter to exit this menu.
Figure 2-47. Configure Mouse Port
64
This system had a PS/2 mouse, so the default PS/2 was appropriate. To change the port, use the arrow keys and then
press Enter.
Figure 2-49. Enable the Mouse Daemon
65
The cursor moved around the screen so the mouse daemon is running.
Select [ Yes ] to return to the previous menu then select Exit with the arrow keys and press Enter to return to
continue with the post-installation configuration.
To see whether your video card is supported, check the XFree86 (http://www.xfree86.org/) web site.
User Confirmation Requested
Would you like to configure your X server at this time?
[ Yes ]
No
Warning: It is necessary to know your monitor specifications and video card information. Equipment damage can
occur if settings are incorrect. If you do not have this information, select [ No ] and perform the configuration after
installation when you have the information using /stand/sysinstall, selecting Configure and then XFree86.
If you have graphics card and monitor information, select [ Yes ] and press Enter to proceed with configuring the X
server.
66
There are several ways to configure the X server. Use the arrow keys to select one of the methods and press Enter.
Be sure to read all instructions carefully.
The xf86cfg and xf86cfg -textmode may make the screen go dark and take a few seconds to start. Be patient.
The following will illustrate the use of the xf86config configuration tool. The configuration choices you make will
depend on the hardware in the system so your choices will probably be different than those shown:
Message
You have configured and been running the mouse daemon.
Choose "/dev/sysmouse" as the mouse port and "SysMouse" or
"MouseSystems" as the mouse protocol in the X configuration utility.
[ OK ]
[ Press enter to continue ]
This indicates that the mouse daemon previously configured has been detected. Press Enter to continue.
Starting xf86config will display a brief introduction:
This program will create a basic XF86Config file, based on menu selections you
make.
The XF86Config file usually resides in /usr/X11R6/etc/X11 or /etc/X11. A sample
XF86Config file is supplied with XFree86; it is configured for a standard
VGA card and monitor with 640x480 resolution. This program will ask for a
pathname when it is ready to write the file.
You can either take the sample XF86Config as a base and edit it for your
configuration, or let this program produce a base XF86Config file for your
configuration and fine-tune it.
Before continuing with this program, make sure you know what video card
you have, and preferably also the chipset it uses and the amount of video
67
Pressing Enter will start the mouse configuration. Be sure to follow the instructions and use Mouse Systems as the
mouse protocol and /dev/sysmouse as the mouse port even if using a PS/2 mouse is shown as an illustration.
First specify a mouse protocol type. Choose one from the following list:
1.
2.
3.
4.
5.
6.
7.
8.
9.
If you have a two-button mouse, it is most likely of type 1, and if you have
a three-button mouse, it can probably support both protocol 1 and 2. There are
two main varieties of the latter type: mice with a switch to select the
protocol, and mice that default to 1 and require a button to be held at
boot-time to select protocol 2. Some mice can be convinced to do 2 by sending
a special sequence to the serial port (see the ClearDTR/ClearRTS options).
Enter a protocol number: 2
You have selected a Mouse Systems protocol mouse. If your mouse is normally
in Microsoft-compatible mode, enabling the ClearDTR and ClearRTS options
may cause it to switch to Mouse Systems mode when the server starts.
Please answer the following question with either y or n.
Do you want to enable ClearDTR and ClearRTS? n
You have selected a three-button mouse protocol. It is recommended that you
do not enable Emulate3Buttons, unless the third button doesnt work.
Please answer the following question with either y or n.
Do you want to enable Emulate3Buttons? y
Now give the full device name that the mouse is connected to, for example
/dev/tty00. Just pressing enter will use the default, /dev/mouse.
On FreeBSD, the default is /dev/sysmouse.
Mouse device: /dev/sysmouse
The keyboard is the next item to be configured. A generic 101-key model is shown for illustration. Any name may be
used for the variant or simply press Enter to accept the default value.
Please select one of the following keyboard types that is the better
description of your keyboard. If nothing really matches,
choose 1 (Generic 101-key PC)
68
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
Generic 101-key PC
Generic 102-key (Intl) PC
Generic 104-key PC
Generic 105-key (Intl) PC
Dell 101-key PC
Everex STEPnote
Keytronic FlexPro
Microsoft Natural
Northgate OmniKey 101
Winbook Model XP5
Japanese 106-key
PC-98xx Series
Brazilian ABNT2
HP Internet
Logitech iTouch
Logitech Cordless Desktop Pro
Logitech Internet Keyboard
Logitech Internet Navigator Keyboard
Compaq Internet
Microsoft Natural Pro
Genius Comfy KB-16M
IBM Rapid Access
IBM Rapid Access II
Chicony Internet Keyboard
Dell Internet Keyboard
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
U.S. English
U.S. English w/ ISO9995-3
U.S. English w/ deadkeys
Albanian
Arabic
Armenian
Azerbaidjani
Belarusian
Belgian
Bengali
Brazilian
Bulgarian
Burmese
Canadian
Croatian
Czech
Czech (qwerty)
Danish
69
Next, we proceed to the configuration for the monitor. Do not exceed the ratings of your monitor. Damage could
occur. If you have any doubts, do the configuration after you have the information.
Now we want to set the specifications of the monitor. The two critical
parameters are the vertical refresh rate, which is the rate at which the
whole screen is refreshed, and most importantly the horizontal sync rate,
which is the rate at which scanlines are displayed.
The valid range for horizontal sync and vertical sync should be documented
in the manual of your monitor. If in doubt, check the monitor database
/usr/X11R6/lib/X11/doc/Monitors to see if your monitor is there.
Press enter to continue, or ctrl-c to abort.
You must indicate the horizontal sync range of your monitor. You can either
select one of the predefined ranges below that correspond to industrystandard monitor types, or give a specific range.
It is VERY IMPORTANT that you do not specify a monitor type with a horizontal
sync range that is beyond the capabilities of your monitor. If in doubt,
choose a conservative setting.
1
2
3
4
5
6
7
8
9
10
11
70
50-70
50-90
50-100
40-150
Enter your own vertical sync range
The selection of a video card driver from a list is next. If you pass your card on the list, continue to press Enter and
the list will repeat. Only an excerpt from the list is shown:
Now we must configure video card specific settings. At this point you can
choose to make a selection out of a database of video card definitions.
Because there can be variation in Ramdacs and clock generators even
between cards of the same model, it is not sensible to blindly copy
the settings (e.g. a Device section). For this reason, after you make a
selection, you will still be asked about the components of the card, with
the settings from the chosen database entry presented as a strong hint.
The database entries include information about the chipset, what driver to
run, the Ramdac and ClockChip, and comments that will be included in the
Device section. However, a lot of definitions only hint about what driver
to run (based on the chipset the card uses) and are untested.
If you cant find your card in the database, theres nothing to worry about.
You should only choose a database entry that is exactly the same model as
your card; choosing one that looks similar is just a bad idea (e.g. a
GemStone Snail 64 may be as different from a GemStone Snail 64+ in terms of
hardware as can be).
Do you want to look at the card database? y
288
289
290
291
Matrox
Matrox
Matrox
Matrox
Millennium
Millennium
Millennium
Millennium
G200
G200
G200
G200
8MB
SD 16MB
SD 4MB
SD 8MB
mgag200
mgag200
mgag200
mgag200
71
mgag400
mga2164w
mga2164w
mga2164w
mga1064sg
mgag200
mgag200
mgag200
mgag100
mgag100
mediagx
ET6000
ET6000
Verite 1000
Now you must give information about your video card. This will be used for
the "Device" section of your video card in XF86Config.
You must indicate how much video memory you have. It is probably a good
idea to use the same approximate amount as that detected by the server you
intend to use. If you encounter problems that are due to the used server
not supporting the amount memory you have (e.g. ATI Mach64 is limited to
1024K with the SVGA server), specify the maximum amount supported by the
server.
How much video memory do you have on your video card:
1
2
3
4
5
6
256K
512K
1024K
2048K
4096K
Other
72
Next, the video modes are set for the resolutions desired. Typically, useful ranges are 640x480, 800x600, and
1024x768 but those are a function of video card capability, monitor size, and eye comfort. When selecting a color
depth, select the highest mode that your card will support.
For each depth, a list of modes (resolutions) is defined. The default
resolution that the server will start-up with will be the first listed
mode that can be supported by the monitor and card.
Currently it is set to:
"640x480" "800x600" "1024x768" "1280x1024" for 8-bit
"640x480" "800x600" "1024x768" "1280x1024" for 16-bit
"640x480" "800x600" "1024x768" "1280x1024" for 24-bit
Modes that cannot be supported due to monitor or clock constraints will
be automatically skipped by the server.
1
2
3
4
"640x400"
"640x480"
"800x600"
"1024x768"
"1280x1024"
"320x200"
"320x240"
"400x300"
"1152x864"
"1600x1200"
"1800x1400"
"512x384"
Please type the digits corresponding to the modes that you want to select.
For example, 432 selects "1024x768" "800x600" "640x480", with a
default mode of 1024x768.
Which modes? 432
73
You can have a virtual screen (desktop), which is screen area that is larger
than the physical screen and which is panned by moving the mouse to the edge
of the screen. If you dont want virtual desktop at a certain resolution,
you cannot have modes listed that are larger. Each color depth can have a
differently-sized virtual screen
Please answer the following question with either y or n.
Do you want a virtual screen that is larger than the physical screen? n
1 bit (monochrome)
4 bits (16 colors)
8 bits (256 colors)
16 bits (65536 colors)
24 bits (16 million colors)
Finally, the configuration needs to be saved. Be sure to enter /etc/XF86Config as the location for saving the
configuration.
I am going to write the XF86Config file now. Make sure you dont accidently
overwrite a previously configured one.
Shall I write it to /etc/X11/XF86Config? y
74
No
If you have trouble configuring XFree86, select [ No ] and press Enter and continue with the installation process.
After installation you can use xf86cfg -textmode or xf86config to access the command line configuration
utilities as root. There is an additional method for configuring XFree86 described in Chapter 5. If you choose not to
configure XFree86 at this time the next menu will be for package selection.
The default setting which allows the server to be killed is the hotkey sequence Ctrl+Alt+Backspace. This can be
executed if something is wrong with the server settings and prevent hardware damage.
The default setting that allows video mode switching will permit changing of the mode while running X with the
hotkey sequence Ctrl+Alt++ or Ctrl+Alt+-.
After installation, the display can be adjusted for height, width, or centering by using xvidtune after you have
XFree86 running with xvidtune.
There are warnings that improper settings can damage your equipment. Heed them. If in doubt, do not do it. Instead,
use the monitor controls to adjust the display for X Window. There may be some display differences when switching
back to text mode, but it is better than damaging equipment.
Read the xvidtune(1) manual page before making any adjustments.
Following a successful XFree86 configuration, it will proceed to the selection of a default desktop.
75
Use the arrow keys to select a desktop and press Enter. Installation of the selected desktop will proceed.
No
Selecting [ Yes ] and pressing Enter will be followed by the Package Selection screens:
76
All packages available will be displayed if All is selected or you can select a particular category. Highlight your
selection with the arrow keys and press Enter.
A menu will display showing all the packages available for the selection made:
Figure 2-54. Select Packages
The bash shell is shown selected. Select as many as desired by highlighting the package and pressing the Space key.
A short description of each package will appear in the lower left corner of the screen.
Pressing the Tab key will toggle between the last selected package, [ OK ], and [ Cancel ].
When you have finished marking the packages for installation, press Tab once to toggle to the [ OK ] and press
Enter to return to the Package Selection menu.
The left and right arrow keys will also toggle between [ OK ] and [ Cancel ]. This method can also be used to select
[ OK ] and press Enter to return to the Package Selection menu.
77
Use the arrow keys to select [ Install ] and press Enter. You will then need to confirm that you want to install the
packages:
Figure 2-56. Confirm Package Installation
Selecting [ OK ] and pressing Enter will start the package installation. Installing messages will appear until
completed. Make note if there are any error messages.
The final configuration continues after packages are installed.
noted below:
78
No
The following descriptions will appear in the lower part of the screen as the items are selected with Tab to assist with
entering the required information:
79
80
When you are finished adding users, select Exit with the arrow keys and press Enter to continue the installation.
[ No ]
Select [ No ] with the arrow keys and press Enter to return to the Main Installation Menu.
81
Select [X Exit Install] with the arrow keys and press Enter. You will be asked to confirm exiting the installation:
User Confirmation Requested
Are you sure you wish to exit? The system will reboot (be sure to
remove any floppies from the drives).
[ Yes ]
No
Select [ Yes ] and remove the floppy if booting from the floppy. The CDROM drive is locked until the machine starts
to reboot. The CDROM drive is then unlocked and the disk can be removed from drive (quickly).
The system will reboot so watch for any error messages that may appear.
frequency 1193182 Hz
82
83
84
Generating the RSA and DSA keys may take some time on slower machines. This happens only on the initial
boot-up of a new installation. Subsequent boots will be faster.
If the X server has been configured and a Default Desktop chosen, it can be started by typing startx at the
command line.
This instructs the firmware to boot the specified disk. To make FreeBSD boot automatically in the future, use these
commands:
>>>
>>>
>>>
>>>
SET
SET
SET
SET
BOOT_OSFLAGS A
BOOT_FILE
BOOTDEF_DEV DKC0
AUTO_ACTION BOOT
The boot messages will be similar (but not identical) to those produced by FreeBSD booting on the i386.
It is safe to turn off the power after the shutdown command has been issued and the message Please press any key to
reboot appears. If any key is pressed instead of turning off the power switch, the system will reboot.
85
2.11 Troubleshooting
The following section covers basic installation troubleshooting, such as common problems people have reported.
There are also a few questions and answers for people wishing to dual-boot FreeBSD with MS-DOS.
86
Disable device drivers for hardware that is not present in your system.
After adjusting the kernel to match your hardware configuration, type Q to boot with the new settings. Once the
installation has completed, any changes you made in the configuration mode will be permanent so you do not have to
reconfigure every time you boot. It is still highly likely that you will eventually want to build a custom kernel.
In this example, the MS-DOS file system is located on the first partition of the primary hard disk. Your situation may
be different, check the output from the dmesg, and mount commands. They should produce enough information too
give an idea of the partition layout.
87
2.
88
Repeat this command for each .flp file, replacing the floppy disk each time. Adjust the command line as
necessary, depending on where you have placed the .flp files. If you do not have the CDROM then fdimage
can be downloaded from the tools directory (ftp://ftp.FreeBSD.org/pub/FreeBSD/tools/) on the FreeBSD FTP
site.
If you are writing the floppies on a Unix system (such as another FreeBSD system) you can use the dd(1)
command to write the image files directly to disk. On FreeBSD you would run:
# dd if=kern.flp of=/dev/fd0
On FreeBSD /dev/fd0 refers to the first floppy disk (the A: drive). /dev/fd1 would be the B: drive, and so
on. Other Unix variants might have different names for the floppy disk devices, and you will need to check the
documentation for the system as necessary.
3.
If you were to boot into the floppies that you just made, FreeBSD would boot into its normal install mode. We
want FreeBSD to boot into a serial console for our install. To do this, you have to mount the kern.flp floppy
onto your FreeBSD system using the mount(8) command.
# mount /dev/fd0 /mnt
Now that you have the floppy mounted, you must change into the floppy directory:
# cd /mnt
Here is where you must set the floppy to boot into a serial console. You have to make a file called boot.config
containing /boot/loader -h. All this does is pass a flag to the bootloader to boot into a serial console.
# echo "/boot/loader -h" > boot.config
Now that you have your floppy configured correctly, you must unmount the floppy using the umount(8)
command:
# cd /
# umount /mnt
Now you can remove the floppy from the floppy drive.
4.
5.
89
Thats it! You should be able to control the headless machine through your cu session now. It will ask you to put in
the mfsroot.flp, and then it will come up with a selection of what kind of terminal to use. Just select the FreeBSD
color console and proceed with your install!
There may be some situations in which you need to create your own FreeBSD installation media and/or source. This
might be physical media, such as a tape, or a source that sysinstall can use to retrieve the files, such as a local FTP
site, or an MS-DOS partition. For example:
You have many machines connected to your local network, and one FreeBSD disk. You want to create a local FTP
site using the contents of the FreeBSD disk, and then have your machines use this local FTP site instead of
needing to connect to the Internet.
You have a FreeBSD disk, FreeBSD does not recognize your CD/DVD drive, but DOS/Windows does. You want
to copy the FreeBSD installations files to a DOS partition on the same computer, and then install FreeBSD using
those files.
The computer you want to install on does not have a CD/DVD drive, or a network card, but you can connect a
Laplink-style serial or parallel cable to a computer that does.
90
Contains
version-mini.iso
version-disc1.iso
version-disc2.iso
version-disc3.iso
version-disc4.iso
Note: The mini ISO was only produced for FreeBSD 4.4 and subsequent releases. The images for discs two,
three, and four were only produced for FreeBSD 4.5 and subsequent releases.
You must download one of either the mini ISO image, or the image of disc one. Do not download both of them,
since the disc one image contains everything that the mini ISO image contains.
Use the mini ISO if Internet access is cheap for you. It will let you install FreeBSD, and you can then install
third party packages by downloading them using the ports/packages system (see Chapter 4) as necessary.
Use the image of disc one if you want a reasonable selection of third party packages on the disc as well.
The additional disc images are useful, but not essential, especially if you have high-speed access to the Internet.
2.
On the FreeBSD computer that will host the FTP site, ensure that the CDROM is in the drive, and mounted on
/cdrom.
# mount /cdrom
2.
Create an account for anonymous FTP in /etc/passwd. Do this by editing /etc/passwd using vipw(8) and
adding this line.
ftp:*:99:99::0:0:FTP:/cdrom:/nonexistent
91
Anyone with network connectivity to your machine can now chose a media type of FTP and type in ftp://your
machine after picking Other in the FTP sites menu during the install.
Warning: This approach is OK for a machine that is on your local network, and that is protected by your firewall.
Offering up FTP services to other machines over the Internet (and not your local network) exposes your
computer to the attention of crackers and other undesirables. We strongly recommend that you follow good
security practices if you do this.
Then you can mount and write to them like any other filesystem.
After you have formatted the floppies, you will need to copy the files to them. The distribution files are split into
chunks conveniently sized so that 5 of them will fit on a conventional 1.44 MB floppy. Go through all your floppies,
packing as many files as will fit on each one, until you have all of the distributions you want packed up in this fashion.
Each distribution should go into a subdirectory on the floppy, e.g.: a:\bin\bin.aa, a:\bin\bin.ab, and so on.
Once you come to the Media screen during the install process, select Floppy and you will be prompted for the rest.
92
Assuming that C: is where you have free space and E: is where your CDROM is mounted.
If you do not have a CDROM drive, you can download the distribution from ftp.FreeBSD.org
(ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/5.1-RELEASE/). Each distribution is in its own directory; for
example, the base distribution can be found in the 5.1/base/
(ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/5.1-RELEASE/base/) directory.
Note: In the 4.X and older releases of FreeBSD the base distribution is called bin. Adjust the sample
commands and URLs above accordingly, if you are using one of these versions.
For as many distributions you wish to install from an MS-DOS partition (and you have the free space for), install
each one under c:\freebsd the BIN distribution is the only one required for a minimum installation.
When you go to do the installation, you should also make sure that you leave enough room in some temporary
directory (which you will be allowed to choose) to accommodate the full contents of the tape you have created. Due
to the non-random access nature of tapes, this method of installation requires quite a bit of temporary storage. You
should expect to require as much temporary storage as you have stuff written on tape.
Note: When starting the installation, the tape must be in the drive before booting from the boot floppy. The
installation probe may otherwise fail to find it.
93
94
3.1 Synopsis
The following chapter will cover the basic commands and functionality of the FreeBSD operating system. Much of
this material is relevant for any Unix-like operating system. Feel free to skim over this chapter if you are familiar
with the material. If you are new to FreeBSD, then you will definitely want to read through this chapter carefully.
After reading this chapter, you will know:
What a shell is, and how to change your default login environment.
3.2 Permissions
FreeBSD, being a direct descendant of BSD Unix, is based on several key Unix concepts. The first, and most
pronounced, is that FreeBSD is a multi-user operating system. The system can handle several users all working
simultaneously on completely unrelated tasks. The system is responsible for properly sharing and managing requests
for hardware devices, peripherals, memory, and CPU time evenly to each user.
Because the system is capable of supporting multiple users, everything the system manages has a set of permissions
governing who can read, write, and execute the resource. These permissions are stored as two octets broken into
three pieces, one for the owner of the file, one for the group that the file belongs to, and one for everyone else. This
numerical representation works like this:
Value
Permission
Directory Listing
---
1
2
--x
3
4
5
6
r-x
rwx
-w-wx
r--
rw-
You can use the -l command line argument to ls(1) to view a long directory listing that includes a column with
information about a files permissions for the owner, group, and everyone else. Here is how the first column of ls
95
The first (leftmost) character tells if this file is a regular file, a directory, a special character device, a socket, or any
other special pseudo-file device. In this case, the - indicates a regular file. The next three characters, rw- in this
example, give the permissions for the owner of the file. The next three characters, r--, give the permissions for the
group that the file belongs to. The final three characters, r--, give the permissions for the rest of the world. A dash
means that the permission is turned off. In the case of this file, the permissions are set so the owner can read and
write to the file, the group can read the file, and the rest of the world can only read the file. According to the table
above, the permissions for this file would be 644, where each digit represents the three parts of the files permission.
This is all well and good, but how does the system control permissions on devices? FreeBSD actually treats most
hardware devices as a file that programs can open, read, and write data to just like any other file. These special device
files are stored on the /dev directory.
Directories are also treated as files. They have read, write, and execute permissions. The executable bit for a
directory has a slightly different meaning than that of files. When a directory is marked executable, it means it can be
moved into, i.e. it is possible to cd into it. This also means that within the directory it is possible to access files
whose names are known (subject, of course, to the permissions on the files themselves).
In particular, in order to perform a directory listing, read permission must be set on the directory, whilst to delete a
file that one knows the name of, it is necessary to have write and execute permissions to the directory containing the
file.
There are more permission bits, but they are primarily used in special circumstances such as setuid binaries and
sticky directories. If you want more information on file permissions and how to set them, be sure to look at the
chmod(1) manual page.
Letter
Represents
(who)
User
(who)
Group owner
(who)
Other
(who)
All (world)
(action)
Adding permissions
(action)
Removing permissions
(action)
(permissions)
Read
(permissions)
Write
(permissions)
Execute
(permissions)
Sticky bit
96
Letter
Represents
(permissions)
These values are used with the chmod command just like before, but with letters. For an example, you could use the
following command to block other users from accessing FILE:
%chmod go= FILE
A comma separated list can be provided when more than one set of changes to a file must be made. For example the
following command will remove the groups and world write permission on FILE, then it adds the execute
permissions for everyone:
%chmod go-w,a+x FILE
Most users will not notice this, but it should be pointed out that using the octal method will only set or assign
permissions to a file; it does not add or delete them.
Description
/bin/
/boot/
/boot/defaults/
/dev/
/etc/
/etc/defaults/
/etc/mail/
97
Description
/etc/namedb/
/etc/periodic/
/etc/ppp/
/mnt/
/proc/
/root/
/sbin/
/stand/
/tmp/
/usr/
/usr/bin/
/usr/include/
/usr/lib/
/usr/libdata/
/usr/libexec/
/usr/local/
/usr/obj/
/usr/ports
/usr/sbin/
/usr/share/
/usr/src/
/usr/X11R6/
/var/
/var/log/
/var/mail/
/var/tmp/
/var/yp
NIS maps.
/var/spool/
98
/mount-point fstype
options
dumpfreq
passno
device
The file system type to pass to mount(8). The default FreeBSD file system is ufs.
options
Either rw for read-write file systems, or ro for read-only file systems, followed by any other options that may be
needed. A common option is noauto for file systems not normally mounted during the boot sequence. Other
options are listed in the mount(8) manual page.
dumpfreq
This is used by dump(8) to determine which file systems require dumping. If the field is missing, a value of zero
is assumed.
passno
This determines the order in which file systems should be checked. File systems that should be skipped should
have their passno set to zero. The root file system (which needs to be checked before everything else) should
have its passno set to one, and other file systems passno should be set to values greater than one. If more
than one file systems have the same passno then fsck(8) will attempt to check file systems in parallel if
possible.
99
There are plenty of options, as mentioned in the mount(8) manual page, but the most common are:
Mount Options
-a
Mount all the file systems listed in /etc/fstab. Exceptions are those marked as noauto, excluded by the -t
flag, or those that are already mounted.
-d
Do everything except for the actual system call. This option is useful in conjunction with the -v flag to
determine what mount(8) is actually trying to do.
-f
Force the mount of an unclean file system (dangerous), or forces the revocation of write access when
downgrading a file systems mount status from read-write to read-only.
-r
Mount the file system read-only. This is identical to using the rdonly argument to the -o option.
-t fstype
Mount the given file system as the given file system type, or mount only file systems of the given type, if given
the -a option.
ufs is the default file system type.
-u
Be verbose.
-w
100
3.5 Processes
FreeBSD is a multi-tasking operating system. This means that it seems as though more than one program is running
at once. Each program running at any one time is called a process. Every command you run will start at least one
new process, and there are a number of system processes that run all the time, keeping the system functional.
Each process is uniquely identified by a number called a process ID, or PID, and, like files, each process also has one
owner and group. The owner and group information is used to determine what files and devices the process can open,
using the file permissions discussed earlier. Most processes also have a parent process. The parent process is the
process that started them. For example, if you are typing commands to the shell then the shell is a process, and any
commands you run are also processes. Each process you run in this way will have your shell as its parent process.
The exception to this is a special process called init. init is always the first process, so its PID is always 1. init
is started automatically by the kernel when FreeBSD starts.
Two commands are particularly useful to see the processes on the system, ps(1) and top(1). The ps(1) command is
used to show a static list of the currently running processes, and can show their PID, how much memory they are
using, the command line they were started with, and so on. The top(1) command displays all the running processes,
and updates the display every few seconds, so that you can interactively see what your computer is doing.
By default, ps(1) only shows you the commands that are running and are owned by you. For example:
% ps
PID
298
7078
37393
48630
48730
72210
390
7059
6688
10735
TT
p0
p0
p0
p0
p0
p0
p1
p2
p3
p4
STAT
Ss
S
I
S
IW
R+
Is
Is+
IWs
IWs
TIME
0:01.10
2:40.88
0:03.11
2:50.89
0:00.00
0:00.00
0:01.14
1:36.18
0:00.00
0:00.00
COMMAND
tcsh
xemacs mdoc.xsl (xemacs-21.1.14)
xemacs freebsd.dsl (xemacs-21.1.14)
/usr/local/lib/netscape-linux/navigator-linux-4.77.bi
(dns helper) (navigator-linux-)
ps
tcsh
/usr/local/bin/mutt -y
tcsh
tcsh
101
p5
v0
v0
v0
v0
v0
IWs
IWs
IW+
IW+
IW
S
0:00.00
0:00.00
0:00.00
0:00.00
0:00.00
0:38.45
tcsh
-tcsh (tcsh)
/bin/sh /usr/X11R6/bin/startx -- -bpp 16
xinit /home/nik/.xinitrc -- -bpp 16
/bin/sh /home/nik/.xinitrc
/usr/X11R6/bin/sawfish
As you can see in this example, the output from ps(1) is organized into a number of columns. PID is the process ID
discussed earlier. PIDs are assigned starting from 1, go up to 99999, and wrap around back to the beginning when
you run out. TT shows the tty the program is running on, and can safely be ignored for the moment. STAT shows the
programs state, and again, can be safely ignored. TIME is the amount of time the program has been running on the
CPUthis is not necessarily the elapsed time since you started the program, as some programs spend a lot of time
waiting for things to happen before they need to spend time on the CPU. Finally, COMMAND is the command line that
was used to run the program.
ps(1) supports a number of different options to change the information that is displayed. One of the most useful sets
is auxww. a displays information about all the running processes, not just your own. u displays the username of the
process owner, as well as memory usage. x displays information about daemon processes, and ww causes ps(1) to
display the full command line, rather than truncating it once it gets too long to fit on the screen.
The output from top(1) is similar. A sample session looks like this:
% top
TIME
WCPU
0:00 14.86%
2:54 0.88%
5:36 0.73%
0:12 0.05%
3:18 0.00%
1:41 0.00%
1:38 0.00%
CPU
1.42%
0.88%
0.73%
0.05%
0.00%
0.00%
0.00%
COMMAND
top
xemacs-21.1.14
XF86_SVGA
xterm
navigator-linu
syslogd
mutt
The output is split into two sections. The header (the first five lines) shows the PID of the last process to run, the
system load averages (which are a measure of how busy the system is), the system uptime (time since the last reboot)
and the current time. The other figures in the header relate to how many processes are running (47 in this case), how
much memory and swap space has been taken up, and how much time the system is spending in different CPU states.
Below that are a series of columns containing similar information to the output from ps(1). As before you can see the
PID, the username, the amount of CPU time taken, and the command that was run. top(1) also defaults to showing
you the amount of memory space taken by the process. This is split into two columns, one for total size, and one for
resident sizetotal size is how much memory the application has needed, and the resident size is how much it is
actually using at the moment. In this example you can see that Netscape has required almost 30 MB of RAM, but is
currently only using 9 MB.
top(1) automatically updates this display every two seconds; this can be changed with the s option.
102
The other signals you might want to use are SIGHUP, SIGUSR1, and SIGUSR2. These are general purpose signals,
and different applications will do different things when they are sent.
Suppose that you have changed your web servers configuration fileyou would like to tell the web server to re-read
its configuration. You could stop and restart httpd, but this would result in a brief outage period on your web server,
which may be undesirable. Most daemons are written to respond to the SIGHUP signal by re-reading their
configuration file. So instead of killing and restarting httpd you would send it the SIGHUP signal. Because there is
no standard way to respond to these signals, different daemons will have different behavior, so be sure and read the
documentation for the daemon in question.
Signals are sent using the kill(1) command, as this example shows.
103
Find the process ID of the process you want to send the signal to. Do this using ps(1) and grep(1). The grep(1)
command is used to search through output, looking for the string you specify. This command is run as a normal
user, and inetd(8) is run as root, so the ax options must be given to ps(1).
% ps -ax | grep inetd
198
??
IWs
So the inetd(8) PID is 198. In some cases the grep inetd command might also occur in this output. This is
because of the way ps(1) has to find the list of running processes.
2.
Use kill(1) to send the signal. Because inetd(8) is being run by root you must use su(1) to become root first.
% su
Password:
# /bin/kill -s HUP 198
In common most with Unix commands, kill(1) will not print any output if it is successful. If you send a signal to
a process that you do not own then you will see kill: PID: Operation not permitted. If you mistype
the PID you will either send the signal to the wrong process, which could be bad, or, if you are lucky, you will
have sent the signal to a PID that is not currently in use, and you will see kill: PID: No such process.
Why Use /bin/kill?: Many shells provide the kill command as a built in command; that is, the shell will
send the signal directly, rather than running /bin/kill. This can be very useful, but different shells have a
different syntax for specifying the name of the signal to send. Rather than try to learn all of them, it can be
simpler just to use the /bin/kill ... command directly.
Sending other signals is very similar, just substitute TERM or KILL in the command line as necessary.
Important: Killing random process on the system can be a bad idea. In particular, init(8), process ID 1, is very
special. Running /bin/kill -s KILL 1 is a quick way to shutdown your system. Always double check the
arguments you run kill(1) with before you press Return.
3.7 Shells
In FreeBSD, a lot of everyday work is done in a command line interface called a shell. A shells main job is to take
commands from the input channel and execute them. A lot of shells also have built in functions to help everyday
tasks such as file management, file globbing, command line editing, command macros, and environment variables.
FreeBSD comes with a set of shells, such as sh, the Bourne Shell, and tcsh, the improved C-shell. Many other
shells are available from the FreeBSD Ports Collection, such as zsh and bash.
Which shell do you use? It is really a matter of taste. If you are a C programmer you might feel more comfortable
with a C-like shell such as tcsh. If you have come from Linux or are new to a Unix command line interface you
104
Description
USER
PATH
DISPLAY
SHELL
TERM
TERMCAP
OSTYPE
MACHTYPE
EDITOR
PAGER
MANPATH
To set an environment variable differs somewhat from shell to shell. For example, in the C-Style shells such as tcsh
and csh, you would use setenv to set environment variables. Under Bourne shells such as sh and bash, you would
use export to set your current environment variables. For example, to set or modify the EDITOR environment
variable, under csh or tcsh a command like this would set EDITOR to /usr/local/bin/emacs:
% setenv EDITOR /usr/local/bin/emacs
You can also make most shells expand the environment variable by placing a $ character in front of it on the
command line. For example, echo $TERM would print out whatever $TERM is set to, because the shell expands
$TERM and passes it on to echo.
105
Running chsh with no parameters and editing the shell from there would work also.
Note: The shell that you wish to use must be present in the /etc/shells file. If you have installed a shell from
the ports collection, then this should have been done for you already. If you installed the shell by hand, you must
do this.
For example, if you installed bash by hand and placed it into /usr/local/bin, you would want to:
# echo "/usr/local/bin/bash" >> /etc/shells
106
This example would make the proper device nodes for the second IDE drive when installed.
107
The messages might be a bit different on your system, but you will see something similar. The last two lines are what
we are interested in right now. The second last line reads:
FreeBSD/i386 (pc3.example.org) (ttyv0)
This line contains some bits of information about the system you have just booted. You are looking at a FreeBSD
console, running on an Intel or compatible processor of the x86 architecture 2. The name of this machine (every
UNIX machine has a name) is pc3.example.org, and you are now looking at its system consolethe ttyv0
terminal.
Finally, the last line is always:
login:
This is the part where you are supposed to type in your username to log into FreeBSD. The next section describes
how you can do this.
For the sake of this example, let us assume that your username is john. Type john at this prompt and press Enter.
You should then be presented with a prompt to enter a password:
login: john
Password:
Type in johns password now, and press Enter. The password is not echoed! You need not worry about this right
now. Suffice it to say that it is done for security reasons.
If you have typed your password correctly, you should by now be logged into FreeBSD and ready to try out all the
available commands.
108
type
status
Pc"
cons25
on
secure
Pc"
Pc"
Pc"
Pc"
Pc"
Pc"
Pc"
-nodaemon"
cons25
cons25
cons25
cons25
cons25
cons25
cons25
xterm
on
on
on
on
on
on
on
off
secure
secure
secure
secure
secure
secure
secure
secure
comments
For a detailed description of every column in this file and all the options you can use to set things up for the virtual
consoles, consult the ttys(5) manual page.
109
Note: As the comments above the console line indicate, you can edit this line and change secure to insecure.
If you do that, when FreeBSD boots into single user mode, it will still ask for the root password.
Be careful when changing this to insecure though. If you ever forget the root password, booting into single user
mode is a bit involved. It is still possible, but it might be a bit hard for someone who is not very comfortable with
the FreeBSD booting process and the programs involved.
a.out(5)
The oldest and classic Unix object format. It uses a short and compact header with a magic number at the
beginning that is often used to characterize the format (see a.out(5) for more details). It contains three loaded
segments: .text, .data, and .bss plus a symbol table and a string table.
COFF
The SVR3 object format. The header now comprises a section table, so you can have more than just .text, .data,
and .bss sections.
ELF
The successor to COFF, featuring multiple sections and 32-bit or 64-bit possible values. One major drawback:
ELF was also designed with the assumption that there would be only one ABI per system architecture. That
assumption is actually quite incorrect, and not even in the commercial SYSV world (which has at least three ABIs:
SVR4, Solaris, SCO) does it hold true.
FreeBSD tries to work around this problem somewhat by providing a utility for branding a known ELF executable
with information about the ABI it is compliant with. See the manual page for brandelf(1) for more information.
FreeBSD comes from the classic camp and used the a.out(5) format, a technology tried and proven through many
generations of BSD releases, until the beginning of the 3.X branch. Though it was possible to build and run native
ELF binaries (and kernels) on a FreeBSD system for some time before that, FreeBSD initially resisted the push to
switch to ELF as the default format. Why? Well, when the Linux camp made their painful transition to ELF, it was
110
111
command is the name of the command you wish to learn about. For example, to learn more about ls command type:
% man ls
This will display the manual page for the user command chmod. References to a particular section of the online
manual are traditionally placed in parenthesis in written documentation, so chmod(1) refers to the chmod user
command and chmod(2) refers to the system call.
This is fine if you know the name of the command and simply wish to know how to use it, but what if you cannot
recall the command name? You can use man to search for keywords in the command descriptions by using the -k
switch:
% man -k mail
With this command you will be presented with a list of commands that have the keyword mail in their descriptions.
This is actually functionally equivalent to using the apropos command.
So, you are looking at all those fancy commands in /usr/bin but do not have the faintest idea what most of them
actually do? Simply do:
% cd /usr/bin
112
or
% cd /usr/bin
% whatis *
Notes
1. Not quite truethere are a few things that can not be interrupted. For example, if the process is trying to read
from a file that is on another computer on the network, and the other computer has gone away for some reason
(been turned off, or the network has a fault), then the process is said to be uninterruptible. Eventually the
process will time out, typically after two minutes. As soon as this time out occurs the process will be killed.
2. This is what i386 means. Note that even if you are not running FreeBSD on an Intel 386 CPU, this is going to be
i386. It is not the type of your processor, but the processor architecture that is shown here.
3. Startup scripts are programs that are run automatically by FreeBSD when booting. Their main function is to set
things up for everything else to run, and start any services that you have configured to run in the background
doing useful things.
4. A fairly technical and accurate description of all the details of the FreeBSD console and keyboard drivers can be
found in the manual pages of syscons(4), atkbd(4), vidcontrol(1) and kbdcontrol(1). We will not expand on the
details here, but the interested reader can always consult the manual pages for a more detailed and thorough
explanation of how things work.
113
How to override the default values that the ports collection uses.
Download the software, which might be distributed in source code format, or as a binary.
2.
Unpack the software from its distribution format (typically a tarball compressed with compress(1), gzip(1), or
bzip2(1)).
3.
Locate the documentation (perhaps an INSTALL or README file, or some files in a doc/ subdirectory) and read
up on how to install the software.
4.
If the software was distributed in source format, compile it. This may involve editing a Makefile, or running a
configure script, and other work.
5.
And that is only if everything goes well. If you are installing a software package that was not deliberately ported to
FreeBSD you may even have to go in and edit the code to make it work properly.
Should you want to, you can continue to install software the traditional way with FreeBSD. However, FreeBSD
provides two technologies which can save you a lot of effort: packages and ports. At the time of writing, over 9,000
third party applications have been made available in this way.
For any given application, the FreeBSD package for that application is a single file which you must download. The
package contains pre-compiled copies of all the commands for the application, as well as any configuration files or
114
A compressed package tarball is typically smaller than the compressed tarball containing the source code for the
application.
Packages do not require any additional compilation. For large applications, such as Mozilla, KDE, or GNOME
this can be important, particularly if you are on a slow system.
Packages do not require any understanding of the process involved in compiling software on FreeBSD.
Ports Benefits
Packages are normally compiled with conservative options, because they have to run on the maximum number of
systems. By installing from the port, you can tweak the compilation options to (for example) generate code that is
specific to a Pentium III or Athlon processor.
Some applications have compile time options relating to what they can and cannot do. For example, Apache can
be configured with a wide variety of different built-in options. By building from the port you do not have to accept
the default options, and can set them yourself.
In some cases, multiple packages will exist for the same application to specify certain settings. For example,
Ghostscript is available as a ghostscript package and a ghostscript-nox11 package, depending on
whether or not you have installed an X11 server. This sort of rough tweaking is possible with packages, but rapidly
becomes impossible if an application has more than one or two different compile time options.
The licensing conditions of some software distributions forbid binary distribution. They must be distributed as
source code.
Some people do not trust binary distributions. At least with source code, you can (in theory) read through it and
look for potential problems yourself.
If you have local patches, you will need the source in order to apply them.
115
Some people like having code around, so they can read it if they get bored, hack it, borrow from it (license
permitting, of course), and so on.
To keep track of updated ports, subscribe to the FreeBSD ports mailing list
(http://lists.FreeBSD.org/mailman/listinfo/freebsd-ports) and the FreeBSD ports bugs mailing list
(http://lists.FreeBSD.org/mailman/listinfo/freebsd-ports-bugs).
The remainder of this chapter will explain how to use packages and ports to install and manage third party software
on FreeBSD.
The FreeBSD web site maintains an up-to-date searchable list of all the available applications, at
http://www.FreeBSD.org/ports/ (../../../../ports/index.html). The ports are divided into categories, and you may
either search for an application by name (if you know it), or see all the applications available in a category.
Dan Langille maintains FreshPorts, at http://www.FreshPorts.org/. FreshPorts tracks changes to the applications in
the ports tree as they happen, allows you to watch one or more ports, and can send you email when they are
updated.
If you do not know the name of the application you want, try using a site like FreshMeat
(http://www.freshmeat.net/) to find an application, then check back at the FreeBSD site to see if the application
has been ported yet.
Connected to ftp2.FreeBSD.org.
220 ftp2.FreeBSD.org FTP server (Version 6.00LS) ready.
331 Guest login ok, send your email address as password.
230230This machine is in Vienna, VA, USA, hosted by Verio.
230Questions? E-mail freebsd@vienna.verio.net.
230230230 Guest login ok, access restrictions apply.
116
If you do not have a source of local packages (such as a FreeBSD CD-ROM set) then it will probably be easier to use
the -r option to pkg_add(1). This will cause the utility to automatically determine the correct object format and
release and then fetch and install the package from an FTP site.
# pkg_add -r lsof
The example above would download the correct package and add it without any further user intervention. pkg_add(1)
uses fetch(3) to download the files, which honors various environment variables, including FTP_PASSIVE_MODE,
FTP_PROXY, and FTP_PASSWORD. You may need to set one or more of these if you are behind a firewall, or need to
use an FTP/HTTP proxy. See fetch(3) for the complete list. Note that in the example above lsof is used instead of
lsof-4.56.4. When the remote fetching feature is used, the version number of the package must be removed.
pkg_add(1) will automatically fetch the latest version of the application.
Package files are distributed in .tgz format. You can find them at
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages/, or on the FreeBSD CD-ROM distribution. Every CD on the
FreeBSD 4-CD set (and the PowerPak, etc.) contains packages in the /packages directory. The layout of the
packages is similar to that of the /usr/ports tree. Each category has its own directory, and every package can be
found within the All directory.
The directory structure of the package system matches the ports layout; they work with each other to form the entire
package/port system.
cvsup-16.1
docbook-1.2
...
pkg_version(1) is a utility that summarizes the versions of all installed packages. It compares the package version to
the current version found in the ports tree.
# pkg_version
cvsup
docbook
...
=
=
117
Meaning
<
>
4.4.4 Miscellaneous
All package information is stored within the /var/db/pkg directory. The installed file list and descriptions of each
package can be found within files in this directory.
118
2.
3.
4.
5.
6.
Select your desired installation media, such as CDROM, FTP, and so on.
7.
8.
The alternative method to obtain and keep your ports collection up to date is by using CVSup. Look at the ports
CVSup file, /usr/share/examples/cvsup/ports-supfile. See Using CVSup (Section A.5) for more
information on using CVSup and this file.
CVSup Method
This is a quick method for getting the ports collection using CVSup. If you want to keep your ports tree up to date,
or learn more about CVSup, read the previously mentioned sections.
1.
Install the net/cvsup port. See CVSup Installation (Section A.5.2) for more details.
2.
3.
Edit ports-supfile.
4.
Change CHANGE_THIS.FreeBSD.org to a CVSup server near you. See CVSup Mirrors (Section A.5.7) for
a complete listing of mirror sites.
5.
Run cvsup:
# cvsup -g -L 2 /root/ports-supfile
6.
Running this command later will download and apply all the recent changes to your ports collection, except
actually rebuilding the ports for your own system.
A Makefile. The Makefile contains various statements that specify how the application should be compiled and
where it should be installed on your system.
A distinfo file. This file contains information about the files that must be downloaded to build the port and their
checksums, to verify that files have not been corrupted during the download using md5(1).
A files directory. This directory contains patches to make the program compile and install on your FreeBSD
system. Patches are basically small files that specify changes to particular files. They are in plain text format, and
119
A pkg-descr file. This is a more detailed, often multiple-line, description of the program.
A pkg-plist file. This is a list of all the files that will be installed by the port. It also tells the ports system what
files to remove upon deinstallation.
Some ports have other files, such as pkg-message. The ports system uses these files to handle special situations. If
you want more details on these files, and on ports in general, check out the FreeBSD Porters Handbook
(../porters-handbook/index.html).
Now that you have enough background information to know what the ports collection is used for, you are ready to
install your first port. There are two ways this can be done, and each is explained below.
Before we get into that, however, you will need to choose a port to install. There are a few ways to do this, with the
easiest method being the ports listing on the FreeBSD web site (../../../../ports/index.html). You can browse through
the ports listed there or use the search function on the site. Each port also includes a description so you can read a bit
about each port before deciding to install it.
Another method is to use the whereis(1) command. Simply type whereis file, where file is the program you
want to install. If it is found on your system, you will be told where it is, as follows:
# whereis lsof
lsof: /usr/ports/sysutils/lsof
This tells us that lsof (a system utility) can be found in the /usr/ports/sysutils/lsof directory.
Yet another way to find a particular port is by using the ports collections built-in search mechanism. To use the
search feature, you will need to be in the /usr/ports directory. Once in that directory, run make search
name=program-name where program-name is the name of the program you want to find. For example, if you
were looking for lsof:
# cd /usr/ports
# make search name=lsof
Port:
Path:
Info:
Maint:
Index:
B-deps:
R-deps:
lsof-4.56.4
/usr/ports/sysutils/lsof
Lists information about open files (similar to fstat(1))
obrien@FreeBSD.org
sysutils
The part of the output you want to pay particular attention to is the Path: line, since that tells you where to find the
port. The other information provided is not needed in order to install the port, so it will not be covered here.
For more in-depth searching you can also use make search key=string where string is some text to search
for. This searches port names, comments, descriptions and dependencies and can be used to find ports which relate to
a particular subject if you dont know the name of the program you are looking for.
In both of these cases, the search string is case-insensitive. Searching for LSOF will yield the same results as
searching for lsof.
120
Now that you have found a port you would like to install, you are ready to do the actual installation. The port
includes instructions on how to build source code, but not the actual source code. You can get the source code from a
CD-ROM or from the Internet. Source code is distributed in whatever manner the software author desires. Frequently
this is a tarred and gzipped file, but it might be compressed with some other tool or even uncompressed. The program
source code, whatever form it comes in, is called a distfile. You can get the distfile from a CD-ROM or from the
Internet.
4.5.2.1 Installing Ports from a CD-ROM
The FreeBSD Projects official CD-ROM images no longer include distfiles. They take up a lot of room that is better
used for precompiled packages. CD-ROM products such as the FreeBSD PowerPak do include distfiles, and you can
order these sets from a vendor such as the FreeBSD Mall (http://www.freebsdmall.com/). This section assumes you
have such a FreeBSD CD-ROM set.
Place your FreeBSD CD-ROM in the drive. Mount it on /cdrom. (If you use a different mount point, the install will
not work.) To begin, change to the directory for the port you want to install:
# cd /usr/ports/sysutils/lsof
Once inside the lsof directory, you will see the port skeleton. The next step is to compile, or build, the port. This
is done by simply typing make at the prompt. Once you have done so, you should see something like this:
# make
Notice that once the compile is complete you are returned to your prompt. The next step is to install the port. In order
to install it, you simply need to tack one word onto the make command, and that word is install:
# make install
121
Once you are returned to your prompt, you should be able to run the application you just installed. Since lsof is a
program that runs with increased privileges, a security warning is shown. During the building and installation of
ports, you should take heed of any other warnings that may appear.
Note: You can save an extra step by just running make install instead of make and make install as two
separate steps.
Note: Some shells keep a cache of the commands that are available in the directories listed in the PATH
environment variable, to speed up lookup operations for the executable file of these commands. If you are using
one of these shells, you might have to use the rehash command after installing a port, before the newly installed
commands can be used. This is true for both shells that are part of the base-system (such as tcsh) and shells
that are available as ports (for instance, shells/zsh).
Note: Please be aware that the licenses of a few ports do not allow for inclusion on the CD-ROM. This could be
because a registration form needs to be filled out before downloading or redistribution is not allowed, or for
another reason. If you wish to install a port not included on the CD-ROM, you will need to be online in order to do
so (see the next section).
122
As you can see, the only difference is the line that tells you where the system is fetching the port distfile from.
The ports system uses fetch(1) to download the files, which honors various environment variables, including
FTP_PASSIVE_MODE, FTP_PROXY, and FTP_PASSWORD. You may need to set one or more of these if you are behind
a firewall, or need to use an FTP/HTTP proxy. See fetch(3) for the complete list.
For users which cannot be connected all the time, the make fetch option is provided. Just run this command at the
top level directory (/usr/ports) and the required files will be downloaded for you. This command will also work
in the lower level categories, for example: /usr/ports/net. Note that if a port depends on libraries or other ports
this will not fetch the distfiles of those ports too. Replace fetch with fetch-recursive if you want to fetch all the
dependencies of a port too.
Note: You can build all the ports in a category or as a whole by running make in the top level directory, just like
the aforementioned make fetch method. This is dangerous, however, as some ports cannot co-exist. In other
cases, some ports can install two different files with the same filename.
In some rare cases, users may need to acquire the tarballs from a site other than the MASTER_SITES (the location
where files are downloaded from). You can override the MASTER_SITES option with the following command:
# cd /usr/ports/directory
# make MASTER_SITE_OVERRIDE= \
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch
123
will compile the port in /usr/home/example/ports and install everything under /usr/local.
# make PREFIX=/usr/home/example/local install
will combine the two (it is too long to completely write on this page, but it should give you the general idea).
Alternatively, these variables can also be set as part of your environment. Read the manual page for your shell for
instructions on doing so.
===>
That was easy enough. You have removed lsof from your system. If you would like to reinstall it, you can do so by
running make reinstall from the /usr/ports/sysutils/lsof directory.
124
Use pkg_info(1) to find out which files were installed, and where. For example, if you have just installed
FooPackage version 1.0.0, then this command
# pkg_info -L foopackage-1.0.0 | less
will show all the files installed by the package. Pay special attention to files in man/ directories, which will be
manual pages, etc/ directories, which will be configuration files, and doc/, which will be more comprehensive
documentation.
If you are not sure which version of the application was just installed, a command like this
# pkg_info | grep -i foopackage
will find all the installed packages that have foopackage in the package name. Replace foopackage in your
command line as necessary.
125
Once you have identified where the applications manual pages have been installed, review them using man(1).
Similarly, look over the sample configuration files, and any additional documentation that may have been provided.
If the application has a web site, check it for additional documentation, frequently asked questions, and so forth. If
you are not sure of the web site address it may be listed in the output from
# pkg_info foopackage-1.0.0
A WWW: line, if present, should provide a URL for the applications web site.
Ports that should start at boot (such as Internet servers) will usually install a sample script in
/usr/local/etc/rc.d. You should review this script for correctness and edit or rename it if needed. See
Starting Services for more information.
126
The various components of the X Window System, and how they interoperate.
5.2 Understanding X
Using X for the first time can be somewhat of a shock to someone familiar with other graphical environments, such
as Microsoft Windows or MacOS.
It is not necessary to understand all of the details of various X components and how they interact; however, some
basic knowledge makes it possible to take advantage of Xs strengths.
5.2.1 Why X?
X is not the first window system written for Unix, but it is the most popular. Xs original development team had
worked on another window system before writing X. That systems name was W (for Window). X is just the
next letter in the Roman alphabet.
X can be called X, X Window System, X11, and other terms. Calling X11 X Windows can offend some
people; see X(7) for a bit more insight on this.
127
128
5.2.4 Widgets
The X approach of providing tools and not policy extends to the widgets that seen on screen in each application.
Widget is a term for all the items in the user interface that can be clicked or manipulated in some way; buttons,
check boxes, radio buttons, icons, lists, and so on. Microsoft Windows calls these controls.
Microsoft Windows and Apples MacOS both have a very rigid widget policy. Application developers are supposed
to ensure that their applications share a common look and feel. With X, it was not considered sensible to mandate a
particular graphical style, or set of widgets to adhere to.
As a result, do not expect X applications to have a common look and feel. There are several popular widget sets and
variations, including the original Athena widget set from MIT, Motif (on which the widget set in Microsoft Windows
was modeled, all bevelled edges and three shades of grey), OpenLook, and others.
Most newer X applications today will use a modern-looking widget set, either Qt, used by KDE, or GTK, used by
the GNOME project. In this respect, there is some convergence in look-and-feel of the Unix desktop, which
certainly makes things easier for the novice user.
129
Alternatively, either version of XFree86 can be installed directly from the FreeBSD binaries provided on the
XFree86 web site (http://www.XFree86.org/). A binary package to use with pkg_add(1) tool is also available for
XFree86 4.X. When the remote fetching feature of pkg_add(1) is used, the version number of the package must be
removed. pkg_add(1) will automatically fetch the latest version of the application. So to fetch and install the package
of XFree86 4.X, simply type:
# pkg_add -r XFree86
You can also use the ports collection to install XFree86 4.X, for that you simply need to type the following
commands:
# cd /usr/ports/x11/XFree86-4
# make install clean
Note: The examples above will install the complete XFree86 distribution including the servers, clients, fonts etc.
Separate packages and ports for different parts of XFree86 4.X are also available.
The rest of this chapter will explain how to configure XFree86, and how to setup a productive desktop environment.
Monitor specifications
The specifications for the monitor are used by XFree86 to determine the resolution and refresh rate to run at. These
specifications can usually be obtained from the documentation that came with the monitor or from the
manufacturers website. There are two ranges of numbers that are needed, the horizontal scan rate and the vertical
synchronization rate.
The video adapters chipset defines what driver module XFree86 uses to talk to the graphics hardware. With most
chipsets, this can be automatically determined, but it is still useful to know in case the automatic detection does not
work correctly.
130
This will generate a skeleton XFree86 configuration file in the /root directory called XF86Config.new (in fact the
directory used is the one covered by the environment variable $HOME, and it will depend from the way you got the
superuser rights). The XFree86 program will attempt to probe the graphics hardware on the system and will write a
configuration file to load the proper drivers for the detected hardware on the target system.
The next step is to test the existing configuration to verify that XFree86 can work with the graphics hardware on the
target system. To perform this task, the user needs to run:
# XFree86 -xf86config XF86Config.new
If a black and grey grid and an X mouse cursor appear, the configuration was successful. To exit the test, just press
Ctrl+Alt+Backspace simultaneously.
Note: If the mouse does not work, be sure the device has been configured. See Section 2.9.10 in the FreeBSD
install chapter.
Next, tune the XF86Config.new configuration file to taste. Open the file in a text editor such as emacs(1) or ee(1).
First, add the frequencies for the target systems monitor. These are usually expressed as a horizontal and vertical
synchronization rate. These values are added to the XF86Config.new file under the "Monitor" section:
Section "Monitor"
Identifier
VendorName
ModelName
HorizSync
VertRefresh
EndSection
"Monitor0"
"Monitor Vendor"
"Monitor Model"
30-107
48-120
The HorizSync and VertRefresh keywords may not exist in the configuration file. If they do not, they need to be
added, with the correct horizontal synchronization rate placed after the Horizsync keyword and the vertical
synchronization rate after the VertRefresh keyword. In the example above the target monitors rates were entered.
X allows DPMS (Energy Star) features to be used with capable monitors. The xset(1) program controls the time-outs
and can force standby, suspend, or off modes. If you wish to enable DPMS features for your monitor, you must add
the following line to the monitor section:
Option
"DPMS"
While the XF86Config.new configuration file is still open in an editor, select the default resolution and color depth
desired. This is defined in the "Screen" section:
131
The DefaultDepth keyword describes the color depth to run at by default. This can be overridden with the -bpp
command line switch to XFree86(1). The Modes keyword describes the resolution to run at for the given color depth.
Note that only VESA standard modes are supported as defined by the target systems graphics hardware. In the
example above, the default color depth is twenty-four bits per pixel. At this color depth, the accepted resolution is
one thousand twenty-four pixels by seven hundred and sixty-eight pixels.
Finally, write the configuration file and test it using the test mode given above. If all is well, the configuration file
needs to be installed in a common location where XFree86(1) can find it. This is typically /etc/X11/XF86Config
or /usr/X11R6/etc/X11/XF86Config.
# cp XF86Config.new /etc/X11/XF86Config
Once the configuration file has been placed in a common location, configuration is complete. In order to start
XFree86 4.X with startx(1), install the x11/wrapper port. XFree86 4.X can also be started with xdm(1).
Note: There is also a graphical tool for configuration, xf86cfg(1), that comes with the XFree86 4.X distribution. It
allows to interactively define your configuration by choosing the appropiate drivers and settings. This program
can be used under console as well, just use the command xf86cfg -textmode. For more details, refer to the
xf86cfg(1) manual page.
in your kernel configuration file and rebuild a new kernel. Instead, you may want to load the agp.ko kernel module
automatically with the loader(8) at boot time. For that, simply add this line to /boot/loader.conf:
agp_load="YES"
Next, if you are running FreeBSD 4.X or earlier, a device node needs to be created for the programming interface. To
create the AGP device node, run MAKEDEV(8) in the /dev directory:
132
Note: FreeBSD 5.X or later will use devfs(5) to allocate device nodes transparently, therefore the MAKEDEV(8)
step is not required.
This will allow configuration of the hardware as any other graphics board. Note on systems without the agp(4) driver
compiled in the kernel, trying to load the module with kldload(8) will not work. This driver has to be in the kernel at
boot time through being compiled in or using /boot/loader.conf.
If you are using XFree86 4.1.0 (or later) and messages about unresolved symbols like fbPictureInit appear, try
adding the following line after Driver "i810" in the XFree86 configuration file:
Option "NoDDC"
And likewise with the freefont or other collections. To tell the X server that these fonts exist, add an appropriate line
to the XF86Config file (in /etc/ for XFree86 version 3, or in /etc/X11/ for version 4), which reads:
FontPath "/usr/X11R6/lib/X11/fonts/URW/"
133
"freetype"
For XFree86 3.3.X, a separate TrueType font server is needed. Xfstt is commonly used for this purpose. To install
Xfstt, simply install the port x11-servers/Xfstt.
Now make a directory for the TrueType fonts (for example, /usr/X11R6/lib/X11/fonts/TrueType) and copy
all of the TrueType fonts into this directory. Keep in mind that TrueType fonts cannot be directly taken from a
Macintosh; they must be in Unix/DOS/Windows format for use by XFree86. Once the files have been copied into
this directory, use ttmkfdir to create a fonts.dir file, so that the X font renderer knows that these new files have
been installed. ttmkfdir is available from the FreeBSD Ports Collection as x11-fonts/ttmkfdir.
# cd /usr/X11R6/lib/X11/fonts/TrueType
# ttmkfdir > fonts.dir
Now add the TrueType directory to the font path. This is just the same as described above for Type1 fonts, that is, use
% xset fp+ /usr/X11R6/lib/X11/fonts/TrueType
% xset fp rehash
134
As previously stated, all fonts in /usr/X11R6/lib/X11/fonts/ as well as ~/.fonts/ are already made available
to Xft-aware applications. If you wish to add another directory outside of these two directory trees, add a line similar
to the following to /usr/X11R6/etc/fonts/local.conf:
<dir>/path/to/my/fonts</dir>
After adding new fonts, and especially new font directories, you should run the following command to rebuild the
font caches:
# fc-cache -f
Anti-aliasing makes borders slightly fuzzy, which makes very small text more readable and removes staircases
from large text, but can cause eyestrain if applied to normal text. To exclude point sizes smaller than 14 point from
anti-aliasing, include these lines:
<match target="font">
<test name="size" compare="less">
<double>14</double>
</test>
<edit name="antialias" mode="assign">
<bool>false</bool>
</edit>
</match>
Spacing for some monospaced fonts may also be inappropriate with anti-aliasing. This seems to be an issue with
KDE, in particular. One possible fix for this is to force the spacing for such fonts to be 100. Add the following lines:
<match target="pattern" name="family">
<test qual="any" name="family">
<string>fixed</string>
</test>
<edit name="family" mode="assign">
<string>mono</string>
</edit>
</match>
<match target="pattern" name="family">
<test qual="any" name="family">
<string>console</string>
</test>
<edit name="family" mode="assign">
<string>mono</string>
</edit>
</match>
(this aliases the other common names for fixed fonts as "mono"), and then add:
135
Certain fonts, such as Helvetica, may have a problem when anti-aliased. Usually this manifests itself as a font that
seems cut in half vertically. At worst, it may cause applications such as Mozilla to crash. To avoid this, consider
adding the following to local.conf:
<match target="pattern" name="family">
<test qual="any" name="family">
<string>Helvetica</string>
</test>
<edit name="family" mode="assign">
<string>sans-serif</string>
</edit>
</match>
Once you have finished editing local.conf make sure you end the file with the </fontconfig> tag. Not doing
this will cause your changes to be ignored.
The default font set that comes with XFree86 is not very desirable when it comes to anti-aliasing. A much better set
of default fonts can be found in the x11-fonts/bitstream-vera port. This port will install a
/usr/X11R6/etc/fonts/local.conf file if one does not exist already. If the file does exist, the port will create a
/usr/X11R6/etc/fonts/local.conf-vera file. Merge the contents of this file into
/usr/X11R6/etc/fonts/local.conf, and the Bitstream fonts will automatically replace the default XFree86
Serif, Sans Serif, and Monospaced fonts.
Finally, users can add their own settings via their personal .fonts.conf files. To do this, each user should simply
create a ~/.fonts.conf. This file must also be in XML format.
One last point: with an LCD screen, sub-pixel sampling may be desired. This basically treats the (horizontally
separated) red, green and blue components separately to improve the horizontal resolution; the results can be
dramatic. To enable this, add the line somewhere in the local.conf file:
<match target="font">
<test qual="all" name="rgba">
<const>unknown</const>
</test>
<edit name="rgba" mode="assign">
<const>rgb</const>
</edit>
</match>
Note: Depending on the sort of display, rgb may need to be changed to bgr, vrgb or vbgr: experiment and see
which works best.
136
5.6.1 Overview
The X Display Manager (XDM) is an optional part of the X Window System that is used for login session
management. This is useful for several types of situations, including minimal X Terminals, desktops, and large
network display servers. Since the X Window System is network and protocol independent, there are a wide variety
of possible configurations for running X clients and servers on different machines connected by a network. XDM
provides a graphical interface for choosing which display server to connect to, and entering authorization
information such as a login and password combination.
Think of XDM as providing the same functionality to the user as the getty(8) utility (see Section 17.3.2 for details).
That is, it performs system logins to the display being connected to and then runs a session manager on behalf of the
user (usually an X window manager). XDM then waits for this program to exit, signaling that the user is done and
should be logged out of the display. At this point, XDM can display the login and display chooser screens for the
next user to login.
"/usr/X11R6/bin/xdm -nodaemon"
xterm
off secure
By default this entry is disabled; in order to enable it change field 5 from off to on and restart init(8) using the
directions in Section 17.3.2.2. The first field, the name of the terminal this program will manage, is ttyv8. This
means that XDM will start running on the 9th virtual terminal.
Description
137
Description
Xaccess
Xresources
Xservers
Xsession
Xsetup_*
xdm-config
xdm-errors
xdm-pid
Also in this directory are a few scripts and programs used to setup the desktop when XDM is running. The purpose
of each of these files will be briefly described. The exact syntax and usage of all of these files is described in xdm(1).
The default configuration is a simple rectangular login window with the hostname of the machine displayed at the
top in a large font and Login: and Password: prompts below. This is a good starting point for changing the look
and feel of XDM screens.
5.6.3.1 Xaccess
The protocol for connecting to XDM controlled displays is called the X Display Manager Connection Protocol
(XDMCP). This file is a ruleset for controlling XDMCP connections from remote machines. By default, it allows any
client to connect, but that does not matter unless the xdm-config is changed to listen for remote connections.
5.6.3.2 Xresources
This is an application-defaults file for the display chooser and the login screens. This is where the appearance of the
login program can be modified. The format is identical to the app-defaults file described in the XFree86
documentation.
5.6.3.3 Xservers
This is a list of the remote displays the chooser should provide as choices.
5.6.3.4 Xsession
This is the default session script for XDM to run after a user has logged in. Normally each user will have a
customized session script in ~/.xsession that overrides this script.
5.6.3.5 Xsetup_*
These will be run automatically before displaying the chooser or login interfaces. There is a script for each display
being used, named Xsetup_ followed by the local display number (for instance Xsetup_0). Typically these scripts
will run one or two programs in the background such as xconsole.
138
5.6.3.7 xdm-errors
This contains the output of the X servers that XDM is trying to run. If a display that XDM is trying to start hangs for
some reason, this is a good place to look for error messages. These messages are also written to the users
~/.xsession-errors file on a per-session basis.
and then restart XDM. Remember that comments in app-defaults files begin with a ! character, not the usual #.
More strict access controls may be desired. Look at the example entries in Xaccess, and refer to the xdm(1) manual
page.
5.7.1 GNOME
5.7.1.1 About GNOME
GNOME is a user-friendly desktop environment that enables users to easily use and configure their computers.
GNOME includes a panel (for starting applications and displaying status), a desktop (where data and applications
can be placed), a set of standard desktop tools and applications, and a set of conventions that make it easy for
139
Once GNOME is installed, the X server must be told to start GNOME instead of a default window manager. If a
custom .xinitrc is already in place, simply replace the line that starts the current window manager with one that
starts /usr/X11R6/bin/gnome-session instead. If nothing special has been done to configuration file, then it is
enough to simply type:
% echo "/usr/X11R6/bin/gnome-session" > ~/.xinitrc
Next, type startx, and the GNOME desktop environment will be started.
Note: If a display manager, like XDM, is being used, this will not work. Instead, create an executable .xsession
file with the same command in it. To do this, edit the file and replace the existing window manager command with
/usr/X11R6/bin/gnome-session:
Another option is to configure the display manager to allow choosing the window manager at login time; the section
on KDE details explains how to do this for kdm, the display manager of KDE.
140
5.7.2 KDE
5.7.2.1 About KDE
KDE is an easy to use contemporary desktop environment. Some of the things that KDE brings to the user are:
An integrated help system allowing for convenient, consistent access to help on the use of the KDE desktop and
its applications
KDE has an office application suite based on KDEs KParts technology consisting of a spread-sheet, a
presentation application, an organizer, a news client and more. KDE also comes with a web browser called
Konqueror, which represents a solid competitor to other existing web browsers on Unix systems. More information
on KDE can be found on the KDE website (http://www.kde.org/). For FreeBSD specific informations and resources
on KDE, consult the FreeBSD-KDE team (http://freebsd.kde.org/)s website.
After KDE has been installed, the X server must be told to launch this application instead of the default window
manager. This is accomplished by editing the .xinitrc file:
% echo "exec startkde" > ~/.xinitrc
Now, whenever the X Window System is invoked with startx, KDE will be the desktop.
If a display manager such as xdm is being used, the configuration is slightly different. Edit the .xsession file
instead. Instructions for kdm are described later in this chapter.
141
In a terminal window, as root, edit the file /usr/X11R6/lib/X11/xdm/Xsession. There is a section in the
middle like this:
case $# in
1)
case $1 in
failsafe)
exec xterm -geometry 80x24-0-0
;;
esac
esac
A few lines need to be added to this section. Assuming the labels from used were KDE and GNOME, use the
following:
case $# in
1)
case $1 in
kde)
142
For the KDE login-time desktop background to be honored, the following line needs to be added to
/usr/X11R6/lib/X11/xdm/Xsetup_0:
/usr/local/bin/kdmdesktop
Now, make sure kdm is listed in /etc/ttys to be started at the next bootup. To do this, simply follow the
instructions from the previous section on xdm and replace references to the /usr/X11R6/bin/xdm program with
/usr/local/bin/kdm.
5.7.4 XFce
5.7.4.1 About XFce
XFce is a desktop environment based on the GTK toolkit used by GNOME, but is much more lightweight and meant
for those who want a simple, efficient desktop which is nevertheless easy to use and configure. Visually, it looks very
much like CDE, found on commercial Unix systems. Some of XFces features are:
Main panel similar to CDE, with menus, applets and app launchers
Integrated window manager, file manager, sound manager, GNOME compliance module, and other things
Fast, light and efficient: ideal for older/slower machines or machines with memory limitations
143
Now, tell the X server to launch XFce the next time X is started. Simply type this:
% echo "/usr/X11R6/bin/startxfce" > ~/.xinitrc
The next time X is started, XFce will be the desktop. As before, if a display manager like xdm is being used, create
an .xsession, as described in the section on GNOME, but with the /usr/X11R6/bin/startxfce command; or,
configure the display manager to allow choosing a desktop at login time, as explained in the section on kdm.
144
6.1 Synopsis
One of the important aspects of FreeBSD is system configuration. Correct system configuration will help prevent
headaches during future upgrades. This chapter will explain much of the FreeBSD configuration process, including
some of the parameters which can be set to tune a FreeBSD system.
After reading this chapter, you will know:
Be familiar with keeping FreeBSD sources up to date (Chapter 21), and the basics of kernel
configuration/compilation (Chapter 9).
146
147
rc.conf:
. rc.conf.site
hostname="node15.example.com"
network_interfaces="fxp0 lo0"
ifconfig_fxp0="inet 10.1.1.1"
rc.conf.site:
defaultrouter="10.1.1.254"
saver="daemon"
blanktime="100"
The rc.conf.site file can then be distributed to every system using rsync or a similar program, while the
rc.conf file remains unique.
Upgrading the system using sysinstall(8) or make world will not overwrite the rc.conf file, so system
configuration information will not be lost.
1
1
1
1
1
1
1
root
root
root
root
root
root
root
wheel
wheel
wheel
wheel
wheel
wheel
wheel
2184
2184
9555
9555
12205
12205
2700
May
May
May
May
May
May
May
20
20
20
20
20
20
20
1998
1998
1998
1998
1998
1998
1998
access.conf
access.conf.default
httpd.conf
httpd.conf.default
magic
magic.default
mime.types
148
1 root
1 root
1 root
wheel
wheel
wheel
2700 May 20
7980 May 20
7933 May 20
1998 mime.types.default
1998 srm.conf
1998 srm.conf.default
The file sizes show that only the srm.conf file has been changed. A later update of the Apache port would not
overwrite this changed file.
The startup scripts of FreeBSD will look in /usr/local/etc/rc.d for scripts that have an .sh extension and are
executable by root. Those scripts that are found are called with an option start at startup, and stop at shutdown
to allow them to carry out their purpose. So if you wanted the above sample script to be picked up and run at the
proper time during system startup, you should save it to a file called FooBar.sh in /usr/local/etc/rc.d and
make sure it is executable. You can make a shell script executable with chmod(1) as shown below:
# chmod 755 FooBar.sh
Some services expect to be invoked by inetd(8) when a connection is received on a suitable port. This is common for
mail reader servers (POP and IMAP, etc.). These services are enabled by editing the file /etc/inetd.conf. See
inetd(8) for details on editing this file.
149
It is also possible to use the cron(8) daemon to start system services. This approach has a number of advantages, not
least being that because cron(8) runs these processes as the owner of the crontab, services may be started and
maintained by non-root users.
This takes advantage of a feature of cron(8): the time specification may be replaced by @reboot, which will cause
the job to be run when cron(8) is started shortly after system boot.
Like most FreeBSD configuration files, the # character represents a comment. A comment can be placed in the
file as a reminder of what and why a desired action is performed. Comments cannot be on the same line as a
command or else they will be interpreted as part of the command; they must be on a new line. Blank lines are
ignored.
First, the environment must be defined. The equals (= character is used to define any environment settings, as
with this example where it is used for the SHELL, PATH, and HOME options. If the shell line is omitted, cron will
150
This line defines a total of seven fields. Listed here are the values minute, hour, mday, month, wday, who, and
command. These are almost all self explanatory. Minute is the time in minutes the command will be run. Hour is
similar to the minute option, just in hours. Mday stands for day of the month. Month is similar to hour and
minute, as it designates the month. The wday options stands for day of the week. All these fields must be
numeric values, and follow the twenty-four hour clock. The who field is special, and only exists in the
/etc/crontab file. This field specifies which user the command should be run as. When a user installs his or
her crontab file, they will not have this option. Finally, the command option is listed. This is the last field, so
naturally it should designate the command to be executed.
This last line will define the values discussed above. Notice here we have a */5 listing, followed by several
more * characters. These * characters mean first-last, and can be interpreted as every time. So, judging by this
line, its apparent that the atrun command is to be invoked by root every five minutes regardless of what day or
month it is. For more information on the atrun, see the atrun(8) manual page.
Commands can have any number of flags passed to them; however, commands which extend to multiple lines
need to be broken with the backslash \ continuation character.
This is the basic set up for every crontab file, although there is one thing different about this one. Field number six,
where we specified the username, only exists in the system /etc/crontab file. This field should be omitted for
individual user crontab files.
There is also an option to list installed crontab files, just pass the -l to crontab and look over the output.
Users who wish to begin their own crontab file from scratch, without the use of a template, the crontab -e option
is available. This will invoke the selected editor with an empty file. When the file is saved, it will be automatically
installed by the crontab command.
This procedure is similar for other services. Of course, services are usually started automatically as specified in
rc.conf(5). For example, enabling the Network Address Translation daemon at startup is as simple as adding the
following line to /etc/rc.conf:
151
If a natd_enable="NO" line is already present, then simply change the NO to YES. The rc scripts will automatically
load any other dependent services during the next reboot, as described below.
Since the rc.d system is primarily intended to start/stop services at system startup/shutdown time; the standard
start, stop and restart options will only perform their action if the appropriate /etc/rc.conf variables are
set. For instance the above sshd restart command will only work if sshd_enable is set to YES in
/etc/rc.conf. To start, stop or restart a service regardless of the settings in /etc/rc.conf, the commands
should be prefixed with force. For instance to restart sshd regardless of the current /etc/rc.conf setting,
execute the following command:
# /etc/rc.d/sshd forcerestart
Its easy to check if a service is enabled in /etc/rc.conf by running the appropriate rc.d script with the option
rcvar. Thus, an administrator can check that sshd is in fact enabled in /etc/rc.conf by running:
# /etc/rc.d/sshd rcvar
# sshd
$sshd_enable=YES
Note: The second line (# sshd) is the output from the sshd command; not a root console.
To determine if a service is running, a status option is available. For instance to verify that sshd is actually started:
# /etc/rc.d/sshd status
It is also possible to reload a service. This will attempt to send a signal to an individual service, forcing the service
to reload its configuration files. In most cases this means sending the service a SIGHUP signal.
The rcNG structure is not only used for network services, it also contributes to most of the system initialization. For
instance, consider the bgfsck file. When this script is executed, it will print out the following message:
Starting background file system checks in 60 seconds.
Therefore this file is used for background file system checks, which are done only during system initialization.
Many system services depend on other services to function properly. For example, NIS and other RPC-based services
may fail to start until after the rpcbind (portmapper) service has started. To resolve this issue, information about
dependencies and other meta-data is included in the comments at the top of each startup script. The rcorder(8) script
is then used to parse these comments during system initialization to determine the order in which system services
should be invoked to satisfy the dependencies. The following words may be included at the top of each startup file :
REQUIRE: Name of services which may be required for this service to function
152
the supported chipsets/cards. If you have doubts about which driver is the correct one, read the manual page of the
driver. The manual page will give you more information about the supported hardware and even the possible
problems that could occur.
If you own a common card, most of the time you will not have to look very hard for a driver. Drivers for common
network cards are present in the GENERIC kernel, so your card should show up during boot, like so:
dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38
000ff irq 15 at device 11.0 on pci0
dc0: Ethernet address: 00:a0:cc:da:da:da
miibus0: <MII bus> on dc0
ukphy0: <Generic IEEE 802.3u media interface> on miibus0
ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30
000ff irq 11 at device 12.0 on pci0
dc1: Ethernet address: 00:a0:cc:da:da:db
miibus1: <MII bus> on dc1
ukphy1: <Generic IEEE 802.3u media interface> on miibus1
ukphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
In this example, we see that two cards using the dc(4) driver are present on the system.
To use your network card, you will need to load the proper driver. This may be accomplished in one of two ways.
The easiest way is to simply load a kernel module for your network card with kldload(8). A module is not available
for all network card drivers (ISA cards and cards using the ed(4) driver, for example). Alternatively, you may
statically compile the support for your card into your kernel. Check /usr/src/sys/i386/conf/LINT and the
manual page of the driver to know what to add in your kernel configuration file. For more information about
recompiling your kernel, please see Chapter 9. If your card was detected at boot by your kernel (GENERIC) you do
not have to build a new kernel.
153
Note: Old versions of FreeBSD may require the -a option following ifconfig(8), for more details about the correct
syntax of ifconfig(8), please refer to the manual page. Note also that entries concerning IPv6 (inet6 etc.) were
omitted in this example.
dc1:
lp0:
lo0:
tun0:
FreeBSD uses the driver name followed by the order in which one the card is detected at the kernel boot to name the
network card. For example sis2 would be the third network card on the system using the sis(4) driver.
In this example, the dc0 device is up and running. The key indicators are:
1. UP means that the card is configured and ready.
2. The card has an Internet (inet) address (in this case 192.168.1.3).
3. It has a valid subnet mask (netmask; 0xffffff00 is the same as 255.255.255.0).
4. It has a valid broadcast address (in this case, 192.168.1.255).
5. The MAC address of the card (ether) is 00:a0:cc:da:da:da
154
You have to replace dc0, dc1, and so on, with the correct device for your cards, and the addresses with the proper
ones. You should read the card driver and ifconfig(8) manual pages for more details about the allowed options and
also rc.conf(5) manual page for more information on the syntax of /etc/rc.conf.
If you configured the network during installation, some lines about the network card(s) may be already present.
Double check /etc/rc.conf before adding any lines.
You will also have to edit the file /etc/hosts to add the names and the IP addresses of various machines of the
LAN, if they are not already there. For more information please refer to hosts(5) and to
/usr/share/examples/etc/hosts.
155
ms
ms
ms
ms
ms
--- 192.168.1.2 ping statistics --5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms
You could also use the machine name instead of 192.168.1.2 if you have set up the /etc/hosts file.
6.8.3.2 Troubleshooting
Troubleshooting hardware and software configurations is always a pain, and a pain which can be alleviated by
checking the simple things first. Is your network cable plugged in? Have you properly configured the network
services? Did you configure the firewall correctly? Is the card you are using supported by FreeBSD? Always check
the hardware notes before sending off a bug report. Update your version of FreeBSD to the latest STABLE version.
Check the mailing list archives, or perhaps search the Internet.
If the card works, yet performance is poor, it would be worthwhile to read over the tuning(7) manual page. You can
also check the network configuration as incorrect network settings can cause slow connections.
Some users experience one or two device timeouts, which is normal for some cards. If they continue, or are
bothersome, you may wish to be sure the device is not conflicting with another device. Double check the cable
connections. Perhaps you may just need to get another card.
At times, users see a few watchdog timeout errors. The first thing to do here is to check your network cable. Many
cards require a PCI slot which supports Bus Mastering. On some old motherboards, only one PCI slot allows it
(usually slot 0). Check the network card and the motherboard documentation to determine if that may be the problem.
No route to host messages occur if the system is unable to route a packet to the destination host. This can happen if
no default route is specified, or if a cable is unplugged. Check the output of netstat -rn and make sure there is a
valid route to the host you are trying to reach. If there is not, read on to Chapter 19.
ping: sendto: Permission denied error messages are often caused by a misconfigured firewall. If ipfw is enabled in
the kernel but no rules have been defined, then the default policy is to deny all traffic, even ping requests! Read on to
Section 10.7 for more information.
156
Note that alias entries must start with alias0 and proceed upwards in order, (for example, _alias1, _alias2, and so on).
The configuration process will stop at the first missing number.
The calculation of alias netmasks is important, but fortunately quite simple. For a given interface, there must be one
address which correctly represents the networks netmask. Any other addresses which fall within this network must
have a netmask of all 1s.
For example, consider the case where the fxp0 interface is connected to two networks, the 10.1.1.0 network with
a netmask of 255.255.255.0 and the 202.0.75.16 network with a netmask of 255.255.255.240. We want the
system to appear at 10.1.1.1 through 10.1.1.5 and at 202.0.75.17 through 202.0.75.20.
The following entries configure the adapter correctly for this arrangement:
ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0"
ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255"
ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255"
ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255"
ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255"
ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240"
ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255"
ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255"
ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"
157
/usr/local/etc
/usr/local/etc/rc.d
/var/db
6.10.2 Hostnames
6.10.2.1 /etc/resolv.conf
/etc/resolv.conf dictates how FreeBSDs resolver accesses the Internet Domain Name System (DNS).
search
domain
A typical resolv.conf:
search example.com
nameserver 147.11.1.11
nameserver 147.11.100.30
Note: Only one of the search and domain options should be used.
If you are using DHCP, dhclient(8) usually rewrites resolv.conf with information received from the DHCP server.
6.10.2.2 /etc/hosts
/etc/hosts is a simple text database reminiscent of the old Internet. It works in conjunction with DNS and NIS
providing name to IP address mappings. Local computers connected via a LAN can be placed in here for simplistic
naming purposes instead of setting up a named(8) server. Additionally, /etc/hosts can be used to provide a local
record of Internet names, reducing the need to query externally for commonly accessed names.
#
#
#
#
#
#
$FreeBSD$
Host Database
This file should contain the addresses and aliases
for local hosts that share this file.
In the presence of the domain name service or NIS, this file may
158
For example:
10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2
159
6.10.3.2 newsyslog.conf
newsyslog.conf is the configuration file for newsyslog(8), a program that is normally scheduled to run by cron(8).
newsyslog(8) determines when log files require archiving or rearranging. logfile is moved to logfile.0,
logfile.0 is moved to logfile.1, and so on. Alternatively, the log files may be archived in gzip(1) format
causing them to be named: logfile.0.gz, logfile.1.gz, and so on.
newsyslog.conf indicates which log files are to be managed, how many are to be kept, and when they are to be
touched. Log files can be rearranged and/or archived when they have either reached a certain size, or at a certain
periodic time/date.
# configuration file for newsyslog
# $FreeBSD$
#
# filename
[owner:group]
/var/log/cron
/var/log/amd.log
/var/log/kerberos.log
/var/log/lpd-errs
/var/log/maillog
/var/log/sendmail.st
/var/log/messages
/var/log/all.log
/var/log/slip.log
/var/log/ppp.log
/var/log/security
/var/log/wtmp
160
640
640
640
640
7
5
12
5
*
1
*
100
@T00
$W6D0
$M1D0
*
Z
Z
Z
Z
6.10.4 sysctl.conf
sysctl.conf looks much like rc.conf. Values are set in a variable=value form. The specified values are set
after the system goes into multi-user mode. Not all variables are settable in this mode.
A sample sysctl.conf turning off logging of fatal signal exits and letting Linux programs know they are really
running under FreeBSD:
kern.logsigexit=0
# Do not log fatal signal exits (e.g. sig 11)
compat.linux.osname=FreeBSD
compat.linux.osrelease=4.3-STABLE
Settings of sysctl variables are usually either strings, numbers, or booleans (a boolean being 1 for yes or a 0 for no).
161
Cases like the one above usually require the modification of some default sysctl(8) settings which are set read only.
To overcome these situations a user can put sysctl(8) OIDs in their local /boot/loader.conf.local. Default
settings are located in the /boot/defaults/loader.conf file.
Fixing the problem mentioned above would require a user to set hw.pci.allow_unsupported_io_range=1 in
the aforementioned file. Now cardbus(4) will work properly.
6.12.1.2 vfs.write_behind
The vfs.write_behind sysctl variable defaults to 1 (on). This tells the file system to issue media writes as full
clusters are collected, which typically occurs when writing large sequential files. The idea is to avoid saturating the
buffer cache with dirty buffers when it would not benefit I/O performance. However, this may stall processes and
under certain circumstances you may wish to turn it off.
6.12.1.3 vfs.hirunningspace
The vfs.hirunningspace sysctl variable determines how much outstanding write I/O may be queued to disk
controllers system-wide at any given instance. The default is usually sufficient but on machines with lots of disks you
may want to bump it up to four or five megabytes. Note that setting too high a value (exceeding the buffer caches
write threshold) can lead to extremely bad clustering performance. Do not set this value arbitrarily high! Higher
write values may add latency to reads occurring at the same time.
162
6.12.1.4 vm.swap_idle_enabled
The vm.swap_idle_enabled sysctl variable is useful in large multi-user systems where you have lots of users
entering and leaving the system and lots of idle processes. Such systems tend to generate a great deal of continuous
pressure on free memory reserves. Turning this feature on and tweaking the swapout hysteresis (in idle seconds) via
vm.swap_idle_threshold1 and vm.swap_idle_threshold2 allows you to depress the priority of memory
pages associated with idle processes more quickly then the normal pageout algorithm. This gives a helping hand to
the pageout daemon. Do not turn this option on unless you need it, because the tradeoff you are making is essentially
pre-page memory sooner rather than later; thus eating more swap and disk bandwidth. In a small system this option
will have a determinable effect but in a large system that is already doing moderate paging this option allows the VM
system to stage whole processes into and out of memory easily.
6.12.1.5 hw.ata.wc
FreeBSD 4.3 flirted with turning off IDE write caching. This reduced write bandwidth to IDE disks but was
considered necessary due to serious data consistency issues introduced by hard drive vendors. The problem is that
IDE drives lie about when a write completes. With IDE write caching turned on, IDE hard drives not only write data
to disk out of order, but will sometimes delay writing some blocks indefinitely when under heavy disk loads. A crash
or power failure may cause serious file system corruption. FreeBSDs default was changed to be safe. Unfortunately,
the result was such a huge performance loss that we changed write caching back to on by default after the release.
You should check the default on your system by observing the hw.ata.wc sysctl variable. If IDE write caching is
turned off, you can turn it back on by setting the kernel variable back to 1. This must be done from the boot loader at
boot time. Attempting to do it after the kernel boots will have no effect.
For more information, please see ata(4).
A filesystem cannot be modified with tunefs(8) while it is mounted. A good time to enable Soft Updates is before
any partitions have been mounted, in single-user mode.
163
Soft Updates drastically improves meta-data performance, mainly file creation and deletion, through the use of a
memory cache. We recommend to use Soft Updates on all of your file systems. There are two downsides to Soft
Updates that you should be aware of: First, Soft Updates guarantees filesystem consistency in the case of a crash but
could very easily be several seconds (even a minute!) behind updating the physical disk. If your system crashes you
may lose more work than otherwise. Secondly, Soft Updates delays the freeing of filesystem blocks. If you have a
filesystem (such as the root filesystem) which is almost full, performing a major update, such as make
installworld, can cause the filesystem to run out of space and the update to fail.
6.12.2.1 More Details about Soft Updates
There are two traditional approaches to writing a file systems meta-data back to disk. (Meta-data updates are updates
to non-content data like inodes or directories.)
Historically, the default behavior was to write out meta-data updates synchronously. If a directory had been changed,
the system waited until the change was actually written to disk. The file data buffers (file contents) were passed
through the buffer cache and backed up to disk later on asynchronously. The advantage of this implementation is that
it operates safely. If there is a failure during an update, the meta-data are always in a consistent state. A file is either
created completely or not at all. If the data blocks of a file did not find their way out of the buffer cache onto the disk
by the time of the crash, fsck(8) is able to recognize this and repair the filesystem by setting the file length to 0.
Additionally, the implementation is clear and simple. The disadvantage is that meta-data changes are slow. An rm
-r, for instance, touches all the files in a directory sequentially, but each directory change (deletion of a file) will be
written synchronously to the disk. This includes updates to the directory itself, to the inode table, and possibly to
indirect blocks allocated by the file. Similar considerations apply for unrolling large hierarchies ( tar -x).
The second case is asynchronous meta-data updates. This is the default for Linux/ext2fs and mount -o async for
*BSD ufs. All meta-data updates are simply being passed through the buffer cache too, that is, they will be
intermixed with the updates of the file content data. The advantage of this implementation is there is no need to wait
until each meta-data update has been written to disk, so all operations which cause huge amounts of meta-data
updates work much faster than in the synchronous case. Also, the implementation is still clear and simple, so there is
a low risk for bugs creeping into the code. The disadvantage is that there is no guarantee at all for a consistent state of
the filesystem. If there is a failure during an operation that updated large amounts of meta-data (like a power failure,
or someone pressing the reset button), the filesystem will be left in an unpredictable state. There is no opportunity to
examine the state of the filesystem when the system comes up again; the data blocks of a file could already have been
written to the disk while the updates of the inode table or the associated directory were not. It is actually impossible
to implement a fsck which is able to clean up the resulting chaos (because the necessary information is not available
on the disk). If the filesystem has been damaged beyond repair, the only choice is to use newfs(8) on it and restore it
from backup.
The usual solution for this problem was to implement dirty region logging, which is also referred to as journaling,
although that term is not used consistently and is occasionally applied to other forms of transaction logging as well.
Meta-data updates are still written synchronously, but only into a small region of the disk. Later on they will be
moved to their proper location. Because the logging area is a small, contiguous region on the disk, there are no long
distances for the disk heads to move, even during heavy operations, so these operations are quicker than synchronous
updates. Additionally the complexity of the implementation is fairly limited, so the risk of bugs being present is low.
A disadvantage is that all meta-data are written twice (once into the logging region and once to the proper location)
so for normal work, a performance pessimization might result. On the other hand, in case of a crash, all pending
164
Each open file, socket, or fifo uses one file descriptor. A large-scale production server may easily require many
thousands of file descriptors, depending on the kind and number of services running concurrently.
kern.maxfiles default value is dictated by the MAXUSERS option in your kernel configuration file.
kern.maxfiles grows proportionally to the value of MAXUSERS. When compiling a custom kernel, it is a good idea
to set this kernel configuration option according to the uses of your system. From this number, the kernel is given
165
6.13.1.2 kern.ipc.somaxconn
The kern.ipc.somaxconn sysctl variable limits the size of the listen queue for accepting new TCP connections.
The default value of 128 is typically too low for robust handling of new connections in a heavily loaded web server
environment. For such environments, it is recommended to increase this value to 1024 or higher. The service daemon
may itself limit the listen queue size (e.g. sendmail(8), or Apache) but will often have a directive in its configuration
file to adjust the queue size. Large listen queues also do a better job of avoiding Denial of Service (DoS) attacks.
For busy servers that make extensive use of the sendfile(2) system call, it may be necessary to increase the number of
sendfile(2) buffers via the NSFBUFS kernel configuration option or by setting its value in /boot/loader.conf (see
loader(8) for details). A common indicator that this parameter needs to be adjusted is when processes are seen in the
sfbufa state. The sysctl variable kern.ipc.nsfbufs is a read-only glimpse at the kernel configured variable. This
parameter nominally scales with kern.maxusers, however it may be necessary to tune accordingly.
Important: Even though a socket has been marked as non-blocking, calling sendfile(2) on the non-blocking
socket may result in the sendfile(2) call blocking until enough struct sf_bufs are made available.
6.13.2.1 net.inet.ip.portrange.*
The net.inet.ip.portrange.* sysctl variables control the port number ranges automatically bound to TCP and
UDP sockets. There are three ranges: a low range, a default range, and a high range. Most network programs use the
default range which is controlled by the net.inet.ip.portrange.first and
net.inet.ip.portrange.last, which default to 1024 and 5000, respectively. Bound port ranges are used for
166
product for each connection and limit the amount of data queued to the network to just the amount required to
maintain optimum throughput.
This feature is useful if you are serving data over modems, Gigabit Ethernet, or even high speed WAN links (or any
other link with a high bandwidth delay product), especially if you are also using window scaling or have configured a
large send window. If you enable this option, you should also be sure to set net.inet.tcp.inflight_debug to 0
(disable debugging), and for production use setting net.inet.tcp.inflight_min to at least 6144 may be
beneficial. However, note that setting high minimums may effectively disable bandwidth limiting depending on the
link. The limiting feature reduces the amount of data built up in intermediate route and switch packet queues as well
as reduces the amount of data built up in the local hosts interface queue. With fewer packets queued up, interactive
connections, especially over slow modems, will also be able to operate with lower Round Trip Times. However, note
that this feature only effects data transmission (uploading / server side). It has no effect on data reception
(downloading).
Adjusting net.inet.tcp.inflight_stab is not recommended. This parameter defaults to 20, representing 2
maximal packets added to the bandwidth delay product window calculation. The additional window is required to
stabilize the algorithm and improve responsiveness to changing conditions, but it can also result in higher ping times
over slow links (though still much lower than you would get without the inflight algorithm). In such cases, you may
wish to try reducing this parameter to 15, 10, or 5; and may also have to reduce net.inet.tcp.inflight_min
(for example, to 3500) to get the desired effect. Reducing these parameters should be done as a last resort only.
167
6.14.3 Swapfiles
You can create a file of a specified size to use as a swap file. In our example here we will use a 64MB file called
/usr/swap0. You can use any name you want, of course.
Example 6-1. Creating a Swapfile on FreeBSD 4.X
1. Be certain that your kernel configuration includes the vnode driver. It is not in recent versions of GENERIC.
pseudo-device
vn 1
2. create a vn-device:
# cd /dev
# sh MAKEDEV vn0
md
# Memory "disks"
168
169
In the simplest form, ACPI can be used to put the system into a sleep mode with acpiconf(8), the -s flag, and a 1-5
option. Most users will only need 1. Option 5 will do a soft-off which is the same action as:
# halt -p
The other options are available. Check out the acpiconf(8) manual page for more information.
FreeBSD 5.1-RELEASE and later come with a boot-time menu that controls how FreeBSD is booted. One of the
proposed options is to turn off ACPI. So to disable ACPI just select 2. Boot FreeBSD with ACPI disabled in the
menu.
170
What the components of the FreeBSD bootstrap system are, and how they interact.
The options you can give to the components in the FreeBSD bootstrap to control the boot process.
171
7.3 The MBR, and Boot Stages One, Two, and Three
7.3.1 MBR, /boot/boot0
The FreeBSD MBR is located in /boot/boot0. This is a copy of the MBR, as the real MBR must be placed on a
special part of the disk, outside the FreeBSD area.
boot0 is very simple, since the program in the MBR can only be 512 bytes in size. If you have installed the
FreeBSD MBR and have installed multiple operating systems on your hard disks then you will see a display similar
to this one at boot time:
Example 7-1. boot0 Screenshot
F1
F2
F3
F4
F5
DOS
FreeBSD
Linux
??
Drive 1
Default: F2
Other operating systems, in particular Windows 95, have been known to overwrite an existing MBR with their own.
If this happens to you, or you want to replace your existing MBR with the FreeBSD MBR then use the following
command:
# fdisk -B -b /boot/boot0 device
Where device is the device that you boot from, such as ad0 for the first IDE disk, ad2 for the first IDE disk on a
second IDE controller, da0 for the first SCSI disk, and so on.
If you are a Linux user, however, and prefer that LILO control the boot process, you can edit the /etc/lilo.conf
file for FreeBSD, or select Leave The Master Boot Record Untouched during the FreeBSD installation
process. If you have installed the FreeBSD boot manager, you can boot back into Linux and modify the LILO
configuration file /etc/lilo.conf and add the following option:
other=/dev/hdXY
table=/dev/hdb
loader=/boot/chain.b
172
which will permit the booting of FreeBSD and Linux via LILO. In our example, we use XY to determine drive
number and partition. If you are using a SCSI drive, you will want to change /dev/hdXY to read something similar
to /dev/sdXY, which again uses the XY syntax. The loader=/boot/chain.b can be omitted if you have both
operating systems on the same drive. You can now run /sbin/lilo -v to commit your new changes to the system,
this should be verified with screen messages.
Since the loader is much more sophisticated, and provides a nice easy-to-use boot configuration, boot2 usually runs
it, but previously it was tasked to run the kernel directly.
Example 7-2. boot2 Screenshot
>> FreeBSD/i386 BOOT
Default: 0:ad(0,a)/kernel
boot:
If you ever need to replace the installed boot1 and boot2 use disklabel(8).
# disklabel -B diskslice
Where diskslice is the disk and slice you boot from, such as ad0s1 for the first slice on the first IDE disk.
Dangerously Dedicated Mode: If you use just the disk name, such as ad0, in the disklabel(8) command you will
create a dangerously dedicated disk, without slices. This is almost certainly not what you want to do, so make
sure you double check the disklabel(8) command before you press Return.
173
174
To unload your usual kernel and modules, and then load just your old (or another) kernel:
unload
load kernel.old
You can use kernel.GENERIC to refer to the generic kernel that comes on the install disk, or kernel.old to
refer to your previously installed kernel (when you have upgraded or configured your own kernel, for example).
Note: Use the following to load your usual modules with another kernel:
unload
set kernel="kernel.old"
boot-conf
To load a kernel configuration script (an automated script which does the things you would normally do in the
kernel boot-time configurator):
load -t userconfig_script /boot/kernel.conf
175
during kernel initialization, ask for the device to mount as the root file system.
-C
During initial system startup, the boot loader(8) will read the device.hints(5) file. This file stores kernel boot
information known as variables, sometimes referred to as device hints. These device hints are used by device
drivers for device configuration.
Device hints may also be specified at the Stage 3 boot loader prompt. Variables can be added using set, removed
with unset, and viewed with the show commands. Variables set in the /boot/device.hints file can be
176
port:
irq:
drq:
maddr:
flags:
disabled: if
Device drivers may accept (or require) more hints not listed here, viewing their manual page is recommended. For
more information, consult the device.hints(5), kenv(1), loader.conf(5), and loader(8) manual pages.
177
Note: An insecure console means that you consider your physical security to the console to be insecure, and
want to make sure only someone who knows the root password may use single-user mode, and it does not
mean that you want to run your console insecurely. Thus, if you want security, choose insecure, not secure.
178
8.1 Synopsis
FreeBSD allows multiple users to use the computer at the same time. Obviously, only one of those users can be
sitting in front of the screen and keyboard at any one time 1, but any number of users can log in through the network
to get their work done. To use the system every user must have an account.
After reading this chapter, you will know:
How to change account details, such as the users full name, or preferred shell.
How to set limits on a per-account basis, to control the resources such as memory and CPU time that accounts and
groups of accounts are allowed to access.
8.2 Introduction
All access to the system is achieved via accounts, and all processes are run by users, so user and account
management are of integral importance on FreeBSD systems.
Every account on a FreeBSD system has certain information associated with it to identify the account.
User name
The user name as it would be typed at the login: prompt. User names must be unique across the computer;
you may not have two users with the same user name. There are a number of rules for creating valid user names,
documented in passwd(5); you would typically use user names that consist of eight or fewer all lower case
characters.
Password
Each account has a password associated with it. The password may be blank, in which case no password will be
required to access the system. This is normally a very bad idea; every account should have a password.
179
180
user becomes.
Summary
adduser(8)
181
Summary
rmuser(8)
chpass(1)
passwd(1)
pw(8)
8.6.1 adduser
adduser(8) is a simple program for adding new users. It creates entries in the system passwd and group files. It will
also create a home directory for the new user, copy in the default configuration files (dotfiles) from
/usr/share/skel, and can optionally mail the new user a welcome message.
To create the initial configuration file, use adduser -s -config_create. 2 Next, we configure adduser(8)
defaults, and create our first user account, since using root for normal usage is evil and nasty.
Example 8-1. Configuring adduser
# adduser -v
Use option -silent if you dont want to see all warnings and questions.
Check /etc/shells
Check /etc/master.passwd
Check /etc/group
Enter your default shell: csh date no sh tcsh zsh [sh]: zsh
Your default shell is: zsh -> /usr/local/bin/zsh
Enter your default HOME partition: [/home]:
Copy dotfiles from: /usr/share/skel no [/usr/share/skel]:
Send message from file: /etc/adduser.message no
[/etc/adduser.message]: no
Do not send message
Use passwords (y/n) [y]: y
Write your changes to /etc/adduser.conf? (y/n) [n]: y
Ok, lets go.
Dont worry about mistakes. I will give you the chance later to correct any input.
Enter username [a-z0-9_-]: jru
Enter full name []: J. Random User
Enter shell csh date no sh tcsh zsh [zsh]:
Enter home directory (full path) [/home/jru]:
Uid [1001]:
Enter login class: default []:
Login group jru [jru]:
Login group is jru. Invite jru into other groups: guest no
[no]: wheel
Enter password []:
Enter password again []:
Name:
jru
Password: ****
182
In summary, we changed the default shell to zsh (an additional shell found in the Ports Collection), and turned off the
sending of a welcome mail to added users. We then saved the configuration, created an account for jru, and made
sure jru is in wheel group (so that she may assume the role of root with the su(1) command.)
Note: The password you type in is not echoed, nor are asterisks displayed. Make sure you do not mistype the
password twice.
Note: Just use adduser(8) without arguments from now on, and you will not have to go through changing the
defaults. If the program asks you to change the defaults, exit the program, and try the -s option.
8.6.2 rmuser
You can use rmuser(8) to completely remove a user from the system. rmuser(8) performs the following steps:
1.
2.
3.
4.
5.
6.
Removes the incoming mail files belonging to the user from /var/mail.
7.
Removes all files owned by the user from temporary file storage areas such as /tmp.
8.
Finally, removes the username from all groups to which it belongs in /etc/group.
Note: If a group becomes empty and the group name is the same as the username, the group is removed; this
complements the per-user unique groups created by adduser(8).
183
8.6.3 chpass
chpass(1) changes user database information such as passwords, shells, and personal information.
Only system administrators, as the superuser, may change other users information and passwords with chpass(1).
When passed no options, aside from an optional username, chpass(1) displays an editor containing user information.
When the user exists from the editor, the user database is updated with the new information.
Example 8-3. Interactive chpass by Superuser
#Changing user database information for jru.
Login: jru
Password: *
Uid [#]: 1001
Gid [# or name]: 1001
Change [month day year]:
Expire [month day year]:
Class:
Home directory: /home/jru
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:
The normal user can change only a small subset of this information, and only for themselves.
184
Note: chfn(1) and chsh(1) are just links to chpass(1), as are ypchpass(1), ypchfn(1), and ypchsh(1). NIS support
is automatic, so specifying the yp before the command is not necessary. If this is confusing to you, do not worry,
NIS will be covered in Chapter 19.
8.6.4 passwd
passwd(1) is the usual way to change your own password as a user, or another users password as the superuser.
Note: Users must type in their original password before changing their password, to prevent an unauthorized
person from changing their password when the user is away from their console.
Note: As with chpass(1), yppasswd(1) is just a link to passwd(1), so NIS works with either command.
185
8.6.5 pw
pw(8) is a command line utility to create, remove, modify, and display users and groups. It functions as a front end to
the system user and group files. pw(8) has a very powerful set of command line options that make it suitable for use
in shell scripts, but new users may find it more complicated than the other commands presented here.
The limit on the size of a core file generated by a program is, for obvious reasons, subordinate to other limits on
disk usage (e.g., filesize, or disk quotas). Nevertheless, it is often used as a less-severe method of controlling
disk space consumption: since users do not generate core files themselves, and often do not delete them, setting
this may save them from running out of disk space should a large program (e.g., emacs) crash.
cputime
This is the maximum amount of CPU time a users process may consume. Offending processes will be killed by
the kernel.
186
filesize
This is the maximum size of a file the user may possess. Unlike disk quotas, this limit is enforced on individual
files, not the set of all files a user owns.
maxproc
This is the maximum number of processes a user may be running. This includes foreground and background
processes alike. For obvious reasons, this may not be larger than the system limit specified by the
kern.maxproc sysctl(8). Also note that setting this too small may hinder a users productivity: it is often
useful to be logged in multiple times or execute pipelines. Some tasks, such as compiling a large program, also
spawn multiple processes (e.g., make(1), cc(1), and other intermediate preprocessors).
memorylocked
This is the maximum amount a memory a process may have requested to be locked into main memory (e.g., see
mlock(2)). Some system-critical programs, such as amd(8), lock into main memory such that in the event of
being swapped out, they do not contribute to a systems trashing in time of trouble.
memoryuse
This is the maximum amount of memory a process may consume at any given time. It includes both core
memory and swap usage. This is not a catch-all limit for restricting memory consumption, but it is a good start.
openfiles
This is the maximum amount of files a process may have open. In FreeBSD, files are also used to represent
sockets and IPC channels; thus, be careful not to set this too low. The system-wide limit for this is defined by
the kern.maxfiles sysctl(8).
187
This is the limit on the amount of network memory, and thus mbufs, a user may consume. This originated as a
response to an old DoS attack by creating a lot of sockets, but can be generally used to limit network
communications.
stacksize
This is the maximum size a process stack may grow to. This alone is not sufficient to limit the amount of
memory a program may use; consequently, it should be used in conjunction with other limits.
There are a few other things to remember when setting resource limits. Following are some general tips, suggestions,
and miscellaneous comments.
Processes started at system startup by /etc/rc are assigned to the daemon login class.
Although the /etc/login.conf that comes with the system is a good source of reasonable values for most
limits, only you, the administrator, can know what is appropriate for your system. Setting a limit too high may
open your system up to abuse, while setting it too low may put a strain on productivity.
Users of the X Window System (X11) should probably be granted more resources than other users. X11 by itself
takes a lot of resources, but it also encourages users to run more programs simultaneously.
Remember that many limits apply to individual processes, not the user as a whole. For example, setting
openfiles to 50 means that each process the user runs may open up to 50 files. Thus, the gross amount of files a
user may open is the value of openfiles multiplied by the value of maxproc. This also applies to memory
consumption.
For further information on resource limits and login classes and capabilities in general, please consult the relevant
manual pages: cap_mkdb(1), getrlimit(2), login.conf(5).
8.9 Groups
A group is simply a list of users. Groups are identified by their group name and GID (Group ID). In FreeBSD (and
most other Unix systems), the two factors the kernel uses to decide whether a process is allowed to do something is
its user ID and list of groups it belongs to. Unlike a user ID, a process has a list of groups associated with it. You may
hear some things refer to the group ID of a user or process; most of the time, this just means the first group in the
list.
188
teamtwo:*:1100:
The number 1100 above is the group ID of the group teamtwo. Right now, teamtwo has no members, and is thus
rather useless. Lets change that by inviting jru to the teamtwo group.
Example 8-8. Adding Somebody to a Group Using pw(8)
# pw groupmod teamtwo -M jru
# pw groupshow teamtwo
teamtwo:*:1100:jru
The argument to the -M option is a comma-delimited list of users who are members of the group. From the preceding
sections, we know that the password file also contains a group for each user. The latter (the user) is automatically
added to the group list by the system; the user will not show up as a member when using the groupshow command
to pw(8), but will show up when the information is queried via id(1) or similar tool. In other words, pw(8) only
manipulates the /etc/group file; it will never attempt to read additionally data from /etc/passwd.
Example 8-9. Using id(1) to Determine Group Membership
% id jru
As you can see, jru is a member of the groups jru and teamtwo.
For more information about pw(8), see its manual page, and for more information on the format of /etc/group,
consult the group(5) manual page.
Notes
1. Well, unless you hook up multiple terminals, but we will save that for Chapter 17.
2. The -s makes adduser(8) default to quiet. We use -v later when we want to change defaults.
189
9.1 Synopsis
The kernel is the core of the FreeBSD operating system. It is responsible for managing memory, enforcing security
controls, networking, disk access, and much more. While more and more of FreeBSD becomes dynamically
configurable it is still occasionally necessary to reconfigure and recompile your kernel.
After reading this chapter, you will know:
How to use the kernel configuration file to create and build a new kernel.
Faster boot time. Since the kernel will only probe the hardware you have on your system, the time it takes your
system to boot will decrease dramatically.
Less memory usage. A custom kernel often uses less memory than the GENERIC kernel, which is important
because the kernel must always be present in real memory. For this reason, a custom kernel is especially useful on
a system with a small amount of RAM.
190
Additional hardware support. A custom kernel allows you to add in support for devices such as sound cards, which
are not present in the GENERIC kernel.
Everything inside a particular architectures directory deals with that architecture only; the rest of the code is
common to all platforms to which FreeBSD could potentially be ported. Notice the logical organization of the
directory structure, with each supported device, file system, and option in its own subdirectory. FreeBSD 5.X and up
has support for sparc64, and a few other architectures under development.
Note: If there is not a /usr/src/sys directory on your system, then the kernel source has not been installed.
The easiest way to do this is by running /stand/sysinstall as root, choosing Configure, then Distributions,
then src, then sys. If you have an aversion to sysinstall and you have access to an official FreeBSD CDROM,
then you can also install the source from the command line:
#
#
#
#
mount /cdrom
mkdir -p /usr/src/sys
ln -s /usr/src/sys /sys
cat /cdrom/src/ssys.[a-d]* | tar -xzvf -
Next, move to the arch/conf directory and copy the GENERIC configuration file to the name you want to give your
kernel. For example:
# cd /usr/src/sys/i386/conf
# cp GENERIC MYKERNEL
Traditionally, this name is in all capital letters and, if you are maintaining multiple FreeBSD machines with different
hardware, it is a good idea to name it after your machines hostname. We will call it MYKERNEL for the purpose of
this example.
Tip: Storing your kernel config file directly under /usr/src can be a bad idea. If you are experiencing problems it
can be tempting to just delete /usr/src and start again. Five seconds after you do that you realize that you have
deleted your custom kernel config file. Do not edit GENERIC directly, as it may get overwritten the next time you
update your source tree, and your kernel modifications will be lost.
You might want to keep your kernel config file elsewhere, and then create a symbolic link to the file in the i386
directory.
For example:
#
#
#
#
cd /usr/src/sys/i386/conf
mkdir /root/kernels
cp GENERIC /root/kernels/MYKERNEL
ln -s /root/kernels/MYKERNEL
191
Note: You must execute these and all of the following commands under the root account or you will get
permission denied errors.
Now, edit MYKERNEL with your favorite text editor. If you are just starting out, the only editor available will probably
be vi, which is too complex to explain here, but is covered well in many books in the bibliography. However,
FreeBSD does offer an easier editor called ee which, if you are a beginner, should be your editor of choice. Feel free
to change the comment lines at the top to reflect your configuration or the changes you have made to differentiate it
from GENERIC.
If you have built a kernel under SunOS or some other BSD operating system, much of this file will be very familiar
to you. If you are coming from some other operating system such as DOS, on the other hand, the GENERIC
configuration file might seem overwhelming to you, so follow the descriptions in the Configuration File section
slowly and carefully.
Note: Be sure to always check the file /usr/src/UPDATING, before you perform any update steps, in the case
you sync your source tree with the latest sources of the FreeBSD project. In this file all important issues with
updating FreeBSD are typed out. /usr/src/UPDATING always fits your version of the FreeBSD source, and is
therefore more accurate for new information than the handbook.
You must now compile the source code for the kernel. There are two procedures you can use to do this, and the one
you will use depends on why you are rebuilding the kernel, and the version of FreeBSD you are running.
If you have installed only the kernel source code, use procedure 1.
If you are running a FreeBSD version prior to 4.0, and you are not upgrading to FreeBSD 4.0 or higher using the
make world procedure, use procedure 1.
If you are building a new kernel without updating the source code (perhaps just to add a new option, such as
IPFIREWALL) you can use either procedure.
If you are rebuilding the kernel as part of a make world process, use procedure 2.
2.
Change into the build directory. This is printed out after running the aforementioned command.
# cd ../compile/MYKERNEL
3.
192
2.
3.
Note: In FreeBSD 4.2 and older you must replace KERNCONF= with KERNEL=. 4.2-STABLE that was fetched before
Feb 2nd, 2001 does not recognize KERNCONF=.
If you have not upgraded your source tree in any way (you have not run CVSup, CTM, or used anoncvs), then you
should use the config, make depend, make, make install sequence.
The new kernel will be copied to the root directory as /kernel and the old kernel will be moved to /kernel.old.
Now, shutdown the system and reboot to use your new kernel. In case something goes wrong, there are some
troubleshooting instructions at the end of this chapter. Be sure to read the section which explains how to recover in
case your new kernel does not boot.
Note: As of FreeBSD 5.0, kernels are installed along with their modules in /boot/kernel, and old kernels will be
backed up as /boot/kernel.old. Other files relating to the boot process, such as the boot loader(8) and
configuration are also stored in /boot. Third party or custom modules may be placed in /boot/modules,
although users should be aware that keeping modules in sync with the compiled kernel is very important.
Modules not intended to run with the compiled kernel may result in instability or incorrectness.
Note: If you have added any new devices (such as sound cards) and you are running FreeBSD 4.X or previous
versions, you may have to add some device nodes to your /dev directory before you can use them. For more
information, take a look at Making Device Nodes section later on in this chapter.
193
Quoting Numbers: In all versions of FreeBSD up to and including 3.X, config(8) required that any strings in the
configuration file that contained numbers used as text had to be enclosed in double quotes.
This requirement was removed in the 4.X branch, which this book covers, so if you are on a pre-4.X system, see
the /usr/src/sys/i386/conf/LINT and /usr/src/sys/i386/conf/GENERIC files on your system for examples.
The following is an example GENERIC kernel configuration file with various additional comments where needed for
clarity. This example should match your copy in /usr/src/sys/i386/conf/GENERIC fairly closely. For details
of all the possible kernel options, see /usr/src/sys/i386/conf/LINT.
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
The following are the mandatory keywords required in every kernel you build:
machine i386
This is the machine architecture. It must be either i386, pc98, sparc64, alpha, ia64, amd64, or powerpc.
cpu
cpu
cpu
I486_CPU
I586_CPU
I686_CPU
The above option specifies the type of CPU you have in your system. You may have multiple instances of the CPU
line (i.e., you are not sure whether you should use I586_CPU or I686_CPU), however, for a custom kernel, it is best
194
Install an older FreeBSD release and rebuild from source as described in Section 9.3.
Build the userland and kernel on a newer machine and install on the 386 using the precompiled /usr/obj files.
Roll your own release of FreeBSD which includes I386_CPU support in the kernels of the installation CD-ROM.
The first of these options is probably the easiest of all, but you will need a lot of disk space on a 386-class machine
which may be difficult to find.
ident
GENERIC
This is the identification of the kernel. You should change this to whatever you named your kernel, i.e. MYKERNEL if
you have followed the instructions of the previous examples. The value you put in the ident string will print when
you boot up the kernel, so it is useful to give the new kernel a different name if you want to keep it separate from
your usual kernel (i.e. you want to build an experimental kernel).
maxusers
The maxusers option sets the size of a number of important system tables. This number is supposed to be roughly
equal to the number of simultaneous users you expect to have on your machine.
Starting with FreeBSD 4.5, the system will auto-tune this setting for you if you explicitly set it to 01. In
FreeBSD-5.x, maxusers will default to 0 if not specified. If you are using an version of FreeBSD earlier than 4.5, or
you want to manage it yourself you will want to set maxusers to at least 4, especially if you are using the X Window
System or compiling software. The reason is that the most important table set by maxusers is the maximum number
of processes, which is set to 20 + 16 * maxusers, so if you set maxusers to 1, then you can only have 36
simultaneous processes, including the 18 or so that the system starts up at boot time, and the 15 or so you will
probably create when you start the X Window System. Even a simple task like reading a manual page will start up
nine processes to filter, decompress, and view it. Setting maxusers to 64 will allow you to have up to 1044
simultaneous processes, which should be enough for nearly all uses. If, however, you see the dreaded proc table full
error when trying to start another program, or are running a server with a large number of simultaneous users (like
ftp.FreeBSD.org), you can always increase the number and rebuild.
Note: maxusers does not limit the number of users which can log into your machine. It simply sets various table
sizes to reasonable values considering the maximum number of users you will likely have on your system and
how many processes each of them will be running. One keyword which does limit the number of simultaneous
remote logins and X terminal windows is pseudo-device pty 16.
195
In FreeBSD 5.x and newer versions the device.hints(5) is used to configure options of the device drivers. The default
location that loader(8) will check at boot time is /boot/device.hints. Using the hints option you can compile
these hints statically into your kernel. Then there is no need to create a device.hints file in /boot.
#makeoptions
DEBUG=-g
The normal build process of the FreeBSD does not include debugging information when building the kernel and
strips most symbols after the resulting kernel is linked, to save some space at the install location. If you are going to
do tests of kernels in the -CURRENT branch or develop changes of your own for the FreeBSD kernel, you might
want to uncomment this line. It will enable the use of the -g option which enables debugging information when
passed to gcc(1). The same can be accomplished by the config(8) -g option, if youre using the old procedure of
building your kernels (config; make depend; etc.).
options
MATH_EMULATE
This line allows the kernel to simulate a math co-processor if your computer does not have one (386 or 486SX). If
you have a 486DX, or a 386 or 486SX (with a separate 387 or 487 chip), or higher (Pentium, Pentium II, etc.), you
can comment this line out.
Note: The normal math co-processor emulation routines that come with FreeBSD are not very accurate. If you
do not have a math co-processor, and you need the best accuracy, it is recommended that you change this option
to GPL_MATH_EMULATE to use the GNU math support, which is not included by default for licensing reasons.
Note: In FreeBSD 5.0, math emulation is disabled by default, as older CPUs that do not have native floating point
math support are far less common, and in many cases not supported by the native FreeBSD kernel without other
additional options.
options
INET
#InterNETworking
Networking support. Leave this in, even if you do not plan to be connected to a network. Most programs require at
least loopback networking (i.e., making network connections within your PC), so this is essentially mandatory.
options
INET6
FFS
FFS_ROOT
This is the basic hard drive Filesystem. Leave it in if you boot from the hard disk.
196
options
UFS_ACL
This option, present only in FreeBSD 5.0, enables kernel support for access control lists. This relies on the use of
extended attributes and UFS2, and the feature is described in detail in the Section 10.12. ACLs are enabled by
default, and should not be disabled in the kernel if they have been used previously on a file system, as this will
remove the access control lists changing the way files are protected in unpredictable ways.
options
UFS_DIRHASH
This option includes some code to speed up disk operations on large directories, at the expense of using a some
additional memory. You would normally keep this for a large server, or interactive workstation, and remove it if you
are using FreeBSD on a smaller system where memory is at a premium and disk access speed is less important, such
as a firewall.
options
SOFTUPDATES
This option enables Soft Updates in the kernel, this will help speed up write access on the disks. They are enabled by
default in the 4.X branch but may not be turned on. Review the output from mount(8) to see if you have them
enabled. If you do not see the soft-updates option then you will need to activate it using the tunefs(8) or newfs(8)
for new filesystems.
options
options
MFS
MD_ROOT
#Memory Filesystem
#MD is a potential root device
This is the memory-mapped Filesystem. This is basically a RAM disk for fast storage of temporary files, useful if
you have a lot of swap space that you want to take advantage of. A perfect place to mount an MFS partition is on the
/tmp directory, since many programs store temporary data here. To mount an MFS RAM disk on /tmp, add the
following line to /etc/fstab:
/dev/ad1s2b /tmp mfs rw 0 0
Now you simply need to either reboot, or run the command mount /tmp.
Note: In FreeBSD 5.0, md(4)-backed UFS file systems are used for memory file systems rather than MFS.
Information on configuring MD-backed file systems may be found in the man pages for mdconfig(8) and
mdmfs(8). As a result, the MFS option is no longer supported.
options
options
NFS
NFS_ROOT
#Network Filesystem
#NFS usable as root device, NFS required
The network Filesystem. Unless you plan to mount partitions from a Unix file server over TCP/IP, you can comment
these out.
options
MSDOSFS
#MSDOS Filesystem
The MS-DOS Filesystem. Unless you plan to mount a DOS formatted hard drive partition at boot time, you can
safely comment this out. It will be automatically loaded the first time you mount a DOS partition, as described
197
CD9660
CD9660_ROOT
The ISO 9660 Filesystem for CDROMs. Comment it out if you do not have a CDROM drive or only mount data CDs
occasionally (since it will be dynamically loaded the first time you mount a data CD). Audio CDs do not need this
Filesystem.
options
PROCFS
#Process filesystem
The process filesystem. This is a pretend filesystem mounted on /proc which allows programs like ps(1) to give
you more information on what processes are running. In FreeBSD 5.0, use of PROCFS is not required under most
circumstances, as most debugging and monitoring tools have been adapted to run without PROCFS. In addition,
5.0-CURRENT kernels making use of PROCFS must now also include support for PSEUDOFS:
options
PSEUDOFS
#Pseudo-filesystem framework
PSEUDOFS is not available in FreeBSD 4.X. Unlike in FreeBSD 4.X, new installs of FreeBSD 5.0 will not mount the
process file system by default.
options
COMPAT_43
Compatibility with 4.3BSD. Leave this in; some programs will act strangely if you comment this out.
options
COMPAT_FREEBSD4
This option is required on FreeBSD 5.0 i386 and alpha systems to support applications compiled on older versions of
FreeBSD that use older system call interfaces. It is recommended that this option be used on all i386 and alpha
systems that may run older applications; platforms that gained support only in 5.0, such as ia64 and sparc64, do not
require this option.
options
SCSI_DELAY=15000
This causes the kernel to pause for 15 seconds before probing each SCSI device in your system. If you only have
IDE hard drives, you can ignore this, otherwise you will probably want to lower this number, perhaps to 5 seconds, to
speed up booting. Of course, if you do this, and FreeBSD has trouble recognizing your SCSI devices, you will have
to raise it back up.
options
UCONSOLE
Allow users to grab the console, which is useful for X users. For example, you can create a console xterm by typing
xterm -C, which will display any write(1), talk(1), and any other messages you receive, as well as any console
messages sent by the kernel.
Note: In FreeBSD 5.0, UCONSOLE is no longer required.
options
USERCONFIG
#boot -c editor
This option allows you to boot the configuration editor from the boot menu.
198
VISUAL_USERCONFIG
This option allows you to boot the visual configuration editor from the boot menu.
Note: From FreeBSD versions 5.0 and later, userconfig has been depreciated in favor of the new device.hints(5)
method. For more information on device.hints(5) please visit Section 7.5
options
KTRACE
#ktrace(1) support
SYSVSHM
This option provides for System V shared memory. The most common use of this is the XSHM extension in X,
which many graphics-intensive programs will automatically take advantage of for extra speed. If you use X, you will
definitely want to include this.
options
SYSVSEM
#SYSV-style semaphores
Support for System V semaphores. Less commonly used but only adds a few hundred bytes to the kernel.
options
SYSVMSG
Support for System V messages. Again, only adds a few hundred bytes to the kernel.
Note: The ipcs(1) command will list any processes using each of these System V facilities.
options
options
Real-time extensions added in the 1993 POSIX. Certain applications in the ports collection use these (such as
StarOffice).
Note: In FreeBSD 5.0, all of this functionality is now provided by the _KPOSIX_PRIORITY_SCHEDULING option,
and P1003_1B is no longer required.
This option enables ICMP error response bandwidth limiting. You typically want this option as it will help protect
the machine from denial of service packet attacks.
Note: In FreeBSD 5.0, this feature is enabled by default and the ICMP_BANDLIM option is not required.
199
isa
All PCs supported by FreeBSD have one of these. If you have an IBM PS/2 (Micro Channel Architecture), FreeBSD
provides some limited support at this time. For more information about the MCA support, see
/usr/src/sys/i386/conf/LINT.
device
eisa
Include this if you have an EISA motherboard. This enables auto-detection and configuration support for all devices
on the EISA bus.
device
pci
Include this if you have a PCI motherboard. This enables auto-detection of PCI cards and gatewaying from the PCI
to ISA bus.
device
agp
Include this if you have an AGP card in the system. This will enable support for AGP, and AGP GART for boards
which have these features.
# Floppy drives
device
fdc0
device
fd0
device
fd1
This is the floppy drive controller. fd0 is the A: floppy drive, and fd1 is the B: drive.
device
ata
This driver supports all ATA and ATAPI devices. You only need one device ata line for the kernel to detect all PCI
ATA/ATAPI devices on modern machines.
device
atadisk
This is needed along with device ata for ATA disk drives.
device
atapicd
This is needed along with device ata for ATAPI CDROM drives.
device
atapifd
This is needed along with device ata for ATAPI floppy drives.
device
atapist
This is needed along with device ata for ATAPI tape drives.
options
ATA_STATIC_ID
This makes the controller number static (like the old driver) or else the device numbers are dynamically allocated.
200
adv0
adw
bt0
aha0
aic0
#
#
#
#
#
#
#
at isa?
at isa?
at isa?
at isa?
SCSI controllers. Comment out any you do not have in your system. If you have an IDE only system, you can
remove these altogether.
# SCSI peripherals
device
scbus
device
da
device
sa
device
cd
device
pass
access)
#
#
#
#
#
SCSI peripherals. Again, comment out any you do not have, or if you have only IDE hardware, you can remove them
completely.
# RAID controllers
device
ida
device
amr
device
mlx
Supported RAID controllers. If you do not have any of these, you can comment them out or remove them.
# atkbdc0 controls both the keyboard and the PS/2 mouse
device
atkbdc0
at isa? port IO_KBD
The keyboard controller (atkbdc) provides I/O services for the AT keyboard and PS/2 style pointing devices. This
controller is required by the keyboard driver (atkbd) and the PS/2 pointing device driver (psm).
device
atkbd0
at atkbdc? irq 1
The atkbd driver, together with atkbdc controller, provides access to the AT 84 keyboard or the AT enhanced
keyboard which is connected to the AT keyboard controller.
device
psm0
at atkbdc? irq 12
201
vga0
at isa?
This is a VT220-compatible console driver, backward compatible to VT100/102. It works well on some laptops
which have hardware incompatibilities with sc0. Also set your TERM variable to vt100 or vt220 when you log in.
This driver might also prove useful when connecting to a large number of different machines over the network,
where termcap or terminfo entries for the sc0 device are often not available vt100 should be available on
virtually any platform.
# Power management support (see LINT for more options)
device
apm0
at nexus? disable flags 0x20 # Advanced Power Management
at
at
at
at
isa?
isa?
isa?
isa?
port IO_COM1
port IO_COM2
disable port
disable port
These are the four serial ports referred to as COM1 through COM4 in the MS-DOS/Windows world.
202
# Parallel port
device
ppc0
at isa? irq 7
ppbus
lpt
# Printer
device
plip
ppi
vpo
This is for an Iomega Zip drive. It requires scbus and da support. Best performance is achieved with ports in EPP
1.9 mode.
# PCI Ethernet NICs.
device
de
device
fxp
device
tx
device
vx
device
wx
#
#
#
#
#
Various PCI network card drivers. Comment out or remove any of these not present in your system.
# PCI Ethernet NICs that use the common MII bus controller code.
device
miibus
# MII bus support
203
dc
rl
sf
sis
ste
tl
vr
wb
xl
#
#
#
#
#
#
#
#
#
ISA Ethernet drivers. See /usr/src/sys/i386/conf/LINT for which cards are supported by which driver.
pseudo-device
ether
# Ethernet support
ether is only needed if you have an Ethernet card. It includes generic Ethernet protocol code.
pseudo-device
sl
# Kernel SLIP
sl is for SLIP support. This has been almost entirely supplanted by PPP, which is easier to set up, better suited for
modem-to-modem connection, and more powerful. The number after sl specifies how many simultaneous SLIP
sessions to support.
204
ppp
# Kernel PPP
This is for kernel PPP support for dial-up connections. There is also a version of PPP implemented as a userland
application that uses tun and offers more flexibility and features such as demand dialing. The number after ppp
specifies how many simultaneous PPP connections to support.
pseudo-device
tun
# Packet tunnel.
This is used by the userland PPP software. A number after tun specifies the number of simultaneous PPP sessions
to support. See the PPP section of this book for more information.
pseudo-device
pty
This is a pseudo-terminal or simulated login port. It is used by incoming telnet and rlogin sessions, xterm,
and some other applications such as Emacs. A number after pty indicates the number of ptys to create. If you
need more than the default of 16 simultaneous xterm windows and/or remote logins, be sure to increase this number
accordingly, up to a maximum of 256.
pseudo-device
md
# Memory disks
gif
or
pseudo-device
gif
This implements IPv6 over IPv4 tunneling, IPv4 over IPv6 tunneling, IPv4 over IPv4 tunneling, and IPv6 over IPv6
tunneling. Beginning with FreeBSD 4.4 the gif device is auto-cloning, and you should use the first example
(without the number after gif). Earlier versions of FreeBSD require the number.
pseudo-device
faith
This pseudo-device captures packets that are sent to it and diverts them to the IPv4/IPv6 translation daemon.
# The bpf pseudo-device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
pseudo-device
bpf
# Berkeley packet filter
This is the Berkeley Packet Filter. This pseudo-device allows network interfaces to be placed in promiscuous mode,
capturing every packet on a broadcast network (e.g., an Ethernet). These packets can be captured to disk and or
examined with the tcpdump(1) program.
Note: The bpf pseudo-device is also used by dhclient(8) to obtain the IP address of the default router
(gateway) and so on. If you use DHCP, leave this uncommented.
# USB support
#device
#device
#device
uhci
ohci
usb
205
ugen
uhid
ukbd
ulpt
umass
ums
requires mii
aue
cue
kue
#
#
#
#
#
#
Generic
Human Interface Devices
Keyboard
Printer
Disks/Mass storage - Requires scbus and da
Mouse
Almost every device in the kernel has a corresponding node entry in the /dev directory. These nodes look like
regular files, but are actually special entries into the kernel which programs use to access the device. The shell script
/dev/MAKEDEV, which is executed when you first install the operating system, creates nearly all of the device nodes
supported. However, it does not create all of them, so when you add support for a new device, it pays to make sure
that the appropriate entries are in this directory, and if not, add them. Here is a simple example:
Suppose you add the IDE CD-ROM support to the kernel. The line to add is:
device acd0
This means that you should look for some entries that start with acd0 in the /dev directory, possibly followed by a
letter, such as c, or preceded by the letter r, which means a raw device. It turns out that those files are not there, so
you must change to the /dev directory and type:
# sh MAKEDEV acd0
When this script finishes, you will find that there are now acd0c and racd0c entries in /dev so you know that it
executed correctly.
For sound cards, the following command creates the appropriate entries:
# sh MAKEDEV snd0
Note: When creating device nodes for devices such as sound cards, if other people have access to your
machine, it may be desirable to protect the devices from outside access by adding them to the /etc/fbtab file.
See fbtab(5) for more information.
Follow this simple procedure for any other non-GENERIC devices which do not have entries.
206
If the config(8) command fails when you give it your kernel description, you have probably made a simple error
somewhere. Fortunately, config(8) will print the line number that it had trouble with, so you can quickly skip to
it with vi. For example, if you see:
config: line 17: syntax error
You can skip to the problem in vi by typing 17G in command mode. Make sure the keyword is typed correctly,
by comparing it to the GENERIC kernel or another reference.
make fails:
If the make command fails, it usually signals an error in your kernel description, but not severe enough for
config(8) to catch it. Again, look over your configuration, and if you still cannot resolve the problem, send mail
to the FreeBSD general questions mailing list (http://lists.FreeBSD.org/mailman/listinfo/freebsd-questions)
with your kernel configuration, and it should be diagnosed very quickly.
Installing the new kernel fails:
If the kernel compiled fine, but failed to install (the make install or make installkernel command
failed), the first thing to check is if your system is running at securelevel 1 or higher (see init(8)). The kernel
installation tries to remove the immutable flag from your kernel and set the immutable flag on the new one.
Since securelevel 1 or higher prevents unsetting the immutable flag for any files on the system, the kernel
installation needs to be performed at securelevel 0 or lower.
The kernel does not boot:
If your new kernel does not boot, or fails to recognize your devices, do not panic! Fortunately, FreeBSD has an
excellent mechanism for recovering from incompatible kernels. Simply choose the kernel you want to boot from
at the FreeBSD boot loader. You can access this when the system counts down from 10. Hit any key except for
the Enter key, type unload and then type boot kernel.old , or the filename of any other kernel that will boot
properly. When reconfiguring a kernel, it is always a good idea to keep a kernel that is known to work on hand.
After booting with a good kernel you can check over your configuration file and try to build it again. One
helpful resource is the /var/log/messages file which records, among other things, all of the kernel messages
from every successful boot. Also, the dmesg(8) command will print the kernel messages from the current boot.
Note: If you are having trouble building a kernel, make sure to keep a GENERIC, or some other kernel that is
known to work on hand as a different name that will not get erased on the next build. You cannot rely on
kernel.old because when installing a new kernel, kernel.old is overwritten with the last installed kernel
207
If you find you cannot do this, you are probably running at a securelevel(8) greater than zero. Edit
kern_securelevel in /etc/rc.conf and set it to -1, then reboot. You can change it back to its previous
Note: In FreeBSD 5.0, kernels are not installed with the system immutable flag, so this is unlikely to be the
source of the problem youre experiencing.
The kernel works, but ps(1) does not work any more:
If you have installed a different version of the kernel from the one that the system utilities have been built with,
for example, a 4.X kernel on a 3.X system, many system-status commands like ps(1) and vmstat(8) will not
work any more. You must recompile the libkvm library as well as these utilities. This is one reason it is not
normally a good idea to use a different version of the kernel from the rest of the operating system.
Notes
1. The auto-tuning algorithm sets maxuser equal to the amount of memory in the system, with a minimum of 32,
and a maximum of 384.
208
Chapter 10 Security
Much of this chapter has been taken from the security(7) manual page by Matthew Dillon.
10.1 Synopsis
This chapter will provide a basic introduction to system security concepts, some general good rules of thumb, and
some advanced topics under FreeBSD. A lot of the topics covered here can be applied to system and Internet security
in general as well. The Internet is no longer a friendly place in which everyone wants to be your kind neighbor.
Securing your system is imperative to protect your data, intellectual property, time, and much more from the hands of
hackers and the like.
FreeBSD provides an array of utilities and mechanisms to ensure the integrity and security of your system and
network.
After reading this chapter, you will know:
About the various crypt mechanisms available in FreeBSD, such as DES and MD5.
How to configure and load access control extension modules using the TrustedBSD MAC Framework.
10.2 Introduction
Security is a function that begins and ends with the system administrator. While all BSD Unix multi-user systems
have some inherent security, the job of building and maintaining additional security mechanisms to keep those users
honest is probably one of the single largest undertakings of the sysadmin. Machines are only as secure as you make
them, and security concerns are ever competing with the human necessity for convenience. Unix systems, in general,
are capable of running a huge number of simultaneous processes and many of these processes operate as servers
meaning that external entities can connect and talk to them. As yesterdays mini-computers and mainframes become
todays desktops, and as computers become networked and internetworked, security becomes an even bigger issue.
Security is best implemented through a layered onion approach. In a nutshell, what you want to do is to create as
many layers of security as are convenient and then carefully monitor the system for intrusions. You do not want to
overbuild your security or you will interfere with the detection side, and detection is one of the single most important
aspects of any security mechanism. For example, it makes little sense to set the schg flags (see chflags(1)) on every
209
Chapter 10 Security
system binary because while this may temporarily protect the binaries, it prevents an attacker who has broken in from
making an easily detectable change that may result in your security mechanisms not detecting the attacker at all.
System security also pertains to dealing with various forms of attack, including attacks that attempt to crash, or
otherwise make a system unusable, but do not attempt to compromise the root account (break root). Security
concerns can be split up into several categories:
1. Denial of service attacks.
2. User account compromises.
3. Root compromise through accessible servers.
4. Root compromise via user accounts.
5. Backdoor creation.
A denial of service attack is an action that deprives the machine of needed resources. Typically, DoS attacks are
brute-force mechanisms that attempt to crash or otherwise make a machine unusable by overwhelming its servers or
network stack. Some DoS attacks try to take advantage of bugs in the networking stack to crash a machine with a
single packet. The latter can only be fixed by applying a bug fix to the kernel. Attacks on servers can often be fixed
by properly specifying options to limit the load the servers incur on the system under adverse conditions. Brute-force
network attacks are harder to deal with. A spoofed-packet attack, for example, is nearly impossible to stop, short of
cutting your system off from the Internet. It may not be able to take your machine down, but it can saturate your
Internet connection.
A user account compromise is even more common than a DoS attack. Many sysadmins still run standard telnetd,
rlogind, rshd, and ftpd servers on their machines. These servers, by default, do not operate over encrypted
connections. The result is that if you have any moderate-sized user base, one or more of your users logging into your
system from a remote location (which is the most common and convenient way to login to a system) will have his or
her password sniffed. The attentive system admin will analyze his remote access logs looking for suspicious source
addresses even for successful logins.
One must always assume that once an attacker has access to a user account, the attacker can break root. However,
the reality is that in a well secured and maintained system, access to a user account does not necessarily give the
attacker access to root. The distinction is important because without access to root the attacker cannot generally
hide his tracks and may, at best, be able to do nothing more than mess with the users files, or crash the machine.
User account compromises are very common because users tend not to take the precautions that sysadmins take.
System administrators must keep in mind that there are potentially many ways to break root on a machine. The
attacker may know the root password, the attacker may find a bug in a root-run server and be able to break root
over a network connection to that server, or the attacker may know of a bug in a suid-root program that allows the
attacker to break root once he has broken into a users account. If an attacker has found a way to break root on a
machine, the attacker may not have a need to install a backdoor. Many of the root holes found and closed to date
involve a considerable amount of work by the attacker to cleanup after himself, so most attackers install backdoors.
A backdoor provides the attacker with a way to easily regain root access to the system, but it also gives the smart
system administrator a convenient way to detect the intrusion. Making it impossible for an attacker to install a
backdoor may actually be detrimental to your security, because it will not close off the hole the attacker found to
break in the first place.
Security remedies should always be implemented with a multi-layered onion peel approach and can be categorized
as follows:
1. Securing root and staff accounts.
210
Chapter 10 Security
2. Securing root root-run servers and suid/sgid binaries.
3. Securing user accounts.
4. Securing the password file.
5. Securing the kernel core, raw devices, and filesystems.
6. Quick detection of inappropriate changes made to the system.
7. Paranoia.
The next section of this chapter will cover the above bullet items in greater depth.
The sections that follow will cover the methods of securing your FreeBSD system that were mentioned in the
last section of this chapter.
211
Chapter 10 Security
can replace each instance of an encrypted password with a single * character. This command will update the
/etc/master.passwd file and user/password database to disable password-authenticated logins.
A staff account entry such as:
foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
This change will prevent normal logins from occurring, since the encrypted password will never match *. With this
done, staff members must use another mechanism to authenticate themselves such as kerberos(1) or ssh(1) using a
public/private key pair. When using something like Kerberos, one generally must secure the machines which run the
Kerberos servers and your desktop workstation. When using a public/private key pair with ssh, one must generally
secure the machine used to login from (typically ones workstation). An additional layer of protection can be added
to the key pair by password protecting the key pair when creating it with ssh-keygen(1). Being able to star out the
passwords for staff accounts also guarantees that staff members can only login through secure access methods that
you have setup. This forces all staff members to use secure, encrypted connections for all of their sessions, which
closes an important hole used by many intruders: sniffing the network from an unrelated, less secure machine.
The more indirect security mechanisms also assume that you are logging in from a more restrictive server to a less
restrictive server. For example, if your main box is running all sorts of servers, your workstation should not be
running any. In order for your workstation to be reasonably secure you should run as few servers as possible, up to
and including no servers at all, and you should run a password-protected screen blanker. Of course, given physical
access to a workstation an attacker can break any sort of security you put on it. This is definitely a problem that you
should consider, but you should also consider the fact that the vast majority of break-ins occur remotely, over a
network, from people who do not have physical access to your workstation or servers.
Using something like Kerberos also gives you the ability to disable or change the password for a staff account in one
place, and have it immediately effect all the machines on which the staff member may have an account. If a staff
members account gets compromised, the ability to instantly change his password on all machines should not be
underrated. With discrete passwords, changing a password on N machines can be a mess. You can also impose
re-passwording restrictions with Kerberos: not only can a Kerberos ticket be made to timeout after a while, but the
Kerberos system can require that the user choose a new password after a certain period of time (say, once a month).
212
Chapter 10 Security
upgrading an existing system, the special user accounts used by these sandboxes may not be installed. The prudent
sysadmin would research and implement sandboxes for servers whenever possible.
There are a number of other servers that typically do not run in sandboxes: sendmail, popper, imapd, ftpd, and
others. There are alternatives to some of these, but installing them may require more work than you are willing to
perform (the convenience factor strikes again). You may have to run these servers as root and rely on other
mechanisms to detect break-ins that might occur through them.
The other big potential root holes in a system are the suid-root and sgid binaries installed on the system. Most of
these binaries, such as rlogin, reside in /bin, /sbin, /usr/bin, or /usr/sbin. While nothing is 100% safe, the
system-default suid and sgid binaries can be considered reasonably safe. Still, root holes are occasionally found in
these binaries. A root hole was found in Xlib in 1998 that made xterm (which is typically suid) vulnerable. It is
better to be safe than sorry and the prudent sysadmin will restrict suid binaries, that only staff should run, to a special
group that only staff can access, and get rid of (chmod 000) any suid binaries that nobody uses. A server with no
display generally does not need an xterm binary. Sgid binaries can be almost as dangerous. If an intruder can break
an sgid-kmem binary, the intruder might be able to read /dev/kmem and thus read the encrypted password file,
potentially compromising any passworded account. Alternatively an intruder who breaks group kmem can monitor
keystrokes sent through ptys, including ptys used by users who login through secure methods. An intruder that
breaks the tty group can write to almost any users tty. If a user is running a terminal program or emulator with a
keyboard-simulation feature, the intruder can potentially generate a data stream that causes the users terminal to
echo a command, which is then run as that user.
213
Chapter 10 Security
But even if you turn off the bpf device, you still have /dev/mem and /dev/kmem to worry about. For that matter,
the intruder can still write to raw disk devices. Also, there is another kernel feature called the module loader,
kldload(8). An enterprising intruder can use a KLD module to install his own bpf device, or other sniffing device, on
a running kernel. To avoid these problems you have to run the kernel at a higher secure level, at least securelevel 1.
The securelevel can be set with a sysctl on the kern.securelevel variable. Once you have set the securelevel to
1, write access to raw devices will be denied and special chflags flags, such as schg, will be enforced. You must
also ensure that the schg flag is set on critical startup binaries, directories, and script files everything that gets run
up to the point where the securelevel is set. This might be overdoing it, and upgrading the system is much more
difficult when you operate at a higher secure level. You may compromise and run the system at a higher secure level
but not set the schg flag for every system file and directory under the sun. Another possibility is to simply mount /
and /usr read-only. It should be noted that being too Draconian in what you attempt to protect may prevent the
all-important detection of an intrusion.
214
Chapter 10 Security
If you have a huge amount of user disk space, it may take too long to run through every file on those partitions. In
this case, setting mount flags to disallow suid binaries and devices on those partitions is a good idea. The nodev and
nosuid options (see mount(8)) are what you want to look into. You should probably scan them anyway, at least once
a week, since the object of this layer is to detect a break-in whether or not the break-in is effective.
Process accounting (see accton(8)) is a relatively low-overhead feature of the operating system which might help as a
post-break-in evaluation mechanism. It is especially useful in tracking down how an intruder has actually broken into
a system, assuming the file is still intact after the break-in occurs.
Finally, security scripts should process the log files, and the logs themselves should be generated in as secure a
manner as possible remote syslog can be very useful. An intruder tries to cover his tracks, and log files are critical
to the sysadmin trying to track down the time and method of the initial break-in. One way to keep a permanent record
of the log files is to run the system console to a serial port and collect the information on a continuing basis through a
secure machine monitoring the consoles.
10.3.7 Paranoia
A little paranoia never hurts. As a rule, a sysadmin can add any number of security features, as long as they do not
effect convenience, and can add security features that do effect convenience with some added thought. Even more
importantly, a security administrator should mix it up a bit if you use recommendations such as those given by this
document verbatim, you give away your methodologies to the prospective attacker who also has access to this
document.
215
Chapter 10 Security
Syslogd can be attacked directly and it is strongly recommended that you use the -s option whenever possible, and
the -a option otherwise.
You should also be fairly careful with connect-back services such as tcpwrappers reverse-identd, which can be
attacked directly. You generally do not want to use the reverse-ident feature of tcpwrappers for this reason.
It is a very good idea to protect internal services from external access by firewalling them off at your border routers.
The idea here is to prevent saturation attacks from outside your LAN, not so much to protect internal services from
network-based root compromise. Always configure an exclusive firewall, i.e., firewall everything except ports A,
B, C, D, and M-Z. This way you can firewall off all of your low ports except for certain specific services such as
named (if you are primary for a zone), ntalkd, sendmail, and other Internet-accessible services. If you try to
configure the firewall the other way as an inclusive or permissive firewall, there is a good chance that you will
forget to close a couple of services, or that you will add a new internal service and forget to update the firewall.
You can still open up the high-numbered port range on the firewall, to allow permissive-like operation, without
compromising your low ports. Also take note that FreeBSD allows you to control the range of port numbers used for
dynamic binding, via the various net.inet.ip.portrange sysctls (sysctl -a | fgrep portrange),
which can also ease the complexity of your firewalls configuration. For example, you might use a normal first/last
range of 4000 to 5000, and a hiport range of 49152 to 65535, then block off everything under 4000 in your firewall
(except for certain specific Internet-accessible ports, of course).
Another common DoS attack is called a springboard attack to attack a server in a manner that causes the server to
generate responses which overloads the server, the local network, or some other machine. The most common attack
of this nature is the ICMP ping broadcast attack. The attacker spoofs ping packets sent to your LANs broadcast
address with the source IP address set to the actual machine they wish to attack. If your border routers are not
configured to stomp on pings to broadcast addresses, your LAN winds up generating sufficient responses to the
spoofed source address to saturate the victim, especially when the attacker uses the same trick on several dozen
broadcast addresses over several dozen different networks at once. Broadcast attacks of over a hundred and twenty
megabits have been measured. A second common springboard attack is against the ICMP error reporting system. By
constructing packets that generate ICMP error responses, an attacker can saturate a servers incoming network and
cause the server to saturate its outgoing network with ICMP responses. This type of attack can also crash the server
by running it out of mbufs, especially if the server cannot drain the ICMP responses it generates fast enough. The
FreeBSD kernel has a new kernel compile option called ICMP_BANDLIM which limits the effectiveness of these sorts
of attacks. The last major class of springboard attacks is related to certain internal inetd services such as the udp
echo service. An attacker simply spoofs a UDP packet with the source address being server As echo port, and the
destination address being server Bs echo port, where server A and B are both on your LAN. The two servers then
bounce this one packet back and forth between each other. The attacker can overload both servers and their LANs
simply by injecting a few packets in this manner. Similar problems exist with the internal chargen port. A competent
sysadmin will turn off all of these inetd-internal test services.
Spoofed packet attacks may also be used to overload the kernel route cache. Refer to the net.inet.ip.rtexpire,
rtminexpire, and rtmaxcache sysctl parameters. A spoofed packet attack that uses a random source IP will
cause the kernel to generate a temporary cached route in the route table, viewable with netstat -rna | fgrep
W3. These routes typically timeout in 1600 seconds or so. If the kernel detects that the cached route table has gotten
too big it will dynamically reduce the rtexpire but will never decrease it to less than rtminexpire. There are two
problems:
1. The kernel does not react quickly enough when a lightly loaded server is suddenly attacked.
2. The rtminexpire is not low enough for the kernel to survive a sustained attack.
If your servers are connected to the Internet via a T3 or better, it may be prudent to manually override both
216
Chapter 10 Security
rtexpire and rtminexpire via sysctl(8). Never set either parameter to zero (unless you want to crash the
machine). Setting both parameters to 2 seconds should be sufficient to protect the route table from attack.
217
Chapter 10 Security
library supports DES, MD5 and Blowfish hash functions. By default FreeBSD uses MD5 to encrypt passwords.
It is pretty easy to identify which encryption method FreeBSD is set up to use. Examining the encrypted passwords
in the /etc/master.passwd file is one way. Passwords encrypted with the MD5 hash are longer than those
encrypted with the DES hash and also begin with the characters $1$. Passwords starting with $2$ are encrypted with
the Blowfish hash function. DES password strings do not have any particular identifying characteristics, but they are
shorter than MD5 passwords, and are coded in a 64-character alphabet which does not include the $ character, so a
relatively short string which does not begin with a dollar sign is very likely a DES password.
The password format used for new passwords is controlled by the passwd_format login capability in
/etc/login.conf, which takes values of des, md5 or blf. See the login.conf(5) manual page for more
information about login capabilities.
218
Chapter 10 Security
and one-time password. The keyinfo and opieinfo programs examine the relevant credentials files
(/etc/skeykeys or /etc/opiekeys) and print out the invoking users current iteration count and seed.
There are four different sorts of operations we will cover. The first is using keyinit or opiepasswd over a secure
connection to set up one-time-passwords for the first time, or to change your password or seed. The second operation
is using keyinit or opiepasswd over an insecure connection, in conjunction with key or opiekey over a secure
connection, to do the same. The third is using key/opiekey to log in over an insecure connection. The fourth is
using key or opiekey to generate a number of keys which can be written down or printed out to carry with you
when going to some location without secure connections to anywhere.
Adding unfurl:
Reminder - Only use this method if you are directly connected.
If you are using telnet or rlogin exit with no password and use keyinit -s.
Enter secret password:
Again secret password:
ID unfurl s/key is 99 to17757
DEFY CLUB PRO NASH LACE SOFT
[grimreaper] ~ $ opiepasswd -f -c
Adding unfurl:
Only use this method from the console; NEVER from remote. If you are using
telnet, xterm, or a dial-in, type ^C now or exit with no password.
Then run opiepasswd without the -c parameter.
Using MD5 to compute responses.
Enter new secret pass phrase:
Again new secret pass phrase:
ID unfurl OTP key is 499 to4268
MOS MALL GOAT ARM AVID COED
At the Enter new secret pass phrase: or Enter secret password: prompts, you should enter a password
or phrase. Remember, this is not the password that you will use to login with, this is used to generate your one-time
login keys. The ID line gives the parameters of your particular instance; your login name, the iteration count, and
seed. When logging in the system will remember these parameters and present them back to you so you do not have
to remember them. The last line gives the particular one-time password which corresponds to those parameters and
your secret password; if you were to re-login immediately, this one-time password is the one you would use.
219
Chapter 10 Security
Macintosh, or a shell prompt on a machine you trust. You will also need to make up an iteration count (100 is
probably a good value), and you may make up your own seed or use a randomly-generated one. Over on the insecure
connection (to the machine you are initializing), use the keyinit -s command:
% keyinit -s
Updating unfurl:
Old key: to17758
Reminder you need the 6 English words from the key command.
Enter sequence count from 1 to 9999: 100
Enter new key [default to17759]:
s/key 100 to 17759
s/key access password:
s/key access password:CURE MIKE BANE HIM RACY GORE
Updating unfurl:
You need the response from
Old secret pass phrase:
otp-md5 498 to4268
Response: GAME GAG
New secret pass phrase:
otp-md5 499 to4269
Response: LINE PAP
an OTP generator.
ext
WELT OUT DOWN CHAT
To accept the default seed (which the keyinit program confusingly calls a key), press Return. Then before
entering an access password, move over to your secure connection or S/Key desk accessory, and give it the same
parameters:
% key 100 to17759
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password: <secret password>
CURE MIKE BANE HIM RACY GORE
Or for OPIE:
% opiekey 498 to4268
Now switch back over to the insecure connection, and copy the one-time password generated over to the relevant
program.
220
Chapter 10 Security
Trying 10.0.0.1...
Connected to example.com
Escape character is ^].
FreeBSD/i386 (example.com) (ttypa)
login: <username>
s/key 97 fw13894
Password:
Or for OPIE:
% telnet example.com
Trying 10.0.0.1...
Connected to example.com
Escape character is ^].
FreeBSD/i386 (example.com) (ttypa)
login: <username>
otp-md5 498 gr4269 ext
Password:
As a side note, the S/Key and OPIE prompts have a useful feature (not shown here): if you press Return at the
password prompt, the prompter will turn echo on, so you can see what you are typing. This can be extremely useful
if you are attempting to type in a password by hand, such as from a printout.
At this point you need to generate your one-time password to answer this login prompt. This must be done on a
trusted system that you can run key or opiekey on. (There are versions of these for DOS, Windows and MacOS as
well.) They need both the iteration count and the seed as command line options. You can cut-and-paste these right
from the login prompt on the machine that you are logging in to.
On the trusted system:
% key 97 fw13894
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password:
WELD LIP ACTS ENDS ME HAAG
For OPIE:
% opiekey 498 to4268
Now that you have your one-time password you can continue logging in:
login: <username>
221
Chapter 10 Security
s/key 97 fw13894
Password: <return to enable echo>
s/key 97 fw13894
Password [echo on]: WELD LIP ACTS ENDS ME HAAG
Last login: Tue Mar 21 11:56:41 from 10.0.0.2 ...
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password: <secret password>
26: SODA RUDE LEA LIND BUDD SILT
27: JILT SPY DUTY GLOW COWL ROT
28: THEM OW COLA RUNT BONG SCOT
29: COT MASH BARR BRIM NAN FLAG
30: CAN KNEE CAST NAME FOLK BILK
Or for OPIE:
% opiekey -n 5 30 zz99999
Using the MD5 algorithm to compute response.
Reminder: Dont use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: <secret password>
26: JOAN BORE FOSS DES NAY QUIT
27: LATE BIAS SLAY FOLK MUCH TRIG
28: SALT TIN ANTI LOON NEAL USE
29: RIO ODIN GO BYE FURY TIC
30: GREW JIVE SAN GIRD BOIL PHI
The -n 5 requests five keys in sequence, the 30 specifies what the last iteration number should be. Note that these
are printed out in reverse order of eventual use. If you are really paranoid, you might want to write the results down
by hand; otherwise you can cut-and-paste into lpr. Note that each line shows both the iteration count and the
one-time password; you may still find it handy to scratch off passwords as you use them.
222
Chapter 10 Security
Here is a sample skey.access configuration file which illustrates the three most common sorts of configuration
statements:
permit internet 192.168.0.0 255.255.0.0
permit user fnord
permit port ttyd0
The first line (permit internet) allows users whose IP source address (which is vulnerable to spoofing) matches
the specified value and mask, to use Unix passwords. This should not be considered a security mechanism, but rather,
a means to remind authorized users that they are using an insecure network and need to use S/Key for authentication.
The second line (permit user) allows the specified username, in this case fnord, to use Unix passwords at any
time. Generally speaking, this should only be used for people who are either unable to use the key program, like
those with dumb terminals, or those who are uneducable.
The third line (permit port) allows all users logging in on the specified terminal line to use Unix passwords; this
would be used for dial-ups.
OPIE can restrict the use of Unix passwords based on the IP address of a login session just like S/Key does. The
relevant file is /etc/opieaccess, which is present by default on FreeBSD 5.0 and newer systems. Please check
opieaccess(5) for more information on this file and which security considerations you should be aware of when using
it.
Here is a sample opieaccess file:
permit 192.168.0.0 255.255.0.0
This line allows users whose IP source address (which is vulnerable to spoofing) matches the specified value and
mask, to use Unix passwords at any time.
If no rules in opieaccess are matched, the default is to deny non-OPIE logins.
10.6 Kerberos
Contributed by Mark Murray. Based on a contribution by Mark Dapoz.
Kerberos is a network add-on system/protocol that allows users to authenticate themselves through the services of a
secure server. Services such as remote login, remote copy, secure inter-system file copying and other high-risk tasks
are made considerably safer and more controllable.
The following instructions can be used as a guide on how to set up Kerberos as distributed for FreeBSD. However,
you should refer to the relevant manual pages for a complete description.
223
Chapter 10 Security
README krb.conf
krb.realms
If any additional files (such as principal.* or master_key) exist, then use the kdb_destroy command to
destroy the old Kerberos database, or if Kerberos is not running, simply delete the extra files.
You should now edit the krb.conf and krb.realms files to define your Kerberos realm. In this case the realm will
be EXAMPLE.COM and the server is grunt.example.com. We edit or create the krb.conf file:
# cat krb.conf
EXAMPLE.COM
EXAMPLE.COM grunt.example.com admin server
CS.BERKELEY.EDU okeeffe.berkeley.edu
ATHENA.MIT.EDU kerberos.mit.edu
ATHENA.MIT.EDU kerberos-1.mit.edu
ATHENA.MIT.EDU kerberos-2.mit.edu
ATHENA.MIT.EDU kerberos-3.mit.edu
LCS.MIT.EDU kerberos.lcs.mit.edu
TELECOM.MIT.EDU bitsy.mit.edu
ARC.NASA.GOV trident.arc.nasa.gov
In this case, the other realms do not need to be there. They are here as an example of how a machine may be made
aware of multiple realms. You may wish to not include them for simplicity.
The first line names the realm in which this system works. The other lines contain realm/host entries. The first item
on a line is a realm, and the second is a host in that realm that is acting as a key distribution center. The words
admin server following a hosts name means that host also provides an administrative database server. For further
explanation of these terms, please consult the Kerberos manual pages.
Now we have to add grunt.example.com to the EXAMPLE.COM realm and also add an entry to put all hosts in the
.example.com domain in the EXAMPLE.COM realm. The krb.realms file would be updated as follows:
# cat krb.realms
grunt.example.com EXAMPLE.COM
.example.com EXAMPLE.COM
.berkeley.edu CS.BERKELEY.EDU
.MIT.EDU ATHENA.MIT.EDU
.mit.edu ATHENA.MIT.EDU
Again, the other realms do not need to be there. They are here as an example of how a machine may be made aware
of multiple realms. You may wish to remove them to simplify things.
The first line puts the specific system into the named realm. The rest of the lines show how to default systems of a
particular subdomain to a named realm.
Now we are ready to create the database. This only needs to run on the Kerberos server (or Key Distribution Center).
Issue the kdb_init command to do this:
# kdb_init
224
Chapter 10 Security
Realm name [default ATHENA.MIT.EDU ]: EXAMPLE.COM
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter Kerberos master key:
Now we have to save the key so that servers on the local machine can pick it up. Use the kstash command to do this:
# kstash
Enter Kerberos master key:
Opening database...
Enter Kerberos master key:
225
Chapter 10 Security
Principals new key version = 1
Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
Max ticket lifetime (*5 minutes) [ 255 ] ?
Attributes [ 0 ] ?
Edit O.K.
Principal name: rcmd
Instance: grunt
Verifying password
New Password:
Edit O.K.
Principal name:
Now, this command only generates a temporary file which must be renamed to srvtab so that all the servers can
pick it up. Use the mv(1) command to move it into place on the original system:
# mv grunt-new-srvtab srvtab
If the file is for a client system, and the network is not deemed safe, then copy the client-new-srvtab to
removable media and transport it by secure physical means. Be sure to rename it to srvtab in the clients
/etc/kerberosIV directory, and make sure it is mode 600:
# mv grumble-new-srvtab srvtab
# chmod 600 srvtab
226
Chapter 10 Security
Opening database...
Enter Kerberos master key:
New Password:
New Password:
Edit O.K.
Principal name:
227
Chapter 10 Security
regular kill instead
Current Kerberos master key version is 1.
Master key entered.
BEWARE!
Now we can try using the kinit command to get a ticket for the id jane that we created above:
% kinit jane
Try listing the tokens using klist to see if we really have them:
% klist
Ticket file:
Principal:
Issued
Apr 30 11:23:22
/tmp/tkt245
jane@EXAMPLE.COM
Expires
Apr 30 19:23:22
Principal
krbtgt.EXAMPLE.COM@EXAMPLE.COM
Now try changing the password using passwd to check if the kpasswd daemon can get authorization to the Kerberos
database:
% passwd
realm EXAMPLE.COM
Old password for jane:
New Password for jane:
Verifying password
New Password for jane:
Password changed.
Opening database...
Enter Kerberos master key:
228
Chapter 10 Security
New Password:
New Password:
Edit O.K.
<---- null entry here will cause an exit
Principal name:
jane.root@EXAMPLE.COM
Expires
May 3 04:43:12
Principal
krbtgt.EXAMPLE.COM@EXAMPLE.COM
jane.root@EXAMPLE.COM
229
Chapter 10 Security
Likewise, if a user has in their own home directory lines of the form:
% cat ~/.klogin
jane@EXAMPLE.COM
jack@EXAMPLE.COM
This allows anyone in the EXAMPLE.COM realm who has authenticated themselves to jane or jack (via kinit, see
above) access to rlogin to janes account or files on this system (grunt) via rlogin, rsh or rcp.
For example, jane now logs into another system using Kerberos:
% kinit
Or Jack logs into Janes account on the same machine (jane having set up the .klogin file as above, and the person
in charge of Kerberos having set up principal jack with a null instance:
% kinit
% rlogin grunt -l jane
10.7 Firewalls
Contributed by Gary Palmer and Alex Nash.
Firewalls are an area of increasing interest for people who are connected to the Internet, and are even finding
applications on private networks to provide enhanced security. This section will hopefully explain what firewalls are,
how to use them, and how to use the facilities provided in the FreeBSD kernel to implement them.
Note: People often think that having a firewall between your internal network and the Big Bad Internet will solve
all your security problems. It may help, but a poorly setup firewall system is more of a security risk than not
having one at all. A firewall can add another layer of security to your systems, but it cannot stop a really
determined cracker from penetrating your internal network. If you let internal security lapse because you believe
your firewall to be impenetrable, you have just made the crackers job that much easier.
230
Chapter 10 Security
231
Chapter 10 Security
Enables code to allow logging of packets through syslogd(8). Without this option, even if you specify that
packets should be logged in the filter rules, nothing will happen.
options IPFIREWALL_VERBOSE_LIMIT=10
Limits the number of packets logged through syslogd(8) on a per entry basis. You may wish to use this option in
hostile environments in which you want to log firewall activity, but do not want to be open to a denial of service
attack via syslog flooding.
When a chain entry reaches the packet limit specified, logging is turned off for that particular entry. To resume
logging, you will need to reset the associated counter using the ipfw(8) utility:
# ipfw zero 4500
232
Chapter 10 Security
options IPFIREWALL_DEFAULT_TO_ACCEPT
This changes the default rule action from deny to allow. This avoids the possibility of locking yourself out
if you happen to boot a kernel with IPFIREWALL support but have not configured your firewall yet. It is also
very useful if you often use ipfw(8) as a filter for specific problems as they arise. Use with care though, as this
opens up the firewall and changes the way it works.
Note: Previous versions of FreeBSD contained an IPFIREWALL_ACCT option. This is now obsolete as the firewall
code automatically includes accounting facilities.
There is one valid flag when using this form of the command:
-N
Resolve addresses and service names in output.
The command given can be shortened to the shortest unique form. The valid commands are:
add
Add an entry to the firewall/accounting rule list
delete
Delete an entry from the firewall/accounting rule list
Previous versions of IPFW used separate firewall and accounting entries. The present version provides packet
accounting with each firewall entry.
233
Chapter 10 Security
If an index value is supplied, it is used to place the entry at a specific point in the chain. Otherwise, the entry is placed
at the end of the chain at an index 100 greater than the last chain entry (this does not include the default policy, rule
65535, deny).
The log option causes matching rules to be output to the system console if the kernel was compiled with
IPFIREWALL_VERBOSE.
Valid actions are:
reject
Drop the packet, and send an ICMP host or port unreachable (as appropriate) packet to the source.
allow
Pass the packet on as normal. (aliases: pass, permit, and accept)
deny
Drop the packet. The source is not notified via an ICMP message (thus it appears that the packet never arrived at
the destination).
count
Update packet counters but do not allow/deny the packet based on this rule. The search continues with the next
chain entry.
Each action will be recognized by the shortest unambiguous prefix.
The protocols which can be specified are:
all
Matches any IP packet
icmp
Matches ICMP packets
tcp
Matches TCP packets
udp
Matches UDP packets
The address specification is:
from address/mask [port] to address/mask [port] [via interface]
You can only specify port in conjunction with protocols which support ports (UDP and TCP).
The via is optional and may specify the IP address or domain name of a local IP interface, or an interface name (e.g.
ed0) to match only packets coming through this interface. Interface unit numbers can be specified with an optional
wildcard. For example, ppp* would match all kernel PPP interfaces.
The syntax used to specify an address/mask is:
234
Chapter 10 Security
address
or
address/mask-bits
or
address:mask-pattern
A valid hostname may be specified in place of the IP address. mask-bits is a decimal number representing how
many bits in the address mask should be set. e.g. specifying 192.216.222.1/24 will create a mask which will
allow any address in a class C subnet (in this case, 192.216.222) to be matched. mask-pattern is an IP address
which will be logically ANDed with the address given. The keyword any may be used to specify any IP address.
The port numbers to be blocked are specified as:
port [,port [,port [. . . ]]]
to specify either a single port or a list of ports, or
port-port
to specify a range of ports. You may also combine a single range with a list, but the range must always be specified
first.
The options available are:
frag
Matches if the packet is not the first fragment of the datagram.
in
Matches if the packet is on the way in.
out
Matches if the packet is on the way out.
ipoptions spec
Matches if the IP header contains the comma separated list of options specified in spec. The supported IP
options are: ssrr (strict source route), lsrr (loose source route), rr (record packet route), and ts (time
stamp). The absence of a particular option may be specified with a leading !.
established
Matches if the packet is part of an already established TCP connection (i.e. it has the RST or ACK bits set). You
can optimize the performance of the firewall by placing established rules early in the chain.
235
Chapter 10 Security
setup
Matches if the packet is an attempt to establish a TCP connection (the SYN bit is set but the ACK bit is not).
tcpflags flags
Matches if the TCP header contains the comma separated list of flags. The supported flags are fin, syn,
rst, psh, ack, and urg. The absence of a particular flag may be indicated by a leading !.
icmptypes types
Matches if the ICMP type is present in the list types. The list may be specified as any combination of ranges
and/or individual types separated by commas. Commonly used ICMP types are: 0 echo reply (ping reply), 3
destination unreachable, 5 redirect, 8 echo request (ping request), and 11 time exceeded (used to indicate TTL
expiration as with traceroute(8)).
There are seven valid flags when using this form of the command:
-a
While listing, show counter values. This option is the only way to see accounting counters.
-c
List rules in compact form.
-d
Show dynamic rules in addition to static rules.
-e
If -d was specified, also show expired dynamic rules.
-t
Display the last match times for each chain entry. The time listing is incompatible with the input syntax used by
the ipfw(8) utility.
-N
Attempt to resolve given addresses and service names.
-S
Show the set each rule belongs to. If this flag is not specified, disabled rules will not be listed.
236
Chapter 10 Security
10.7.4.3 Flushing the IPFW Rules
The syntax for flushing the chain is:
ipfw flush
This causes all entries in the firewall chain to be removed except the fixed default policy enforced by the kernel
(index 65535). Use caution when flushing rules; the default deny policy will leave your system cut off from the
network until allow entries are added to the chain.
When used without an index argument, all packet counters are cleared. If an index is supplied, the clearing
operation only affects a specific chain entry.
The next example denies and logs any TCP traffic from the entire crackers.org network (a class C) to the
nice.people.org machine (any port).
# ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org
If you do not want people sending X sessions to your internal network (a subnet of a class C), the following
command will do the necessary filtering:
# ipfw add deny tcp from any to my.org/28 6000 setup
You can also see the last time a chain entry was matched with:
237
Chapter 10 Security
# ipfw -at l
When initially setting up your firewall, unless you have a test bench setup where you can configure your firewall host
in a controlled environment, it is strongly recommend you use the logging version of the commands and enable
logging in the kernel. This will allow you to quickly identify problem areas and cure them without too much
disruption. Even after the initial setup phase is complete, I recommend using the logging for deny as it allows
tracing of possible attacks and also modification of the firewall rules if your requirements alter.
Note: If you use the logging versions of the accept command, be aware that it can generate large amounts of
log data. One log entry will be generated for every packet that passes through the firewall, so large FTP/http
transfers, etc, will really slow the system down. It also increases the latencies on those packets as it requires
more work to be done by the kernel before the packet can be passed on. syslogd will also start using up a lot
more processor time as it logs all the extra data to disk, and it could quite easily fill the partition /var/log is
located on.
You should enable your firewall from /etc/rc.conf.local or /etc/rc.conf. The associated manual page
explains which knobs to fiddle and lists some preset firewall configurations. If you do not use a preset configuration,
ipfw list will output the current ruleset into a file that you can pass to rc.conf. If you do not use
/etc/rc.conf.local or /etc/rc.conf to enable your firewall, it is important to make sure your firewall is
enabled before any IP interfaces are configured.
The next problem is what your firewall should actually do! This is largely dependent on what access to your network
you want to allow from the outside, and how much access to the outside world you want to allow from the inside.
Some general rules are:
Block all incoming access to ports below 1024 for TCP. This is where most of the security sensitive services are,
like finger, SMTP (mail) and telnet.
Block all incoming UDP traffic. There are very few useful services that travel over UDP, and what useful traffic
there is, is normally a security threat (e.g. Suns RPC and NFS protocols). This has its disadvantages also, since
UDP is a connectionless protocol, denying incoming UDP traffic also blocks the replies to outgoing UDP traffic.
This can cause a problem for people (on the inside) using external archie (prospero) servers. If you want to allow
access to archie, you will have to allow packets coming from ports 191 and 1525 to any internal UDP port through
the firewall. ntp is another service you may consider allowing through, which comes from port 123.
Block traffic to port 6000 from the outside. Port 6000 is the port used for access to X11 servers, and can be a
security threat (especially if people are in the habit of doing xhost + on their workstations). X11 can actually use
a range of ports starting at 6000, the upper limit being how many X displays you can run on the machine. The
upper limit as defined by RFC 1700 (Assigned Numbers) is 6063.
Check what ports any internal servers use (e.g. SQL servers, etc). It is probably a good idea to block those as well,
as they normally fall outside the 1-1024 range specified above.
238
Chapter 10 Security
Another checklist for firewall configuration is available from CERT at
http://www.cert.org/tech_tips/packet_filtering.html
As stated above, these are only guidelines. You will have to decide what filter rules you want to use on your firewall
yourself. We cannot accept ANY responsibility if someone breaks into your network, even if you follow the advice
given above.
This demonstrates a worst case scenario by causing most of IPFWs packet check routine to be executed before
finally deciding that the packet does not match the rule (by virtue of the port number). Following the 999th iteration
of this rule was an allow ip from any to any.
The second set of rules were designed to abort the rule check quickly:
# ipfw add deny ip from 1.2.3.4 to 1.2.3.4
The non-matching source IP address for the above rule causes these rules to be skipped very quickly. As before, the
1000th rule was an allow ip from any to any.
The per-packet processing overhead in the former case was approximately 2.703 ms/packet, or roughly
2.7 microseconds per rule. Thus the theoretical packet processing limit with these rules is around 370 packets per
second. Assuming 10 Mbps Ethernet and a ~1500 byte packet size, we would only be able to achieve 55.5%
bandwidth utilization.
For the latter case each packet was processed in approximately 1.172 ms, or roughly 1.2 microseconds per rule. The
theoretical packet processing limit here would be about 853 packets per second, which could consume 10 Mbps
Ethernet bandwidth.
The excessive number of rules tested and the nature of those rules do not provide a real-world scenario -- they were
used only to generate the timing information presented here. Here are a few things to keep in mind when building an
efficient rule set:
Place an established rule early on to handle the majority of TCP traffic. Do not put any allow tcp statements
before this rule.
Place heavily triggered rules earlier in the rule set than those rarely used (without changing the permissiveness of
the firewall, of course). You can see which rules are used most often by examining the packet counting statistics
with ipfw -a l.
239
Chapter 10 Security
10.8 OpenSSL
As of FreeBSD 4.0, the OpenSSL toolkit is a part of the base system. OpenSSL (http://www.openssl.org/) provides a
general-purpose cryptography library, as well as the Secure Sockets Layer v2/v3 (SSLv2/SSLv3) and Transport
Layer Security v1 (TLSv1) network security protocols.
However, one of the algorithms (specifically IDEA) included in OpenSSL is protected by patents in the USA and
elsewhere, and is not available for unrestricted use. IDEA is included in the OpenSSL sources in FreeBSD, but it is
not built by default. If you wish to use it, and you comply with the license terms, enable the MAKE_IDEA switch in
/etc/make.conf and rebuild your sources using make world.
Today, the RSA algorithm is free for use in USA and other countries. In the past it was protected by a patent.
FAST_IPSEC
Note, that it is not currently possible to use the Fast IPsec subsystem in lue with the KAME implementation of
IPsec. Consult the fast_ipsec(4) manual page for more information.
240
Chapter 10 Security
Encapsulated Security Payload (ESP), protects the IP packet data from third party interference, by encrypting the
contents using symmetric cryptography algorithms (like Blowfish, 3DES).
Authentication Header (AH), protects the IP packet header from third party interference and spoofing, by
computing a cryptographic checksum and hashing the IP packet header fields with a secure hashing function. This
is then followed by an additional header that contains the hash, to allow the information in the packet to be
authenticated.
ESP and AH can either be used together or seperately, depending on the environment.
IPsec can either be used to directly encrypt the traffic between two hosts (known as Transport Mode); or to build
virtual tunnels between two subnets, which could be used for secure communication between two corporate
networks (known as Tunnel Mode). The latter is more commonly known as a Virtual Private Network (VPN). The
ipsec(4) manual page should be consulted for detailed information on the IPsec subsystem in FreeBSD.
To add IPsec support to your kernel, add the following options to your kernel configuration file:
options
options
IPSEC
IPSEC_ESP
#IP security
#IP security (crypto; define w/ IPSEC)
If IPsec debugging support is desired, the following kernel option should also be added:
options
IPSEC_DEBUG
10.9.3 Scenario #1: Two networks, connected to the Internet, to behave as one
This is the scenario that caused me to first investigating VPNs. The premise is as follows:
Both sites are connected to the Internet, through a gateway that is running FreeBSD.
The internal addresses of the two networks can be public or private IP addresses, it doesnt matter. You can be
running NAT on the gateway machine if necessary.
The internal IP addresses of the two networks do not collide. While I expect it is theoretically possible to use a
combination of VPN technology and NAT to get this to work, I expect it to be a configuration nightmare.
If you find that you are trying to connect two networks, both of which, internally, use the same private IP address
range (e.g., both of them use 192.168.1.x), then one of the networks will have to be renumbered.
I think its now a law that every VPN article must feature some ASCII artwork. This one is no exception.
241
Chapter 10 Security
The network topology might look something like this:
Network #1
Network #2
[ Internal Hosts ]
[
Win9x/NT/2K ]
[
Unix
]
|
|
.---[fxp1]---.
|
FreeBSD |
---[fxp0]---
|
|
-=-=- Internet -=-=|
|
.---[fxp0]---.
|
FreeBSD |
---[fxp1]---
|
|
[ Internal Hosts ]
[
Win9x/NT/2K ]
[
Unix
]
Notice the two public IP addresses. Ill use the letters to refer to them in the rest of this article. Anywhere you see
those letters in this article, replace them with your own public IP addresses. Note also that that internally, the two
gateway machines have .1 IP addresses, and that the two networks have different private IP address ( 192.168.1.x
and 192.168.2.x respectively). All the machines on the private networks have been configured to use the .1
machine as their default gateway.
The intention is that, from a network point of view, each network should view the machines on the other network as
though they were directly attached the same router -- albeit a slightly slow router with an occasional tendency to drop
packets.
This means that (for example), machine 192.168.1.20 should be able to run
ping 192.168.2.34
and have it work, transparently. Windows machines should be able to see the machines on the other network, browse
file shares, and so on, in exactly the same way that they can browse machines on the local network.
And the whole thing has to be secure. This means that traffic between the two networks has to be encrypted.
Creating a VPN between these two networks is a multi-step process. The stages are as follows:
1. Create a "virtual" network link between the two networks, across the Internet. Test it, using tools like ping(8), to
make sure it works.
2. Apply security policies to ensure that traffic between the two networks is transparently encrypted and decrypted
as necessary. Test this, using tools like tcpdump(1), to ensure that traffic is encrypted.
3. Configure additional software on the FreeBSD gateways, to allow Windows machines to see one another across
the VPN.
242
Chapter 10 Security
to the kernel configuration files on both machines, and then compile, install, and reboot as normal.
Configuring the tunnel is a two step process. First the tunnel must be told what the outside (or public) IP addresses
are, using gifconfig(8). Then the private IP addresses must be configured using ifconfig(8).
On the gateway machine on network #1 you would run the following two commands to configure the tunnel.
gifconfig gif0 A.B.C.D W.X.Y.Z
ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff
On the other gateway machine you run the same commands, but with the order of the IP addresses reversed.
gifconfig gif0 W.X.Y.Z A.B.C.D
ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff
to see the configuration. For example, on the network #1 gateway, you would see this:
# gifconfig gif0
243
Chapter 10 Security
As you can see, a tunnel has been created between the physical addresses A.B.C.D and W.X.Y.Z, and the traffic
allowed through the tunnel is that between 192.168.1.1 and 192.168.2.1.
This will also have added an entry to the routing table on both machines, which you can examine with "netstat -rn".
This output is from the gateway host on network #1.
# netstat -rn
Routing tables
Internet:
Destination
...
192.168.2.1
...
Gateway
Flags
192.168.1.1
UH
Refs
0
Use
0
Netif
Expire
gif0
As the Flags value indicates, this is a host route, which means that each gateway knows how to reach the other
gateway, but they do not know how to reach the rest of their respective networks. That problem will be fixed shortly.
It is likely that you are running a firewall on both machines. This will need to be circumvented for your VPN traffic.
You might want to allow all traffic between both networks, or you might want to include firewall rules that protect
both ends of the VPN from one another.
It greatly simplifies testing if you configure the firewall to allow all traffic through the VPN. You can always tighten
things up later. If you are using ipfw(8) on the gateway machines then a command like
ipfw add 1 allow ip from any to any via gif0
will allow all traffic between the two end points of the VPN, without affecting your other firewall rules. Obviously
you will need to run this command on both gateway hosts.
This is sufficient to allow each gateway machine to ping the other. On 192.168.1.1, you should be able to run
ping 192.168.2.1
and get a response, and you should be able to do the same thing on the other gateway machine.
However, you will not be able to reach internal machines on either network yet. This is because of the routing -although the gateway machines know how to reach one another, they do not know how to reach the network behind
each one.
To solve this problem you must add a static route on each gateway machine. The command to do this on the first
gateway would be:
route add 192.168.2.0 192.168.2.1 netmask 0xffffff00
This says In order to reach the hosts on the network 192.168.2.0, send the packets to the host 192.168.2.1.
You will need to run a similar command on the other gateway, but with the 192.168.1.x addresses instead.
IP traffic from hosts on one network will now be able to reach hosts on the other network.
That has now created two thirds of a VPN between the two networks, in as much as its virtual and its a
network. Its not private yet. You can test this using ping(8) and tcpdump(1). Log in to the gateway host and run
244
Chapter 10 Security
tcpdump dst host 192.168.2.1
192.168.1.1
192.168.1.1
192.168.1.1
192.168.1.1
192.168.1.1
192.168.1.1
>
>
>
>
>
>
192.168.2.1:
192.168.2.1:
192.168.2.1:
192.168.2.1:
192.168.2.1:
192.168.2.1:
icmp:
icmp:
icmp:
icmp:
icmp:
icmp:
echo
echo
echo
echo
echo
echo
request
reply
request
reply
request
reply
As you can see, the ICMP messages are going back and forth unencrypted. If you had used the -s parameter to
tcpdump(1) to grab more bytes of data from the packets you would see more information.
Obviously this is unacceptable. The next section will discuss securing the link between the two networks so that it all
traffic is automatically encrypted.
Summary:
Edit /etc/rc.conf on gateway host #1 and add the following lines (replacing IP addresses as necessary).
gifconfig_gif0="A.B.C.D W.X.Y.Z"
ifconfig_gif0="inet 192.168.1.1 192.168.2.1 netmask 0xffffffff"
static_routes="vpn"
route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00"
Edit your firewall script (/etc/rc.firewall, or similar) on both hosts, and add
ipfw add 1 allow ip from any to any via gif0
Make similar changes to /etc/rc.conf on gateway host #2, reversing the order of IP addresses.
245
Chapter 10 Security
Security associations and security policies are both maintained by the kernel, and can be modified by userland
programs. However, before you can do this you must configure the kernel to support IPSec and the Encapsulated
Security Payload (ESP) protocol. This is done by configuring a kernel with:
options IPSEC
options IPSEC_ESP
and recompiling, reinstalling, and rebooting. As before you will need to do this to the kernels on both of the gateway
hosts.
You have two choices when it comes to setting up security associations. You can configure them by hand between
two hosts, which entails choosing the encryption algorithm, encryption keys, and so forth, or you can use daemons
that implement the Internet Key Exchange protocol (IKE) to do this for you.
I recommend the latter. Apart from anything else, its easier to set up.
Editing and displaying security policies is carried out using setkey(8). By analogy, setkey is to the kernels security
policy tables as route(8) is to the kernels routing tables. setkey can also display the current security associations,
and to continue the analogy further, is akin to netstat -r in that respect.
There are a number of choices for daemons to manage security associations with FreeBSD. This article will describe
how to use one of these, racoon. racoon is in the FreeBSD ports collection, in the security/ category, and is installed
in the usual way.
racoon must be run on both gateway hosts. On each host it is configured with the IP address of the other end of the
VPN, and a secret key (which you choose, and must be the same on both gateways).
The two daemons then contact one another, confirm that they are who they say they are (by using the secret key that
you configured). The daemons then generate a new secret key, and use this to encrypt the traffic over the VPN. They
periodically change this secret, so that even if an attacker were to crack one of the keys (which is as theoretically
close to unfeasible as it gets) it wont do them much good -- by the time theyve cracked the key the two daemons
have chosen another one.
racoons configuration is stored in ${PREFIX}/etc/racoon. You should find a configuration file there, which
should not need to be changed too much. The other component of racoons configuration, which you will need to
change, is the pre-shared key.
The default racoon configuration expects to find this in the file ${PREFIX}/etc/racoon/psk.txt. It is important to note
that the pre-shared key is *not* the key that will be used to encrypt your traffic across the VPN link, it is simply a
token that allows the key management daemons to trust one another.
psk.txt contains a line for each remote site you are dealing with. In this example, where there are two sites, each
psk.txt file will contain one line (because each end of the VPN is only dealing with one other end).
secret
That is, the *public* IP address of the remote end, whitespace, and a text string that provides the secret. Obviously,
you shouldnt use "secret" as your key -- the normal rules for choosing a password apply.
On gateway host #2 the line would look like this
A.B.C.D
secret
246
Chapter 10 Security
That is, the public IP address of the remote end, and the same secret key. psk.txt must be mode 0600 (i.e., only
read/write to root) before racoon will run.
You must run racoon on both gateway machines. You will also need to add some firewall rules to allow the IKE
traffic, which is carried over UDP to the isakmp (kmp == key management protocol) port. Again, this should be
fairly early in your firewall ruleset.
ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
Once racoon is running you can try pinging one gateway host from the other. The connection is still not encrypted,
but racoon will then setup the security associations between the two hosts -- this might take a moment, and you may
see this as a short delay before the ping commands start responding.
Once the security association has been set up you can view it using setkey(8). Run
setkey -D
Then it will be encapsulated inside another packet, looking something like this:
.--------------------------.
| Src: A.B.C.D
|
| Dst: W.X.Y.Z
|
| <other header info>
|
+--------------------------+
| .----------------------. |
| | Src: 192.168.1.1
| |
| | Dst: 192.168.2.1
| |
| | <other header info> | |
| +----------------------+ |
| | <packet data>
| |
| ---------------------- |
247
Chapter 10 Security
--------------------------
This encapsulation is carried out by the gif device. As you can see, the packet now has real IP addresses on the
outside, and our original packet has been wrapped up as data inside the packet that will be put out on the Internet.
Obviously, we want all traffic between the VPNs to be encrypted. You might try putting this in to words, as:
If a packet leaves from A.B.C.D, and it is destined for W.X.Y.Z, then encrypt it, using the necessary security
associations.
If a packet arrives from W.X.Y.Z, and it is destined for A.B.C.D, then decrypt it, using the necessary security
associations.
Thats close, but not quite right. If you did this, all traffic to and from W.X.Y.Z, even traffic that was not part of the
VPN, would be encrypted. Thats not quite what you want. The correct policy is as follows
If a packet leaves from A.B.C.D, and that packet is encapsulating another packet, and it is destined for W.X.Y.Z,
then encrypt it, using the necessary security associations.
If a packet arrives from W.X.Y.Z, and that packet is encapsulating another packet, and it is destined for A.B.C.D,
then encrypt it, using the necessary security associations.
A subtle change, but a necessary one.
Security policies are also set using setkey(8). setkey(8) features a configuration language for defining the policy. You
can either enter configuration instructions via stdin, or you can use the -f option to specify a filename that contains
configuration instructions.
The configuration on gateway host #1 (which has the public IP address A.B.C.D) to force all outbound traffic to
W.X.Y.Z to be encrypted is:
spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;
spdadd tells setkey(8) that we want to add a rule to the secure policy database. The rest of this line specifies which
packets will match this policy. A.B.C.D/32 and W.X.Y.Z/32 are the IP addresses and netmasks that identify the
network or hosts that this policy will apply to. In this case, we want it to apply to traffic between these two hosts.
ipencap tells the kernel that this policy should only apply to packets that encapsulate other packets. -P out says
that this policy applies to outgoing packets, and ipsec says that the packet will be secured.
The second line specifies how this packet will be encrypted. esp is the protocol that will be used, while tunnel
indicates that the packet will be further encapsulated in an IPSec packet. The repeated use of A.B.C.D and W.X.Y.Z
is used to select the security association to use, and the final require mandates that packets must be encrypted if
they match this rule.
This rule only matches outgoing packets. You will need a similar rule to match incoming packets.
spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;
Note the in instead of out in this case, and the necessary reversal of the IP addresses.
The other gateway host (which has the public IP address W.X.Y.Z) will need similar rules.
248
Chapter 10 Security
spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;
spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;
Finally, you need to add firewall rules to allow ESP and IPENCAP packets back and forth. These rules will need to
be added to both hosts.
ipfw
ipfw
ipfw
ipfw
add
add
add
add
1
1
1
1
allow
allow
allow
allow
Because the rules are symmetric you can use the same rules on each gateway host.
Outgoing packets will now look something like this.
.------------------------------.
| Src: A.B.C.D
|
| Dst: W.X.Y.Z
|
| <other header info>
|
+------------------------------+
| .--------------------------. |
| | Src: A.B.C.D
| |
| | Dst: W.X.Y.Z
| |
| | <other header info>
| |
| +--------------------------+ |
| | .----------------------. | |
| | | Src: 192.168.1.1
| | |
| | | Dst: 192.168.2.1
| | |
| | | <other header info> | | |
| | +----------------------+ | |
| | | <packet data>
| | |
| | ---------------------- | |
| -------------------------- |
------------------------------
--------------------------.
|
|
| Encrypted
| packet.
-------------.
| contents
|
| are
|
| completely
|
|- secure
| Encapd
| from third
-.
| packet
| party
| Original |- with real | snooping
| packet, | IP addr
|
|- private |
|
| IP addr |
|
|
|
|
-
|
|
-------------
|
--------------------------
When they are received by the far end of the VPN they will first be decrypted (using the security associations that
have been negotiated by racoon). Then they will enter the gif interface, which will unwrap the second layer, until you
are left with the innermost packet, which can then travel in to the inner network.
You can check the security using the same ping(8) test from earlier. First, log in to the A.B.C.D gateway machine,
and run:
tcpdump dst host 192.168.2.1
249
Chapter 10 Security
Now, as you can see, tcpdump(1) shows the ESP packets. If you try and examine them with the -s option you will see
(apparently) gibberish, because of the encryption.
Congratulations. You have just set up a VPN between two remote sites.
Summary
Install security/racoon. Edit ${PREFIX}/etc/racoon/psk.txt on both gateway hosts, adding an entry for
the remote hosts IP address and a secret key that they both know. Make sure this file is mode 0600.
Create an /etc/ipsec.conf on each host that contains the necessary spdadd lines. On gateway host #1 this
would be:
spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec
esp/tunnel/A.B.C.D-W.X.Y.Z/require;
spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec
esp/tunnel/W.X.Y.Z-A.B.C.D/require;
Add firewall rules to allow IKE, ESP, and IPENCAP traffic to both hosts:
ipfw
ipfw
ipfw
ipfw
ipfw
ipfw
add
add
add
add
add
add
1
1
1
1
1
1
allow
allow
allow
allow
allow
allow
The previous two steps should suffice to get the VPN up and running. Machines on each network will be able to refer
to one another using IP addresses, and all traffic across the link will be automatically and securely encrypted.
250
Chapter 10 Security
10.10 OpenSSH
Contributed by Chern Lee.
Secure shell is a set of network connectivity tools used to access remote machines securely. It can be used as a direct
replacement for rlogin, rsh, rcp, and telnet. Additionally, any other TCP/IP connections can be
tunneled/forwarded securely through ssh. ssh encrypts all traffic to effectively eliminate eavesdropping, connection
hijacking, and other network-level attacks.
OpenSSH is maintained by the OpenBSD project, and is based upon SSH v1.2.12 with all the recent bug fixes and
updates. It is compatible with both SSH protocols 1 and 2. OpenSSH has been in the base system since FreeBSD 4.0.
This will load the ssh daemon the next time your system initializes. Alternatively, you can simply run the sshd
daemon.
The login will continue just as it would have if a session was created using rlogin or telnet. SSH utilizes a key
fingerprint system for verifying the authenticity of the server when the client connects. The user is prompted to enter
yes only when connecting for the first time. Future attempts to login are all verified against the saved fingerprint key.
The SSH client will alert you if the saved fingerprint differs from the received fingerprint on future login attempts.
The fingerprints are saved in ~/.ssh/known_hosts, or ~/.ssh/known_hosts2 for SSH v2 fingerprints.
By default, OpenSSH servers are configured to accept both SSH v1 and SSH v2 connections. The client, however,
can choose between the two. Version 2 is known to be more robust and secure than its predecessor.
ssh can be forced to use either protocol by passing it the -1 or -2 argument for v1 and v2, respectively.
251
Chapter 10 Security
4735
Since the fingerprint was already saved for this host in the previous example, it is verified when using scp here.
The arguments passed to scp are similar to cp, with the file or files in the first argument, and the destination in the
second. Since the file is fetched over the network, through SSH, one or more of the file arguments takes on the form
user@host:<path_to_remote_file>.
10.10.5 Configuration
The system-wide configuration files for both the OpenSSH daemon and client reside within the /etc/ssh directory.
ssh_config configures the client settings, while sshd_config configures the daemon.
Additionally, the sshd_program (/usr/sbin/sshd by default), and sshd_flags rc.conf options can provide
more levels of configuration.
10.10.6 ssh-keygen
Instead of using passwords, ssh-keygen(1) can be used to generate RSA keys to authenticate a user.
% ssh-keygen
ssh-keygen(1) will create a public and private key pair for use in authentication. The private key is stored in
~/.ssh/identity, whereas the public key is stored in ~/.ssh/identity.pub. The public key must be placed in
~/.ssh/authorized_keys of the remote machine in order for the setup to work.
This will allow connection to the remote machine based upon RSA authentication instead of passwords.
If a passphrase is used in ssh-keygen(1), the user will be prompted for a password each time in order to use the
private key.
A SSH v2 DSA key can be created for the same purpose by using the ssh-keygen -d command (or ssh-keygen
-t dsa for FreeBSD FreeBSD-CURRENT). This will create a public/private DSA key for use in SSH v2 sessions
only. The public key is stored in ~/.ssh/id_dsa.pub, while the private key is in ~/.ssh/id_dsa.
252
Chapter 10 Security
DSA public keys are placed in ~/.ssh/authorized_keys2 on the remote machine.
ssh-agent(1) and ssh-add(1) are utilities used in managing multiple passworded private keys.
Forces ssh to use version 2 of the protocol. (Do not use if you are working with older ssh servers)
-N
Indicates no command, or tunnel only. If omitted, ssh would initiate a normal session.
-f
This can be used in conjunction with an ssh-keygen(1) and additional user accounts to create a more
seamless/hassle-free SSH tunneling environment. Keys can be used in place of typing a password, and the tunnels
can be run as a separate user.
253
Chapter 10 Security
When the tunnel is up and running, you can point your mail client to send POP3 requests to localhost port 2110.
A connection here will be forwarded securely across the tunnel to mail.example.com.
Your streaming client can now be pointed to localhost port 8888, which will be forwarded over to
music.example.com port 8000, successfully evading the firewall.
254
Chapter 10 Security
Security policy modules shipped with the base system may be loaded using kldload(8) or in the boot loader(8) They
may also be compiled directly into the kernel using the following options, if the use of modules is not desired.
Different MAC policies may be configured in different ways; frequently, MAC policy modules export configuration
parameters using the sysctl(8) MIB using the security.mac namespace. Policies relying on file system or other
labels may require a configuration step that involves assigning initial labels to system objects or creating a policy
configuration file. For information on how to configure and use each policy module, see its man page.
A variety of tools are available to configure the MAC Framework and labels maintained by various policies.
Extensions have been made to the login and credential management mechanisms (setusercontext(3)) to support initial
user labeling using login.conf(5). In addition, modifications have been made to su(1), ps(1), ls(1), and ifconfig(8) to
inspect and set labels on processes, files, and interfaces. In addition, several new tools have been added to manage
labels on objects, including getfmac(8), setfmac(8), and setfsmac(8) to manage labels on files, and getpmac(8) and
setpmac(8).
What follows is a list of policy modules shipped with FreeBSD 5.0.
255
Chapter 10 Security
256
Chapter 10 Security
Multi-Level Security (MLS) (mac_mls(4)) provides for hierarchical and non-hierarchical labeling of all system
objects with sensitivity data, and the strict enforcement of an information flow policy to prevent the leakage of
confidential data to untrusted parties. The logical conjugate of the Biba Integrity Policy, MLS is frequently shipped
in commercial trusted operating systems to protect data secrecy in multi-user environments. Hierarchal labels
provide support for the notion of clearances and classifications in traditional parlance; non-hierarchical labels
provide support for need-to-know. As with Biba, ubiquitous labeling of objects occurs, and it must therefore be
compiled into the kernel or loaded at boot. As with Biba, extensive initial configuration may be required.
257
Chapter 10 Security
The Test policy (mac_test(4)) provides a regression test environment for the MAC Framework, and will cause a
fail-stop in the event that internal MAC Framework assertions about proper data labeling fail. This module can be
used to detect failures to properly label system objects in the kernel implementation. This policy may be compiled
into the kernel, loaded at boot, or loaded at run-time.
must be compiled into the kernel. If this option has not been compiled in, a warning message will be displayed when
attempting to mount a file system supporting ACLs. This option is included in the GENERIC kernel. ACLs rely on
extended attributes being enabled on the file system. Extended attributes are natively supported in the next generation
UNIX file system, UFS2.
Note: A higher level of administrative overhead is required to configure extended attributes on UFS1 than on
UFS2. The performance of extended attributes on UFS2 is also substantially higher. As a result, UFS2 is
generally recommended in preference to UFS1 for use with access control lists.
ACLs are enabled by the mount-time administrative flag, acls, which may be added to /etc/fstab. The
mount-time flag can also be automatically set in a persistent manner using tunefs(8) to modify a superblock ACLs
flag in the file system header. In general, it is preferred to use the superblock flag for several reasons:
The mount-time ACLs flag cannot be changed by a remount (mount(8) -u), only by means of a complete
umount(8) and fresh mount(8). This means that ACLs cannot be enabled on the root file system after boot. It also
means that you cannot change the disposition of a file system once it is in use.
Setting the superblock flag will cause the file system to always be mounted with ACLs enabled even if there is not
an fstab entry or if the devices re-order. This prevents accidental mounting of the file system without ACLs
enabled, which can result in ACLs being improperly enforced, and hence security problems.
Note: We may change the ACLs behavior to allow the flag to be enabled without a complete fresh mount(8), but
we consider it desirable to discourage accidental mounting without ACLs enabled, because you can shoot your
feet quite nastily if you enable ACLs, then disable them, then re-enable them without flushing the extended
attributes. In general, once you have enabled ACLs on a file system, they should not be disabled, as the resulting
file protections may not be compatible with those intended by the users of the system, and re-enabling ACLs may
re-attach the previous ACLs to files that have since had their permissions changed, resulting in other
unpredictable behavior.
258
Chapter 10 Security
File systems with ACLs enabled will show a + (plus) sign in their permission settings when viewed. For example:
drwx-----drwxrwx---+
drwxrwx---+
drwxrwx---+
drwxr-xr-x
2
2
2
2
2
robert
robert
robert
robert
robert
robert
robert
robert
robert
robert
512
512
512
512
512
Dec
Dec
Dec
Dec
Nov
27
23
22
27
10
11:54
10:57
10:20
11:57
11:54
private
directory1
directory2
directory3
public_html
Here we see that the directory1, directory2, and directory3 directories are all taking advantage of ACLs.
The public_html directory is not.
259
Chapter 11 Printing
Contributed by Sean Kelly. Restructured and updated by Jim Mock.
11.1 Synopsis
FreeBSD can be used to print to a wide variety of printers, from the oldest impact printer to the latest laser printers,
and everything in between, allowing you to produce high quality printed output from the applications you run.
FreeBSD can also be configured to act as a print server on a network; in this capacity FreeBSD can receive print jobs
from a variety of other computers, including other FreeBSD computers, Windows and MacOS hosts. FreeBSD will
ensure that one job at a time is printed, and can keep statistics on which users and machines are doing the most
printing, produce banner pages showing whos printout is whos, and more.
After reading this chapter, you will know:
How to install print filters, to handle special print jobs differently, including converting incoming documents to
print formats that your printers understand.
How to control printer restrictions, including limiting the size of print jobs, and preventing certain users from
printing.
11.2 Introduction
In order to use printers with FreeBSD, you will need to set them up to work with the Berkeley line printer spooling
system, also known as the LPD spooling system. It is the standard printer control system in FreeBSD. This chapter
introduces the LPD spooling system, often simply called LPD, and will guide you through its configuration.
If you are already familiar with LPD or another printer spooling system, you may wish to skip to section
Setting up the spooling system.
LPD controls everything about a hosts printers. It is responsible for a number of things:
It controls access to attached printers and printers attached to other hosts on the network.
It enables users to submit files to be printed; these submissions are known as jobs.
It prevents multiple users from accessing a printer at the same time by maintaining a queue for each printer.
260
Chapter 11 Printing
It can print header pages (also known as banner or burst pages) so users can easily find jobs they have printed in a
stack of printouts.
It can send jobs over the network to a LPD spooler on another host.
It can run special filters to format jobs to be printed for various printer languages or printer capabilities.
Through a configuration file (/etc/printcap), and by providing the special filter programs, you can enable the
LPD system to do all or some subset of the above for a great variety of printer hardware.
LPD prints jobs in the background; you do not have to wait for data to be copied to the printer.
LPD can conveniently run a job to be printed through filters to add date/time headers or convert a special file
format (such as a TeX DVI file) into a format the printer will understand. You will not have to do these steps
manually.
Many free and commercial programs that provide a print feature usually expect to talk to the spooler on your
system. By setting up the spooling system, you will more easily support other software you may later add or
already have.
See section Simple Printer Setup to learn how to connect a printer, tell LPD how to communicate with it, and print
plain text files to the printer.
See section Advanced Printer Setup to find out how to print a variety of special file formats, to print header pages,
to print across a network, to control access to printers, and to do printer accounting.
Section Hardware Setup gives some hints on connecting the printer to a port on your computer.
Section Software Setup shows how to setup the LPD spooler configuration file (/etc/printcap).
If you are setting up a printer that uses a network protocol to accept data to print instead of a serial or parallel
interface, see Printers With Networked Data Stream Interfaces.
261
Chapter 11 Printing
Although this section is called Simple Printer Setup, it is actually fairly complex. Getting the printer to work with
your computer and the LPD spooler is the hardest part. The advanced options like header pages and accounting are
fairly easy once you get the printer working.
11.3.1.1 Hardware Setup
This section tells about the various ways you can connect a printer to your PC. It talks about the kinds of ports and
cables, and also the kernel configuration you may need to enable FreeBSD to speak to the printer.
If you have already connected your printer and have successfully printed with it under another operating system, you
can probably skip to section Software Setup.
11.3.1.1.1 Ports and Cables
Nearly all printers you can get for a PC today support one or both of the following interfaces:
Serial interfaces use a serial port on your computer to send data to the printer. Serial interfaces are common in the
computer industry and cables are readily available and also easy to construct. Serial interfaces sometimes need
special cables and might require you to configure somewhat complex communications options.
Parallel interfaces use a parallel port on your computer to send data to the printer. Parallel interfaces are common
in the PC market. Cables are readily available but more difficult to construct by hand. There are usually no
communications options with parallel interfaces, making their configuration exceedingly simple.
Parallel interfaces are sometimes known as Centronics interfaces, named after the connector type on the printer.
In general, serial interfaces are slower than parallel interfaces. Parallel interfaces usually offer just one-way
communication (computer to printer) while serial gives you two-way. Many newer parallel ports and printers can
communicate in both directions under FreeBSD when a IEEE1284 compliant cable is used.
Usually, the only time you need two-way communication with the printer is if the printer speaks PostScript.
PostScript printers can be very verbose. In fact, PostScript jobs are actually programs sent to the printer; they need
not produce paper at all and may return results directly to the computer. PostScript also uses two-way
communication to tell the computer about problems, such as errors in the PostScript program or paper jams. Your
users may be appreciative of such information. Furthermore, the best way to do effective accounting with a
PostScript printer requires two-way communication: you ask the printer for its page count (how many pages it has
printed in its lifetime), then send the users job, then ask again for its page count. Subtract the two values and you
know how much paper to charge the user.
262
Chapter 11 Printing
11.3.1.1.3 Serial Ports
To hook up a printer using a serial interface, connect the proper serial cable between the printer and the computer.
The instructions that came with the printer, the computer, or both should give you complete guidance.
If you are unsure what the proper serial cable is, you may wish to try one of the following alternatives:
A modem cable connects each pin of the connector on one end of the cable straight through to its corresponding
pin of the connector on the other end. This type of cable is also known as a DTE-to-DCE cable.
A null-modem cable connects some pins straight through, swaps others (send data to receive data, for example),
and shorts some internally in each connector hood. This type of cable is also known as a DTE-to-DTE cable.
A serial printer cable, required for some unusual printers, is like the null-modem cable, but sends some signals to
their counterparts instead of being internally shorted.
You should also set up the communications parameters for the printer, usually through front-panel controls or DIP
switches on the printer. Choose the highest bps (bits per second, sometimes baud rate) rate that both your computer
and the printer can support. Choose 7 or 8 data bits; none, even, or odd parity; and 1 or 2 stop bits. Also choose a
flow control protocol: either none, or XON/XOFF (also known as in-band or software) flow control. Remember
these settings for the software configuration that follows.
Configure your kernel, if necessary, for the port you are using for the printer; section Kernel Configuration tells
you what you need to do.
2.
Set the communications mode for the parallel port, if you are using a parallel port; section
Setting the Communication Mode for the Parallel Port gives details.
3.
Test if the operating system can send data to the printer. Section Checking Printer Communications gives some
suggestions on how to do this.
4.
Set up LPD for the printer by modifying the file /etc/printcap. You will find out how to do this later in this
chapter.
Where N is the number of the serial port, starting from zero. If you see output similar to the following:
sio2 at port 0x3e8-0x3ef irq 5 on isa
sio2: type 16550A
263
Chapter 11 Printing
then the kernel supports the port.
To find out if the kernel supports a parallel interface, type:
# grep ppcN /var/run/dmesg.boot
Where N is the number of the parallel port, starting from zero. If you see output similar to the following:
ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
ppc0: FIFO with 16/16/8 bytes threshold
Even though the kernel may support communication along a serial or parallel port, you will still need a software
interface through which programs running on the system can send and receive data. That is what entries in the /dev
directory are for.
To add a /dev entry for a port:
1.
Become root with the su(1) command. Enter the root password when prompted.
2.
3.
Type:
# ./MAKEDEV port
Where port is the device entry for the port you want to make. Use lpt0 for the printer on the first parallel port,
lpt1 for the printer on the second port, and so on; use ttyd0 for the first serial port, ttyd1 for the second, and
so on.
4.
Type:
# ls -l port
264
Chapter 11 Printing
11.3.1.3.1 Setting the Communication Mode for the Parallel Port
When you are using the parallel interface, you can choose whether FreeBSD should use interrupt-driven or polled
communication with the printer. The generic printer device driver (lpt(4)) on FreeBSD 4.X and 5.X uses the ppbus(4)
system, which controls the port chipset with the ppc(4) driver.
The interrupt-driven method is the default with the GENERIC kernel. With this method, the operating system uses
an IRQ line to determine when the printer is ready for data.
The polled method directs the operating system to repeatedly ask the printer if it is ready for more data. When it
responds ready, the kernel sends more data.
The interrupt-driven method is usually somewhat faster but uses up a precious IRQ line. Some newer HP printers are
claimed not to work correctly in interrupt mode, apparently due to some (not yet exactly understood) timing
problem. These printers need polled mode. You should use whichever one works. Some printers will work in both
modes, but are painfully slow in interrupt mode.
You can set the communications mode in two ways: by configuring the kernel or by using the lptcontrol(8) program.
To set the communications mode by configuring the kernel:
1.
Edit your kernel configuration file. Look for an ppc0 entry. If you are setting up the second parallel port, use
ppc1 instead. Use ppc2 for the third port, and so on.
If you want interrupt-driven mode, for FreeBSD 4.X add the irq specifier:
device ppc0 at isa? irq N
in the /boot/device.hints file and replace N with the right IRQ number. The kernel configuration file
must also contain the ppc(4) driver:
device ppc
For FreeBSD 5.X, simply remove in your /boot/device.hints file, the following line:
hint.ppc.0.irq="N "
In some cases, this is not enough to put the port in polled mode under FreeBSD 5.X. Most of time it comes
from acpi(4) driver, this latter is able to probe and attach devices, and therefore, control the access mode to the
printer port. You should check your acpi(4) configuration to correct this problem.
2.
Save the file. Then configure, build, and install the kernel, then reboot. See kernel configuration for more details.
265
Chapter 11 Printing
1.
Type:
# lptcontrol -i -d /dev/lptN
Type:
# lptcontrol -p -d /dev/lptN
The above PostScript code can be placed into a file and used as shown in the examples appearing in the following
sections.
Note: When this document refers to a printer language, it is assuming a language like PostScript, and not
Hewlett Packards PCL. Although PCL has great functionality, you can intermingle plain text with its escape
sequences. PostScript cannot directly print plain text, and that is the kind of printer language for which we must
make special accommodations.
2.
If the printer can print plain text, then use lptest(1). Type:
# lptest > /dev/lptN
266
Chapter 11 Printing
If the printer understands PostScript or other printer language, then send a small program to the printer. Type:
# cat > /dev/lptN
Then, line by line, type the program carefully as you cannot edit a line once you have pressed RETURN or
ENTER. When you have finished entering the program, press CONTROL+D, or whatever your end of file key is.
Alternatively, you can put the program in a file and type:
# cat file > /dev/lptN
Where file is the name of the file containing the program you want to send to the printer.
You should see something print. Do not worry if the text does not look right; we will fix such things later.
2.
Where port is the device entry for the serial port (ttyd0, ttyd1, etc.), bps-rate is the bits-per-second rate
at which the printer communicates, and parity is the parity required by the printer (either even, odd, none,
or zero).
Here is a sample entry for a printer connected via a serial line to the third serial port at 19200 bps with no parity:
printer:dv=/dev/ttyd2:br#19200:pa=none
3.
If this step does not work, edit the file /etc/remote again and try using /dev/cuaaN instead of /dev/ttydN .
4.
If the printer can print plain text, then use lptest(1). Type:
% $lptest
If the printer understands PostScript or other printer language, then send a small program to the printer. Type
the program, line by line, very carefully as backspacing or other editing keys may be significant to the printer.
You may also need to type a special end-of-file key for the printer so it knows it received the whole program.
For PostScript printers, press CONTROL+D.
Alternatively, you can put the program in a file and type:
% >file
267
Chapter 11 Printing
Where file is the name of the file containing the program. After tip(1) sends the file, press any required
end-of-file key.
You should see something print. Do not worry if the text does not look right; we will fix that later.
Pick a name (and a few convenient aliases) for the printer, and put them in the /etc/printcap file; see the
Naming the Printer section for more information on naming.
2.
Turn off header pages (which are on by default) by inserting the sh capability; see the
Suppressing Header Pages section for more information.
3.
Make a spooling directory, and specify its location with the sd capability; see the
Making the Spooling Directory section for more information.
4.
Set the /dev entry to use for the printer, and note it in /etc/printcap with the lp capability; see the
Identifying the Printer Device for more information. Also, if the printer is on a serial port, set up the
communication parameters with the ms# capability which is discussed in the
Configuring Spooler Communications Parameters section.
5.
Install a plain text input filter; see the Installing the Text Filter section for details.
6.
Test the setup by printing something with the lpr(1) command. More details are available in the Trying It Out
and Troubleshooting sections.
Note: Language-based printers, such as PostScript printers, cannot directly print plain text. The simple setup
outlined above and described in the following sections assumes that if you are installing such a printer you will
print only files that the printer can understand.
Users often expect that they can print plain text to any of the printers installed on your system. Programs that
interface to LPD to do their printing usually make the same assumption. If you are installing such a printer and want
to be able to print jobs in the printer language and print plain text jobs, you are strongly urged to add an additional
step to the simple setup outlined above: install an automatic plain-text-to-PostScript (or other printer language)
conversion program. The section entitled Accommodating Plain Text Jobs on PostScript Printers tells how to do this.
268
Chapter 11 Printing
11.3.1.4.1 Naming the Printer
The first (easy) step is to pick a name for your printer It really does not matter whether you choose functional or
whimsical names since you can also provide a number of aliases for the printer.
At least one of the printers specified in the /etc/printcap should have the alias lp. This is the default printers
name. If users do not have the PRINTER environment variable nor specify a printer name on the command line of any
of the LPD commands, then lp will be the default printer they get to use.
Also, it is common practice to make the last alias for a printer be a full description of the printer, including make and
model.
Once you have picked a name and some common aliases, put them in the /etc/printcap file. The name of the
printer should start in the leftmost column. Separate each alias with a vertical bar and put a colon after the last alias.
In the following example, we start with a skeletal /etc/printcap that defines two printers (a Diablo 630 line
printer and a Panasonic KX-P4455 PostScript laser printer):
#
# /etc/printcap for host rose
#
rattan|line|diablo|lp|Diablo 630 Line Printer:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:
In this example, the first printer is named rattan and has as aliases line, diablo, lp, and Diablo 630 Line
Printer. Since it has the alias lp, it is also the default printer. The second is named bamboo, and has as aliases ps,
PS, S, panasonic, and Panasonic KX-P4455 PostScript v51.4.
Note how we used the correct format: the first line starts in the leftmost column, and subsequent lines are indented
with a single TAB. Every line in an entry except the last ends in a backslash character.
269
Chapter 11 Printing
11.3.1.4.3 Making the Spooling Directory
The next step in the simple spooler setup is to make a spooling directory, a directory where print jobs reside until
they are printed, and where a number of other spooler support files live.
Because of the variable nature of spooling directories, it is customary to put these directories under /var/spool. It
is not necessary to backup the contents of spooling directories, either. Recreating them is as simple as running
mkdir(1).
It is also customary to make the directory with a name that is identical to the name of the printer, as shown below:
# mkdir /var/spool/printer-name
However, if you have a lot of printers on your network, you might want to put the spooling directories under a single
directory that you reserve just for printing with LPD. We will do this for our two example printers rattan and
bamboo:
# mkdir /var/spool/lpd
# mkdir /var/spool/lpd/rattan
# mkdir /var/spool/lpd/bamboo
Note: If you are concerned about the privacy of jobs that users print, you might want to protect the spooling
directory so it is not publicly accessible. Spooling directories should be owned and be readable, writable, and
searchable by user daemon and group daemon, and no one else. We will do this for our example printers:
#
#
#
#
chown
chown
chmod
chmod
daemon:daemon /var/spool/lpd/rattan
daemon:daemon /var/spool/lpd/bamboo
770 /var/spool/lpd/rattan
770 /var/spool/lpd/bamboo
Finally, you need to tell LPD about these directories using the /etc/printcap file. You specify the pathname of
the spooling directory with the sd capability:
#
# /etc/printcap for host rose - added spooling directories
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:
Note that the name of the printer starts in the first column but all other entries describing the printer should be
indented with a tab and each line escaped with a backslash.
If you do not specify a spooling directory with sd, the spooling system will use /var/spool/lpd as a default.
270
Chapter 11 Printing
11.3.1.4.4 Identifying the Printer Device
In the Adding /dev Entries for the Ports section, we identified which entry in the /dev directory FreeBSD will use
to communicate with the printer. Now, we tell LPD that information. When the spooling system has a job to print, it
will open the specified device on behalf of the filter program (which is responsible for passing data to the printer).
List the /dev entry pathname in the /etc/printcap file using the lp capability.
In our running example, let us assume that rattan is on the first parallel port, and bamboo is on a sixth serial port;
here are the additions to /etc/printcap:
#
# /etc/printcap for host rose - identified what devices to use
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:
If you do not specify the lp capability for a printer in your /etc/printcap file, LPD uses /dev/lp as a default.
/dev/lp currently does not exist in FreeBSD.
If the printer you are installing is connected to a parallel port, skip to the section entitled, Installing the Text Filter.
Otherwise, be sure to follow the instructions in the next section.
It lets you try different communication parameters by simply editing the /etc/printcap file; you do not have to
recompile the filter program.
It enables the spooling system to use the same filter program for multiple printers which may have different serial
communication settings.
The following /etc/printcap capabilities control serial communication parameters of the device listed in the lp
capability:
br#bps-rate
Sets the communications speed of the device to bps-rate, where bps-rate can be 50, 75, 110, 134, 150,
200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, or 115200 bits-per-second.
ms#stty-mode
Sets the options for the terminal device after opening the device. stty(1) explains the available options.
When LPD opens the device specified by the lp capability, it sets the characteristics of the device to those specified
with the ms# capability. Of particular interest will be the parenb, parodd, cs5, cs6, cs7, cs8, cstopb, crtscts,
and ixon modes, which are explained in the stty(1) manual page.
271
Chapter 11 Printing
Let us add to our example printer on the sixth serial port. We will set the bps rate to 38400. For the mode, we will set
no parity with -parenb, 8-bit characters with cs8, no modem control with clocal and hardware flow control with
crtscts:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:
And then tell LPD to use it by specifying it with the if capability in /etc/printcap. We will add it to the two
printers we have so far in the example /etc/printcap:
#
# /etc/printcap for host rose - added text filter
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:\
:if=/usr/local/libexec/if-simple:
272
Chapter 11 Printing
11.3.1.4.7 Turn on LPD
lpd(8) is run from /etc/rc, controlled by the lpd_enable variable. This variable defaults to NO. If you have not
done so already, add the line:
lpd_enable="YES"
to /etc/rc.conf, and then either restart your machine, or just run lpd(8).
# lpd
Where printer-name is a the name of a printer (or an alias) specified in /etc/printcap. To test the default
printer, type lpr(1) without any -P argument. Again, if you are testing a printer that expects PostScript, send a
PostScript program in that language instead of using lptest(1). You can do so by putting the program in a file and
typing lpr file.
For a PostScript printer, you should get the results of the program. If you are using lptest(1), then your results should
look like the following:
!"#$%&()*+,-./01234
"#$%&()*+,-./012345
#$%&()*+,-./0123456
$%&()*+,-./01234567
%&()*+,-./012345678
To further test the printer, try downloading larger programs (for language-based printers) or running lptest(1) with
different arguments. For example, lptest 80 60 will produce 60 lines of 80 characters each.
If the printer did not work, see the Troubleshooting section.
273
Chapter 11 Printing
11.4.1 Filters
Although LPD handles network protocols, queuing, access control, and other aspects of printing, most of the real
work happens in the filters. Filters are programs that communicate with the printer and handle its device
dependencies and special requirements. In the simple printer setup, we installed a plain text filteran extremely
simple one that should work with most printers (section Installing the Text Filter).
However, in order to take advantage of format conversion, printer accounting, specific printer quirks, and so on, you
should understand how filters work. It will ultimately be the filters responsibility to handle these aspects. And the
bad news is that most of the time you have to provide filters yourself. The good news is that many are generally
available; when they are not, they are usually easy to write.
Also, FreeBSD comes with one, /usr/libexec/lpr/lpf, that works with many printers that can print plain text.
(It handles backspacing and tabs in the file, and does accounting, but that is about all it does.) There are also several
filters and filter components in the FreeBSD Ports Collection.
Here is what you will find in this section:
Section How Filters Work, tries to give an overview of a filters role in the printing process. You should read this
section to get an understanding of what is happening under the hood when LPD uses filters. This knowledge
could help you anticipate and debug problems you might encounter as you install more and more filters on each of
your printers.
LPD expects every printer to be able to print plain text by default. This presents a problem for PostScript (or other
language-based printers) which cannot directly print plain text. Section
Accommodating Plain Text Jobs on PostScript Printers tells you what you should do to overcome this problem.
You should read this section if you have a PostScript printer.
PostScript is a popular output format for many programs. Even some people (myself included) write PostScript
code directly. But PostScript printers are expensive. Section Simulating PostScript on Non-PostScript Printers tells
how you can further modify a printers text filter to accept and print PostScript data on a non-PostScript printer.
You should read this section if you do not have a PostScript printer.
Section Conversion Filters tells about a way you can automate the conversion of specific file formats, such as
graphic or typesetting data, into formats your printer can understand. After reading this section, you should be able
to set up your printers such that users can type lpr -t to print troff data, or lpr -d to print TeX DVI data, or
lpr -v to print raster image data, and so forth. I recommend reading this section.
Section Output Filters tells all about a not often used feature of LPD: output filters. Unless you are printing header
pages (see Header Pages), you can probably skip that section altogether.
Section lpf: a Text Filter describes lpf, a fairly complete if simple text filter for line printers (and laser printers
that act like line printers) that comes with FreeBSD. If you need a quick way to get printer accounting working for
plain text, or if you have a printer which emits smoke when it sees backspace characters, you should definitely
consider lpf.
274
Chapter 11 Printing
Which filter LPD starts and the filters arguments depend on what is listed in the /etc/printcap file and what
arguments the user specified for the job on the lpr(1) command line. For example, if the user typed lpr -t, LPD
would start the troff filter, listed in the tf capability for the destination printer. If the user wanted to print plain text, it
would start the if filter (this is mostly true: see Output Filters for details).
There are three kinds of filters you can specify in /etc/printcap:
The text filter, confusingly called the input filter in LPD documentation, handles regular text printing. Think of it
as the default filter. LPD expects every printer to be able to print plain text by default, and it is the text filters job
to make sure backspaces, tabs, or other special characters do not confuse the printer. If you are in an environment
where you have to account for printer usage, the text filter must also account for pages printed, usually by counting
the number of lines printed and comparing that to the number of lines per page the printer supports. The text filter
is started with the following argument list:
where
-c
A conversion filter converts a specific file format into one the printer can render onto paper. For example, ditroff
typesetting data cannot be directly printed, but you can install a conversion filter for ditroff files to convert the
ditroff data into a form the printer can digest and print. Section Conversion Filters tells all about them. Conversion
filters also need to do accounting, if you need printer accounting. Conversion filters are started with the following
arguments:
275
Chapter 11 Printing
where pixel-width is the value from the px capability (default 0) and pixel-height is the value from the
py capability (default 0).
The output filter is used only if there is no text filter, or if header pages are enabled. In my experience, output
filters are rarely used. Section Output Filters describe them. There are only two arguments to an output filter:
276
Chapter 11 Printing
lprps is part of the FreeBSD Ports Collection (see The Ports Collection). You can fetch, build and install it yourself,
of course. After installing lprps, just specify the pathname to the psif program that is part of lprps. If you
installed lprps from the ports collection, use the following in the serial PostScript printers entry in
/etc/printcap:
:if=/usr/local/libexec/psif:
You should also specify the rw capability; that tells LPD to open the printer in read-write mode.
If you have a parallel PostScript printer (and therefore cannot use two-way communication with the printer, which
lprps needs), you can use the following shell script as the text filter:
#!/bin/sh
#
# psif - Print PostScript or plain text on a PostScript printer
# Script version; NOT the version that comes with lprps
# Installed in /usr/local/libexec/psif
#
IFS="" read -r first_line
first_two_chars=expr "$first_line" : \(..\)
if [ "$first_two_chars" = "%!" ]; then
#
# PostScript job, print it.
#
echo "$first_line" && cat && printf "\004" && exit 0
exit 2
else
#
# Plain text, convert it, then print it.
#
( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0
exit 2
fi
In the above script, textps is a program we installed separately to convert plain text to PostScript. You can use any
text-to-PostScript program you wish. The FreeBSD Ports Collection (see The Ports Collection) includes a full
featured text-to-PostScript program called a2ps that you might want to investigate.
277
Chapter 11 Printing
To simulate PostScript, we have the text filter detect if it is printing a PostScript file. If it is not, then the filter will
pass the file directly to the printer; otherwise, it will use Ghostscript to first convert the file into a format the printer
will understand.
Here is an example: the following script is a text filter for Hewlett Packard DeskJet 500 printers. For other printers,
substitute the -sDEVICE argument to the gs (Ghostscript) command. (Type gs -h to get a list of devices the current
installation of Ghostscript supports.)
#!/bin/sh
#
# ifhp - Print Ghostscript-simulated PostScript on a DeskJet 500
# Installed in /usr/local/libexec/ifhp
#
# Treat LF as CR+LF:
#
printf "\033&k2G" || exit 2
#
# Read first two characters of the file
#
IFS="" read -r first_line
first_two_chars=expr "$first_line" : \(..\)
if [ "$first_two_chars" = "%!" ]; then
#
# It is PostScript; use Ghostscript to scan-convert and print it.
#
# Note that PostScript files are actually interpreted programs,
# and those programs are allowed to write to stdout, which will
# mess up the printed output. So, we redirect stdout to stderr
# and then make descriptor 3 go to stdout, and have Ghostscript
# write its output there. Exercise for the clever reader:
# capture the stderr output from Ghostscript and mail it back to
# the user originating the print job.
#
exec 3>&1 1>&2
/usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \
-sOutputFile=/dev/fd/3 - && exit 0
else
#
# Plain text or HP/PCL, so just print it directly; print a form feed
# at the end to eject the last page.
#
echo "$first_line" && cat && printf "\033&l0H" &&
exit 0
fi
exit 2
Finally, you need to notify LPD of the filter via the if capability:
:if=/usr/local/libexec/ifhp:
278
Chapter 11 Printing
That is it. You can type lpr plain.text and lpr whatever.ps and both should print successfully.
By installing a conversion filter for DVI files, we can skip the hand conversion step each time by having LPD do it
for us. Now, each time we get a DVI file, we are just one step away from printing it:
% lpr -d seaweed-analysis.dvi
We got LPD to do the DVI file conversion for us by specifying the -d option. Section
Formatting and Conversion Options lists the conversion options.
For each of the conversion options you want a printer to support, install a conversion filter and specify its pathname
in /etc/printcap. A conversion filter is like the text filter for the simple printer setup (see section
Installing the Text Filter) except that instead of printing plain text, the filter converts the file into a format the printer
can understand.
/etc/printcap capability
lpr option
cifplot
DVI
cf
-c
df
-d
plot
ditroff
gf
-g
nf
-n
FORTRAN text
troff
rf
-f
rf
-f
raster
plain text
vf
-v
if
none, -p, or -l
In our example, using lpr -d means the printer needs a df capability in its entry in /etc/printcap.
279
Chapter 11 Printing
Despite what others might contend, formats like FORTRAN text and plot are probably obsolete. At your site, you
can give new meanings to these or any of the formatting options just by installing custom filters. For example,
suppose you would like to directly print Printerleaf files (files from the Interleaf desktop publishing program), but
will never print plot files. You could install a Printerleaf conversion filter under the gf capability and then educate
your users that lpr -g mean print Printerleaf files.
The DVI filter is a shell script named /usr/local/libexec/psdf. Here is that script:
#!/bin/sh
#
# psdf - DVI to PostScript printer filter
# Installed in /usr/local/libexec/psdf
#
# Invoked by lpd when user runs lpr -d
#
exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"
This script runs dvips in filter mode (the -f argument) on standard input, which is the job to print. It then starts the
PostScript printer filter lprps (see section Accommodating Plain Text Jobs on PostScript Printers) with the
arguments LPD passed to this script. lprps will use those arguments to account for the pages printed.
280
Chapter 11 Printing
This example script is a raster (well, GIF file, actually) conversion filter for a Hewlett Packard LaserJet III-Si printer:
#!/bin/sh
#
# hpvf - Convert GIF files into HP/PCL, then print
# Installed in /usr/local/libexec/hpvf
PATH=/usr/X11R6/bin:$PATH; export PATH
giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
&& exit 0 \
|| exit 2
It works by converting the GIF file into a portable anymap, converting that into a portable graymap, converting that
into a portable bitmap, and converting that into LaserJet/PCL-compatible data.
Here is the /etc/printcap file with an entry for a printer using the above filter:
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:\
:vf=/usr/local/libexec/hpvf:
The following script is a conversion filter for troff data from the groff typesetting system for the PostScript printer
named bamboo:
#!/bin/sh
#
# pstf - Convert groffs troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps "$@"
The above script makes use of lprps again to handle the communication with the printer. If the printer were on a
parallel port, we would use this script instead:
#!/bin/sh
#
# pstf - Convert groffs troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops
That is it. Here is the entry we need to add to /etc/printcap to enable the filter:
:tf=/usr/local/libexec/pstf:
Here is an example that might make old hands at FORTRAN blush. It is a FORTRAN-text filter for any printer that
can directly print plain text. We will install it for the printer teak:
#!/bin/sh
#
281
Chapter 11 Printing
# hprf - FORTRAN text filter for LaserJet 3si:
# Installed in /usr/local/libexec/hprf
#
printf "\033&k2G" && fpr && printf "\033&l0H" &&
exit 0
exit 2
And we will add this line to the /etc/printcap for the printer teak to enable this filter:
:rf=/usr/local/libexec/hprf:
Here is one final, somewhat complex example. We will add a DVI filter to the LaserJet printer teak introduced
earlier. First, the easy part: updating /etc/printcap with the location of the DVI filter:
:df=/usr/local/libexec/hpdf:
Now, for the hard part: making the filter. For that, we need a DVI-to-LaserJet/PCL conversion program. The
FreeBSD Ports Collection (see The Ports Collection) has one: dvi2xx is the name of the package. Installing this
package gives us the program we need, dvilj2p, which converts DVI into LaserJet IIp, LaserJet III, and LaserJet
2000 compatible codes.
dvilj2p makes the filter hpdf quite complex since dvilj2p cannot read from standard input. It wants to work with
a filename. What is worse, the filename has to end in .dvi so using /dev/fd/0 for standard input is problematic.
We can get around that problem by linking (symbolically) a temporary file name (one that ends in .dvi) to
/dev/fd/0, thereby forcing dvilj2p to read from standard input.
The only other fly in the ointment is the fact that we cannot use /tmp for the temporary link. Symbolic links are
owned by user and group bin. The filter runs as user daemon. And the /tmp directory has the sticky bit set. The
filter can create the link, but it will not be able clean up when done and remove it since the link will belong to a
different user.
Instead, the filter will make the symbolic link in the current working directory, which is the spooling directory
(specified by the sd capability in /etc/printcap). This is a perfect place for filters to do their work, especially
since there is (sometimes) more free disk space in the spooling directory than under /tmp.
Here, finally, is the filter:
#!/bin/sh
#
# hpdf - Print DVI data on HP/PCL printer
# Installed in /usr/local/libexec/hpdf
PATH=/usr/local/bin:$PATH; export PATH
#
# Define a function to clean up our temporary files. These exist
# in the current directory, which will be the spooling directory
# for the printer.
#
cleanup() {
rm -f hpdf$$.dvi
}
282
Chapter 11 Printing
#
# Define a function to handle fatal errors: print the given message
# and exit 2. Exiting with 2 tells LPD to do not try to reprint the
# job.
#
fatal() {
echo "$@" 1>&2
cleanup
exit 2
}
#
# If user removes the job, LPD will send SIGINT, so trap SIGINT
# (and a few other signals) to clean up after ourselves.
#
trap cleanup 1 2 15
#
# Make sure we are not colliding with any existing files.
#
cleanup
#
# Link the DVI input file to standard input (the file to print).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"
#
# Make LF = CR+LF
#
printf "\033&k2G" || fatal "Cannot initialize printer"
#
# Convert and print. Return value from dvilj2p does not seem to be
# reliable, so we ignore it.
#
dvilj2p -M1 -q -e- dfhp$$.dvi
#
# Clean up and exit
#
cleanup
exit 0
283
Chapter 11 Printing
Rather than install conversion filters at all, you might want to try having the text filter (since it is the default filter)
detect the type of file it has been asked to print and then automatically run the right conversion filter. Tools such as
file can be of help here. Of course, it will be hard to determine the differences between some file typesand, of
course, you can still provide conversion filters just for them.
The FreeBSD Ports Collection has a text filter that performs automatic conversion called apsfilter. It can detect
plain text, PostScript, and DVI files, run the proper conversions, and print.
LPD starts an output filter once for the entire job instead of once for each file in the job.
LPD does not make any provision to identify the start or the end of files within the job for the output filter.
LPD does not pass the users login or host to the filter, so it is not intended to do accounting. In fact, it gets only
two arguments:
filter-name -wwidth -llength
Where width is from the pw capability and length is from the pl capability for the printer in question.
Do not be seduced by an output filters simplicity. If you would like each file in a job to start on a different page an
output filter will not work. Use a text filter (also known as an input filter); see section Installing the Text Filter.
Furthermore, an output filter is actually more complex in that it has to examine the byte stream being sent to it for
special flag characters and must send signals to itself on behalf of LPD.
However, an output filter is necessary if you want header pages and need to send escape sequences or other
initialization strings to be able to print the header page. (But it is also futile if you want to charge header pages to the
requesting users account, since LPD does not give any user or host information to the output filter.)
On a single printer, LPD allows both an output filter and text or other filters. In such cases, LPD will start the output
filter to print the header page (see section Header Pages) only. LPD then expects the output filter to stop itself by
sending two bytes to the filter: ASCII 031 followed by ASCII 001. When an output filter sees these two bytes (031,
001), it should stop by sending SIGSTOP to itself. When LPDs done running other filters, it will restart the output
filter by sending SIGCONT to it.
If there is an output filter but no text filter and LPD is working on a plain text job, LPD uses the output filter to do
the job. As stated before, the output filter will print each file of the job in sequence with no intervening form feeds or
other paper advancement, and this is probably not what you want. In almost all cases, you need a text filter.
The program lpf, which we introduced earlier as a text filter, can also run as an output filter. If you need a
quick-and-dirty output filter but do not want to write the byte detection and signal sending code, try lpf. You can
also wrap lpf in a shell script to handle any initialization codes the printer might require.
284
Chapter 11 Printing
11.4.1.6 lpf: a Text Filter
The program /usr/libexec/lpr/lpf that comes with FreeBSD binary distribution is a text filter (input filter) that
can indent output (job submitted with lpr -i), allow literal characters to pass (job submitted with lpr -l), adjust
the printing position for backspaces and tabs in the job, and account for pages printed. It can also act like an output
filter.
lpf is suitable for many printing environments. And although it has no capability to send initialization sequences to
a printer, it is easy to write a shell script to do the needed initialization and then execute lpf.
In order for lpf to do page accounting correctly, it needs correct values filled in for the pw and pl capabilities in the
/etc/printcap file. It uses these values to determine how much text can fit on a page and how many pages were in
a users job. For more information on printer accounting, see Accounting for Printer Usage.
Specify the path to the output filter in the of capability. See the Output Filters section for more information.
Here is an example /etc/printcap file for the printer teak that we introduced earlier; we enabled header pages
and added the above output filter:
285
Chapter 11 Printing
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:\
:vf=/usr/local/libexec/hpvf:\
:of=/usr/local/libexec/hpof:
Now, when users print jobs to teak, they get a header page with each job. If users want to spend time searching for
their printouts, they can suppress header pages by submitting the job with lpr -h; see the Header Page Options
section for more lpr(1) options.
Note: LPD prints a form feed character after the header page. If your printer uses a different character or
sequence of characters to eject a page, specify them with the ff capability in /etc/printcap.
o
o
o
o
oooo
o
o
o
o
oooo
eeee
e
e
eeeeee
e
e
e
eeee
ll
l
l
l
l
l
l
l
lll
ll
l
l
l
l
l
l
l
lll
u
u
u
u
u
u
u
u
u
uu
uuu u
t
t
ttttt
t
t
t
t t
tt
ll
l
l
l
l
l
l
l
lll
y
y
y
y
y
y
y
y
y
yy
yyy y
y
y
y
yyyy
i
ii
i
i
i
i
iii
n nnn
nn
n
n
n
n
n
n
n
n
n
eeee
e
e
eeeeee
e
e
e
eeee
286
Chapter 11 Printing
r rrr
rr
r
r
r
r
r
oooo
o
o
o
o
o
o
o
o
oooo
ssss
s
s
ss
ss
s
s
ssss
eeee
e
e
eeeeee
e
e
e
eeee
Job: outline
Date: Sun Sep 17 11:04:58 1995
LPD appends a form feed after this text so the job starts on a new page (unless you have sf (suppress form feeds) in
the destination printers entry in /etc/printcap).
If you prefer, LPD can make a short header; specify sb (short banner) in the /etc/printcap file. The header page
will look like this:
rose:kelly
Job: outline
Also by default, LPD prints the header page first, then the job. To reverse that, specify hl (header last) in
/etc/printcap.
287
Chapter 11 Printing
Install an alternative to LPD, such as LPRng. Section Alternatives to the Standard Spooler tells more about other
spooling software you can substitute for LPD.
Write a smart output filter. Normally, an output filter is not meant to do anything more than initialize a printer or
do some simple character conversion. It is suited for header pages and plain text jobs (when there is no text (input)
filter). But, if there is a text filter for the plain text jobs, then LPD will start the output filter only for the header
pages. And the output filter can parse the header page text that LPD generates to determine what user and host to
charge for the header page. The only other problem with this method is that the output filter still does not know
what accounting file to use (it is not passed the name of the file from the af capability), but if you have a
well-known accounting file, you can hard-code that into the output filter. To facilitate the parsing step, use the sh
(short header) capability in /etc/printcap. Then again, all that might be too much trouble, and users will
certainly appreciate the more generous system administrator who makes header pages free.
Modify for A4 or
#
# Check arguments
#
if [ $# -ne 3 ]; then
echo "Usage: basename $0 <user> <host> <job>" 1>&2
exit 1
fi
#
# Save these, mostly for readability in the PostScript, below.
#
user=$1
host=$2
288
Chapter 11 Printing
job=$3
date=date
#
# Send the PostScript code to stdout.
#
exec cat <<EOF
%!PS
%
% Make sure we do not interfere with users job that will follow
%
save
%
% Make a thick, unpleasant border around the edge of the paper.
%
$border $border moveto
$page_width $border 2 mul sub 0 rlineto
0 $page_height $border 2 mul sub rlineto
currentscreen 3 -1 roll pop 100 3 1 roll setscreen
$border 2 mul $page_width sub 0 rlineto closepath
0.8 setgray 10 setlinewidth stroke 0 setgray
%
% Display users login name, nice and large and prominent
%
/Helvetica-Bold findfont 64 scalefont setfont
$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto
($user) show
%
% Now show the boring particulars
%
/Helvetica findfont 14 scalefont setfont
/y 200 def
[ (Job:) (Host:) (Date:) ] {
200 y moveto show /y y 18 sub def }
forall
/Helvetica-Bold findfont 14 scalefont setfont
/y 200 def
[ ($job) ($host) ($date) ] {
270 y moveto show /y y 18 sub def
} forall
%
% That is it
%
restore
showpage
EOF
289
Chapter 11 Printing
Now, each of the conversion filters and the text filter can call this script to first generate the header page, and then
print the users job. Here is the DVI conversion filter from earlier in this document, modified to make a header page:
#!/bin/sh
#
# psdf - DVI to PostScript printer filter
# Installed in /usr/local/libexec/psdf
#
# Invoked by lpd when user runs lpr -d
#
orig_args="$@"
fail() {
echo "$@" 1>&2
exit 2
}
while getopts "x:y:n:h:" option; do
case $option in
x|y) ;; # Ignore
n)
login=$OPTARG ;;
h)
host=$OPTARG ;;
*)
echo "LPD started basename $0 wrong." 1>&2
exit 2
;;
esac
done
[ "$login" ] || fail "No login name"
[ "$host" ] || fail "No host name"
( /usr/local/libexec/make-ps-header $login $host "DVI File"
/usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args
Notice how the filter has to parse the argument list in order to determine the user and host name. The parsing for the
other conversion filters is identical. The text filter takes a slightly different set of arguments, though (see section
How Filters Work).
As we have mentioned before, the above scheme, though fairly simple, disables the suppress header page option
(the -h option) to lpr. If users wanted to save a tree (or a few pennies, if you charge for header pages), they would
not be able to do so, since every filters going to print a header page with every job.
To allow users to shut off header pages on a per-job basis, you will need to use the trick introduced in section
Accounting for Header Pages: write an output filter that parses the LPD-generated header page and produces a
PostScript version. If the user submits the job with lpr -h, then LPD will not generate a header page, and neither
will your output filter. Otherwise, your output filter will read the text from LPD and send the appropriate header page
PostScript code to the printer.
If you have a PostScript printer on a serial line, you can make use of lprps, which comes with an output filter,
psof, which does the above. Note that psof does not charge for header pages.
290
Chapter 11 Printing
Accessing a printer attached to a remote host. You install a printer that has a conventional serial or parallel
interface on one host. Then, you set up LPD to enable access to the printer from other hosts on the network.
Section Printers Installed on Remote Hosts tells how to do this.
Accessing a printer attached directly to a network. The printer has a network interface in addition (or in place of) a
more conventional serial or parallel interface. Such a printer might work as follows:
It might understand the LPD protocol and can even queue jobs from remote hosts. In this case, it acts just like a
regular host running LPD. Follow the same procedure in section Printers Installed on Remote Hosts to set up
such a printer.
It might support a data stream network connection. In this case, you attach the printer to one host on the
network by making that host responsible for spooling jobs and sending them to the printer. Section
Printers with Networked Data Stream Interfaces gives some suggestions on installing such printers.
Then, on the other hosts you want to have access to the printer, make an entry in their /etc/printcap files with the
following:
1. Name the entry anything you want. For simplicity, though, you probably want to use the same name and aliases
as on the printer host.
2. Leave the lp capability blank, explicitly (:lp=:).
3. Make a spooling directory and specify its location in the sd capability. LPD will store jobs here before they get
sent to the printer host.
4. Place the name of the printer host in the rm capability.
291
Chapter 11 Printing
5. Place the printer name on the printer host in the rp capability.
That is it. You do not need to list conversion filters, page dimensions, or anything else in the /etc/printcap file.
Here is an example. The host rose has two printers, bamboo and rattan. We will enable users on the host orchid
to print to those printers. Here is the /etc/printcap file for orchid (back from section Enabling Header Pages). It
already had the entry for the printer teak; we have added entries for the two printers on the host rose:
#
#
#
#
# teak is local; it is connected directly to orchid:
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/ifhp:\
:vf=/usr/local/libexec/vfhp:\
:of=/usr/local/libexec/ofhp:
#
# rattan is connected to rose; send jobs for rattan to rose:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
#
# bamboo is connected to rose as well:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:
Now, users on orchid can print to rattan and bamboo. If, for example, a user on orchid typed
% lpr -P bamboo -d sushi-review.dvi
the LPD system on orchid would copy the job to the spooling directory /var/spool/lpd/bamboo and note that
it was a DVI job. As soon as the host rose has room in its bamboo spooling directory, the two LPDs would transfer
the file to rose. The file would wait in roses queue until it was finally printed. It would be converted from DVI to
PostScript (since bamboo is a PostScript printer) on rose.
292
Chapter 11 Printing
(the cheaper version). This section tells how to use the cheaper version. For the more expensive one, see the previous
section Printers Installed on Remote Hosts.
The format of the /etc/printcap file lets you specify what serial or parallel interface to use, and (if you are using
a serial interface), what baud rate, whether to use flow control, delays for tabs, conversion of newlines, and more. But
there is no way to specify a connection to a printer that is listening on a TCP/IP or other network port.
To send data to a networked printer, you need to develop a communications program that can be called by the text
and conversion filters. Here is one such example: the script netprint takes all data on standard input and sends it to
a network-attached printer. We specify the hostname of the printer as the first argument and the port number to which
to connect as the second argument to netprint. Note that this supports one-way communication only (FreeBSD to
printer); many network printers support two-way communication, and you might want to take advantage of that (to
get printer status, perform accounting, etc.).
#!/usr/bin/perl
#
# netprint - Text filter for printer attached to network
# Installed in /usr/local/libexec/netprint
#
$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";
$printer_host = $ARGV[0];
$printer_port = $ARGV[1];
require sys/socket.ph;
($ignore, $ignore, $protocol) = getprotobyname(tcp);
($ignore, $ignore, $ignore, $ignore, $address)
= gethostbyname($printer_host);
$sockaddr = pack(S n a4 x8, &AF_INET, $printer_port, $address);
socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
|| die "Cant create TCP/IP stream socket: $!";
connect(PRINTER, $sockaddr) || die "Cant contact $printer_host: $!";
while (<STDIN>) { print PRINTER; }
exit 0;
We can then use this script in various filters. Suppose we had a Diablo 750-N line printer connected to the network.
The printer accepts data to print on port number 5100. The host name of the printer is scrivener. Here is the text filter
for the printer:
#!/bin/sh
#
# diablo-if-net - Text filter for Diablo printer scrivener listening
# on port 5100.
Installed in /usr/local/libexec/diablo-if-net
#
exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100
293
Chapter 11 Printing
Note that if you have set up access to a printer remotely (see section Printers Installed on Remote Hosts), you need
the sc capability on the remote /etc/printcap files as well, or else users will still be able to submit multiple-copy
jobs by using another host.
Here is an example. This is the /etc/printcap file for the host rose. The printer rattan is quite hearty, so we
will allow multiple copies, but the laser printer bamboo is a bit more delicate, so we will disable multiple copies by
adding the sc capability:
#
# /etc/printcap for host rose - restrict multiple copies on bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:\
:lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
Now, we also need to add the sc capability on the host orchids /etc/printcap (and while we are at it, let us
disable multiple copies for the printer teak):
#
# /etc/printcap for host orchid - no multiple copies for local
# printer teak or remote printer bamboo
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\
:if=/usr/local/libexec/ifhp:\
:vf=/usr/local/libexec/vfhp:\
:of=/usr/local/libexec/ofhp:
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
294
Chapter 11 Printing
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:
By using the sc capability, we prevent the use of lpr -#, but that still does not prevent users from running lpr(1)
multiple times, or from submitting the same file multiple times in one job like this:
% lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign
There are many ways to prevent this abuse (including ignoring it) which you are free to explore.
Let us leave the other example /etc/printcap file (for the host orchid) alone. Of course, anyone on orchid can
print to bamboo. It might be the case that we only allow certain logins on orchid anyway, and want them to have
access to the printer. Or not.
Note: There can be only one restricted group per printer.
295
Chapter 11 Printing
LPD enables you to limit the maximum byte size a file in a job can be with the mx capability. The units are in
BUFSIZ blocks, which are 1024 bytes. If you put a zero for this capability, there will be no limit on file size;
however, if no mx capability is specified, then a default limit of 1000 blocks will be used.
Note: The limit applies to files in a job, andnot the total job size.
LPD will not refuse a file that is larger than the limit you place on a printer. Instead, it will queue as much of the file
up to the limit, which will then get printed. The rest will be discarded. Whether this is correct behavior is up for
debate.
Let us add limits to our example printers rattan and bamboo. Since those artists PostScript files tend to be large,
we will limit them to five megabytes. We will put no limit on the plain text line printer:
#
#
#
#
# No limit on job size:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:mx#0:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:
#
# Limit of five megabytes:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
:lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
Again, the limits apply to the local users only. If you have set up access to your printers remotely, remote users will
not get those limits. You will need to specify the mx capability in the remote /etc/printcap files as well. See
section Printers Installed on Remote Hosts for more information on remote printing.
There is another specialized way to limit job sizes from remote printers; see section
Restricting Jobs from Remote Printers.
296
Chapter 11 Printing
The format of these files is simple: one host name per line. Note that the file /etc/hosts.equiv is also used
by the ruserok(3) protocol, and affects programs like rsh(1) and rcp(1), so be careful.
For example, here is the /etc/hosts.lpd file on the host rose:
orchid
violet
madrigal.fishbaum.de
This means rose will accept requests from the hosts orchid, violet, and madrigal.fishbaum.de. If any
other host tries to access roses LPD, the job will be refused.
Size restrictions
You can control how much free space there needs to remain on the filesystem where a spooling directory
resides. Make a file called minfree in the spooling directory for the local printer. Insert in that file a number
representing how many disk blocks (512 bytes) of free space there has to be for a remote job to be accepted.
This lets you insure that remote users will not fill your filesystem. You can also use it to give a certain priority to
local users: they will be able to queue jobs long after the free disk space has fallen below the amount specified
in the minfree file.
For example, let us add a minfree file for the printer bamboo. We examine /etc/printcap to find the
spooling directory for this printer; here is bamboos entry:
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
:lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:mx#5000:\
:if=/usr/local/libexec/psif:\
:df=/usr/local/libexec/psdf:
The spooling directory is given in the sd capability. We will make three megabytes (which is 6144 disk blocks)
the amount of free disk space that must exist on the filesystem for LPD to accept remote jobs:
# echo 6144 > /var/spool/lpd/bamboo/minfree
User restrictions
You can control which remote users can print to local printers by specifying the rs capability in
/etc/printcap. When rs appears in the entry for a locally-attached printer, LPD will accept jobs from
remote hosts if the user submitting the job also has an account of the same login name on the local host.
Otherwise, LPD refuses the job.
This capability is particularly useful in an environment where there are (for example) different departments
sharing a network, and some users transcend departmental boundaries. By giving them accounts on your
systems, they can use your printers from their own departmental systems. If you would rather allow them to use
only your printers and not your computer resources, you can give them token accounts, with no home
directory and a useless shell like /usr/bin/false.
297
Chapter 11 Printing
Periodic accounting is the more common way, possibly because it is easier. Whenever someone prints a job, the
filter logs the user, host, and number of pages to an accounting file. Every month, semester, year, or whatever time
period you prefer, you collect the accounting files for the various printers, tally up the pages printed by users, and
charge for usage. Then you truncate all the logging files, starting with a clean slate for the next period.
Timely accounting is less common, probably because it is more difficult. This method has the filters charge users
for printouts as soon as they use the printers. Like disk quotas, the accounting is immediate. You can prevent users
from printing when their account goes in the red, and might provide a way for users to check and adjust their
print quotas. But this method requires some database code to track users and their quotas.
The LPD spooling system supports both methods easily: since you have to provide the filters (well, most of the
time), you also have to provide the accounting code. But there is a bright side: you have enormous flexibility in your
accounting methods. For example, you choose whether to use periodic or timely accounting. You choose what
information to log: user names, host names, job types, pages printed, square footage of paper used, how long the job
took to print, and so forth. And you do so by modifying the filters to save this information.
11.4.5.1 Quick and Dirty Printer Accounting
FreeBSD comes with two programs that can get you set up with simple periodic accounting right away. They are the
text filter lpf, described in section lpf: a Text Filter, and pac(8), a program to gather and total entries from printer
accounting files.
As mentioned in the section on filters (Filters), LPD starts the text and the conversion filters with the name of the
accounting file to use on the filter command line. The filters can use this argument to know where to write an
accounting file entry. The name of this file comes from the af capability in /etc/printcap, and if not specified as
an absolute path, is relative to the spooling directory.
LPD starts lpf with page width and length arguments (from the pw and pl capabilities). lpf uses these arguments
to determine how much paper will be used. After sending the file to the printer, it then writes an accounting entry in
the accounting file. The entries look like this:
2.00
3.00
3.00
5.00
2.00
rose:andy
rose:kelly
orchid:mary
orchid:mary
orchid:zhang
298
Chapter 11 Printing
You should use a separate accounting file for each printer, as lpf has no file locking logic built into it, and two lpfs
might corrupt each others entries if they were to write to the same file at the same time. An easy way to insure a
separate accounting file for each printer is to use af=acct in /etc/printcap. Then, each accounting file will be in
the spooling directory for a printer, in a file named acct.
When you are ready to charge users for printouts, run the pac(8) program. Just change to the spooling directory for
the printer you want to collect on and type pac. You will get a dollar-centric summary like the following:
Login
orchid:kelly
orchid:mary
orchid:zhang
rose:andy
rose:kelly
rose:mary
rose:root
total
pages/feet
5.00
31.00
9.00
2.00
177.00
87.00
26.00
337.00
runs
1
3
1
1
104
32
12
$
$
$
$
$
$
$
price
0.10
0.62
0.18
0.04
3.54
1.74
0.52
154
6.74
Which printer to summarize. This option works only if there is an absolute path in the af capability in
/etc/printcap.
-c
Ignore host name in the accounting files. With this option, user smith on host alpha is the same user smith on
host gamma. Without, they are different users.
-pprice
Compute charges with price dollars per page or per foot instead of the price from the pc capability in
/etc/printcap, or two cents (the default). You can specify price as a floating point number.
-r
pages/feet
runs
price
299
Chapter 11 Printing
andy
kelly
mary
root
zhang
2.00
182.00
118.00
26.00
9.00
1
105
35
12
1
$
$
$
$
$
0.04
3.64
2.36
0.52
0.18
total
337.00
154
6.74
To compute the dollar amount due, pac(8) uses the pc capability in the /etc/printcap file (default of 200, or 2
cents per page). Specify, in hundredths of cents, the price per page or per foot you want to charge for printouts in this
capability. You can override this value when you run pac(8) with the -p option. The units for the -p option are in
dollars, though, not hundredths of cents. For example,
# pac -p1.50
makes each page cost one dollar and fifty cents. You can really rake in the profits by using this option.
Finally, running pac -s will save the summary information in a summary accounting file, which is named the same
as the printers accounting file, but with _sum appended to the name. It then truncates the accounting file. When you
run pac(8) again, it rereads the summary file to get starting totals, then adds information from the regular accounting
file.
300
Chapter 11 Printing
This prints each of the listed files to the default printer. If you list no files, lpr(1) reads data to print from standard
input. For example, this command prints some important system files:
% lpr /etc/host.conf /etc/hosts.equiv
This example prints a long listing of the current directory to the printer named rattan:
% ls -l | lpr -P rattan
Because no files were listed for the lpr(1) command, lpr read the data to print from standard input, which was the
output of the ls -l command.
The lpr(1) command can also accept a wide variety of options to control formatting, apply file conversions, generate
multiple copies, and so forth. For more information, see the section Printing Options.
301
Chapter 11 Printing
shows the queue for the printer named bamboo. Here is an example of the output of the lpq command:
bamboo
Rank
active
2nd
3rd
is ready
Owner
kelly
kelly
mary
and printing
Job Files
9
/etc/host.conf, /etc/hosts.equiv
10
(standard input)
11
...
Total Size
88 bytes
1635 bytes
78519 bytes
This shows three jobs in the queue for bamboo. The first job, submitted by user kelly, got assigned job number 9.
Every job for a printer gets a unique job number. Most of the time you can ignore the job number, but you will need
it if you want to cancel the job; see section Removing Jobs for details.
Job number nine consists of two files; multiple files given on the lpr(1) command line are treated as part of a single
job. It is the currently active job (note the word active under the Rank column), which means the printer should
be currently printing that job. The second job consists of data passed as the standard input to the lpr(1) command.
The third job came from user mary; it is a much larger job. The pathname of the file she is trying to print is too long
to fit, so the lpq(1) command just shows three dots.
The very first line of the output from lpq(1) is also useful: it tells what the printer is currently doing (or at least what
LPD thinks the printer is doing).
The lpq(1) command also support a -l option to generate a detailed long listing. Here is an example of lpq -l:
waiting for bamboo to become ready (offline ?)
kelly: 1st [job 009rose]
/etc/host.conf
73 bytes
/etc/hosts.equiv
15 bytes
kelly: 2nd [job 010rose]
(standard input)
1635 bytes
mary: 3rd
[job 011rose]
/home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes
302
Chapter 11 Printing
To remove the job from a specific printer, add the -P option. The following command removes job number 10 from
the queue for the printer bamboo:
% lprm -P bamboo 10
Note: If you are working in a networked environment, lprm(1) will let you remove jobs only from the host from
which the jobs were submitted, even if the same printer is available from other hosts. The following command
sequence demonstrates this:
% lpr -P rattan myfile
% rlogin orchid
% lpq -P rattan
Rank
Owner
Job Files
active seeyan
12 ...
2nd
kelly
13
myfile
% lprm -P rattan 13
rose: Permission denied
% logout
% lprm -P rattan 13
dfA013rose dequeued
cfA013rose dequeued
Total Size
49123 bytes
12 bytes
303
Chapter 11 Printing
11.5.4.1 Formatting and Conversion Options
The following lpr(1) options control formatting of the files in the job. Use these options if the job does not contain
plain text or if you want plain text formatted through the pr(1) utility.
For example, the following command prints a DVI file (from the TeX typesetting system) named
fish-report.dvi to the printer named bamboo:
% lpr -P bamboo -d fish-report.dvi
These options apply to every file in the job, so you cannot mix (say) DVI and ditroff files together in a job. Instead,
submit the files as separate jobs, using a different conversion option for each job.
Note: All of these options except -p and -T require conversion filters installed for the destination printer. For
example, the -d option requires the DVI conversion filter. Section Conversion Filters gives details.
-c
Indent the output by number columns; if you omit number, indent by 8 columns. This option works only with
certain conversion filters.
Note: Do not put any space between the -i and the number.
-l
304
Chapter 11 Printing
-T title
Use title on the pr(1) header instead of the file name. This option has effect only when used with the -p
option.
-t
The zcat(1) command uncompresses the source of the ls(1) manual page and passes it to the troff(1) command,
which formats that source and makes GNU troff output and passes it to lpr(1), which submits the job to the LPD
spooler. Because we used the -t option to lpr(1), the spooler will convert the GNU troff output into a format the
default printer can understand when it prints the job.
-m
Send mail after completing the print job. With this option, the LPD system will send mail to your account when
it finishes handling your job. In its message, it will tell you if the job completed successfully or if there was an
error, and (often) what the error was.
-s
Do not copy the files to the spooling directory, but make symbolic links to them instead.
If you are printing a large job, you probably want to use this option. It saves space in the spooling directory
(your job might overflow the free space on the filesystem where the spooling directory resides). It saves time as
well since LPD will not have to copy each and every byte of your job to the spooling directory.
There is a drawback, though: since LPD will refer to the original files directly, you cannot modify or remove
them until they have been printed.
305
Chapter 11 Printing
Note: If you are printing to a remote printer, LPD will eventually have to copy files from the local host to the
remote host, so the -s option will save space only on the local spooling directory, not the remote. It is still
useful, though.
-r
Remove the files in the job after copying them to the spooling directory, or after printing them with the -s
option. Be careful with this option!
First, a note about terminology: if a printer is stopped, it will not print anything in its queue. Users can still submit
jobs, which will wait in the queue until the printer is started or the queue is cleared.
306
Chapter 11 Printing
If a queue is disabled, no user (except root) can submit jobs for the printer. An enabled queue allows jobs to be
submitted. A printer can be started for a disabled queue, in which case it will continue to print jobs in the queue until
the queue is empty.
In general, you have to have root privileges to use the lpc(8) command. Ordinary users can use the lpc(8) command
to get printer status and to restart a hung printer only.
Here is a summary of the lpc(8) commands. Most of the commands take a printer-name argument to tell on
which printer to operate. You can use all for the printer-name to mean all printers listed in /etc/printcap.
abort printer-name
Cancel the current job and stop the printer. Users can still submit jobs if the queue is enabled.
clean printer-name
Remove old files from the printers spooling directory. Occasionally, the files that make up a job are not
properly removed by LPD, particularly if there have been errors during printing or a lot of administrative
activity. This command finds files that do not belong in the spooling directory and removes them.
disable printer-name
Disable queuing of new jobs. If the printer is running, it will continue to print any jobs remaining in the queue.
The superuser (root) can always submit jobs, even to a disabled queue.
This command is useful while you are testing a new printer or filter installation: disable the queue and submit
jobs as root. Other users will not be able to submit jobs until you complete your testing and re-enable the
queue with the enable command.
Take a printer down. Equivalent to disable followed by stop. The message appears as the printers status
whenever a user checks the printers queue with lpq(1) or status with lpc status.
enable printer-name
Enable the queue for a printer. Users can submit jobs but the printer will not print anything until it is started.
help command-name
Print help on the command command-name. With no command-name, print a summary of the commands
available.
restart printer-name
Start the printer. Ordinary users can use this command if some extraordinary circumstance hangs LPD, but they
cannot start a printer stopped with either the stop or down commands. The restart command is equivalent to
abort followed by start.
start printer-name
Start the printer. The printer will print jobs in its queue.
307
Chapter 11 Printing
stop printer-name
Stop the printer. The printer will finish the current job and will not print anything else in its queue. Even though
the printer is stopped, users can still submit jobs to an enabled queue.
topq printer-name job-or-username
Rearrange the queue for printer-name by placing the jobs with the listed job numbers or the jobs
belonging to username at the top of the queue. For this command, you cannot use all as the
printer-name.
up printer-name
Bring a printer up; the opposite of the down command. Equivalent to start followed by enable.
lpc(8) accepts the above commands on the command line. If you do not enter any commands, lpc(8) enters an
interactive mode, where you can enter commands until you type exit, quit, or end-of-file.
11.7 Troubleshooting
After performing the simple test with lptest(1), you might have gotten one of the following results instead of the
correct printout:
It worked, after awhile; or, it did not eject a full sheet.
The printer printed the above, but it sat for awhile and did nothing. In fact, you might have needed to press a
PRINT REMAINING or FORM FEED button on the printer to get any results to appear.
If this is the case, the printer was probably waiting to see if there was any more data for your job before it
printed anything. To fix this problem, you can have the text filter send a FORM FEED character (or whatever is
necessary) to the printer. This is usually sufficient to have the printer immediately print any text remaining in its
internal buffer. It is also useful to make sure each print job ends on a full sheet, so the next job does not start
somewhere on the middle of the last page of the previous job.
The following replacement for the shell script /usr/local/libexec/if-simple prints a form feed after it
sends the job to the printer:
#!/bin/sh
#
308
Chapter 11 Printing
#
#
#
#
#
You have become another victim of the staircase effect, caused by conflicting interpretations of what characters
should indicate a new line. Unix-style operating systems use a single character: ASCII code 10, the line feed
(LF). MS-DOS, OS/2, and others uses a pair of characters, ASCII code 10 and ASCII code 13 (the carriage
return or CR). Many printers use the MS-DOS convention for representing new-lines.
When you print with FreeBSD, your text used just the line feed character. The printer, upon seeing a line feed
character, advanced the paper one line, but maintained the same horizontal position on the page for the next
character to print. That is what the carriage return is for: to move the location of the next character to print to the
left edge of the paper.
Here is what FreeBSD wants your printer to do:
Printer received CR
Printer prints CR
Printer received LF
Printer prints CR + LF
Use the printers configuration switches or control panel to alter its interpretation of these characters. Check
your printers manual to find out how to do this.
Note: If you boot your system into other operating systems besides FreeBSD, you may have to
reconfigure the printer to use a an interpretation for CR and LF characters that those other operating
systems use. You might prefer one of the other solutions, below.
Have FreeBSDs serial line driver automatically convert LF to CR+LF. Of course, this works with printers on
serial ports only. To enable this feature, use the ms# capability and set the onlcr mode in the
/etc/printcap file for the printer.
Send an escape code to the printer to have it temporarily treat LF characters differently. Consult your
printers manual for escape codes that your printer might support. When you find the proper escape code,
modify the text filter to send the code first, then send the print job.
309
Chapter 11 Printing
Here is an example text filter for printers that understand the Hewlett-Packard PCL escape codes. This filter
makes the printer treat LF characters as a LF and CR; then it sends the job; then it sends a form feed to eject
the last page of the job. It should work with nearly all Hewlett Packard printers.
#!/bin/sh
#
# hpif - Simple text input filter for lpd for HP-PCL based printers
# Installed in /usr/local/libexec/hpif
#
# Simply copies stdin to stdout. Ignores all filter arguments.
# Tells printer to treat LF as CR+LF. Ejects the page when done.
printf "\033&k2G" && cat && printf "\033&l0H" && exit 0
exit 2
Here is an example /etc/printcap from a host called orchid. It has a single printer attached to its first
parallel port, a Hewlett Packard LaserJet 3Si named teak. It is using the above script as its text filter:
#
# /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
:lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
:if=/usr/local/libexec/hpif:
Printer prints
CR
LF
CR
CR + LF
If the printer supports XON/XOFF flow control, have FreeBSD use it by specifying the ixon mode in the
ms# capability.
310
Chapter 11 Printing
If the printer supports carrier flow control, specify the crtscts mode in the ms# capability. Make sure the
cable connecting the printer to the computer is correctly wired for carrier flow control.
It printed garbage.
The printer printed what appeared to be random garbage, but not the desired text.
This is usually another symptom of incorrect communications parameters with a serial printer. Double-check
the bps rate in the br capability, and the parity setting in the ms# capability; make sure the printer is using the
same settings as specified in the /etc/printcap file.
Nothing happened.
If nothing happened, the problem is probably within FreeBSD and not the hardware. Add the log file ( lf)
capability to the entry for the printer you are debugging in the /etc/printcap file. For example, here is the
entry for rattan, with the lf capability:
rattan|line|diablo|lp|Diablo 630 Line Printer:\
:sh:sd=/var/spool/lpd/rattan:\
:lp=/dev/lpt0:\
:if=/usr/local/libexec/if-simple:\
:lf=/var/log/rattan.log
Then, try printing again. Check the log file (in our example, /var/log/rattan.log) to see any error
messages that might appear. Based on the messages you see, try to correct the problem.
If you do not specify a lf capability, LPD uses /dev/console as a default.
311
Chapter 12 Storage
12.1 Synopsis
This chapter covers the use of disks in FreeBSD. This includes memory-backed disks, network-attached disks, and
standard SCSI/IDE storage devices.
After reading this chapter, you will know:
The terminology FreeBSD uses to describe the organization of data on a physical disk (partitions and slices).
ad
acd
da
cd
Floppy drives
fd
sa
ast
Flash drives
312
Chapter 12 Storage
Drive type
RAID drives
Notes: a. The matcd(4) driver has been removed in FreeBSD 4.X branch since October 5th, 2002 and does not exist in FreeBSD 5.0 an
Navigating Sysinstall
You may use /stand/sysinstall to partition and label a new disk using its easy to use menus. Either login as
user root or use the su command. Run /stand/sysinstall and enter the Configure menu. Within the
FreeBSD Configuration Menu, scroll down and select the Fdisk option.
2.
3.
313
Chapter 12 Storage
have an a partition. The b partition is used for swap partitions, and you may have many disks with swap
partitions. The c partition addresses the entire disk in dedicated mode, or the entire FreeBSD slice in slice mode.
The other partitions are for general use.
sysinstalls Label editor favors the e partition for non-root, non-swap partitions. Within the Label editor, create a
single file system by typing C. When prompted if this will be a FS (file system) or swap, choose FS and type in a
mount point (e.g, /mnt). When adding a disk in post-install mode, sysinstall will not create entries in
/etc/fstab for you, so the mount point you specify is not important.
You are now ready to write the new label to the disk and create a file system on it. Do this by typing W. Ignore
any errors from sysinstall that it could not mount the new partition. Exit the Label Editor and sysinstall
completely.
4.
Finish
The last step is to edit /etc/fstab to add an entry for your new disk.
If you have an IDE disk, substitute ad for da. On pre-4.X systems use wd.
12.3.2.2 Dedicated
If you will not be sharing the new drive with another operating system, you may use the dedicated mode.
Remember this mode can confuse Microsoft operating systems; however, no damage will be done by them. IBMs
OS/2 however, will appropriate any partition it finds which it does not understand.
#
#
#
#
#
#
#
314
Chapter 12 Storage
#
#
#
#
#
#
Note: Since FreeBSD 5.1-RELEASE, the bsdlabel(8) utility replaces the old disklabel(8) program. With
bsdlabel(8) a number of obsolete options and parameters have been retired; in the examples above the option -r
should be removed with bsdlabel(8). For more information, please refer to the bsdlabel(8) manual page.
12.4 RAID
12.4.1 Software RAID
12.4.1.1 Concatenated Disk Driver (CCD) Configuration
Original work by Christopher Shumway. Revised by Jim Brown.
When choosing a mass storage solution the most important factors to consider are speed, reliability, and cost. It is
rare to have all three in balance; normally a fast, reliable mass storage device is expensive, and to cut back on cost
either speed or reliability must be sacrificed.
In designing the system described below, cost was chosen as the most important factor, followed by speed, then
reliability. Data transfer speed for this system is ultimately constrained by the network. And while reliability is very
important, the CCD drive described below serves online data that is already fully backed up on CD-Rs and can
easily be replaced.
Defining your own requirements is the first step in choosing a mass storage solution. If your requirements prefer
speed or reliability over cost, your solution will differ from the system described in this section.
12.4.1.1.1 Installing the Hardware
In addition to the IDE system disk, three Western Digital 30GB, 5400 RPM IDE disks form the core of the CCD disk
described below providing approximately 90GB of online storage. Ideally, each IDE disk would have its own IDE
controller and cable, but to minimize cost, additional IDE controllers were not used. Instead the disks were
configured with jumpers so that each IDE controller has one master, and one slave.
Upon reboot, the system BIOS was configured to automatically detect the disks attached. More importantly,
FreeBSD detected them on reboot:
ad0:
ad1:
ad2:
ad3:
19574MB
29333MB
29333MB
29333MB
<WDC
<WDC
<WDC
<WDC
WD205BA>
WD307AA>
WD307AA>
WD307AA>
[39770/16/63]
[59598/16/63]
[59598/16/63]
[59598/16/63]
at
at
at
at
ata0-master UDMA33
ata0-slave UDMA33
ata1-master UDMA33
ata1-slave UDMA33
315
Chapter 12 Storage
Note: If FreeBSD does not detect all the disks, ensure that you have jumpered them correctly. Most IDE drives
also have a Cable Select jumper. This is not the jumper for the master/slave relationship. Consult the drive
documentation for help in identifying the correct jumper.
Next, consider how to attach them as part of the file system. You should research both vinum(8) (Chapter 13) and
ccd(4). In this particular configuration, ccd(4) was chosen.
ccd
ccd
Note: In FreeBSD 5.X, it is not necessary to specify a number of ccd(4) devices, as the ccd(4) device driver is
now self-cloning new device instances will automatically be created on demand.
The ccd(4) support can also be loaded as a kernel loadable module in FreeBSD 3.0 or later.
To set up ccd(4), you must first use disklabel(8) to label the disks:
disklabel -r -w ad1 auto
disklabel -r -w ad2 auto
disklabel -r -w ad3 auto
This creates a disklabel for ad1c, ad2c and ad3c that spans the entire disk.
Note: Since FreeBSD 5.1-RELEASE, the bsdlabel(8) utility replaces the old disklabel(8) program. With
bsdlabel(8) a number of obsolete options and parameters have been retired; in the examples above the option -r
should be removed. For more information, please refer to the bsdlabel(8) manual page.
The next step is to change the disk label type. You can use disklabel(8) to edit the disks:
disklabel -e ad1
disklabel -e ad2
disklabel -e ad3
This opens up the current disk label on each disk with the editor specified by the EDITOR environment variable,
typically vi(1).
An unmodified disk label will look something like this:
8 partitions:
316
Chapter 12 Storage
#
size
c: 60074784
offset
0
fstype
unused
0 - 59597)
Add a new e partition for ccd(4) to use. This can usually be copied from the c partition, but the fstype must be
4.2BSD. The disk label should now look something like this:
8 partitions:
#
size
c: 60074784
e: 60074784
offset
0
0
fstype
unused
4.2BSD
0 - 59597)
0 - 59597)
Note: In FreeBSD 5.0, devfs(5) will automatically manage device nodes in /dev, so use of MAKEDEV is not
necessary.
Now that you have all of the disks labeled, you must build the ccd(4). To do that, use ccdconfig(8), with options
similar to the following:
ccdconfig ccd0 32 0 /dev/ad1e /dev/ad2e /dev/ad3e
The first argument is the device to configure, in this case, /dev/ccd0c. The /dev/ portion is optional.
The interleave for the file system. The interleave defines the size of a stripe in disk blocks, each normally 512
bytes. So, an interleave of 32 would be 16,384 bytes.
Flags for ccdconfig(8). If you want to enable drive mirroring, you can specify a flag here. This configuration
does not provide mirroring for ccd(4), so it is set at 0 (zero).
The final arguments to ccdconfig(8) are the devices to place into the array. Use the complete pathname for each
device.
After running ccdconfig(8) the ccd(4) is configured. A file system can be installed. Refer to newfs(8) for options, or
simply run:
newfs /dev/ccd0c
317
Chapter 12 Storage
During reboot, the script /etc/rc runs ccdconfig -C if /etc/ccd.conf exists. This automatically configures
the ccd(4) so it can be mounted.
Note: If you are booting into single user mode, before you can mount(8) the ccd(4), you need to issue the
following command to configure the array:
ccdconfig -C
To automatically mount the ccd(4), place an entry for the ccd(4) in /etc/fstab so it will be mounted at boot time:
/dev/ccd0c
/media
ufs
rw
318
Chapter 12 Storage
# atacontrol list
ATA channel 0:
Master:
no device present
Slave:
acd0 <HL-DT-ST CD-ROM GCR-8520B/1.00> ATA/ATAPI rev 0
ATA channel 1:
Master:
no device present
Slave:
no device present
ATA channel 2:
Master: ad4 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5
Slave:
no device present
ATA channel 3:
Master: ad6 <MAXTOR 6L080J4/A93.0500> ATA/ATAPI rev 5
Slave:
no device present
# atacontrol status ar0
ar0: ATA RAID1 subdisks: ad4 ad6 status: DEGRADED
1.
You will first need to detach the disk from the array so that you can safely remove it:
# atacontrol detach 3
2.
3.
4.
5.
The rebuild command hangs until complete. However, it is possible to open another terminal (using Alt+Fn) and
check on the progress by issuing the following command:
# dmesg | tail -10
[output removed]
ad6: removed from configuration
ad6: deleted from ar0 disk1
ad6: inserted into ar0 disk1 as spare
# atacontrol status ar0
ar0: ATA RAID1 subdisks: ad4 ad6 status: REBUILDING 0% completed
6.
319
Chapter 12 Storage
12.5.1 Introduction
CDs have a number of features that differentiate them from conventional disks. Initially, they were not writable by
the user. They are designed so that they can be read continuously without delays to move the head between tracks.
They are also much easier to transport between systems than similarly sized media were at the time.
CDs do have tracks, but this refers to a section of data to be read continuously and not a physical property of the disk.
To produce a CD on FreeBSD, you prepare the data files that are going to make up the tracks on the CD, then write
the tracks to the CD.
The ISO 9660 file system was designed to deal with these differences. It unfortunately codifies file system limits that
were common then. Fortunately, it provides an extension mechanism that allows properly written CDs to exceed
those limits while still working with systems that do not support those extensions.
The sysutils/mkisofs program is used to produce a data file containing an ISO 9660 file system. It has options
that support various extensions, and is described below. You can install it with the sysutils/mkisofs port.
Which tool to use to burn the CD depends on whether your CD burner is ATAPI or something else. ATAPI CD
burners use the burncd program that is part of the base system. SCSI and USB CD burners should use cdrecord
from the sysutils/cdrtools port.
burncd has a limited number of supported drives. To find out if a drive is supported, see the CD-R/RW supported
12.5.2 mkisofs
sysutils/mkisofs produces an ISO 9660 file system that is an image of a directory tree in the Unix file system
This command will create an imagefile.iso containing an ISO 9660 file system that is a copy of the tree at
/path/to/tree. In the process, it will map the file names to names that fit the limitations of the standard ISO
9660 file system, and will exclude files that have names uncharacteristic of ISO file systems.
A number of options are available to overcome those restrictions. In particular, -R enables the Rock Ridge extensions
common to Unix systems, -J enables Joliet extensions used by Microsoft systems, and -hfs can be used to create
HFS file systems used by MacOS.
For CDs that are going to be used only on FreeBSD systems, -U can be used to disable all filename restrictions.
When used with -R, it produces a file system image that is identical to the FreeBSD tree you started from, though it
may violate the ISO 9660 standard in a number of ways.
320
Chapter 12 Storage
The last option of general use is -b. This is used to specify the location of the boot image for use in producing an El
Torito bootable CD. This option takes an argument which is the path to a boot image from the top of the tree being
written to the CD. So, given that /tmp/myboot holds a bootable FreeBSD system with the boot image in
/tmp/myboot/boot/cdboot, you could produce the image of an ISO 9660 file system in /tmp/bootable.iso
like so:
# mkisofs -U -R -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot
Having done that, if you have vn (FreeBSD 4.X), or md (FreeBSD 5.X) configured in your kernel, you can mount the
file system with:
# vnconfig -e vn0c /tmp/bootable.iso
# mount -t cd9660 /dev/vn0c /mnt
At which point you can verify that /mnt and /tmp/myboot are identical.
There are many other options you can use with sysutils/mkisofs to fine-tune its behavior. In particular:
modifications to an ISO 9660 layout and the creation of Joliet and HFS discs. See the mkisofs(8) manual page for
details.
12.5.3 burncd
If you have an ATAPI CD burner, you can use the burncd command to burn an ISO image onto a CD. burncd is
part of the base system, installed as /usr/sbin/burncd. Usage is very simple, as it has few options:
# burncd -f cddevice data imagefile.iso fixate
Will burn a copy of imagefile.iso on cddevice. The default device is /dev/acd0c. See burncd(8) for
options to set the write speed, eject the CD after burning, and write audio data.
12.5.4 cdrecord
If you do not have an ATAPI CD burner, you will have to use cdrecord to burn your CDs. cdrecord is not part of
the base system; you must install it from either the port at sysutils/cdrtools or the appropriate package.
Changes to the base system can cause binary versions of this program to fail, possibly resulting in a coaster. You
should therefore either upgrade the port when you upgrade your system, or if you are tracking -STABLE, upgrade
the port when a new version becomes available.
While cdrecord has many options, basic usage is even simpler than burncd. Burning an ISO 9660 image is done
with:
# cdrecord dev=device imagefile.iso
The tricky part of using cdrecord is finding the dev to use. To find the proper setting, use the -scanbus flag of
cdrecord, which might produce results like this:
321
Chapter 12 Storage
# cdrecord -scanbus
Schilling
Disk
CD-ROM
CD-ROM
This lists the appropriate dev value for the devices on the list. Locate your CD burner, and use the three numbers
separated by commas as the value for dev. In this case, the CRW device is 1,5,0, so the appropriate input would be
dev=1,5,0. There are easier ways to specify this value; see cdrecord(1) for details. That is also the place to look for
information on writing audio tracks, controlling the speed, and other things.
2.
*.wav
ATAPI Drives
1.
The ATAPI CD driver makes each track available as /dev/acddtnn, where d is the drive number, and nn is the
track number written with two decimal digits, prefixed with zero as needed. So the first track on the first disk is
/dev/acd0t01, the second is /dev/acd0t02, the third is /dev/acd0t03, and so on.
Make sure the appropriate files exist in /dev.
# cd /dev
322
Chapter 12 Storage
# sh MAKEDEV acd0t99
Note: In FreeBSD 5.0, devfs(5) will automatically create and manage entries in /dev for you, so it is not
necessary to use MAKEDEV.
2.
Extract each track using dd(1). You must also use a specific block size when extracting the files.
# dd if=/dev/acd0t01 of=track1.cdr bs=2352
# dd if=/dev/acd0t02 of=track2.cdr bs=2352
...
3.
Burn the extracted files to disk using burncd. You must specify that these are audio files, and that burncd
should fixate the disk when finished.
# burncd -f /dev/acd0c audio track1.cdr track2.cdr ... fixate
name to indicate the entire partition or, in the case of CDROMs, the entire disc.
# dd if=/dev/acd0c of=file.iso bs=2048
Now that you have an image, you can burn it to CD as described above.
you will get a complaint about Incorrect super block, and no mount. The CDROM is not a UFS file system, so
attempts to mount it as such will fail. You just need to tell mount(8) that the file system is of type ISO9660, and
everything will work. You do this by specifying the -t cd9660 option mount(8). For example, if you want to mount
the CDROM device, /dev/cd0c, under /mnt, you would execute:
# mount -t cd9660 /dev/cd0c /mnt
Note that your device name (/dev/cd0c in this example) could be different, depending on the interface your
CDROM uses. Also, the -t cd9660 option just executes mount_cd9660(8). The above example could be shortened
to:
# mount_cd9660 /dev/cd0c /mnt
You can generally use data CDROMs from any vendor in this way. Disks with certain ISO 9660 extensions might
behave oddly, however. For example, Joliet disks store all filenames in two-byte Unicode characters. The FreeBSD
323
Chapter 12 Storage
kernel does not speak Unicode (yet!), so non-English characters show up as question marks. (If you are running
FreeBSD 4.3 or later, the CD9660 driver includes hooks to load an appropriate Unicode conversion table on the fly.
Modules for some of the common encodings are available via the sysutils/cd9660_unicode port.)
Occasionally, you might get Device not configured when trying to mount a CDROM. This usually means that
the CDROM drive thinks that there is no disk in the tray, or that the drive is not visible on the bus. It can take a
couple of seconds for a CDROM drive to realize that it has been fed, so be patient.
Sometimes, a SCSI CDROM may be missed because it didnt have enough time to answer the bus reset. If you have
a SCSI CDROM please add the following option to your kernel configuration and rebuild your kernel.
options SCSI_DELAY=15000
This tells your SCSI bus to pause 15 seconds during boot, to give your CDROM drive every possible chance to
answer the bus reset.
In order to retrieve the data burned to such a CD, you must read data from the raw device node:
# tar xzvf /dev/acd1c
You cannot mount this disk as you would a normal CDROM. Such a CDROM cannot be read under any operating
system except FreeBSD. If you want to be able to mount the CD, or share data with another operating system, you
must use sysutils/mkisofs as described above.
atapicam
scbus
cd
pass
You also need the following lines in your kernel configuration file:
device ata
device atapicd
324
Chapter 12 Storage
acd0: CD-RW <MATSHITA CD-RW/DVD-ROM UJDA740> at ata1-master PIO4
cd0 at ata1 bus 0 target 0 lun 0
cd0: <MATSHITA CDRW/DVD UJDA740 1.00> Removable CD-ROM SCSI-0 device
cd0: 16.000MB/s transfers
cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed
The drive could now be accessed via the /dev/cd0 device name, for example to mount a CD-ROM on /mnt, just
type the following:
# mount -t cd9660 /dev/cd0c /mnt
As root, you can run the following command to get the SCSI address of the burner:
# camcontrol devlist
<MATSHITA CDRW/DVD UJDA740 1.00>
So 1,0,0 will be the SCSI address to use with cdrecord(1) and other SCSI application.
For more information about ATAPI/CAM and SCSI system, refer to the atapicam(4) and cam(4) manual pages.
325
Chapter 12 Storage
12.6.1.1.2 The Disk Size in 5.0 and Newer Releases
In 5.0, devfs(5) will automatically manage device nodes in /dev, so use of MAKEDEV is not necessary.
The desired disk size is passed to fdformat(1) through the -f flag. Supported sizes are listed in fdcontrol(8), but be
advised that 1440kB is what works best.
12.6.1.2 Formatting
A floppy disk needs to be low-level formated before it can be used. This is usually done by the vendor, but formatting
is a good way to check media integrity. Although it is possible to force larger (or smaller) disk sizes, 1440kB is what
most floppy disks are designed for.
To low-level format the floppy disk you need to use fdformat(1). This utility expects the device name as an argument.
Make note of any error messages, as these can help determine if the disk is good or bad.
12.6.1.2.1 Formatting in 4.X and Earlier Releases
Use the /dev/fdN .size devices to format the floppy. Insert a new 3.5inch floppy disk in your drive and issue:
# /usr/sbin/fdformat /dev/fd0.1440
Note: Since FreeBSD 5.1-RELEASE, the bsdlabel(8) utility replaces the old disklabel(8) program. With
bsdlabel(8) a number of obsolete options and parameters have been retired; in the example above the option -r
should be removed. For more information, please refer to the bsdlabel(8) manual page.
326
Chapter 12 Storage
327
Chapter 12 Storage
Data throughput ranges from ~250 kB/s to ~500 kB/s. Data sizes start at 300 MB and go up to 7 GB. Hardware
compression, available with most of these drives, approximately doubles the capacity. These drives are available as
single units or multi-drive tape libraries with 6 drives and 120 tapes in a single cabinet. Tapes are changed
automatically by the unit. Library capacities reach 840+ GB.
The Exabyte Mammoth model supports 12 GB on one tape (24 GB with compression) and costs approximately
twice as much as conventional tape drives.
Data is recorded onto the tape using helical-scan, the heads are positioned at an angle to the media (approximately 6
degrees). The tape wraps around 270 degrees of the spool that holds the heads. The spool spins while the tape slides
over the spool. The result is a high density of data and closely packed tracks that angle across the tape from one edge
to the other.
12.7.3 QIC
QIC-150 tapes and drives are, perhaps, the most common tape drive and media around. QIC tape drives are the least
expensive serious backup drives. The downside is the cost of media. QIC tapes are expensive compared to 8mm or
4mm tapes, up to 5 times the price per GB data storage. But, if your needs can be satisfied with a half-dozen tapes,
QIC may be the correct choice. QIC is the most common tape drive. Every site has a QIC drive of some density or
another. Therein lies the rub, QIC has a large number of densities on physically similar (sometimes identical) tapes.
QIC drives are not quiet. These drives audibly seek before they begin to record data and are clearly audible whenever
reading, writing or seeking. QIC tapes measure (6 x 4 x 0.7 inches; 15.2 x 10.2 x 1.7 mm). Mini-cartridges, which
also use 1/4" wide tape are discussed separately. Tape libraries and changers are not available.
Data throughput ranges from ~150 kB/s to ~500 kB/s. Data capacity ranges from 40 MB to 15 GB. Hardware
compression is available on many of the newer QIC drives. QIC drives are less frequently installed; they are being
supplanted by DAT drives.
Data is recorded onto the tape in tracks. The tracks run along the long axis of the tape media from one end to the
other. The number of tracks, and therefore the width of a track, varies with the tapes capacity. Most if not all newer
drives provide backward-compatibility at least for reading (but often also for writing). QIC has a good reputation
regarding the safety of the data (the mechanics are simpler and more robust than for helical scan drives).
Tapes should be retired from use after 5,000 backups.
12.7.5 DLT
DLT has the fastest data transfer rate of all the drive types listed here. The 1/2" (12.5mm) tape is contained in a
single spool cartridge (4 x 4 x 1 inches; 100 x 100 x 25 mm). The cartridge has a swinging gate along one entire side
of the cartridge. The drive mechanism opens this gate to extract the tape leader. The tape leader has an oval hole in it
which the drive uses to hook the tape. The take-up spool is located inside the tape drive. All the other tape
cartridges listed here (9 track tapes are the only exception) have both the supply and take-up spools located inside the
tape cartridge itself.
Data throughput is approximately 1.5 MB/s, three times the throughput of 4mm, 8mm, or QIC tape drives. Data
capacities range from 10 GB to 20 GB for a single drive. Drives are available in both multi-tape changers and
328
Chapter 12 Storage
multi-tape, multi-drive tape libraries containing from 5 to 900 tapes over 1 to 20 drives, providing from 50 GB to
9 TB of storage.
With compression, DLT Type IV format supports up to 70 GB capacity.
Data is recorded onto the tape in tracks parallel to the direction of travel (just like QIC tapes). Two tracks are written
at once. Read/write head lifetimes are relatively long; once the tape stops moving, there is no relative motion
between the heads and the tape.
12.7.6 AIT
AIT is a new format from Sony, and can hold up to 50 GB (with compression) per tape. The tapes contain memory
chips which retain an index of the tapes contents. This index can be rapidly read by the tape drive to determine the
position of files on the tape, instead of the several minutes that would be required for other tapes. Software such as
SAMS:Alexandria can operate forty or more AIT tape libraries, communicating directly with the tapes memory
chip to display the contents on screen, determine what files were backed up to which tape, locate the correct tape,
load it, and restore the data from the tape.
Libraries like this cost in the region of $20,000, pricing them a little out of the hobbyist market.
The tape does not contain an Identifier Block (block number 0). All QIC tape drives since the adoption of QIC-525
standard write an Identifier Block to the tape. There are two solutions:
mt fsf 1
329
Chapter 12 Storage
They have a very limited capacity (the days of backing up an entire hard disk onto a dozen or so floppies has long
since passed).
However, if you have no other method of backing up your data then floppy disks are better than no backup at all.
If you do have to use floppy disks then ensure that you use good quality ones. Floppies that have been lying around
the office for a couple of years are a bad choice. Ideally use new ones from a reputable manufacturer.
When the first floppy is full tar(1) will prompt you to insert the next volume (because tar(1) is media independent it
refers to volumes; in this context it means floppy disk).
Prepare volume #2 for /dev/fd0 and hit return:
This is repeated (with the volume number incrementing) until all the specified files have been archived.
There are two ways that you can use to restore only specific files. First, you can start with the first floppy and use:
# tar Mxvf /dev/fd0 filename
The utility tar(1) will prompt you to insert subsequent floppies until it finds the required file.
330
Chapter 12 Storage
Alternatively, if you know which floppy the file is on then you can simply insert that floppy and use the same
command as above. Note that if the first file on the floppy is a continuation from the previous one then tar(1) will
warn you that it cannot restore it, even if you have not asked it to!
dump has quirks that remain from its early days in Version 6 of AT&T Unix (circa 1975). The default parameters are
suitable for 9-track tapes (6250 bpi), not the high-density media available today (up to 62,182 ftpi). These defaults
must be overridden on the command line to utilize the capacity of current tape drives.
It is also possible to backup data across the network to a tape drive attached to another computer with rdump and
rrestore. Both programs rely upon rcmd and ruserok to access the remote tape drive. Therefore, the user
performing the backup must be listed in the .rhosts file on the remote computer. The arguments to rdump and
rrestore must be suitable to use on the remote computer. When rdumping from a FreeBSD computer to an
Exabyte tape drive connected to a Sun called komodo, use:
# /sbin/rdump 0dsbfu 54000 13000 126 komodo:/dev/nsa8 /dev/da0a 2>&1
Beware: there are security implications to allowing .rhosts authentication. Evaluate your situation carefully.
It is also possible to use dump and restore in a more secure fashion over ssh.
Example 12-1. Using dump over ssh
# /sbin/dump -0uan -f - /usr | gzip -2 | ssh1 -c blowfish \
targetuser@targetmachine.example.com dd of=/mybigfiles/dump-usr-l0.gz
12.9.2 tar
tar(1) also dates back to Version 6 of AT&T Unix (circa 1975). tar operates in cooperation with the file system; tar
writes files and directories to tape. tar does not support the full range of options that are available from cpio(1), but
tar does not require the unusual command pipeline that cpio uses.
331
Chapter 12 Storage
Most versions of tar do not support backups across the network. The GNU version of tar, which FreeBSD utilizes,
supports remote devices using the same syntax as rdump. To tar to an Exabyte tape drive connected to a Sun called
komodo, use:
# /usr/bin/tar cf komodo:/dev/nsa8 . 2>&1
For versions without remote device support, you can use a pipeline and rsh to send the data to a remote tape drive.
# tar cf - . | rsh hostname dd of=tape-device obs=20b
If you are worried about the security of backing up over a network you should use the ssh command instead of rsh.
12.9.3 cpio
cpio(1) is the original Unix file interchange tape program for magnetic media. cpio has options (among many
others) to perform byte-swapping, write a number of different archive formats, and pipe the data to other programs.
This last feature makes cpio an excellent choice for installation media. cpio does not know how to walk the
directory tree and a list of files must be provided through stdin.
cpio does not support backups across the network. You can use a pipeline and rsh to send the data to a remote tape
drive.
# for f in directory_list; do
Where directory_list is the list of directories you want to back up, user@host is the user/hostname
combination that will be performing the backups, and backup_device is where the backups should be written to
(e.g., /dev/nsa0).
12.9.4 pax
pax(1) is IEEE/POSIXs answer to tar and cpio. Over the years the various versions of tar and cpio have gotten
slightly incompatible. So rather than fight it out to fully standardize them, POSIX created a new archive utility. pax
attempts to read and write many of the various cpio and tar formats, plus new formats of its own. Its command set
more resembles cpio than tar.
12.9.5 Amanda
Amanda (Advanced Maryland Network Disk Archiver) is a client/server backup system, rather than a single
program. An Amanda server will backup to a single tape drive any number of computers that have Amanda clients
and a network connection to the Amanda server. A common problem at sites with a number of large disks is that the
length of time required to backup to data directly to tape exceeds the amount of time available for the task. Amanda
solves this problem. Amanda can use a holding disk to backup several file systems at the same time. Amanda
creates archive sets: a group of tapes used over a period of time to create full backups of all the file systems listed
in Amandas configuration file. The archive set also contains nightly incremental (or differential) backups of all
the file systems. Restoring a damaged file system requires the most recent full backup and the incremental backups.
332
Chapter 12 Storage
The configuration file provides fine control of backups and the network traffic that Amanda generates. Amanda will
use any of the above backup programs to write the data to tape. Amanda is available as either a port or a package, it
is not installed by default.
12.9.6 Do Nothing
Do nothing is not a computer program, but it is the most widely used backup strategy. There are no initial costs.
There is no backup schedule to follow. Just say no. If something happens to your data, grin and bear it!
If your time and your data is worth little to nothing, then Do nothing is the most suitable backup program for your
computer. But beware, Unix is a useful tool, you may find that within six months you have a collection of files that
are valuable to you.
Do nothing is the correct backup method for /usr/obj and other directory trees that can be exactly recreated by
your computer. An example is the files that comprise the HTML or PostScript version of this Handbook. These
document formats have been created from SGML input files. Creating backups of the HTML or PostScript files is
not necessary. The SGML files are backed up regularly.
333
Chapter 12 Storage
the backup tapes. You will be so distraught when restoring that the notes may prevent you from destroying your
backup tapes (How? In place of tar xvf /dev/sa0, you might accidentally type tar cvf /dev/sa0 and
over-write your backup tape).
For an added measure of security, make bootable floppies and two backup tapes each time. Store one of each at a
remote location. A remote location is NOT the basement of the same office building. A number of firms in the World
Trade Center learned this lesson the hard way. A remote location should be physically separated from your
computers and disk drives by a significant distance.
Example 12-2. A Script for Creating a Bootable Floppy
#!/bin/sh
#
# create a restore floppy
#
# format the floppy
#
PATH=/bin:/sbin:/usr/sbin:/usr/bin
fdformat -q fd0
if [ $? -ne 0 ]
then
echo "Bad floppy, please use a new one"
exit 1
fi
# place boot blocks on the floppy
#
disklabel -w -B /dev/fd0c fd1440
#
# newfs the one and only partition
#
newfs -t 2 -u 18 -l 1 -c 40 -i 5120 -m 5 -o space /dev/fd0a
#
# mount the new floppy
#
mount /dev/fd0a /mnt
#
# create required directories
#
mkdir /mnt/dev
mkdir /mnt/bin
mkdir /mnt/sbin
mkdir /mnt/etc
mkdir /mnt/root
mkdir /mnt/mnt # for the root partition
mkdir /mnt/tmp
mkdir /mnt/var
#
334
Chapter 12 Storage
# populate the directories
#
if [ ! -x /sys/compile/MINI/kernel ]
then
cat << EOM
The MINI kernel does not exist, please create one.
Here is an example config file:
#
# MINI -- A kernel to get FreeBSD onto a disk.
#
machine
"i386"
cpu
"I486_CPU"
ident
MINI
maxusers
5
options
INET
options
options
options
options
options
FFS
FAT_CURSOR
SCSI_DELAY=15
NCONS=2
USERCONFIG
config
device
device
isa0
pci0
device
device
device
ncr0
device
scbus0
device
device
device
device
device
da0
da1
da2
device
sa0
pseudo-device
pseudo-device
EOM
exit 1
fi
loop
gzip
# required by INET
# Exec gzipped a.outs
cp -f /sys/compile/MINI/kernel /mnt
gzip -c -best /sbin/init > /mnt/sbin/init
335
Chapter 12 Storage
gzip
gzip
gzip
gzip
-c
-c
-c
-c
-best
-best
-best
-best
500 /mnt/sbin/init
555 /mnt/sbin/fsck /mnt/sbin/mount /mnt/sbin/halt
555 /mnt/bin/sh /mnt/bin/sync
6555 /mnt/sbin/restore
#
# create the devices nodes
#
cd /mnt/dev
./MAKEDEV std
./MAKEDEV da0
./MAKEDEV da1
./MAKEDEV da2
./MAKEDEV sa0
./MAKEDEV pty0
cd /
#
# create minimum file system table
#
cat > /mnt/etc/fstab <<EOM
/dev/fd0a
/
ufs
rw 1 1
EOM
#
# create minimum passwd file
#
cat > /mnt/etc/passwd <<EOM
root:*:0:0:Charlie &:/root:/bin/sh
EOM
cat > /mnt/etc/master.passwd <<EOM
root::0:0::0:0:Charlie &:/root:/bin/sh
EOM
chmod 600 /mnt/etc/master.passwd
chmod 644 /mnt/etc/passwd
/usr/sbin/pwd_mkdb -d/mnt/etc /mnt/etc/master.passwd
#
336
Chapter 12 Storage
# umount the floppy and inform the user
#
/sbin/umount /mnt
echo "The floppy has been unmounted and is now ready."
337
Chapter 12 Storage
The mdconfig(8) command supports three kinds of memory backed virtual disks: memory disks allocated with
malloc(9), memory disks using a file or swap space as backing. One possible use is the mounting of floppy or CD
images kept in files.
To mount an existing file system image:
338
Chapter 12 Storage
Example 12-5. Using mdconfig to Mount an Existing File System Image under FreeBSD 5.X
# mdconfig -a -t vnode -f diskimage -u 0
# mount /dev/md0c /mnt
If you do not specify the unit number with the -u option, mdconfig(8) will use the md(4) automatic allocation to
select an unused device. The name of the allocated unit will be output on stdout like md4. For more details about
mdconfig(8), please refer to the manual page.
Note: Since FreeBSD 5.1-RELEASE, the bsdlabel(8) utility replaces the old disklabel(8) program. With
bsdlabel(8) a number of obsolete options and parameters have been retired; in the example above the option -r
should be removed. For more information, please refer to the bsdlabel(8) manual page.
The utility mdconfig(8) is very useful, however it asks many command lines to create a file-backed file system.
FreeBSD 5.0 also comes with a tool called mdmfs(8), this program configures a md(4) disk using mdconfig(8), puts
a UFS file system on it using newfs(8), and mounts it using mount(8). For example, if you want to create and mount
the same file system image as above, simply type the following:
# dd if=/dev/zero of=newimage bs=1k count=5k
5120+0 records in
5120+0 records in
5120+0 records out
# mdmfs -F newimage -s 5m md0 /mnt
# df /mnt
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/md0
4846
2 4458
0%
/mnt
If you use the option md without unit number, mdmfs(8) will use md(4) auto-unit feature to automatically select an
unused device. For more details about mdmfs(8), please refer to the manual page.
339
Chapter 12 Storage
Avail Capacity
4532
0%
Mounted on
/mnt
/dev/md1: 5.0MB (10240 sectors) block size 16384, fragment size 2048
using 4 cylinder groups of 1.27MB, 81 blks, 256 inodes.
with soft updates
super-block backups (for fsck -b #) at:
32, 2624, 5216, 7808
# mount /dev/md1 /mnt
# df /mnt
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/md1
4846
2 4458
0%
/mnt
Mounted on
/mnt
Instead of using a malloc(9) backed file system, it is possible to use swap, for that just replace malloc with swap in
the command line of mdconfig(8). The mdmfs(8) utility by default (without -M) creates a swap-based disk. For more
details, please refer to mdconfig(8) and mdmfs(8) manual pages.
340
Chapter 12 Storage
It is possible to list information about configured md(4) devices in using the command mdconfig -l.
For FreeBSD 4.X, vnconfig(8) is used to detach the device. For example to detach and free all resources used by
/dev/vn4:
# vnconfig -u vn4
Some administrators will use a snapshot file for backup purposes, because the snapshot can be transfered to CDs
or tape.
File integrity, fsck(8) may be ran on the snapshot. Assuming that the file system was clean when it was mounted,
you should always get a clean (and unchanging) result. This is essentially what the background fsck(8) process
does.
Run the dump(8) utility on the snapshot. A dump will be returned that is consistent with the file system and the
timestamp of the snapshot. dump(8) can also take a snapshot, create a dump image and then remove the snapshot
in one command using the -L flag.
mount(8) the snapshot as a frozen image of the file system. To mount(8) the snapshot /var/snapshot/snap run:
341
Chapter 12 Storage
# mdconfig -a -t vnode -f /var/snapshot/snap -u 4
# mount -r /dev/md4 /mnt
You can now walk the hierarchy of your frozen /var file system mounted at /mnt. Everything will be in the same
state it was during the snapshot creation time. The only exception is that any earlier snapshots will appear as zero
length files. When the use of a snapshot has delimited, it can be unmounted with:
# umount /mnt
# mdconfig -d -u 4
For more information about softupdates and file system snapshots, including technical papers, you can visit
Marshall Kirk McKusicks website at http://www.mckusick.com. (http://www.mckusick.com/)
The stock GENERIC kernel does not have this enabled by default, so you will have to configure, build and install a
custom kernel in order to use disk quotas. Please refer to Chapter 9 for more information on kernel configuration.
Next you will need to enable disk quotas in /etc/rc.conf. This is done by adding the line:
enable_quotas="YES"
For finer control over your quota startup, there is an additional configuration variable available. Normally on bootup,
the quota integrity of each file system is checked by the quotacheck(8) program. The quotacheck(8) facility insures
that the data in the quota database properly reflects the data on the file system. This is a very time consuming process
that will significantly affect the time your system takes to boot. If you would like to skip this step, a variable in
/etc/rc.conf is made available for the purpose:
check_quotas="NO"
If you are running FreeBSD prior to 3.2-RELEASE, the configuration is simpler, and consists of only one variable.
Set the following in your /etc/rc.conf:
check_quotas="YES"
342
Chapter 12 Storage
Finally you will need to edit /etc/fstab to enable disk quotas on a per-file system basis. This is where you can
either enable user or group quotas or both for all of your file systems.
To enable per-user quotas on a file system, add the userquota option to the options field in the /etc/fstab entry
for the file system you want to enable quotas on. For example:
/dev/da1s2g
/home
ufs rw,userquota 1 2
Similarly, to enable group quotas, use the groupquota option instead of userquota. To enable both user and group
quotas, change the entry as follows:
/dev/da1s2g
/home
ufs rw,userquota,groupquota 1 2
By default, the quota files are stored in the root directory of the file system with the names quota.user and
quota.group for user and group quotas respectively. See fstab(5) for more information. Even though the fstab(5)
manual page says that you can specify an alternate location for the quota files, this is not recommended because the
various quota utilities do not seem to handle this properly.
At this point you should reboot your system with your new kernel. /etc/rc will automatically run the appropriate
commands to create the initial quota files for all of the quotas you enabled in /etc/fstab, so there is no need to
manually create any zero length quota files.
In the normal course of operations you should not be required to run the quotacheck(8), quotaon(8), or quotaoff(8)
commands manually. However, you may want to read their manual pages just to be familiar with their operation.
You should see a one line summary of disk usage and current quota limits for each file system that quotas are enabled
on.
You are now ready to start assigning quota limits with the edquota(8) command.
You have several options on how to enforce limits on the amount of disk space a user or group may allocate, and how
many files they may create. You may limit allocations based on disk space (block quotas) or number of files (inode
quotas) or a combination of both. Each of these limits are further broken down into two categories: hard and soft
limits.
A hard limit may not be exceeded. Once a user reaches his hard limit he may not make any further allocations on the
file system in question. For example, if the user has a hard limit of 500 blocks on a file system and is currently using
490 blocks, the user can only allocate an additional 10 blocks. Attempting to allocate an additional 11 blocks will
fail.
Soft limits, on the other hand, can be exceeded for a limited amount of time. This period of time is known as the
grace period, which is one week by default. If a user stays over his or her soft limit longer than the grace period, the
soft limit will turn into a hard limit and no further allocations will be allowed. When the user drops back below the
soft limit, the grace period will be reset.
343
Chapter 12 Storage
The following is an example of what you might see when you run the edquota(8) command. When the edquota(8)
command is invoked, you are placed into the editor specified by the EDITOR environment variable, or in the vi editor
if the EDITOR variable is not set, to allow you to edit the quota limits.
# edquota -u test
You will normally see two lines for each file system that has quotas enabled. One line for the block limits, and one
line for inode limits. Simply change the value you want updated to modify the quota limit. For example, to raise this
users block limit from a soft limit of 50 and a hard limit of 75 to a soft limit of 500 and a hard limit of 600, change:
/usr: blocks in use: 65, limits (soft = 50, hard = 75)
to:
/usr: blocks in use: 65, limits (soft = 500, hard = 600)
The new quota limits will be in place when you exit the editor.
Sometimes it is desirable to set quota limits on a range of UIDs. This can be done by use of the -p option on the
edquota(8) command. First, assign the desired quota limit to a user, and then run edquota -p protouser
startuid-enduid. For example, if user test has the desired quota limits, the following command can be used to
duplicate those quota limits for UIDs 10,000 through 19,999:
# edquota -p test 10000-19999
grace
5days
files
7
0
quota
50
50
limit
60
60
grace
On the /usr file system in the above example, this user is currently 15 blocks over the soft limit of 50 blocks and has
5 days of the grace period left. Note the asterisk * which indicates that the user is currently over his quota limit.
344
Chapter 12 Storage
Normally file systems that the user is not using any disk space on will not show up in the output from the quota(1)
command, even if he has a quota limit assigned for that file system. The -v option will display those file systems,
such as the /usr/var file system in the above example.
Become root
Configuring gbde requires super-user privileges.
% su -
Password:
2.
3.
345
Chapter 12 Storage
options GEOM_BDE
Configure, recompile, and install the FreeBSD kernel. This process is described in Chapter 9.
Reboot into the new kernel.
/dev/ad0
/dev/ad0s1
/dev/ad0s1a
2.
/dev/ad0s1b
/dev/ad0s1c
/dev/ad0s1d
/dev/ad0s1e
/dev/ad0s1f
/dev/ad4
/dev/ad4s1
/dev/ad4s1c
The gbde lock file contains information that gbde requires to access encrypted partitions. Without access to the
lock file, gbde will not be able to decrypt the data contained in the encrypted partition without significant
manual intervention which is not supported by the software. Each encrypted partition uses a separate lock file.
3.
gbde(8) will open your editor, permitting you to set various configuration options in a template. For use with
UFS1 or UFS2, set the sector_size to 2048:
$FreeBSD: src/sbin/gbde/template.txt,v 1.1 2002/10/20 11:16:13 phk Exp $
#
# Sector size is the smallest unit of data which can be read or written.
# Making it too small decreases performance and decreases available space.
# Making it too large may prevent filesystems from working. 512 is the
# minimum and always safe. For UFS, use the fragment size
#
sector_size
=
2048
[...]
gbde(8) will ask you twice to type the passphrase that should be used to secure the data. The passphrase must be
the same both times. gbdes ability to protect your data depends entirely on the quality of the passphrase that
you choose. 1
The gbde init command creates a lock file for your gbde partition that in this example is stored as
/etc/gbde/ad4s1c.
346
Chapter 12 Storage
Caution: gbde lock files must be backed up together with the contents of any encrypted partitions. While
deleting a lock file alone cannot prevent a determined attacker from decrypting a gbde partition, without the
lock file, the legitimate owner will be unable to access the data on the encrypted partition without a
significant amount of work that is totally unsupported by gbde(8) and its designer.
4.
You will be asked to provide the passphrase that you selected during the initialization of the encrypted partition.
The new encrypted device will show up in /dev as /dev/device_name.bde:
# ls /dev/ad*
/dev/ad0
/dev/ad0s1
/dev/ad0s1a
5.
/dev/ad0s1b
/dev/ad0s1c
/dev/ad0s1d
/dev/ad0s1e
/dev/ad0s1f
/dev/ad4
/dev/ad4s1
/dev/ad4s1c
/dev/ad4s1c.bde
Note: The newfs(8) command must be performed on an attached gbde partition which is identified by a
*.bde extension to the device name.
6.
7.
Size
1037M
1.0K
8.1G
1037M
6.1G
150G
Used
72M
1.0K
55K
1.1M
1.9G
4.1K
Avail Capacity
883M
8%
0B
100%
7.5G
0%
953M
0%
3.7G
35%
138G
0%
Mounted on
/
/dev
/home
/tmp
/usr
/private
347
Chapter 12 Storage
You will be asked to provide the passphrase that you selected during initialization of the encrypted gbde
partition.
2.
3.
Notes
1. For tips on how to select a secure passphrase that is easy to remember, see the Diceware Passphrase
(http://world.std.com/~reinhold/diceware.html) website.
348
349
Disk 1
Disk 2
Disk 3
Disk 4
10
12
11
13
14
15
16
17
An alternative mapping is to divide the address space into smaller, equal-sized components and store them
sequentially on different devices. For example, the first 256 sectors may be stored on the first disk, the next 256
sectors on the next disk and so on. After filling the last disk, the process repeats until the disks are full. This mapping
is called striping or RAID-0 1. Striping requires somewhat more effort to locate the data, and it can cause additional
I/O load where a transfer is spread over multiple disks, but it can also provide a more constant load across the disks.
Figure 13-2 illustrates the sequence in which storage units are allocated in a striped organization.
350
Disk 1
Disk 2
Disk 3
Disk 4
10
11
12
13
14
15
16
17
18
19
20
21
22
23
The performance impact. Writes must be performed to both drives, so they take up twice the bandwidth of a
non-mirrored volume. Reads do not suffer from a performance penalty: it even looks as if they are faster.
An alternative solution is parity, implemented in the RAID levels 2, 3, 4 and 5. Of these, RAID-5 is the most
interesting. As implemented in Vinum, it is a variant on a striped organization which dedicates one block of each
stripe to parity of the other blocks. As implemented by Vinum, a RAID-5 plex is similar to a striped plex, except that
it implements RAID-5 by including a parity block in each stripe. As required by RAID-5, the location of this parity
block changes from one stripe to the next. The numbers in the data blocks indicate the relative block numbers.
351
Disk 1
Disk 2
Disk 3
Disk 4
Parity
Parity
Parity
Parity
10
11
12
13
14
Parity
15
16
Parity
17
Compared to mirroring, RAID-5 has the advantage of requiring significantly less storage space. Read access is
similar to that of striped organizations, but write access is significantly slower, approximately 25% of the read
performance. If one drive fails, the array can continue to operate in degraded mode: a read from one of the remaining
accessible drives continues normally, but a read from the failed drive is recalculated from the corresponding block
from all the remaining drives.
The most visible object is the virtual disk, called a volume. Volumes have essentially the same properties as a
UNIX disk drive, though there are some minor differences. They have no size limitations.
Volumes are composed of plexes, each of which represent the total address space of a volume. This level in the
hierarchy thus provides redundancy. Think of plexes as individual disks in a mirrored array, each containing the
same data.
Since Vinum exists within the UNIX disk storage framework, it would be possible to use UNIX partitions as
the building block for multi-disk plexes, but in fact this turns out to be too inflexible: UNIX disks can have only
a limited number of partitions. Instead, Vinum subdivides a single UNIX partition (the drive) into contiguous
areas called subdisks, which it uses as building blocks for plexes.
Subdisks reside on Vinum drives, currently UNIX partitions. Vinum drives can contain any number of subdisks.
With the exception of a small area at the beginning of the drive, which is used for storing configuration and state
information, the entire drive is available for data storage.
The following sections describe the way these objects provide the functionality required of Vinum.
352
A striped plex stripes the data across each subdisk. The subdisks must all have the same size, and there must be at
least two subdisks in order to distinguish it from a concatenated plex.
Concatenated plexes are the most flexible: they can contain any number of subdisks, and the subdisks may be of
different length. The plex may be extended by adding additional subdisks. They require less CPU time than striped
plexes, though the difference in CPU overhead is not measurable. On the other hand, they are most susceptible to
hot spots, where one disk is very active and others are idle.
The greatest advantage of striped (RAID-0) plexes is that they reduce hot spots: by choosing an optimum sized
stripe (about 256 kB), you can even out the load on the component drives. The disadvantages of this approach are
(fractionally) more complex code and restrictions on subdisks: they must be all the same size, and extending a plex
by adding new subdisks is so complicated that Vinum currently does not implement it. Vinum imposes an
additional, trivial restriction: a striped plex must have at least two subdisks, since otherwise it is indistinguishable
from a concatenated plex.
Table 13-1 summarizes the advantages and disadvantages of each plex organization.
Table 13-1. Vinum Plex Organizations
Plex type
353
concatenated
yes
no
striped
no
yes
High performance in
combination with
highly concurrent
access
The drive line describes a disk partition (drive) and its location relative to the underlying hardware. It is given the
symbolic name a. This separation of the symbolic names from the device names allows disks to be moved from
one location to another without confusion.
The volume line describes a volume. The only required attribute is the name, in this case myvol.
The plex line defines a plex. The only required parameter is the organization, in this case concat. No name is
necessary: the system automatically generates a name from the volume name by adding the suffix .px, where x is
the number of the plex in the volume. Thus this plex will be called myvol.p0.
The sd line describes a subdisk. The minimum specifications are the name of a drive on which to store it, and the
length of the subdisk. As with plexes, no name is necessary: the system automatically assigns names derived from
the plex name by adding the suffix .sx, where x is the number of the subdisk in the plex. Thus Vinum gives this
subdisk the name myvol.p0.s0.
Configuration summary
Drives:
1 (4 configured)
354
1 (4 configured)
1 (8 configured)
1 (16 configured)
D a
State: up
Device /dev/da3h
V myvol
State: up
Plexes:
1 Size:
512 MB
Subdisks:
1 Size:
512 MB
B Size:
512 MB
P myvol.p0
S myvol.p0.s0
C State: up
State: up
PO:
This output shows the brief listing format of vinum(8). It is represented graphically in Figure 13-4.
Figure 13-4. A Simple Vinum Volume
0 MB
volume
address
space
Subdisk
myvol.p0.s0
512 MB
Plex 1
myvol.p0
This figure, and the ones which follow, represent a volume, which contains the plexes, which in turn contain the
subdisks. In this trivial example, the volume contains one plex, and the plex contains one subdisk.
355
In this example, it was not necessary to specify a definition of drive a again, since Vinum keeps track of all objects in
its configuration database. After processing this definition, the configuration looks like:
Drives:
Volumes:
Plexes:
Subdisks:
2
2
3
3
D a
D b
(4 configured)
(4 configured)
(8 configured)
(16 configured)
State: up
State: up
V myvol
V mirror
P myvol.p0
P mirror.p0
P mirror.p1
S myvol.p0.s0
S mirror.p0.s0
S mirror.p1.s0
Device /dev/da3h
Device /dev/da4h
State: up
State: up
Plexes:
Plexes:
512 MB
512 MB
C State: up
Subdisks:
1 Size:
512 MB
C State: up
Subdisks:
1 Size:
512 MB
C State: initializing
Subdisks:
1 Size:
State: up
State: up
State: empty
PO:
PO:
PO:
0
0
0 B Size:
B Size:
B Size:
512 MB
512 MB
512 MB
512 MB
356
0 MB
volume
address
space
Subdisk 1
Subdisk 2
mirror.p0.s0
mirror.p1.s0
512 MB
Plex 1
Plex 2
mirror.p0
mirror.p1
In this example, each plex contains the full 512 MB of address space. As in the previous example, each plex contains
only a single subdisk.
357
As before, it is not necessary to define the drives which are already known to Vinum. After processing this definition,
the configuration looks like:
Drives:
Volumes:
Plexes:
Subdisks:
D
D
D
D
4
3
4
7
(4 configured)
(4 configured)
(8 configured)
(16 configured)
a
b
c
d
V myvol
V mirror
V striped
P
P
P
P
myvol.p0
mirror.p0
mirror.p1
striped.p1
S
S
S
S
S
S
S
myvol.p0.s0
mirror.p0.s0
mirror.p1.s0
striped.p0.s0
striped.p0.s1
striped.p0.s2
striped.p0.s3
State:
State:
State:
State:
up
up
up
up
State: up
State: up
State: up
Device
Device
Device
Device
/dev/da3h
/dev/da4h
/dev/da5h
/dev/da6h
Plexes:
Plexes:
Plexes:
1 Size:
2 Size:
1 Size:
Avail:
Avail:
Avail:
Avail:
1421/2573
1933/2573
2445/2573
2445/2573
512 MB
512 MB
512 MB
C State: up
Subdisks:
1 Size:
512 MB
C State: up
Subdisks:
1 Size:
512 MB
C State: initializing
Subdisks:
1 Size:
State: up
Subdisks:
1 Size:
512 MB
State:
State:
State:
State:
State:
State:
State:
up
up
empty
up
up
up
up
PO:
PO:
PO:
PO:
PO:
PO:
PO:
0 B Size:
0 B Size:
0 B Size:
0 B Size:
512 kB Size:
1024 kB Size:
1536 kB Size:
MB
MB
MB
MB
512
512
512
128
128
128
128
512 MB
MB
MB
MB
MB
MB
MB
MB
358
(55%)
(75%)
(95%)
(95%)
0 MB
striped.p0.s0
volume
address
space
striped.p0.s1
striped.p0.s2
striped.p0.s3
512 MB
Plex 1
striped.p0
This volume is represented in Figure 13-6. The darkness of the stripes indicates the position within the plex address
space: the lightest stripes come first, the darkest last.
a
b
c
d
e
c
359
length
length
length
length
102480k
102480k
102480k
102480k
drive
drive
drive
drive
d
e
a
b
The subdisks of the second plex are offset by two drives from those of the first plex: this helps ensure that writes do
not go to the same subdisks even if a transfer goes over two drives.
Figure 13-7 represents the structure of this volume.
Figure 13-7. A Mirrored, Striped Vinum Volume
.p0.s0
.p1.s0
.p0.s1
.p1.s1
.p0.s2
.p1.s2
.p0.s3
.p1.s3
.p0.s4
.p1.s4
Plex 1
Plex 2
striped.p0
striped.p1
360
The control devices /dev/vinum/control and /dev/vinum/controld, which are used by vinum(8) and the
Vinum daemon respectively.
Block and character device entries for each volume. These are the main devices used by Vinum. The block device
names are the name of the volume, while the character device names follow the BSD tradition of prepending the
letter r to the name. Thus the configuration above would include the block devices /dev/vinum/myvol,
/dev/vinum/mirror, /dev/vinum/striped, /dev/vinum/raid5 and /dev/vinum/raid10, and the
character devices /dev/vinum/rmyvol, /dev/vinum/rmirror, /dev/vinum/rstriped,
/dev/vinum/rraid5 and /dev/vinum/rraid10. There is obviously a problem here: it is possible to have two
volumes called r and rr, but there will be a conflict creating the device node /dev/vinum/rr: is it a character
device for volume r or a block device for volume rr? Currently Vinum does not address this conflict: the
first-defined volume will get the name.
A directory /dev/vinum/drive with entries for each drive. These entries are in fact symbolic links to the
corresponding disk nodes.
A directory /dev/vinum/volume with entries for each volume. It contains subdirectories for each plex, which in
turn contain subdirectories for their component subdisks.
The directories /dev/vinum/plex, /dev/vinum/sd, and /dev/vinum/rsd, which contain block device nodes
for each plex and block and character device nodes respectively for each subdisk.
After processing this file, vinum(8) creates the following structure in /dev/vinum:
brwx-----brwx-----brwx-----drwxr-xr-x
drwxr-xr-x
crwxr-xr-drwxr-xr-x
1
1
1
2
2
1
2
root
root
root
root
root
root
root
wheel
wheel
wheel
wheel
wheel
wheel
wheel
361
2
1
2
3
root
root
root
root
/dev/vinum/drive:
total 0
lrwxr-xr-x 1
lrwxr-xr-x 1
lrwxr-xr-x 1
lrwxr-xr-x 1
wheel
wheel
wheel
wheel
25,
512
2
512
512
Apr
Apr
Apr
Apr
13
13
13
13
13
13
13
13
16:46
16:46
16:46
16:46
16:46
16:46
16:46
16:46
rvol
s64
sd
vol
root
root
root
root
wheel
wheel
wheel
wheel
/dev/vinum/plex:
total 0
brwxr-xr-- 1 root
wheel
/dev/vinum/rsd:
total 0
crwxr-xr-- 1 root
crwxr-xr-- 1 root
crwxr-xr-- 1 root
crwxr-xr-- 1 root
wheel
wheel
wheel
wheel
91,
91,
91,
91,
/dev/vinum/rvol:
total 0
crwxr-xr-- 1 root
wheel
91,
/dev/vinum/sd:
total 0
brwxr-xr-- 1 root
brwxr-xr-- 1 root
brwxr-xr-- 1 root
brwxr-xr-- 1 root
wheel
wheel
wheel
wheel
25,
25,
25,
25,
0x20000002
0x20100002
0x20200002
0x20300002
/dev/vinum/vol:
total 1
brwxr-xr-- 1 root
drwxr-xr-x 3 root
wheel
wheel
25,
/dev/vinum/vol/s64.plex:
total 1
brwxr-xr-- 1 root wheel
drwxr-xr-x 2 root wheel
9
9
9
9
Apr
Apr
Apr
Apr
drive1
drive2
drive3
drive4
0x20000002
0x20100002
0x20200002
0x20300002
Apr
Apr
Apr
Apr
13
13
13
13
->
->
->
->
/dev/sd1h
/dev/sd2h
/dev/sd3h
/dev/sd4h
16:46
16:46
16:46
16:46
s64.p0.s0
s64.p0.s1
s64.p0.s2
s64.p0.s3
Apr
Apr
Apr
Apr
13
13
13
13
16:46
16:46
16:46
16:46
s64.p0.s0
s64.p0.s1
s64.p0.s2
s64.p0.s3
/dev/vinum/vol/s64.plex/s64.p0.sd:
total 0
brwxr-xr-- 1 root wheel
25, 0x20000002
brwxr-xr-- 1 root wheel
25, 0x20100002
brwxr-xr-- 1 root wheel
25, 0x20200002
brwxr-xr-- 1 root wheel
25, 0x20300002
Apr
Apr
Apr
Apr
13
13
13
13
16:46
16:46
16:46
16:46
s64.p0.s0
s64.p0.s1
s64.p0.s2
s64.p0.s3
362
Note: The following is only valid for FreeBSD versions prior to 5.0:
In order to create a file system on this volume, use the -v option to newfs(8):
# newfs -v /dev/vinum/concat
13.8.1 Startup
Vinum stores configuration information on the disk slices in essentially the same form as in the configuration files.
When reading from the configuration database, Vinum recognizes a number of keywords which are not allowed in
the configuration files. For example, a disk configuration might contain the following text:
volume myvol state up
volume bigraid state down
plex name myvol.p0 state up org concat vol myvol
plex name myvol.p1 state up org concat vol myvol
plex name myvol.p2 state init org striped 512b vol myvol
plex name bigraid.p0 state initializing org raid5 512b vol bigraid
sd name myvol.p0.s0 drive a plex myvol.p0 state up len 1048576b driveoffset 265b plexoffset 0b
sd name myvol.p0.s1 drive b plex myvol.p0 state up len 1048576b driveoffset 265b plexoffset 1048576b
sd name myvol.p1.s0 drive c plex myvol.p1 state up len 1048576b driveoffset 265b plexoffset 0b
363
name
name
name
name
name
name
name
name
name
name
myvol.p1.s1 drive d
myvol.p2.s0 drive a
myvol.p2.s1 drive b
myvol.p2.s2 drive c
myvol.p2.s3 drive d
bigraid.p0.s0 drive
bigraid.p0.s1 drive
bigraid.p0.s2 drive
bigraid.p0.s3 drive
bigraid.p0.s4 drive
The obvious differences here are the presence of explicit location information and naming (both of which are also
allowed, but discouraged, for use by the user) and the information on the states (which are not available to the user).
Vinum does not store information about drives in the configuration information: it finds the drives by scanning the
configured disk drives for partitions with a Vinum label. This enables Vinum to identify drives correctly even if they
have been assigned different UNIX drive IDs.
13.8.1.1 Automatic Startup
In order to start Vinum automatically when you boot the system, ensure that you have the following line in your
/etc/rc.conf:
start_vinum="YES" # set to YES to start vinum
If you do not have a file /etc/rc.conf, create one with this content. This will cause the system to load the Vinum
kld at startup, and to start any objects mentioned in the configuration. This is done before mounting file systems, so it
is possible to automatically fsck(8) and mount file systems on Vinum volumes.
When you start Vinum with the vinum start command, Vinum reads the configuration database from one of the
Vinum drives. Under normal circumstances, each drive contains an identical copy of the configuration database, so it
does not matter which drive is read. After a crash, however, Vinum must determine which drive was updated most
recently and read the configuration from this drive. It then updates the configuration if necessary from progressively
older drives.
The root filesystem must be available very early during the boot process, so the Vinum infrastructure must already
be available at this time.
The volume containing the root filesystem also contains the system bootstrap and the kernel, which must be read
using the host systems native utilities (e. g. the BIOS on PC-class machines) which often cannot be taught about
the details of Vinum.
In the following sections, the term root volume is generally used to describe the Vinum volume that contains the
root filesystem. It is probably a good idea to use the name "root" for this volume, but this is not technically
required in any way. All command examples in the following sections assume this name though.
364
Vinum must be available in the kernel at boot-time. Thus, the method to start Vinum automatically described in
Section 13.8.1.1 is not applicable to accomplish this task, and the start_vinum parameter must actually not be
set when the following setup is being arranged. The first option would be to compile Vinum statically into the
kernel, so it is available all the time, but this is usually not desirable. There is another option as well, to have
/boot/loader (Section 7.3.3) load the vinum kernel module early, before starting the kernel. This can be
accomplished by putting the line
vinum_load="YES"
Vinum must be initialized early since it needs to supply the volume for the root filesystem. By default, the Vinum
kernel part is not looking for drives that might contain Vinum volume information until the administrator (or one
of the startup scripts) issues a vinum start command.
Note: The following paragraphs are outlining the steps needed for FreeBSD 5.x and above. The setup
required for FreeBSD 4.x differs, and is described below in Section 13.9.5.
into /boot/loader.conf, Vinum is instructed to automatically scan all drives for Vinum information as part of
the kernel startup.
Note that it is not necessary to instruct the kernel where to look for the root filesystem. /boot/loader looks up
the name of the root device in /etc/fstab, and passes this information on to the kernel. When it comes to mount
the root filesystem, the kernel figures out from the devicename provided which driver to ask to translate this into
the internal device ID (major/minor number).
The root volume must not contain more than one concatenated subdisk per plex.
365
The location (offset from the beginning of the device) and size of this devices subdisk that is part of the root
volume need to be examined, using the command
vinum l -rv root
Note that Vinum offsets and sizes are measured in bytes. They must be divided by 512 in order to obtain the
block numbers that are to be used in the disklabel command.
2.
for each device that participates in the root volume. devname must be either the name of the disk (like da0) for
disks without a slice (aka. fdisk) table, or the name of the slice (like ad0s1).
If there is already an "a" partition on the device (presumably, containing a pre-Vinum root filesystem), it should
be renamed to something else, so it remains accessible (just in case), but will no longer be used by default to
bootstrap the system. Note that active partitions (like a root filesystem currently mounted) cannot be renamed, so
this must be executed either when being booted from a Fixit medium, or in a two-step process, where (in a
mirrored situation) the disk that has not been currently booted is being manipulated first.
Then, the offset the Vinum partition on this device (if any) must be added to the offset of the respective root
volume subdisk on this device. The resulting value will become the "offset" value for the new "a" partition.
The "size" value for this partition can be taken verbatim from the calculation above. The "fstype" should be
4.2BSD. The "fsize", "bsize", and "cpg" values should best be chosen to match the actual filesystem,
though they are fairly unimportant within this context.
That way, a new "a" partition will be established that overlaps the Vinum partition on this device. Note that the
disklabel will only allow for this overlap if the Vinum partition has properly been marked using the "vinum"
fstype.
3.
Thats all! A faked "a" partition does exist now on each device that has one replica of the root volume. It is
highly recommendable to verify the result again, using a command like
fsck -n /dev/devnamea
It should be remembered that all files containing control information must be relative to the root filesystem in the
Vinum volume which, when setting up a new Vinum root volume, might not match the root filesystem that is
currently active. So in particular, the files /etc/fstab and /boot/loader.conf need to be taken care of.
At next reboot, the bootstrap should figure out the appropriate control information from the new Vinum-based root
filesystem, and act accordingly. At the end of the kernel initialization process, after all devices have been announced,
the prominent notice that shows the success of this setup is a message like:
366
The values to note are 135680 for the offset (relative to partition /dev/da0h). This translates to 265 512-byte disk
blocks in disklabels terms. Likewise, the size of this root volume is 245760 512-byte blocks. /dev/da1h,
containing the second replica of this root volume, has a symmetric setup.
The disklabel for these devices might look like:
...
8 partitions:
#
size
a:
245760
c: 71771688
h: 71771672
offset
281
0
16
fstype
4.2BSD
unused
vinum
0*- 15*)
0 - 4467*)
0*- 4467*)
It can be observed that the "size" parameter for the faked "a" partition matches the value outlined above, while the
"offset" parameter is the sum of the offset within the Vinum partition "h", and the offset of this partition within
the device (or slice). This is a typical setup that is necessary to avoid the problem described in Section 13.9.4.3. It
can also be seen that the entire "a" partition is completely within the "h" partition containing all the Vinum data for
this device.
Note that in the above example, the entire device is dedicated to Vinum, and there is no leftover pre-Vinum root
partition, since this has been a newly set-up disk that was only meant to be part of a Vinum configuration, ever.
13.9.4 Troubleshooting
If something goes wrong, a way is needed to recover from the situation. The following list contains few known
pitfalls and solutions.
367
alternate choice would be something like ufs:da0d which could be a hypothetical partition that contains the
pre-Vinum root filesystem. Care should be taken if one of the alias "a" partitions are entered here that are actually
reference to the subdisks of the Vinum root device, because in a mirrored setup, this would only mount one piece of a
mirrored root device. If this filesystem is to be mounted read-write later on, it is necessary to remove the other
plex(es) of the Vinum root volume since these plexes would otherwise carry inconsistent data.
368
Vinum must explicitly be told which disks to scan, using a line like the following one in /boot/loader.conf:
vinum.drives="/dev/da0 /dev/da1"
It is important that all drives are mentioned that could possibly contain Vinum data. It does not harm if more drives
are listed, nor is it necessary to add each slice and/or partition explicitly, since Vinum will scan all slices and
partitions of the named drives for valid Vinum headers.
Since the routines used to parse the name of the root filesystem, and derive the device ID (major/minor number) are
only prepared to handle classical device names like /dev/ad0s1a, they cannot make any sense out of a root
volume name like /dev/vinum/root. For that reason, Vinum itself needs to pre-setup the internal kernel parameter
that holds the ID of the root device during its own initialization. This is requested by passing the name of the root
volume in the loader variable vinum.root. The entry in /boot/loader.conf to accomplish this looks like:
vinum.root="root"
Now, when the kernel initialization tries to find out the root device to mount, it sees whether some kernel module has
already pre-initialized the kernel parameter for it. If that is the case, and the device claiming the root device matches
the major number of the driver as figured out from the name of the root device string being passed (that is, "vinum"
in our case), it will use the pre-allocated device ID, instead of trying to figure out one itself. That way, during the
usual automatic startup, it can continue to mount the Vinum root volume for the root filesystem.
However, when boot -a has been requesting to ask for entering the name of the root device manually, it must be
noted that this routine still cannot actually parse a name entered there that refers to a Vinum volume. If any device
name is entered that does not refer to a Vinum device, the mismatch between the major numbers of the pre-allocated
root parameter and the driver as figured out from the given name will make this routine enter its normal parser, so
entering a string like ufs:da0d will work as expected. Note that if this fails, it is however no longer possible to
re-enter a string like ufs:vinum/root again, since it cannot be parsed. The only way out is to reboot again, and
start over then. (At the askroot prompt, the initial /dev/ can always be omitted.)
Notes
1. RAID stands for Redundant Array of Inexpensive Disks and offers various forms of fault tolerance, though the
latter term is somewhat misleading: it provides no redundancy.
369
14.1 Synopsis
FreeBSD is a very distributed project with users and contributors located all over the world. This chapter discusses
the internationalization and localization features of FreeBSD that allow non-English speaking users to get real work
done. There are many aspects of the i18n implementation in both the system and application levels, so where
applicable we refer the reader to more specific sources of documentation.
After reading this chapter, you will know:
How different languages and locales are encoded on modern operating systems.
370
Description
en_US
ru_RU
zh_TW
14.3.2 Encodings
Some languages use non-ASCII encodings that are 8-bit, wide or multibyte characters, see multibyte(3) for more
details. Older applications do not recognize them and mistake them for control characters. Newer applications
usually do recognize 8-bit characters. Depending on the implementation, users may be required to compile an
application with wide or multibyte characters support, or configure it correctly. To be able to input and process wide
or multibyte characters, the FreeBSD Ports collection (../../../../ports/index.html) has provided each language with
different programs. Refer to the I18N documentation in the respective FreeBSD Port.
Specifically, the user needs to look at the application documentation to decide on how to configure it correctly or to
pass correct values into the configure/Makefile/compiler.
Some things to keep in mind are:
Language specific single C chars character sets (see multibyte(3)), i.e., ISO-8859-1, ISO-8859-15, KOI8-R,
CP437.
You can check the active list of character sets at the IANA Registry (http://www.iana.org/assignments/character-sets).
Note: FreeBSD versions 4.5 and up use X11-compatible locale encodings instead.
371
character set
This includes the user shell configuration, the specific application configuration, and the X11 configuration.
14.3.4.1 Setting Locale Methods
There are two methods for setting locale, and both are described below. The first (recommended one) is by assigning
the environment variables in login class, and the second is by adding the environment variable assignments to the
systems shell startup file.
14.3.4.1.1 Login Classes Method
This method allows environment variables needed for locale name and MIME character sets to be assigned once for
every possible shell instead of adding specific shell assignments to each shells startup file. User Level Setup can be
done by an user himself and Administrator Level Setup require superuser privileges.
14.3.4.1.1.1 User Level Setup
Here is a minimal example of a .login_conf file in users home directory which has both variables set for Latin-1
encoding:
me:\
:charset=ISO-8859-1:\
:lang=de_DE.ISO8859-1:
Here is an example of a .login_conf that sets the variables for Traditional Chinese in BIG-5 encoding. Notice the
many more variables set because some software does not respect locale variables correctly for Chinese, Japanese,
and Korean.
#Users who do not wish to use monetary units or time formats
#of Taiwan can manually change each variable
me:\
lang=zh_TW.Big5:\
lc_all=zh_TW.Big:\
lc_collate=zh_TW.Big5:\
lc_ctype=zh_TW.Big5:\
372
So sticking with our previous example using Latin-1, it would look like this:
german:German Users Accounts:\
:charset=ISO-8859-1:\
:lang=de_DE.ISO8859-1:\
:tc=default:
Set defaultclass = language in /etc/adduser.conf. Keep in mind you must enter a default class for
all users of other languages in this case.
Another alternative is to use the following for each user of a different language that you wish to add:
# adduser -class language
373
To add the locale name and MIME character set, just set the two environment variables shown below in the
/etc/profile and/or /etc/csh.login shell startup files. We will use the German language as an example below:
In /etc/profile:
LANG=de_DE.ISO8859-1; export LANG
MM_CHARSET=ISO-8859-1; export MM_CHARSET
Or in /etc/csh.login:
setenv LANG de_DE.ISO8859-1
setenv MM_CHARSET ISO-8859-1
Alternatively, you can add the above instructions to /usr/share/skel/dot.profile (similar to what was used in
/etc/profile above), or /usr/share/skel/dot.login (similar to what was used in /etc/csh.login above).
For X11:
In $HOME/.xinitrc:
LANG=de_DE.ISO8859-1; export LANG
Or:
setenv LANG de_DE.ISO8859-1
The font_name here is taken from the /usr/share/syscons/fonts directory, without the .fnt suffix.
Also be sure to set the correct keymap and screenmap for your single C chars character set through
/stand/sysinstall. Once inside sysinstall, choose Configure, thenConsole. Alternatively, you can add the
following to /etc/rc.conf:
scrnmap=screenmap_name
keymap=keymap_name
keychange="fkey_number sequence"
374
For the FreeBSD versions 4.4 and up insert the following line into /etc/rc.conf:
mousechar_start=3
The keymap_name here is taken from the /usr/share/syscons/keymaps directory, without the .kbd suffix. If
youre uncertain which keymap to use, you use can kbdmap(1) to test keymaps without rebooting.
The keychange is usually needed to program function keys to match the selected terminal type because function
key sequences cannot be defined in the key map.
Also be sure to set the correct console terminal type in /etc/ttys for all ttyv* entries. Current pre-defined
correspondences are:
Character Set
Terminal Type
ISO-8859-1 or ISO-8859-15
cons25l1
ISO-8859-2
ISO-8859-7
cons25l2
KOI8-R
KOI8-U
CP437 (VGA default)
US-ASCII
cons25l7
cons25r
cons25u
cons25
cons25w
For wide or multibyte characters languages, use the correct FreeBSD port in your /usr/ports/language
directory. Some ports appear as console while the system sees it as serial vttys, hence you must reserve enough vttys
for both X11 and the pseudo-serial console. Here is a partial list of applications for using other languages in console:
Language
Location
chinese/big5con
Japanese
Korean
japanese/ja-kon2-* or japanese/Mule_Wnn
korean/ko-han
375
376
For the FreeBSD versions before 5.0 add the following line to your kernel configuration file:
options SC_MOUSE_CHAR=0x03
For the FreeBSD versions 4.4 and up insert the following line into /etc/rc.conf:
mousechar_start=3
For each ttyv* entry in /etc/ttys, use cons25r as the terminal type.
377
/dos/c
msdos
rw,-Wkoi2dos,-Lru_RU.KOI8-R 0 0
The option -L selects the locale name used, and -W sets the character conversion table. To use the -W option, be sure
to mount /usr before the MS-DOS partition because the conversion tables are located in /usr/libdata/msdosfs.
For more informations, see the mount_msdos(8) manual page.
The above port installs the latest version of the KOI8-R fonts. XFree86 3.3 already has some KOI8-R fonts, but
these are scaled better.
Check the "Files" section in your /etc/XF86Config file. The following lines must be added before any
other FontPath entries:
FontPath
FontPath
FontPath
"/usr/X11R6/lib/X11/fonts/cyrillic/misc"
"/usr/X11R6/lib/X11/fonts/cyrillic/75dpi"
"/usr/X11R6/lib/X11/fonts/cyrillic/100dpi"
If you use a high resolution video mode, swap the 75 dpi and 100 dpi lines.
3. To activate a Russian keyboard, add the following to the "Keyboard" section of your XF86Config file.
For XFree86 3.X:
XkbLayout "ru"
XkbOptions "grp:caps_toggle"
"ru"
"grp:caps_toggle"
Also make sure that XkbDisable is turned off (commented out) there.
378
Description
outta-port tag=.
zh-L10N-tut tag=.
zh-doc tag=.
Chuan-Hsing Shen <s874070@mail.yzu.edu.tw> has created the Chinese FreeBSD Collection (CFC)
(http://cnpa.yzu.edu.tw/~cfc/) using FreeBSD-Taiwans zh-L10N-tut. The packages and the script files are
available at ftp://ftp.csie.ncu.edu.tw/OS/FreeBSD/taiwan/CFC/.
379
380
15.1 Synopsis
FreeBSD can run a wide variety of desktop applications, such as browsers and word processors. Most of these are
available as packages or can be automatically built from the ports collection. Many new users expect to find these
kinds of applications on their desktop. This chapter will show you how to install some popular desktop applications
effortlessly, either from their packages or from the ports collection.
Note that when installing programs from the ports, they are compiled from source. This can take a very long time,
depending on what you are compiling and the processing power of your machine(s). If building from source takes a
prohibitively long amount of time for you, you can install most of the programs of the ports collection from pre-built
packages.
As FreeBSD features Linux binary compatibility, many applications originally developed for Linux are available for
your desktop. It is strongly recommended that you read Chapter 22 before installing any of the Linux applications.
Many of the ports using the Linux binary compatibility start with linux-. Remember this when you search for a
particular port, for instance with whereis(1). In the following text, it is assumed that you have enabled Linux binary
compatibility before installing any of the Linux applications.
Here are the categories covered by this chapter:
For information on how to get a multimedia environment, read Chapter 16. If you want to setup and use electronic
mail, please refer to Chapter 20.
15.2 Browsers
FreeBSD does not come with a particular browser pre-installed. Instead, the www
(http://www.FreeBSD.org/ports/www.html) directory of the ports collection contains a lot of browsers ready to be
installed. If you do not have time to compile everything (this can take a very long time in some cases) many of them
are available as packages.
KDE and GNOME already provide HTML browsers. Please refer to Section 5.7 for more information on how to
setup these complete desktops.
381
Resources Needed
Major Dependencies
Mozilla
heavy
heavy
Gtk+
Netscape
heavy
light
Opera
light
light
15.2.1 Mozilla
Mozilla is perhaps the most suitable browser for your FreeBSD Desktop. It is modern, stable, and fully ported to
FreeBSD. It features a very standards-compliant HTML display engine. It provides a mail and news reader. It even
has a HTML composer if you plan to write some web pages yourself. Users of Netscape will recognize the
similarities with Communicator suite, as both browsers shared the same basis.
On slow machines, with a CPU speed less than 233MHz or with less than 64MB of RAM, Mozilla can be too
resource-consuming to be fully usable. You may want to look at the Opera browser instead, described a little later in
this chapter.
If you cannot or do not want to compile Mozilla for any reason, the FreeBSD GNOME team has already done this
for you. Just install the package from the network by:
# pkg_add -r mozilla
If the package is not available, and you have enough time and disk space, you can get the source for Mozilla,
compile it and install it on your system. This is accomplished by:
# cd /usr/ports/www/mozilla
# make install clean
The Mozilla port ensures a correct initialization by running the chrome registry setup with root privileges. However,
if you want to fetch some add-ons like mouse gestures, you must run Mozilla as root to get them properly installed.
Once you have completed the installation of Mozilla, you do not need to be root any longer. You can start Mozilla
as a browser by typing:
% mozilla
You can start it directly as a mail and news reader as shown below:
% mozilla -mail
382
/usr/X11R6/lib/browser_plugins/libflashplayer_linux.so
# cp /usr/local/lib/flash/ShockwaveFlash.class \
/usr/X11R6/lib/browser_plugins/
Note: If you are using www/mozilla-devel, the destination directories will be different.
Now add the following lines to the top of (but right under #!/bin/sh) Mozilla startup script:
/usr/X11R6/bin/mozilla.
LD_PRELOAD=/usr/local/lib/libflashplayer.so.1
export LD_PRELOAD
And access the About Plug-ins option from the Help menu. A list should appear with all the currently available
plugins. java and shockwave flash should both be listed.
383
15.2.3 Netscape
The ports collection contains several versions of the Netscape browser. Since the native FreeBSD ones contain a
serious security bug, installing them is strongly discouraged. Instead, use a more recent Linux or DIGITAL UNIX
version.
The latest stable release of the Netscape browser is Netscape 7. It can be installed from the ports collection:
# cd /usr/ports/www/netscape7
# make install clean
There are localized versions in the French, German, and Japanese categories.
Caution: Netscape 4.x versions are not recommended because they are not compliant with todays standards.
However, Netscape 7.x and newer versions are only available for the i386 platform.
15.2.4 Opera
Opera is a very fast, full-featured, and standards-compliant browser. It comes in two favors: a native FreeBSD
version and a version that runs under Linux emulation. For each operating system, there is a no-cost version of the
browser that displays advertising and an ad-free version that can be purchased on the Opera web site
(http://www.opera.com/).
To browse the Web with the FreeBSD version of Opera, install the package:
# pkg_add -r opera
Some FTP sites do not have all the packages, but the same result can be obtained with the ports collection by typing:
# cd /usr/ports/www/opera
# make install clean
To install the Linux version of Opera, substitute linux-opera in place of opera in the examples above. The Linux
version is useful in situations requiring the use of plug-ins that are only available for Linux, such as Adobe Acrobat
Reader. In all other respects, the FreeBSD and Linux versions appear to be functionally identical.
15.3 Productivity
When it comes to productivity, new users often look for a good office suite or a friendly word processor. While some
desktop environments like KDE already provide an office suite, there is no default application. FreeBSD provides all
that is needed, regardless of your desktop environment.
This section covers these applications:
Application Name
Resources Needed
Major Dependencies
KOffice
light
heavy
KDE
AbiWord
light
light
Gtk+ or GNOME
384
Resources Needed
Major Dependencies
The Gimp
light
heavy
Gtk+
OpenOffice.org
heavy
huge
15.3.1 KOffice
The KDE community has provided its desktop environment with an office suite which can be used outside KDE. It
includes the four standard components that can be found in other office suites. KWord is the word processor,
KSpread is the spreadsheet program, KPresenter manages slide presentations, and Kontour lets you draw
graphical documents.
Before installing the latest KOffice, make sure you have an up-to-date version of KDE.
To install KOffice as a package, issue the following command:
# pkg_add -r koffice
If the package is not available, you can use the ports collection. For instance, to install KOffice for KDE3, do:
# cd /usr/ports/editors/koffice-kde3
# make install clean
15.3.2 AbiWord
AbiWord is a free word processing program similar in look and feel to Microsoft Word. It is suitable for typing
papers, letters, reports, memos, and so forth. It is very fast, contains many features, and is very user-friendly.
AbiWord can import or export many file formats, including some proprietary ones like Microsoft .doc.
AbiWord is available as a package. You can install it by:
# pkg_add -r AbiWord-gnome
If the package is not available, it can be compiled from the ports collection. The ports collection should be more up
to date. It can be done as follows:
# cd /usr/ports/editors/AbiWord
# make install clean
385
cd /usr/ports/graphics/gimp1
make install clean
cd /usr/ports/graphics/gimp-manual-pdf
make install clean
Note: The graphics (http://www.FreeBSD.org/ports/graphics.html) directory of the ports collection holds the
development version of The GIMP in graphics/gimp-devel. HTML and PostScript versions of The Gimp
Manual are in graphics/gimp-manual-html and graphics/gimp-manual-ps.
15.3.4 OpenOffice.org
OpenOffice.org includes all of the mandatory applications in a complete office productivity suite: a word processor,
a spreadsheet, a presentation manager, and a drawing program. Its user interface is very similar to other office suites,
and it can import and export in various popular file formats. It is available in a number of different languages
including interfaces, spell checkers, and dictionaries.
The word processor of OpenOffice.org uses a native XML file format for increased portability and flexibility. The
spreadsheet program features a macro language and it can be interfaced with external databases. OpenOffice.org is
already stable and runs natively on Windows, Solaris, Linux, FreeBSD, and Mac OS X. More information about
OpenOffice.org can be found on the OpenOffice web site (http://www.openoffice.org/). For FreeBSD specific
information, and to directly download packages use the FreeBSD OpenOffice Porting Team
(http://projects.imp.ch/openoffice/)s web site.
To install OpenOffice.org, do:
# pkg_add -r openoffice
Once the package is installed, you must run the setup program and choose a standard workstation
installation. Run this command as the user who will use OpenOffice.org:
% openoffice-setup
If the OpenOffice.org packages are not available, you still have the option to compile the port. However, you must
bear in mind that it requires a lot of disk space and a fairly long time to compile.
# cd /usr/ports/editors/openoffice
# make install clean
Once this is done, run the setup as the user who will use OpenOffice.org and choose a standard workstation
installation by:
% cd /usr/ports/editors/openoffice
% make install-user
If you want to use a localized version, here are the available ports:
386
Port
Arabic
editors/openoffice-ar
Danish
editors/openoffice-dk
Spanish
editors/openoffice-es
Greek
editors/openoffice-gr
Italian
editors/openoffice-it
Dutch
editors/openoffice-nl
Polish
editors/openoffice-pl
Swedish
editors/openoffice-se
Turkish
editors/openoffice-tr
French
french/openoffice
German
german/openoffice
Japanese
japanese/openoffice
Korean
korean/openoffice
Portuguese
portuguese/openoffice
Russian
russian/openoffice
Resources Needed
Major Dependencies
Acrobat Reader
light
light
gv
light
light
Xaw3d
Xpdf
light
light
FreeType
GQview
light
light
Gtk+ or GNOME
As usual, if the package is not available or you want the latest version, you can use the ports collection as well:
# cd /usr/ports/print/acroread5
# make install clean
387
may not all have been packaged for your version of FreeBSD. The ports collection will always contain the latest
versions.
15.4.2 gv
gv is a PostScript and PDF viewer. It is originally based on ghostview but it has a nicer look thanks to the Xaw3d
library. It is fast and its interface is clean. gv has many features like orientation, paper size, scale, or antialias. Almost
any operation can be done either from the keyboard or the mouse.
To install gv as a package, do:
# pkg_add -r gv
If you cannot get the package, you can use the ports collection:
# cd /usr/ports/print/gv
# make install clean
15.4.3 Xpdf
If you want a small FreeBSD PDF viewer, Xpdf is a light-weight and efficient viewer. It requires very few resources
and is very stable. It uses the standard X fonts and does not require Motif or any other X toolkit.
To install the Xpdf package, issue this command:
# pkg_add -r xpdf
If the package is not available or you prefer to use the ports collection, do:
# cd /usr/ports/graphics/xpdf
# make install clean
Once the installation is complete, you can launch Xpdf and use the right mouse button to activate the menu.
15.4.4 GQview
GQview is an image manager. You can view a file with a single click, launch an external editor, get thumbnail
previews, and much more. It also features a slideshow mode and some basic file operations. You can manage image
collections and easily find duplicates. GQview can do full screen viewing and supports internationalization.
If you want to install the GQview package, do:
# pkg_add -r gqview
If the package is not available or you prefer to use the ports collection, do:
# cd /usr/ports/graphics/gqview
388
15.5 Finance
If, for any reason, you would like to manage your personal finances on your FreeBSD Desktop, there are some
powerful and easy to use applications ready to be installed. Some of them are compatible with widespread file
formats like those of Quicken or Excel documents.
This section covers these applications:
Application Name
Resources Needed
Major Dependencies
GnuCash
light
heavy
GNOME
Gnumeric
light
heavy
GNOME
Abacus
light
light
Tcl/Tk
15.5.1 GnuCash
GnuCash is part of the GNOME effort to provide user-friendly yet powerful applications to end-users. With
GnuCash, you can keep track of your income and expenses, your bank accounts, or your stocks. It features an
intuitive interface while remaining very professional.
GnuCash provides a smart register, a hierarchical system of accounts, many keyboard accelerators and
auto-completion methods. It can split a single transaction into several more detailed pieces. GnuCash can import
and merge Quicken QIF files. It also handles most international date and currency formats.
To install GnuCash on your system, do:
# pkg_add -r gnucash
If the package is not available, you can use the ports collection:
# cd /usr/ports/finance/gnucash
# make install clean
15.5.2 Gnumeric
Gnumeric is a spreadsheet, part of the GNOME desktop environment. It features convenient automatic guessing
of user input according to the cell format and an autofill system for many sequences. It can import files in a number
of popular formats like those of Excel, Lotus 1-2-3, or Quattro Pro. Gnumeric supports graphs through the
math/guppi graphing program. It has a large number of built-in functions and allows all of the usual cell formats
such as number, currency, date, time, and much more.
To install Gnumeric as a package, type in:
# pkg_add -r gnumeric
If the package is not available, you can use the ports collection by doing:
389
15.5.3 Abacus
Abacus is a small and easy to use spreadsheet. It includes many built-in functions useful in several domains such as
statistics, finances, and mathematics. It can import and export the Excel file format. Abacus can produce PostScript
output.
To install Abacus from its package, do:
# pkg_add -r abacus
If the package is not available, you can use the ports collection by doing:
# cd /usr/ports/deskutils/abacus
# make install clean
15.6 Summary
While FreeBSD is popular among ISPs for its performance and stability, it is quite ready for day-to-day use as a
desktop. With several thousand applications available as packages (http://www.FreeBSD.org/where.html) or ports
(http://www.FreeBSD.org/ports/index.html), you can build a perfect desktop that suits all your needs.
Once you have achieved the installation of your desktop, you may want to go one step further with
misc/instant-workstation. This meta-port allows you to build a typical set of ports for a workstation. You
can customize it by editing /usr/ports/misc/instant-workstation/Makefile. Follow the syntax used for
the default set to add or remove ports, and build it with the usual procedure. Eventually, you will be able to create a
big package that corresponds to your very own desktop and install it to your other workstations!
Here is a quick review of all the desktop applications covered in this chapter:
Application Name
Package Name
Ports Name
Mozilla
mozilla
www/mozilla
Netscape
linux-netscape7
www/netscape7
Opera
linux-opera
www/linux-opera
KOffice
koffice-kde3
editors/koffice-kde3
AbiWord
AbiWord-gnome
editors/AbiWord
The GIMP
gimp
graphics/gimp1
OpenOffice.org
openoffice
editors/openoffice
Acrobat Reader
acroread5
print/acroread5
gv
gv
print/gv
Xpdf
xpdf
graphics/xpdf
GQview
gqview
graphics/gqview
GnuCash
gnucash
finance/gnucash
390
Package Name
Ports Name
Gnumeric
gnumeric
math/gnumeric
Abacus
abacus
deskutils/abacus
391
Chapter 16 Multimedia
Edited by Ross Lippert.
16.1 Synopsis
FreeBSD supports a wide variety of sound cards, allowing you to enjoy high fidelity output from your computer.
This includes the ability to record and playback audio in the MPEG Audio Layer 3 (MP3), WAV, and Ogg Vorbis
formats as well as many other formats. The FreeBSD Ports Collection also contains applications allowing you to edit
your recorded audio, add sound effects, and control attached MIDI devices.
With some willingness to experiment, FreeBSD can support playback of video files and DVDs. The number of
applications to encode, convert, and playback various video media is more limited than the number of sound
applications. For example as of this writing, there is no good re-encoding application in the FreeBSD Ports
Collection, which could be use to convert between formats, as there is with audio/sox. However, the software
landscape in this area is changing rapidly.
This chapter will describe the necessary steps to configure your sound card. The configuration and installation of
XFree86 (Chapter 5) has already taken care of the hardware issues for your video card, though there may be some
tweaks to apply for better playback.
After reading this chapter, you will know:
For the video sections, it is assumed that XFree86 4.X (x11/XFree86-4) has been installed. XFree86 3.X may
work, but it has not been tested with what is described in this chapter. If you find that something described here does
work with XFree86 3.X please let us know.
Warning: Trying to mount an audio CD or a video DVD with the mount(8) command will result in an error, at least,
and a kernel panic, at worst. These media have specialized encodings which differ from the usual ISO-filesystem.
392
Chapter 16 Multimedia
Yamaha OPL-SAx
OPTi931
ESS Solo-1/1E
NeoMagic 256AV/ZX
Creative ViBRA16
Gravis UltraSound
Aureal Vortex 1 or 2
To use your sound device, you will need to load the proper device driver. This may be accomplished in one of two
ways. The easiest way is to simply load a kernel module for your sound card with kldload(8). Alternatively, you may
statically compile in support for your sound card in your kernel. The sections below provide the information you
need to add support for your hardware in this manner. For more information about recompiling your kernel, please
see Chapter 9.
16.2.1.1 Creative, Advance, and ESS Sound Cards
If you have one of the above cards, you will need to add:
device pcm
to your kernel configuration file. If you have a PnP ISA card, you will also need to add:
device sbc
to your kernel configuration file. The settings shown above are the defaults. You may need to change the IRQ or the
other settings to match your card. See the sbc(4) manual page for more information.
393
Chapter 16 Multimedia
Note: The Sound Blaster Live is not supported under FreeBSD 4.0 without a patch, which this section will not
cover. It is recommended that you update to the latest -STABLE before trying to use this card.
to your kernel configuration file. If you have a non-PnP ISA card, you will need to add:
device pcm
device gus0 at isa? port 0x220 irq 5 drq 1 flags 0x13
to your kernel configuration file. You may need to change the IRQ or the other settings to match your card. See the
gusc(4) manual page for more information.
to your kernel configuration file. If you have a non-PnP ISA sound card that does not have a bridge driver, you will
need to add:
device pcm0 at isa? irq 10 drq 1 flags 0x0
to your kernel configuration file. You may need to change the IRQ or the other settings to match your card.
394
Chapter 16 Multimedia
The output from your system may look different. If no pcm devices show up, something went wrong earlier. If that
happens, go through your kernel configuration file again and make sure you chose the correct device. Common
problems are listed in Section 16.2.2.1.
Note: If you are running FreeBSD 5.0 or later, you can safely skip the rest of this section. These versions use
devfs(5) to automatically create devices nodes.
If the previous command returned pcm0, you will have to run the following as root:
# cd /dev
# sh MAKEDEV snd0
If the command returned pcm1, follow the same steps as shown above, replacing snd0 with snd1.
Note: The above commands will not create a /dev/snd device!
Device
Description
/dev/audio
/dev/dsp
/dev/dspW
/dev/midi
/dev/music
/dev/sequencer
Sequencer device
/dev/pss
/dev/mixer
If all goes well, you should now have a functioning sound card. If your CD-ROM or DVD-ROM drive is properly
coupled to your sound card, you can put a CD in the drive and play it with cdcontrol(1):
% cdcontrol -f /dev/acd0c play 1
Various applications, such as audio/workman offer a better interface. You may want to install an application such
as audio/mpg123 to listen to MP3 audio files.
16.2.2.1 Common Problems
Error
Solution
395
Chapter 16 Multimedia
Error
Solution
unsupported subdevice XX
bad irq XX
The IRQ is set incorrectly. Make sure that the set IRQ and
the sound IRQ are the same.
The above example allocates four virtual channels, which is a practical number for everyday use.
hw.snd.pcm0.vchans is the number of virtual channels pcm0 has, and is configurable once a device has been
attached. hw.snd.maxautovchans is the number of virtual channels a new audio device is given when it is
attached using kldload(8). Since the pcm module can be loaded independently of the hardware drivers,
hw.snd.maxautovchans can store how many virtual channels any devices which are attached later will be given.
If you are not using devfs(5), you will have to point your applications at /dev/dsp0.x, where x is 0 to 3 if
hw.snd.pcm.0.vchans is set to 4 as in the above example. On a system using devfs(5), the above will
automatically be allocated transparently to the user.
396
Chapter 16 Multimedia
XMMS can be installed from the multimedia/xmms port or package.
XMMS interface is intuitive, with a playlist, graphic equalizer, and more. Those familiar with Winamp will find
XMMS simple to use.
The audio/mpg123 port is an alternative, command-line MP3 player.
mpg123 can be run by specifying the sound device and the MP3 file on the command line, as shown below:
# mpg123 -a /dev/dsp1.0 Foobar-GreatestHits.mp3
cdda2wav will support ATAPI (IDE) CDROM drives. To rip from an IDE drive, specify the device name in place of
the SCSI unit numbers. For example, to rip track 7 from an IDE drive:
# cdda2wav -D /dev/acd0a -t 7
The -D 0,1,0 indicates the SCSI device 0,1,0, which corresponds to the output of cdrecord -scanbus.
To rip individual tracks, make use of the -t option as shown:
# cdda2wav -D 0,1,0 -t 7
This example rips track seven of the audio CDROM. To rip a range of tracks, for example, track one to seven, specify
a range:
# cdda2wav -D 0,1,0 -t 1+7
The utility dd(1) can also be used to extract audio tracks on ATAPI drives, read Section 12.5.5 for more information
on that possibility.
397
Chapter 16 Multimedia
128 kbits seems to be the standard MP3 bitrate in use. Many enjoy the higher quality 160, or 192. The higher the
bitrate, the more disk space the resulting MP3 will consume--but the quality will be higher. The -h option turns on
the higher quality but a little slower mode. The options beginning with --t indicate ID3 tags, which usually
contain song information, to be embedded within the MP3 file. Additional encoding options can be found by
consulting the lame man page.
Launch XMMS.
2.
3.
4.
5.
Press Configure.
6.
Enter (or choose browse) a directory to write the uncompressed files to.
7.
Load the MP3 file into XMMS as usual, with volume at 100% and EQ settings turned off.
8.
Press Play XMMS will appear as if it is playing the MP3, but no music will be heard. It is actually playing
the MP3 to a file.
9.
Be sure to set the default Output Plugin back to what it was before in order to listen to MP3s again.
XMMS writes a file in the WAV format, while mpg123 converts the MP3 into raw PCM audio data. Both of these
formats can be used with cdrecord to create audio CDs. You have to use raw PCM with burncd(8). If you use WAV
files, you will notice a small tick sound at the beginning of each track, this sound is the header of the WAV file. You
398
Chapter 16 Multimedia
can simply remove the header of a WAV file with the utility SoX (it can be installed from the audio/sox port or
package):
% sox -t wav -r 44100 -s -w -c 2 track.wav track.raw
On FreeBSD 5.X, which uses devfs(5) there is a slightly different set of recommended links:
# ln -sf /dev/acd0c /dev/dvd
# ln -sf /dev/acd0c /dev/rdvd
Additionally, DVD decryption, which requires invoking special DVD-ROM functions, requires write permission on
the DVD devices.
Some of the ports discussed rely on the following kernel options to build correctly. Before attempting to build, add
these options to the kernel configuration file, build a new kernel, and reboot:
option CPU_ENABLE_SSE
option USER_LDT
To enhance the shared memory X11 interface, it is recommended that the values of some sysctl(8) variables should
be increased:
kern.ipc.shmmax=67108864
kern.ipc.shmall=32768
399
Chapter 16 Multimedia
A list of common video interfaces:
1. X11: normal X11 output using shared memory.
2. XVideo: an extension to the X11 interface which supports video in any X11 drawable.
3. SDL: the Simple Directmedia Layer.
4. DGA: the Direct Graphics Access.
5. SVGAlib: low level console graphics layer.
16.4.1.1 XVideo
XFree86 4.X has an extension called XVideo (aka Xvideo, aka Xv, aka xv) which allows video to be directly
displayed in drawable objects through a special acceleration. This extension provides very good quality playback
even on low-end machines (for example my PIII 400 Mhz laptop). Unfortunately, the list of cards in which this
feature is supported out of the box is currently:
1. 3DFX Voodoo 3
2. Intel i810 and i815
3. some S3 chips (such as Savage/IX and Savage/MX)
If your card is not one of these, do not be disappointed yet. XFree86 4.X adds new xv capabilities with each release
1
. To check whether the extension is running, use xvinfo:
% xvinfo
value is 2110)
value is 0)
value is 128)
value is 128)
400
Chapter 16 Multimedia
client settable attribute
client gettable attribute (current value is 0)
maximum XvImage size: 1024 x 1024
Number of image formats: 7
id: 0x32595559 (YUY2)
guid: 59555932-0000-0010-8000-00aa00389b71
bits per pixel: 16
number of planes: 1
type: YUV (packed)
id: 0x32315659 (YV12)
guid: 59563132-0000-0010-8000-00aa00389b71
bits per pixel: 12
number of planes: 3
type: YUV (planar)
id: 0x30323449 (I420)
guid: 49343230-0000-0010-8000-00aa00389b71
bits per pixel: 12
number of planes: 3
type: YUV (planar)
id: 0x36315652 (RV16)
guid: 52563135-0000-0000-0000-000000000000
bits per pixel: 16
number of planes: 1
type: RGB (packed)
depth: 0
red, green, blue masks: 0x1f, 0x3e0, 0x7c00
id: 0x35315652 (RV15)
guid: 52563136-0000-0000-0000-000000000000
bits per pixel: 16
number of planes: 1
type: RGB (packed)
depth: 0
red, green, blue masks: 0x1f, 0x7e0, 0xf800
id: 0x31313259 (Y211)
guid: 59323131-0000-0010-8000-00aa00389b71
bits per pixel: 6
number of planes: 3
type: YUV (packed)
id: 0x0
guid: 00000000-0000-0000-0000-000000000000
bits per pixel: 0
number of planes: 0
type: RGB (packed)
depth: 1
red, green, blue masks: 0x0, 0x0, 0x0
Also note that the formats listed (YUV2, YUV12, etc) are not present with every implementation of XVideo and
their absence may hinder some players.
If the result looks like:
X-Video Extension version 2.2
screen #0
no adaptors present
401
Chapter 16 Multimedia
Then XVideo is probably not supported for your card.
If XVideo is not supported for your card, this only means that it will be more difficult for your display to meet the
computational demands of rendering video. Depending on your video card and processor, though, you might still be
able to have a satisfying experience. You should probably read about ways of improving performance in the
advanced reading Section 16.4.3.
402
Chapter 16 Multimedia
By Linux-isms, I mean that there are some issues resulting from the way some standard libraries are implemented
in the Linux distributions, or some features of the Linux kernel which have been assumed by the authors of the
applications, because that is where the authors are primarily developing. These issues may not be noticed and worked
around by the port maintainers which can lead to some problems like these:
1. The use of /proc/cpuinfo to detect processor characteristics.
2. A misuse of threads which causes a program to hang upon completion instead of truly terminating.
3. Software not yet in the FreeBSD Ports Collection which is commonly used in conjunction with the application.
So far, these application developers have been cooperative with port maintainers to minimize the work-arounds
needed for port-ing.
16.4.2.1 MPlayer
MPlayer is a recently developed and rapidly developing video player. The goals of the MPlayer team are speed and
flexibility on Linux and other Unices. The project was started when the team founder got fed up with bad playback
performance on then available players. Some would say that interface has been sacrificed for streamlined design, but
once you get used to the command line options and the key-stroke controls, it works very well.
16.4.2.1.1 Building MPlayer
MPlayer resides in multimedia/mplayer. MPlayer performs a variety of hardware checks during the build
process, resulting in a binary which will not be portable from one system to another. Therefore, it is important to
build it from ports and not to use a binary package. Additionally, a number of options can be specified in the make
which echo at the start of the build.
# cd /usr/ports/multimedia/mplayer
# make
If you have x11-toolkits/gtk12 installed, then you might as well enable the GUI. Otherwise, it is not worth the
effort. If you intend to play (possibly CSS encoded) DVDs with MPlayer you must enable the DVD support option
here 2. Some reasonable options are:
# make WITH_DVD=yes WITH_SVGALIB=yes
As of this writing, the MPlayer port will build its HTML documentation and one executable, mplayer. It can also
be made to build an encoder, mencoder, which is a tool for re-encoding video. A modification to the Makefile can
enable it. It may be enabled by default in subsequent versions of the port.
The HTML documentation to MPlayer is very informative. If the reader finds the information on video hardware and
interfaces in the chapter lacking, the MPlayer documentation is a very thorough alternative. You should definitely
take the time to read the documentation of MPlayer, if you are looking for information about video support in Unix.
403
Chapter 16 Multimedia
16.4.2.1.2 Using MPlayer
Any user of MPlayer must set up a .mplayer subdirectory directory of her home directory. To create this necessary
subdirectory, you can do the following:
% cd /usr/ports/multimedia/mplayer
% make install-user
The command options for mplayer are listed in the manual page. For even more detail there is HTML
documentation. In this section, we will give some of the common use cases.
To play from file, such as testfile.avi through one of the various video interfaces set the -vo:
% mplayer -vo xv testfile.avi
% mplayer -vo sdl testfile.avi
% mplayer -vo x11 testfile.avi
# mplayer -vo dga testfile.avi
# mplayer -vo sdl:dga testfile.avi
It is worth trying all of these options, as their relative performance depends on many factors and will vary
significantly with hardware.
To play from a DVD, replace the testfile.avi with -dvd <N> DEVICE where <N> is the title number to play
and DEVICE is the device node for the DVD-ROM. For example, to play title 3 from /dev/dvd:
# mplayer -vo dga -dvd 2 /dev/dvd
To stop, pause, advance and so on, consult the keybindings, which are output by running mplayer -h or read the
manual page.
Additional important options for playback are: -fs -zoom which engages the fullscreen mode and -framedrop
which helps performance.
In order for the mplayer command line to not become too large, the user can create a file .mplayer/config and set
default options there:
vo=xv
fs=yes
zoom=yes
Finally, mplayer can be used to rip a DVD title into a .vob file. To dump out title 2 from a DVD:
# mplayer -dumpstream -dumpfile out.vob -dvd 2 /dev/dvd
The output file, out.vob, will be MPEG and can be manipulated by the other packages described in this section.
16.4.2.1.3 mencoder
If you opt to install mencoder when you build, be forewarned that it is still quite experimental.
404
Chapter 16 Multimedia
To use mencoder it is a good idea to familiarize yourself with the options from the HTML documentation. There is a
manual page, but it is not very useful without the HTML. There are innumerable ways to improve quality, lower
bitrate, and change formats, and some of these tricks may make the difference between good or bad performance.
Here are a couple of examples to get you going. First a simple copy:
% mencoder input.avi -oac copy -ovc copy -o output.avi
It is easy to find examples where the output is unplayable even by mplayer. Thus, if you just want to rip to a file,
stick to the -dumpfile in mplayer.
To convert input.avi to the MPEG4 codec with MPEG3 audio encoding (audio/lame is required):
% mencoder input.avi -oac mp3lame -lameopts br=192 \
are likely to be dissatisfied with your results the first time around, it is recommended you dump the title to a file and
work on the file.
The menus can then be used to open a file, or it can be started to play a file immediately without the GUI with the
command:
% xine -g -p mymovie.avi
405
Chapter 16 Multimedia
Like MPlayer, transcode is very experimental software which must be build from the port graphics/transcode.
Using a great many options to the make command. I recommend:
# make WITH_LIBMPEG2=yes
If you plan to install multimedia/avifile, then add the WITH_AVIFILE option to your make command line, as
shown here:
# make WITH_AVIFILE=yes WITH_LIBMPEG2=yes
Here are two examples of using transcode for video conversion which produce rescaled output. The first encodes
the output to an openDIVX AVI file, while the second encodes to the much more portable MPEG format.
% transcode -i input.vob -x vob -V -Z 320x240 \
There is a manual page for transcode, but for the various tc* utilities (such as tcmplex) which are also installed,
there is only a curt -h output.
In comparison, transcode runs significantly slower than mencoder, but it has a better chance of producing a more
widely playable file. I can play transcode MPEGs on older copies of Windows Media Player and Apples
Quicktime, for example.
Xtheater (http://xtheater.sourceforge.net/)
406
Chapter 16 Multimedia
Notes
1. A popular familiar graphics card with generally very good XFree86 performance, nVidia, has yet to release the
specifications on their XVideo support to the XFree86 team. It may be some time before XFree86 fully support
XVideo for these cards.
2. Unauthorized DVD playback is a serious criminal act in some countries. Check local laws before enabling this
option.
407
Have access to the technical manual for the serial hardware (modem or multi-port card) that you would like to use
with FreeBSD.
17.2 Introduction
17.2.1 Terminology
bps
Bits per Second the rate at which data is transmitted
DTE
Data Terminal Equipment for example, your computer
DCE
Data Communications Equipment your modem
RS-232
EIA standard for hardware serial communications
When talking about communications data rates, this section does not use the term baud. Baud refers to the number
of electrical state transitions that may be made in a period of time, while bps (bits per second) is the correct term to
use (at least it does not seem to bother the curmudgeons quite as much).
408
Pin #
Pin #
Signal
SG
TxD
7
2
connects to
connects to
7
3
SG
RxD
RxD
RTS
3
4
connects to
connects to
2
5
TxD
CTS
CTS
DTR
5
20
connects to
connects to
4
6
RTS
DSR
DCD
DSR
8
6
connects to
6
20
DSR
DTR
Note: Connect Data Set Ready (DSR) and Data Carrier Detect (DCD) internally in the connector hood, and
then to Data Terminal Ready (DTR) in the remote hood.
17.2.2.2 Ports
Serial ports are the devices through which data is transferred between the FreeBSD host computer and the terminal.
This section describes the kinds of ports that exist and how they are addressed in FreeBSD.
409
Call-in ports are named /dev/ttydN where N is the port number, starting from zero. Generally, you use the
call-in port for terminals. Call-in ports require that the serial line assert the data carrier detect (DCD) signal to
work correctly.
Call-out ports are named /dev/cuaaN . You usually do not use the call-out port for terminals, just for modems.
You may use the call-out port if the serial cable or the terminal does not support the carrier detect signal.
If you have connected a terminal to the first serial port (COM1 in MS-DOS), then you will use /dev/ttyd0 to refer
to the terminal. If the terminal is on the second serial port (also known as COM2), use /dev/ttyd1, and so forth.
For example, on a system with four serial ports, these are the serial-port specific kernel boot messages:
sio0 at 0x3f8-0x3ff irq 4 on isa
sio0: type 16550A
sio1 at 0x2f8-0x2ff irq 3 on isa
sio1: type 16550A
sio2 at 0x3e8-0x3ef irq 5 on isa
410
If your kernel does not recognize all of your serial ports, you will probably need to configure a custom FreeBSD
kernel for your system. For detailed information on configuring your kernel, please see Chapter 9.
The relevant device lines for your kernel configuration file would look like this, for FreeBSD 4.X:
device
device
device
device
sio0
sio1
sio2
sio3
at
at
at
at
isa?
isa?
isa?
isa?
port
port
port
port
IO_COM1
IO_COM2
IO_COM3
IO_COM4
irq
irq
irq
irq
4
3
5
9
You can comment-out or completely remove lines for devices you do not have in the case of FreeBSD 4.X; for
FreeBSD 5.X you have to edit your /boot/device.hints file to configure your serial ports. Please refer to the
sio(4) manual page for more information on serial ports and multiport boards configuration. Be careful if you are
using a configuration file that was previously used for a different version of FreeBSD because the device flags and
the syntax have changed between versions.
Note: port IO_COM1 is a substitution for port 0x3f8, IO_COM2 is 0x2f8, IO_COM3 is 0x3e8, and IO_COM4 is
0x2e8, which are fairly common port addresses for their respective serial ports; interrupts 4, 3, 5, and 9 are fairly
common interrupt request lines. Also note that regular serial ports cannot share interrupts on ISA-bus PCs
(multiport boards have on-board electronics that allow all the 16550As on the board to share one or two interrupt
request lines).
411
After making new device special files, be sure to check the permissions on the files (especially the /dev/cua* files)
to make sure that only users who should have access to those device special files can read and write on them you
probably do not want to allow your average user to use your modems to dial-out. The default permissions on the
/dev/cua* files should be sufficient:
crw-rw---crw-rw---crw-rw----
1 uucp
1 uucp
1 uucp
dialer
dialer
dialer
These permissions allow the user uucp and users in the group dialer to use the call-out devices.
When you change the settings to this device, the settings are in effect until the device is closed. When it is reopened,
it goes back to the default set. To make changes to the default set, you can open and adjust the settings of the initial
state device. For example, to turn on CLOCAL mode, 8 bit communication, and XON/XOFF flow control by default
for ttyd5, type:
# stty -f /dev/ttyid5 clocal cs8 ixon ixoff
System-wide initialization of the serial devices is controlled in /etc/rc.serial. This file affects the default
settings of serial devices.
To prevent certain settings from being changed by an application, make adjustments to the lock state device. For
example, to lock the speed of ttyd5 to 57600 bps, type:
# stty -f /dev/ttyld5 57600
Now, an application that opens ttyd5 and tries to change the speed of the port will be stuck with 57600 bps.
Naturally, you should make the initial state and lock state devices writable only by the root account.
17.3 Terminals
Contributed by Sean Kelly.
Terminals provide a convenient and low-cost way to access your FreeBSD system when you are not at the
computers console or on a connected network. This section describes how to use terminals with FreeBSD.
412
Dumb terminals
X terminals
413
17.3.2 Configuration
This section describes what you need to configure on your FreeBSD system to enable a login session on a terminal. It
assumes you have already configured your kernel to support the serial port to which the terminal is connectedand
that you have connected it.
Recall from Chapter 7 that the init process is responsible for all process control and initialization at system startup.
One of the tasks performed by init is to read the /etc/ttys file and start a getty process on the available
terminals. The getty process is responsible for reading a login name and starting the login program.
Thus, to configure terminals for your FreeBSD system the following steps should be taken as root:
1.
Add a line to /etc/ttys for the entry in the /dev directory for the serial port if it is not already there.
2.
Specify that /usr/libexec/getty be run on the port, and specify the appropriate getty type from the
/etc/gettytab file.
3.
4.
5.
6.
As an optional step, you may wish to create a custom getty type for use in step 2 by making an entry in
/etc/gettytab. This chapter does not explain how to do so; you are encouraged to see the gettytab(5) and the
getty(8) manual pages for more information.
17.3.2.1 Adding an Entry to /etc/ttys
The /etc/ttys file lists all of the ports on your FreeBSD system where you want to allow logins. For example, the
first virtual console ttyv0 has an entry in this file. You can log in on the console using this entry. This file also
contains entries for the other virtual consoles, serial ports, and pseudo-ttys. For a hardwired terminal, just list the
serial ports /dev entry without the /dev part (for example, /dev/ttyv0 would be listed as ttyv0).
A default FreeBSD install includes an /etc/ttys file with support for the first four serial ports: ttyd0 through
ttyd3. If you are attaching a terminal to one of those ports, you do not need to add another entry.
Example 17-1. Adding Terminal Entries to /etc/ttys
Suppose we would like to connect two terminals to the system: a Wyse-50 and an old 286 IBM PC running
Procomm terminal software emulating a VT-100 terminal. We connect the Wyse to the second serial port and the
414
The first field normally specifies the name of the terminal special file as it is found in /dev.
The second field is the command to execute for this line, which is usually getty(8). getty initializes and opens
the line, sets the speed, prompts for a user name and then executes the login(1) program.
The getty program accepts one (optional) parameter on its command line, the getty type. A getty type
configures characteristics on the terminal line, like bps rate and parity. The getty program reads these
characteristics from the file /etc/gettytab.
The file /etc/gettytab contains lots of entries for terminal lines both old and new. In almost all cases, the
entries that start with the text std will work for hardwired terminals. These entries ignore parity. There is a std
entry for each bps rate from 110 to 115200. Of course, you can add your own entries to this file. The gettytab(5)
manual page provides more information.
When setting the getty type in the /etc/ttys file, make sure that the communications settings on the
terminal match.
For our example, the Wyse-50 uses no parity and connects at 38400 bps. The 286 PC uses no parity and
connects at 19200 bps.
The third field is the type of terminal usually connected to that tty line. For dial-up ports, unknown or dialup is
typically used in this field since users may dial up with practically any type of terminal or software. For
hardwired terminals, the terminal type does not change, so you can put a real terminal type from the termcap(5)
database file in this field.
For our example, the Wyse-50 uses the real terminal type while the 286 PC running Procomm will be set to
emulate at VT-100.
The fourth field specifies if the port should be enabled. Putting on here will have the init process start the
program in the second field, getty. If you put off in this field, there will be no getty, and hence no logins on
the port.
The final field is used to specify whether the port is secure. Marking a port as secure means that you trust it
enough to allow the root account (or any account with a user ID of 0) to login from that port. Insecure ports do
not allow root logins. On an insecure port, users must login from unprivileged accounts and then use su(1) or a
similar mechanism to gain superuser privileges.
It is highly recommended that you use insecure even for terminals that are behind locked doors. It is quite easy
to login and use su if you need superuser privileges.
415
If everything is set up correctly, all cables are in place, and the terminals are powered up, then a getty process
should be running on each terminal and you should see login prompts on your terminals at this point.
You should see an entry for the terminal. For example, the following display shows that a getty is running on the
second serial port ttyd1 and is using the std.38400 entry in /etc/gettytab:
22189
d1
Is+
If no getty process is running, make sure you have enabled the port in /etc/ttys. Also remember to run kill
-HUP 1 after modifying the ttys file.
If the getty process is running but the terminal still does not display a login prompt, or if it displays a prompt but
will not allow you to type, your terminal or cable may not support hardware handshaking. Try changing the entry in
/etc/ttys from std.38400 to 3wire.38400 remember to run kill -HUP 1 after modifying /etc/ttys). The
3wire entry is similar to std, but ignores hardware handshaking. You may need to reduce the baud rate or enable
software flow control when using 3wire to prevent buffer overflows.
416
FreeBSD needs the RTS and CTS signals for flow-control at speeds above 2400 bps, the CD signal to detect when a
call has been answered or the line has been hung up, and the DTR signal to reset the modem after a session is
complete. Some cables are wired without all of the needed signals, so if you have problems, such as a login session
not going away when the line hangs up, you may have a problem with your cable.
Like other Unix-like operating systems, FreeBSD uses the hardware signals to find out when a call has been
answered or a line has been hung up and to hangup and reset the modem after a call. FreeBSD avoids sending
commands to the modem or watching for status reports from the modem. If you are familiar with connecting
modems to PC-based bulletin board systems, this may seem awkward.
417
When a user dials the modems line and the modems connect, the CD (Carrier Detect) line is reported by the modem.
The kernel notices that carrier has been detected and completes gettys open of the port. getty sends a login:
prompt at the specified initial line speed. getty watches to see if legitimate characters are received, and, in a typical
configuration, if it finds junk (probably due to the modems connection speed being different than gettys speed),
getty tries adjusting the line speeds until it receives reasonable characters.
After the user enters his/her login name, getty executes /usr/bin/login, which completes the login by asking
for the users password and then starting the users shell.
418
If you have a higher speed modem, you will probably need to add an entry in /etc/gettytab; here is an entry you
could use for a 14.4 Kbps modem with a top interface speed of 19.2 Kbps:
#
# Additions for a V.32bis Modem
#
um|V300|High Speed Modem at 300,8-bit:\
:nx=V19200:tc=std.300:
un|V1200|High Speed Modem at 1200,8-bit:\
:nx=V300:tc=std.1200:
uo|V2400|High Speed Modem at 2400,8-bit:\
:nx=V1200:tc=std.2400:
up|V9600|High Speed Modem at 9600,8-bit:\
:nx=V2400:tc=std.9600:
uq|V19200|High Speed Modem at 19200,8-bit:\
:nx=V9600:tc=std.19200:
419
If you have a slow CPU or a heavily loaded system and do not have 16550A-based serial ports, you may receive sio
silo errors at 57.6 Kbps.
17.4.4.2 /etc/ttys
Configuration of the /etc/ttys file was covered in Example 17-1. Configuration for modems is similar but we
must pass a different argument to getty and specify a different terminal type. The general format for both
locked-speed and matching-speed configurations is:
ttyd0
"/usr/libexec/getty xxx"
dialup on
The first item in the above line is the device special file for this entry ttyd0 means /dev/ttyd0 is the file that
this getty will be watching. The second item, "/usr/libexec/getty xxx" (xxx will be replaced by the initial
gettytab capability) is the process init will run on the device. The third item, dialup, is the default terminal
type. The fourth parameter, on, indicates to init that the line is operational. There can be a fifth parameter, secure,
but it should only be used for terminals which are physically secure (such as the system console).
The default terminal type (dialup in the example above) may depend on local preferences. dialup is the traditional
default terminal type on dial-up lines so that users may customize their login scripts to notice when the terminal is
dialup and automatically adjust their terminal type. However, the author finds it easier at his site to specify vt102
as the default terminal type, since the users just use VT102 emulation on their remote systems.
After you have made changes to /etc/ttys, you may send the init process a HUP signal to re-read the file. You
can use the command
# kill -HUP 1
to send the signal. If this is your first time setting up the system, you may want to wait until your modem(s) are
properly configured and connected before signaling init.
420
"/usr/libexec/getty std.19200"
dialup on
If your modem is locked at a different data rate, substitute the appropriate value for std.speed instead of
std.19200. Make sure that you use a valid type listed in /etc/gettytab.
"/usr/libexec/getty V19200"
dialup on
17.4.4.3 /etc/rc.serial
High-speed modems, like V.32, V.32bis, and V.34 modems, need to use hardware ( RTS/CTS) flow control. You can
add stty commands to /etc/rc.serial to set the hardware flow control flag in the FreeBSD kernel for the
modem ports.
For example to set the termios flag crtscts on serial port #1s (COM2) dial-in and dial-out initialization devices,
the following lines could be added to /etc/rc.serial:
# Serial port initial configuration
stty -f /dev/ttyid1 crtscts
stty -f /dev/cuai01 crtscts
DTR asserted for operation; dropping DTR hangs up line and resets modem
421
No command echo
Please read the documentation for your modem to find out what commands and/or DIP switch settings you need to
give it.
For example, to set the above parameters on a USRobotics Sportster 14,400 external modem, one could give these
commands to the modem:
ATZ
AT&C1&D2&H1&I0&R2&W
You might also want to take this opportunity to adjust other settings in the modem, such as whether it will use
V.42bis and/or MNP5 compression.
The USR Sportster 14,400 external modem also has some DIP switches that need to be set; for other modems,
perhaps you can use these settings as an example:
Result codes should be disabled/suppressed for dial-up modems to avoid problems that can occur if getty
mistakenly gives a login: prompt to a modem that is in command mode and the modem echoes the command or
returns a result code. This sequence can result in a extended, silly conversation between getty and the modem.
17.4.5.1 Locked-speed Config
For a locked-speed configuration, you will need to configure the modem to maintain a constant modem-to-computer
data rate independent of the communications rate. On a USR Sportster 14,400 external modem, these commands will
lock the modem-to-computer data rate at the speed used to issue the commands:
ATZ
AT&B1&W
422
17.4.6 Troubleshooting
Here are a few steps you can follow to check out the dial-up modem on your system.
17.4.6.1 Checking Out the FreeBSD System
Hook up your modem to your FreeBSD system, boot the system, and, if your modem has status indication lights,
watch to see whether the modems DTR indicator lights when the login: prompt appears on the systems console
if it lights up, that should mean that FreeBSD has started a getty process on the appropriate communications
port and is waiting for the modem to accept a call.
If the DTR indicator does not light, login to the FreeBSD system through the console and issue a ps ax to see if
FreeBSD is trying to run a getty process on the correct port. You should see lines like these among the processes
displayed:
114 ??
115 ??
I
I
and the modem has not accepted a call yet, this means that getty has completed its open on the communications
port. This could indicate a problem with the cabling or a mis-configured modem, because getty should not be able
to open the communications port until CD (carrier detect) has been asserted by the modem.
If you do not see any getty processes waiting to open the desired ttydN port, double-check your entries in
/etc/ttys to see if there are any mistakes there. Also, check the log file /var/log/messages to see if there are
any log messages from init or getty regarding any problems. If there are any messages, triple-check the
configuration files /etc/ttys and /etc/gettytab, as well as the appropriate device special files /dev/ttydN,
for any mistakes, missing entries, or missing device special files.
423
The initial capability name specified in /etc/ttys for the line matches a name of a capability in
/etc/gettytab
If you dial but the modem on the FreeBSD system will not answer, make sure that the modem is configured to
answer the phone when DTR is asserted. If the modem seems to be configured correctly, verify that the DTR line is
asserted by checking the modems indicator lights (if it has any).
If you have gone over everything several times and it still does not work, take a break and come back to it later. If it
still does not work, perhaps you can send an electronic mail message to the FreeBSD general questions mailing list
(http://lists.FreeBSD.org/mailman/listinfo/freebsd-questions) describing your modem and your problem, and the
good folks on the list will try to help.
424
Use the highest bps rate your modem supports in the br capability. Then, type tip cuaa0 and you will be connected
to your modem.
If there is no /dev/cuaa0 on your system, do this:
# cd /dev
# sh MAKEDEV cuaa0
line is the serial port (e.g./dev/cuaa0) and speed is the speed (e.g.57600). When you are done entering the AT
commands hit ~. to exit.
and type:
# cu 5551234 -s 115200
425
will let you type tip pain or tip muffin to connect to the hosts pain or muffin, and tip deep13 to get to the
terminal server.
17.5.7 Can Tip Try More Than One Line for Each Site?
This is often a problem where a university has several modem lines and several thousand students trying to use them.
Make an entry for your university in /etc/remote and use @ for the pn capability:
big-university:\
:pn=\@:tc=dialout
dialout:\
:dv=/dev/cuaa3:br#9600:at=courier:du:pa=none:
5551111
5551112
5551113
5551114
tip will try each one in the listed order, then give up. If you want to keep retrying, run tip in a while loop.
426
The ^^ is Shift+Ctrl+6.
~t remote-file [local-file]
There is no error checking, so you probably should use another protocol, like zmodem.
17.6.1 Introduction
FreeBSD has the ability to boot on a system with only a dumb terminal on a serial port as a console. Such a
configuration should be useful for two classes of people: system administrators who wish to install FreeBSD on
machines that have no keyboard or monitor attached, and developers who want to debug the kernel or device drivers.
As described in Chapter 7, FreeBSD employs a three stage bootstrap. The first two stages are in the boot block code
which is stored at the beginning of the FreeBSD slice on the boot disk. The boot block will then load and run the
boot loader (/boot/loader) as the third stage code.
427
2.
Note: If your system has a PS/2 mouse, chances are very good that you may have to unplug your mouse as
well as your keyboard. This is because PS/2 mice share some hardware with the keyboard and leaving the
mouse plugged in can fool the keyboard probe into thinking the keyboard is still there. It is said that a
Gateway 2000 Pentium 90 MHz system with an AMI BIOS that behaves this way. In general, this is not a
problem since the mouse is not much good without the keyboard anyway.
3.
4.
Make sure the configuration file of your kernel has appropriate flags set for COM1 (sio0).
Relevant flags are:
0x10
Enables console support for this unit. The other console flags are ignored unless this is set. Currently, at
most one unit can have console support; the first one (in config file order) with this flag set is preferred.
428
Forces this unit to be the console (unless there is another higher priority console), regardless of the -h
option discussed below. This flag replaces the COMCONSOLE option in FreeBSD versions 2.X. The flag
0x20 must be used together with the 0x10 flag.
0x40
Reserves this unit (in conjunction with 0x10) and makes the unit unavailable for normal access. You should
not set this flag to the serial port unit which you want to use as the serial console. The only use of this flag
is to designate the unit for kernel remote debugging. See The Developers Handbook
(../developers-handbook/index.html) for more information on remote debugging.
Note: In FreeBSD 4.0 or later the semantics of the flag 0x40 are slightly different and there is another
flag to specify a serial port for remote debugging.
Example:
device sio0 at isa? port IO_COM1 flags 0x10 irq 4
Create boot.config in the root directory of the a partition on the boot drive.
This file will instruct the boot block code how you would like to boot the system. In order to activate the serial
console, you need one or more of the following optionsif you want multiple options, include them all on the
same line:
-h
Toggles internal and serial consoles. You can use this to switch console devices. For instance, if you boot
from the internal (video) console, you can use -h to direct the boot loader and the kernel to use the serial
port as its console device. Alternatively, if you boot from the serial port, you can use the -h to tell the boot
loader and the kernel to use the video display as the console instead.
-D
Toggles single and dual console configurations. In the single configuration the console will be either the
internal console (video display) or the serial port, depending on the state of the -h option above. In the dual
console configuration, both the video display and the serial port will become the console at the same time,
regardless of the state of the -h option. However, note that the dual console configuration takes effect only
during the boot block is running. Once the boot loader gets control, the console specified by the -h option
becomes the only console.
429
Makes the boot block probe the keyboard. If no keyboard is found, the -D and -h options are automatically
set.
Note: Due to space constraints in the current version of the boot blocks, the -P option is capable of
detecting extended keyboards only. Keyboards with less than 101 keys (and without F11 and F12 keys)
may not be detected. Keyboards on some laptop computers may not be properly found because of this
limitation. If this is the case with your system, you have to abandon using the -P option. Unfortunately
there is no workaround for this problem.
Use either the -P option to select the console automatically, or the -h option to activate the serial console.
You may include other options described in boot(8) as well.
The options, except for -P, will be passed to the boot loader (/boot/loader). The boot loader will determine
which of the internal video or the serial port should become the console by examining the state of the -h option
alone. This means that if you specify the -D option but not the -h option in /boot.config, you can use the
serial port as the console only during the boot block; the boot loader will use the internal video display as the
console.
6.
The second line appears only if you put -P in /boot.config and indicates presence/absence of the keyboard.
These messages go to either serial or internal console, or both, depending on the option in /boot.config.
Options
Message goes to
none
internal console
-h
-D
serial console
serial and internal consoles
-Dh
internal console
serial console
After the above messages, there will be a small pause before the boot blocks continue loading the boot loader
and before any further messages printed to the console. Under normal circumstances, you do not need to
interrupt the boot blocks, but you may want to do so in order to make sure things are set up correctly.
Hit any key, other than Enter, at the console to interrupt the boot process. The boot blocks will then prompt you
for further action. You should now see something like:
>> FreeBSD/i386 BOOT
Default: 0:wd(0,a)/boot/loader
boot:
430
17.6.3 Summary
Here is the summary of various settings discussed in this section and the console eventually selected.
17.6.3.1 Case 1: You Set the Flags to 0x10 for sio0
device sio0 at isa? port IO_COM1 flags 0x10 irq 4
Console in kernel
nothing
internal
internal
internal
-h
serial
serial and internal
serial
internal
serial
internal
serial
internal
serial
internal
serial
serial
-D
-Dh
Console in kernel
nothing
internal
serial
internal
serial
serial
serial
-Dh
internal
serial
serial
serial
internal
internal
serial
serial
serial
-h
-D
431
If the serial console is configured in some other way than by booting with -h, or if the serial console used by the
kernel is different from the one used by the boot blocks, then you must also add the following option to the kernel
configuration file and compile a new kernel:
options CONSPEED=19200
17.6.4.2 Using Serial Port Other Than sio0 for the Console
Using a port other than sio0 as the console requires some recompiling. If you want to use another serial port for
whatever reasons, recompile the boot blocks, the boot loader and the kernel as follows.
1.
2.
Edit /etc/make.conf and set BOOT_COMCONSOLE_PORT to the address of the port you want to use (0x3F8,
0x2F8, 0x3E8 or 0x2E8). Only sio0 through sio3 (COM1 through COM4) can be used; multiport serial cards
will not work. No interrupt setting is needed.
3.
Create a custom kernel configuration file and add appropriate flags for the serial port you want to use. For
example, if you want to make sio1 (COM2) the console:
device sio1 at isa? port IO_COM2 flags 0x10 irq 3
or
device sio1 at isa? port IO_COM2 flags 0x30 irq 3
The console flags for the other serial ports should not be set.
4.
Recompile and install the boot blocks and the boot loader:
# cd /sys/boot
# make
# make install
5.
6.
Write the boot blocks to the boot disk with disklabel(8) and boot from the new kernel.
432
"/usr/libexec/getty
"/usr/libexec/getty
"/usr/libexec/getty
"/usr/libexec/getty
std.9600"
std.9600"
std.9600"
std.9600"
unknown
unknown
unknown
unknown
off
off
off
off
secure
secure
secure
secure
ttyd0 through ttyd3 corresponds to COM1 through COM4. Change off to on for the desired port. If you have
changed the speed of the serial port, you need to change std.9600 to match the current setting, e.g. std.19200.
You may also want to change the terminal type from unknown to the actual type of your serial terminal.
After editing the file, you must kill -HUP 1 to make this change take effect.
This will take effect regardless of the settings in the boot block discussed in the previous section.
You had better put the above line as the first line of /boot/loader.rc so as to see boot messages on the serial
console as early as possible.
Likewise, you can specify the internal console as:
set console=vidconsole
If you do not set the boot loader environment variable console, the boot loader, and subsequently the kernel, will
use whichever console indicated by the -h option in the boot block.
In versions 3.2 or later, you may specify the console in /boot/loader.conf.local or /boot/loader.conf,
rather than in /boot/loader.rc. In this method your /boot/loader.rc should look like:
include /boot/loader.4th
433
or
console=vidconsole
17.6.5.2 Using a Serial Port Other Than sio0 for the Console
You need to recompile the boot loader to use a serial port other than sio0 for the serial console. Follow the
procedure described in Section 17.6.4.2.
17.6.6 Caveats
The idea here is to allow people to set up dedicated servers that require no graphics hardware or attached keyboards.
Unfortunately, while most systems will let you boot without a keyboard, there are quite a few that will not let you
boot without a graphics adapter. Machines with AMI BIOSes can be configured to boot with no graphics adapter
installed simply by changing the graphics adapter setting in the CMOS configuration to Not installed.
However, many machines do not support this option and will refuse to boot if you have no display hardware in the
system. With these machines, you will have to leave some kind of graphics card plugged in, (even if it is just a junky
mono board) although you will not have to attach a monitor. You might also try installing an AMI BIOS.
434
18.1 Synopsis
FreeBSD has a number of ways to link one computer to another. To establish a network or Internet connection
through a dial-up modem, or to allow others to do so through you, requires the use of PPP or SLIP. This chapter
describes setting up these modem-based communication services in detail.
After reading this chapter, you will know:
Understand the basics and purpose of a dialup connection and PPP and/or SLIP.
You may be wondering what the main difference is between User PPP and kernel PPP. The answer is simple; user
PPP processes the inbound and outbound data in userland rather than in the kernel. This is expensive in terms of
copying the data between the kernel and userland, but allows a far more feature-rich ppp implementation. User PPP
uses the tun device to communicate with the outside world whereas kernel-ppp uses the ppp device.
Note: Throughout in this chapter, user ppp will simply be referred to as ppp unless a distinction needs to be
made between it and any other PPP software such as pppd. Unless otherwise stated, all of the commands
explained in this section should be executed as root.
435
An account with an Internet Service Provider (ISP) which you connect to using PPP.
You have a modem or other device connected to your system and configured correctly which allows you to
connect to your ISP.
Your login name and password. (Either a regular Unix-style login and password pair, or a PAP or CHAP login and
password pair.)
The IP address of one or more name servers. Normally, you will be given two IP addresses by your ISP to use for
this. If they have not given you at least one, then you can use the enable dns command in ppp.conf and ppp
will set the name servers for you. This feature depends on your ISPs PPP implementation supporting DNS
negotiation.
The following information may be supplied by your ISP, but is not completely necessary:
The IP address of your ISPs gateway. The gateway is the machine to which you will connect and will be set up as
your default route. If you do not have this information, we can make one up and your ISPs PPP server will tell us
the correct value when we connect.
This IP number is referred to as HISADDR by ppp.
The netmask you should use. If your ISP has not provided you with one, you can safely use 255.255.255.255.
If your ISP provides you with a static IP address and hostname, you can enter it. Otherwise, we simply let the peer
assign whatever IP address it sees fit.
If you do not have any of the required information, contact your ISP.
Note: Throughout this section, many of the examples showing the contents of configuration files are numbered
by line. These numbers serve to aid in the presentation and discussion only and are not meant to be placed in
the actual file. Proper indentation with tab and space characters is also important.
If you need 16 tunnel devices in your kernel, you will need to create them. This can be done by executing the
following commands:
# cd /dev
436
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
default:
set log Phase Chat LCP IPCP CCP tun command
ident user-ppp VERSION (built COMPILATIONDATE)
set device /dev/cuaa0
set speed 115200
set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
\"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT"
set timeout 180
enable dns
provider:
set phone "(123) 456 7890"
set authname foo
set authkey bar
set login "TIMEOUT 10 \"\" \"\" gin:--gin: \\U word: \\P col: ppp"
set timeout 300
set ifaddr x.x.x.x y.y.y.y 255.255.255.255 0.0.0.0
add default HISADDR
Line 1:
Identifies the default entry. Commands in this entry are executed automatically when ppp is run.
Line 2:
Enables logging parameters. When the configuration is working satisfactorily, this line should be reduced to
saying
set log phase tun
437
Line 8:
Sets the idle timeout for the link. 180 seconds is the default, so this line is purely cosmetic.
Line 9:
Tells PPP to ask the peer to confirm the local resolver settings. If you run a local name server, this line should be
commented out or removed.
Line 10:
A blank line for readability. Blank lines are ignored by PPP.
Line 11:
Identifies an entry for a provider called provider. This could be changed to the name of your ISP so that later
you can use the load ISP to start the connection.
Line 12:
Sets the phone number for this provider. Multiple phone numbers may be specified using the colon ( :) or pipe
character (|)as a separator. The difference between the two separators is described in ppp(8). To summarize, if
you want to rotate through the numbers, use a colon. If you want to always attempt to dial the first number first
and only use the other numbers if the first number fails, use the pipe character. Always quote the entire set of
phone numbers as shown.
You must enclose the phone number in quotation marks (") if there is any intention on using spaces in the phone
number. This can cause a simple, yet subtle error.
438
If you are using PAP or CHAP, there will be no login at this point, and this line should be commented out or
removed. See PAP and CHAP authentication for further details.
The login string is of the same chat-like syntax as the dial string. In this example, the string works for a service
whose login session looks like this:
J. Random Provider
login: foo
password: bar
protocol: ppp
You will need to alter this script to suit your own needs. When you write this script for the first time, you should
ensure that you have enabled chat logging so you can determine if the conversation is going as expected.
Line 16:
Sets the default idle timeout (in seconds) for the connection. Here, the connection will be closed automatically
after 300 seconds of inactivity. If you never want to timeout, set this value to zero or use the -ddial command
line switch.
Line 17:
Sets the interface addresses. The string x.x.x.x should be replaced by the IP address that your provider has
allocated to you. The string y.y.y.y should be replaced by the IP address that your ISP indicated for their
gateway (the machine to which you connect). If your ISP has not given you a gateway address, use
10.0.0.2/0. If you need to use a guessed address, make sure that you create an entry in
/etc/ppp/ppp.linkup as per the instructions for PPP and Dynamic IP addresses. If this line is omitted, ppp
cannot run in -auto mode.
Line 18:
Adds a default route to your ISPs gateway. The special word HISADDR is replaced with the gateway address
specified on line 9. It is important that this line appears after line 9, otherwise HISADDR will not yet be
initialized.
If you do not wish to run ppp in -auto, this line should be moved to the ppp.linkup file.
It is not necessary to add an entry to ppp.linkup when you have a static IP address and are running ppp in -auto
mode as your routing table entries are already correct before you connect. You may however wish to create an entry
to invoke programs after connection. This is explained later with the sendmail example.
Example configuration files can be found in the /usr/share/examples/ppp/ directory.
439
Again, do not include the line number, it is just for reference. Indentation of at least one space is required.
Line 17:
The number after the / character is the number of bits of the address that ppp will insist on. You may wish to
use IP numbers more appropriate to your circumstances, but the above example will always work.
The last argument (0.0.0.0) tells PPP to start negotiations using address 0.0.0.0 rather than 10.0.0.1 and
is necessary for some ISPs. Do not use 0.0.0.0 as the first argument to set ifaddr as it prevents PPP from
setting up an initial route in -auto mode.
If you are not running in -auto mode, you will need to create an entry in /etc/ppp/ppp.linkup. ppp.linkup is
used after a connection has been established. At this point, ppp will have assigned the interface addresses and it will
now be possible to add the routing table entries:
1
2
provider:
add default HISADDR
Line 1:
On establishing a connection, ppp will look for an entry in ppp.linkup according to the following rules: First,
try to match the same label as we used in ppp.conf. If that fails, look for an entry for the IP address of our
gateway. This entry is a four-octet IP style label. If we still have not found an entry, look for the MYADDR entry.
Line 2:
This line tells ppp to add a default route that points to HISADDR. HISADDR will be replaced with the IP number
of the gateway as negotiated by the IPCP.
See the pmdemand entry in the files /usr/share/examples/ppp/ppp.conf.sample and
/usr/share/examples/ppp/ppp.linkup.sample for a detailed example.
440
If this command is used in the default section, it gives the specified users access to everything.
This script should be executable. Now make a symbolic link called ppp-dialup to this script using the following
commands:
# ln -s ppp-shell /etc/ppp/ppp-dialup
You should use this script as the shell for all of your dialup users. This is an example from /etc/password for a
dialup PPP user with username pchilds (remember do not directly edit the password file, use vipw).
pchilds:*:1011:300:Peter Childs PPP:/home/ppp:/etc/ppp/ppp-dialup
441
1 root
1 root
wheel
wheel
Each of these users dialup accounts should have their shell set to the symbolic link created above (for example,
marys shell should be /etc/ppp/ppp-mary).
The default: section is loaded for each session. For each dialup line enabled in /etc/ttys create an entry similar
to the one for ttyd0: above. Each line should get a unique IP address from your pool of IP addresses for dynamic
users.
442
The file /etc/ppp/ppp.linkup should also contain routing information for each static IP user if required. The line
below would add a route for the 203.14.101.0 class C via the clients ppp link.
fred:
add 203.14.101.0 netmask 255.255.255.0 HISADDR
sam:
add 203.14.102.0 netmask 255.255.255.0 HISADDR
mary:
add 203.14.103.0 netmask 255.255.255.0 HISADDR
/etc/ppp/ppp-pap-dialup
This will tell mgetty to run the ppp-pap-dialup script for detected PPP connections.
Create a file called /etc/ppp/ppp-pap-dialup containing the following (the file should be executable):
#!/bin/sh
exec /usr/sbin/ppp -direct pap$IDENT
For each dialup line enabled in /etc/ttys, create a corresponding entry in /etc/ppp/ppp.conf. This will
happily co-exist with the definitions we created above.
pap:
enable pap
set ifaddr 203.14.100.1 203.14.100.20-203.14.100.40
enable proxy
Each user logging in with this method will need to have a username/password in /etc/ppp/ppp.secret file, or
alternatively add the following option to authenticate users via PAP from /etc/password file.
enable passwdauth
443
18.2.1.3.11 MS Extensions
It is possible to configure PPP to supply DNS and NetBIOS nameserver addresses on demand.
To enable these extensions with PPP version 1.x, the following lines might be added to the relevant section of
/etc/ppp/ppp.conf.
enable msext
set ns 203.14.100.1 203.14.100.2
set nbns 203.14.100.5
This will tell the clients the primary and secondary name server addresses, and a NetBIOS nameserver host.
In version 2 and above, if the set dns line is omitted, PPP will use the values found in /etc/resolv.conf.
set login
set authname MyUserName
set authkey MyPassword
Line 7:
Your ISP will not normally require that you log into the server if you are using PAP or CHAP. You must
therefore disable your set login string.
Line 12:
This line specifies your PAP/CHAP user name. You will need to insert the correct value for MyUserName.
444
accept PAP
or
15
accept CHAP
to make it obvious that this is the intention, but PAP and CHAP are both accepted by default.
This will tell PPP to listen to the specified Unix-domain socket, asking clients for the specified password before
allowing access. The %d in the name is replaced with the tun device number that is in use.
Once a socket has been set up, the pppctl(8) program may be used in scripts that wish to manipulate the running
program.
Alternatively, PPP NAT may be enabled by command-line option -nat. There is also /etc/rc.conf knob named
ppp_nat, which is enabled by default.
If you use this feature, you may also find useful the following /etc/ppp/ppp.conf options to enable incoming
connections forwarding:
nat port tcp 10.0.0.2:ftp ftp
nat port tcp 10.0.0.2:http http
445
If your ISP has supplied you with a static IP address and name, it is probably best that you use this name as your host
name.
Look for the network_interfaces variable. If you want to configure your system to dial your ISP on demand,
make sure the tun0 device is added to the list, otherwise remove it.
network_interfaces="lo0 tun0"
ifconfig_tun0=
Note: The ifconfig_tun0 variable should be empty, and a file called /etc/start_if.tun0 should be created.
This file should contain the line:
ppp -auto mysystem
This script is executed at network configuration time, starting your ppp daemon in automatic mode. If you have a
LAN for which this machine is a gateway, you may also wish to use the -alias switch. Refer to the manual page
for further details.
It is important that the routed daemon is not started (it is started by default), as routed tends to delete the default
routing table entries created by ppp.
It is probably worth your while ensuring that the sendmail_flags line does not include the -q option, otherwise
sendmail will attempt to do a network lookup every now and then, possibly causing your machine to dial out. You
may try:
sendmail_flags="-bd"
The downside of this is that you must force sendmail to re-examine the mail queue whenever the ppp link is up by
typing:
# /usr/sbin/sendmail -q
You may wish to use the !bg command in ppp.linkup to do this automatically:
1
2
3
4
provider:
delete ALL
add 0 0 HISADDR
!bg sendmail -bd -q30m
If you do not like this, it is possible to set up a dfilter to block SMTP traffic. Refer to the sample files for further
details.
Now the only thing left to do is reboot the machine.
All that is left is to reboot the machine. After rebooting, you can now either type:
# ppp
446
18.2.1.6 Summary
To recap, the following steps are necessary when setting up ppp for the first time:
Client side:
1.
2.
Ensure that the tunN device file is available in the /dev directory.
3.
Create an entry in /etc/ppp/ppp.conf. The pmdemand example should suffice for most ISPs.
4.
5.
6.
Server side:
1.
2.
Ensure that the tunN device file is available in the /dev directory.
3.
4.
Create a profile in this users home directory that runs ppp -direct direct-server or similar.
5.
6.
7.
1. As a client you want to connect your machine to the outside world via a PPP serial connection or modem
line.
447
defaultroute
To connect:
1.
Dial to the remote host using kermit (or some other modem program), and enter your user name and password
(or whatever is needed to enable PPP on the remote host).
2.
3.
448
Check to see if PPP is still running by executing /usr/etc/ppp/ppptest, which should look like this:
#!/bin/sh
pid=ps ax| grep pppd |grep -v grep|awk {print $1;}
if [ X${pid} != "X" ] ; then
echo pppd running: PID= ${pid-NONE}
else
echo No pppd running.
fi
set -x
netstat -n -I ppp0
ifconfig ppp0
449
pau 1
out +++
inp 5 OK
out ATH0\13
echo \13
exit
Once these are installed and modified correctly, all you need to do is run pppd, like so:
# pppd
450
domain ppp.foo.com
passive
modem
#
#
#
#
#
#
#
#
#
#
#
The following /etc/ppp/pppserv script will enable tell pppd to behave as a server:
#!/bin/sh
ps ax |grep pppd |grep -v grep
pid=ps ax |grep pppd |grep -v grep|awk {print $1;}
if [ "X${pid}" != "X" ] ; then
echo killing pppd, PID= ${pid}
kill ${pid}
fi
ps ax |grep kermit |grep -v grep
pid=ps ax |grep kermit |grep -v grep|awk {print $1;}
if [ "X${pid}" != "X" ] ; then
echo killing kermit, PID= ${pid}
kill -9 ${pid}
fi
# reset ppp interface
ifconfig ppp0 down
ifconfig ppp0 delete
# enable autoanswer mode
kermit -y /etc/ppp/kermit.ans
# run ppp
pppd /dev/tty01 19200
451
The following kermit script (/etc/ppp/kermit.ans) will enable/disable autoanswer mode on your modem. It
should look like this:
set
set
set
set
set
set
set
set
set
set
set
line /dev/tty01
speed 19200
file type binary
file names literal
win 8
rec pack 1024
send pack 1024
block 3
term bytesize 8
command bytesize 8
flow none
pau 1
out +++
inp 5 OK
out ATH0\13
inp 5 OK
echo \13
out ATS0=1\13
inp 5 OK
echo \13
exit
A script named /etc/ppp/kermit.dial is used for dialing and authenticating on the remote host. You will need to
customize it for your needs. Put your login and password in this script; you will also need to change the input
statement depending on responses from your modem and remote host.
;
; put the com line attached to the modem here:
;
set line /dev/tty01
;
; put the modem speed here:
;
set speed 19200
set file type binary
; full 8 bit file xfer
set file names literal
set win 8
set rec pack 1024
set send pack 1024
set block 3
452
:slcmd
; put the modem in command mode
echo Put the modem in command mode.
clear
; Clear unread characters from input buffer
pause 1
output +++
; hayes escape sequence
input 1 OK\13\10
; wait for OK
if success goto slhup
output \13
pause 1
output at\13
input 1 OK\13\10
if fail goto slcmd
; if modem doesnt answer OK, try again
:slhup
clear
pause 1
echo Hanging up the phone.
output ath0\13
input 2 OK\13\10
if fail goto slcmd
:sldial
pause 1
echo Dialing.
output atdt9,550311\13\10
assign \%x 0
:look
clear
increment \%x
input 1 {CONNECT }
if success goto sllogin
reinput 1 {NO CARRIER\13\10}
if success goto sldial
reinput 1 {NO DIALTONE\13\10}
if success goto slnodial
reinput 1 {\255}
if success goto slhup
reinput 1 {\127}
if success goto slhup
453
; login
; zero the time counter
:slloop
increment \%x
; Count the seconds
clear
; Clear unread characters from input buffer
output \13
;
; put your expected login prompt here:
;
input 1 {Username: }
if success goto sluid
reinput 1 {\255}
if success goto slhup
reinput 1 {\127}
if success goto slhup
if < \%x 10 goto slloop
; try 10 times to get a login prompt
else goto slhup
; hang up and start again if 10 failures
:sluid
;
; put your userid here:
;
output ppp-login\13
input 1 {Password: }
;
; put your password here:
;
output ppp-password\13
input 1 {Entering SLIP mode.}
echo
quit
:slnodial
echo \7No dialtone.
exit 1
;
;
;
;
;
local variables:
mode: csh
comment-start: "; "
comment-start-skip: "; "
end:
454
You should get some pertinent output about the sio devices. These are the COM ports we need. If your modem acts
like a standard serial port then you should see it listed on sio1, or COM2. If so, you are not required to rebuild the
kernel, you just need to make the serial device. You can do this by changing your directory to /dev and running the
MAKEDEV script like above. Now make the serial devices with:
# sh MAKEDEV cuaa0 cuaa1 cuaa2 cuaa3
which will create the serial devices for your system. When matching up sio modem is on sio1 or COM2 if you are
in DOS, then your modem device would be /dev/cuaa1.
Set the connection speed, in this case we are using 115,200 kbps.
ppp ON example> enable dns
Tell ppp to configure our resolver and add the nameserver lines to /etc/resolv.conf. If ppp cannot determine
our hostname, we can set one manually later.
ppp ON example> term
455
Use at to initialize the modem, then use atdt and the number for your ISP to begin the dial in process.
CONNECT
Confirmation of the connection, if we are going to have any connection problems, unrelated to hardware, here is
where we will attempt to resolve them.
ISP Login:myusername
Here you are prompted for a username, return the prompt with the username that was provided by the ISP.
ISP Pass:mypassword
This time we are prompted for a password, just reply with the password that was provided by the ISP. Just like
logging into FreeBSD, the password will not echo.
Shell or PPP:ppp
Depending on your ISP this prompt may never appear. Here we are being asked if we wish to use a shell on the
provider, or to start ppp. In this example, we have chosen to use ppp as we want an Internet connection.
Ppp ON example>
Notice that in this example the first p has been capitalized. This shows that we have successfully connected to the
ISP.
PPp ON example>
We have successfully authenticated with our ISP and are waiting for the assigned IP address.
PPP ON example>
Here we add our default route, we need to do this before we can talk to the outside world as currently the only
established connection is with the peer. If this fails due to existing routes you can put a bang character ! in front of
the add. Alternatively, you can set this before making the actual connection and it will negotiate a new route
accordingly.
If everything went good we should now have an active connection to the Internet, which could be thrown into the
background using CTRL+z If you notice the PPP return to ppp then we have lost our connection. This is good to
know because it shows our connection status. Capital Ps show that we have a connection to the ISP and lowercase
ps show that the connection has been lost for whatever reason. ppp only has these 2 states.
456
Where myusername should be replaced with the username that was assigned by the ISP.
ppp ON example> set authkey mypassword
Where mypassword should be replaced with the password that was assigned by the ISP.
If you connect fine, but cannot seem to find any domain name, try to use ping(8) with an IP address and see if you
can get any return information. If you experience 100 percent (100%) packet loss, then its most likely that you were
not assigned a default route. Double check that the option add default HISADDR was set during the connection. If
you can connect to a remote IP address then it is possible that a resolver address has not been added to the
/etc/resolv.conf. This file should look like:
domain example.com
nameserver x.x.x.x
nameserver y.y.y.y
Where x.x.x.x and y.y.y.y should be replaced with the IP address of your ISPs DNS servers. This information
may or may not have been provided when you signed up, but a quick call to your ISP should remedy that.
You could also have syslog(3) provide a logging function for your PPP connection. Just add:
!ppp
*.*
/var/log/ppp.log
457
458
Do not forget to change xl1 to the proper device for your Ethernet card.
Do not forget to change ISP to the profile you have just found above.
For additional information, see:
or can be done for immediate effect with the command sysctl net.graph.nonstandard_pppoe=1.
Unfortunately, because this is a system-wide setting, it is not possible to talk to a normal PPPoE client or server and a
3Com HomeConnect ADSL Modem at the same time.
459
To enable the USB daemon, usbd, put the following the line into /etc/rc.conf:
usbd_enable="YES"
It is also possible to set up PPP to dial up at startup. To do this add the following lines to /etc/rc.conf. Again, for
this procedure you will need to be logged in as the root user.
ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="adsl"
For this to work correctly you will need to have used the sample ppp.conf which is supplied with the net/pppoa
port.
460
link
link
link
link
iface
iface
iface
iface
route default
disable on-demand
enable proxy-arp
idle 0
open
The mpd.links file contains information about the link, or links, you wish to establish. An example mpd.links to
accompany the above example is given beneath.
adsl:
set
set
set
set
set
link
pptp
pptp
pptp
pptp
type pptp
mode active
enable originate incoming outcall
self 10.0.0.1
peer 10.0.0.138
The IP address of your FreeBSD computer which you will be using mpd from.
The IP address of your ADSL modem. For the Alcatel SpeedTouch Home this address defaults to 10.0.0.138.
It is possible to initialize the connection easily by issuing the following command as root.
# mpd -b adsl
You can see the status of the connection with the following command.
% ifconfig ng0
Using mpd is the recommended way to connect to an ADSL service with FreeBSD.
461
This will open a tunnel for a PPP session to your DSL router. Ethernet DSL modems have a preconfigured LAN IP
address which you connect to. In the case of the Alcatel SpeedTouch Home this address is 10.0.0.138. Your
routers documentation should tell you which address your device uses. To open the tunnel and start a ppp session
execute the following command.
# pptp address isp
Tip: You may wish to add an ampersand (&) to the end of the previous command because pptp will not return
your prompt to you otherwise.
A tun virtual tunnel device will be created for interaction between the pptp and ppp processes. Once you have been
returned to your prompt, or the pptp process has confirmed a connection you can examine the tunnel like so.
% ifconfig tun0
462
Make sure you have the following in your kernel configuration file:
pseudo-device
sl
It is included in the GENERIC kernel, so this should not be a problem unless you have deleted it.
18.7.1.1 Things You Have to Do Only Once
1.
Add your home machine, the gateway and nameservers to your /etc/hosts file. Mine looks like this:
127.0.0.1
136.152.64.181
136.152.64.1
128.32.136.9
128.32.136.12
localhost loghost
water.CS.Example.EDU water.CS water
inr-3.CS.Example.EDU inr-3 slip-gateway
ns1.Example.EDU ns1
ns2.Example.EDU ns2
2.
Make sure you have hosts before bind in your /etc/host.conf on FreeBSD versions prior to 5.0. Since
FreeBSD 5.0, the system uses the file /etc/nsswitch.conf instead, make sure you have files before dns in
the hosts line of this file. Without these parameters funny things may happen.
3.
2. Add sl0 to the list of network interfaces by changing the line that says:
463
to:
network_interfaces="lo0 sl0"
to:
defaultrouter="slip-gateway"
4.
As you can see, these set up the nameserver hosts. Of course, the actual domain names and addresses depend on
your environment.
5.
Set the password for root and toor (and any other accounts that do not have a password).
6.
Reboot your machine and make sure it comes up with the correct hostname.
Dial up, type slip at the prompt, enter your machine name and password. What is required to be entered
depends on your environment. If you use kermit, you can try a script like this:
# kermit setup
set modem hayes
set line /dev/modem
set speed 115200
set parity none
set flow rts/cts
set terminal bytesize 8
set file type binary
# The next macro will dial up and login
define slip dial 643-9600, input 10 =>, if failure stop, output slip\x0d, input 10 Username:, if failure stop, output silvia\x0d, input 10 Password:, if failure stop, output ***\x0d, echo \x0aCONNECTED\x0a
Of course, you have to change the hostname and password to fit yours. After doing so, you can just type slip
from the kermit prompt to connect.
464
2.
Leave the kermit there (you can suspend it by Ctrl-z) and as root, type:
# slattach -h -c -s 115200 /dev/modem
If you are able to ping hosts on the other side of the router, you are connected! If it does not work, you might
want to try -a instead of -c as an argument to slattach.
to kill slattach. Keep in mind you must be root to do the above. Then go back to kermit (by running fg if you
suspended it) and exit from it (q).
The slattach manual page says you have to use ifconfig sl0 down to mark the interface down, but this does
not seem to make any difference for me. (ifconfig sl0 reports the same thing.)
Some times, your modem might refuse to drop the carrier (mine often does). In that case, simply start kermit and quit
it again. It usually goes out on the second try.
18.7.1.4 Troubleshooting
If it does not work, feel free to ask me. The things that people tripped over so far:
Not using -c or -a in slattach (This should not be fatal, but some users have reported that this solves their
problems.)
Using s10 instead of sl0 (might be hard to see the difference on some fonts).
Try ifconfig sl0 to see your interface status. For example, you might get:
# ifconfig sl0
sl0: flags=10<POINTOPOINT>
inet 136.152.64.181 --> 136.152.64.1 netmask ffffff00
If you get no route to host messages from ping, there may be a problem with your routing table. You can use
the netstat -r command to display the current routes :
# netstat -r
Routing tables
Destination
Gateway
Flags
Refs
Use
IfaceMTU
Rtt
Netmasks:
(root node)
(root node)
Route Tree for Protocol Family inet:
465
inr-3.Example.EDU
localhost.Example.
water.CS.Example.E
localhost.Example.
UG
UH
UH
UGH
8
224515
5
42127
1
0
34 47641234
sl0
lo0
sl0
lo0
0.438
0.438
The preceding examples are from a relatively busy system. The numbers on your system will vary depending on
network activity.
466
dc-slip sl-helmer
0xfffffc00
autocomp
sliplogin will find that matching line, hook the serial line into the next available SLIP interface, and then execute
/etc/sliphome/slip.login like this:
/etc/sliphome/slip.login 0 19200 Shelmerg dc-slip sl-helmer 0xfffffc00 autocomp
If all goes well, /etc/sliphome/slip.login will issue an ifconfig for the SLIP interface to which
sliplogin attached itself (slip interface 0, in the above example, which was the first parameter in the list given to
slip.login) to set the local IP address (dc-slip), remote IP address (sl-helmer), network mask for the SLIP
interface (0xfffffc00), and any additional flags (autocomp). If something goes wrong, sliplogin usually logs
good informational messages via the daemon syslog facility, which usually logs to /var/log/messages (see the
manual pages for syslogd(8) and syslog.conf(5) and perhaps check /etc/syslog.conf to see to what syslogd is
logging and where it is logging to.
OK, enough of the examples let us dive into setting up the system.
Mtu
1500
1500
65535
65535
296
296
Network
Address
<Link>0.0.c0.2c.5f.4a
138.247.224 ivory
<Link>
loop
localhost
<Link>
<Link>
Ipkts Ierrs
291311
0
291311
0
79
0
79
0
0
0
0
0
The sl0 and sl1 interfaces shown from netstat -i indicate that there are two SLIP interfaces built into the
kernel. (The asterisks after the sl0 and sl1 indicate that the interfaces are down.)
However, FreeBSDs default kernel does not come configured to forward packets (by default, your FreeBSD
machine will not act as a router) due to Internet RFC requirements for Internet hosts (see RFCs 1009 [Requirements
for Internet Gateways], 1122 [Requirements for Internet Hosts Communication Layers], and perhaps 1127 [A
Perspective on the Host Requirements RFCs]). If you want your FreeBSD SLIP Server to act as a router, you will
have to edit the /etc/rc.conf file and change the setting of the gateway_enable variable to YES.
You will then need to reboot for the new settings to take effect.
You will notice that near the end of the default kernel configuration file ( /sys/i386/conf/GENERIC) is a line that
reads:
pseudo-device sl 2
This is the line that defines the number of SLIP devices available in the kernel; the number at the end of the line is
the maximum number of SLIP connections that may be operating simultaneously.
467
Network mask
The local and remote addresses may be host names (resolved to IP addresses by /etc/hosts or by the domain
name service, depending on your specifications in the file /etc/nsswitch.conf on FreeBSD 5.X, in
/etc/host.conf if you use FreeBSD 4.X), and the network mask may be a name that can be resolved by a lookup
into /etc/networks. On a sample system, /etc/sliphome/slip.hosts looks like this:
#
# login local-addr
#
#
Shelmerg dc-slip
remote-addr
mask
opt1
opt2
(normal,compress,noicmp)
sl-helmerg
0xfffffc00
autocomp
no header compression
compress
compress headers
autocomp
noicmp
disable ICMP packets (so any ping packets will be dropped instead of using up your bandwidth)
Your choice of local and remote addresses for your SLIP links depends on whether you are going to dedicate a
TCP/IP subnet or if you are going to use proxy ARP on your SLIP server (it is not true proxy ARP, but that is the
terminology used in this section to describe it). If you are not sure which method to select or how to assign IP
addresses, please refer to the TCP/IP books referenced in the SLIP Prerequisites (Section 18.7.2.1) and/or consult
your IP network manager.
If you are going to use a separate subnet for your SLIP clients, you will need to allocate the subnet number out of
your assigned IP network number and assign each of your SLIP clients IP numbers out of that subnet. Then, you
will probably need to configure a static route to the SLIP subnet via your SLIP server on your nearest IP router.
Otherwise, if you will use the proxy ARP method, you will need to assign your SLIP clients IP addresses out of
your SLIP servers Ethernet subnet, and you will also need to adjust your /etc/sliphome/slip.login and
468
table.
#
# generic login file for a slip line. sliplogin invokes this with
# the parameters:
#
1
2
3
4
5
6
7-n
#
slipunit ttyspeed loginname local-addr remote-addr mask opt-args
#
/sbin/ifconfig sl$1 inet $4 $5 netmask $6
This slip.login file merely runs ifconfig for the appropriate SLIP interface with the local and remote addresses
and network mask of the SLIP interface.
If you have decided to use the proxy ARP method (instead of using a separate subnet for your SLIP clients), your
/etc/sliphome/slip.login file will need to look something like this:
#!/bin/sh #
#
@(#)slip.login
#
# generic login file for a slip line. sliplogin invokes this with
# the parameters:
#
1
2
3
4
5
6
7-n
#
slipunit ttyspeed loginname local-addr remote-addr mask opt-args
#
/sbin/ifconfig sl$1 inet $4 $5 netmask $6
# Answer ARP requests for the SLIP client with our Ethernet addr
/usr/sbin/arp -s $5 00:11:22:33:44:55 pub
The additional line in this slip.login, arp -s $5 00:11:22:33:44:55 pub, creates an ARP entry in the
SLIP servers ARP table. This ARP entry causes the SLIP server to respond with the SLIP servers Ethernet MAC
address whenever another IP node on the Ethernet asks to speak to the SLIP clients IP address.
When using the example above, be sure to replace the Ethernet MAC address ( 00:11:22:33:44:55) with the MAC
address of your systems Ethernet card, or your proxy ARP will definitely not work! You can discover your SLIP
servers Ethernet MAC address by looking at the results of running netstat -i; the second line of the output
should look something like:
ed0
1500
<Link>0.2.c1.28.5f.4a
191923 0
129457
116
This indicates that this particular systems Ethernet MAC address is 00:02:c1:28:5f:4a the periods in the
Ethernet MAC address given by netstat -i must be changed to colons and leading zeros should be added to each
469
If you are using proxy ARP, you will want to have /etc/sliphome/slip.logout remove the ARP entry for the
SLIP client:
#!/bin/sh #
#
@(#)slip.logout
#
# logout file for a slip line. sliplogin invokes this with
# the parameters:
#
1
2
3
4
5
6
7-n
#
slipunit ttyspeed loginname local-addr remote-addr mask opt-args
#
/sbin/ifconfig sl$1 down
# Quit answering ARP requests for the SLIP client
/usr/sbin/arp -d $5
The arp -d $5 removes the ARP entry that the proxy ARP slip.login added when the SLIP client logged in.
It bears repeating: make sure /etc/sliphome/slip.logout has the execute bit set after you create it (ie, chmod
755 /etc/sliphome/slip.logout).
470
An alternative to the headaches of static routes is to install gated on your FreeBSD SLIP server and configure it to
use the appropriate routing protocols (RIP/OSPF/BGP/EGP) to tell other routers about your SLIP subnet. Youll
need to write a /etc/gated.conf file to configure your gated; here is a sample, similar to what the author used on
a FreeBSD SLIP server:
#
# gated configuration file for dc.dsu.edu; for gated version 3.5alpha5
# Only broadcast RIP information for xxx.xxx.yy out the ed Ethernet interface
#
#
# tracing options
#
traceoptions "/var/tmp/gated.output" replace size 100k files 2 general ;
rip yes {
interface sl noripout noripin ;
interface ed ripin ripout version 1 ;
traceoptions route ;
} ;
#
# Turn on a bunch of tracing info for the interface to the kernel:
kernel {
traceoptions remnants request routes info interface ;
} ;
#
# Propagate the route to xxx.xxx.yy out the Ethernet interface via RIP
#
471
The above sample gated.conf file broadcasts routing information regarding the SLIP subnet xxx.xxx.yy via
RIP onto the Ethernet; if you are using a different Ethernet driver than the ed driver, you will need to change the
references to the ed interface appropriately. This sample file also sets up tracing to /var/tmp/gated.output for
debugging gateds activity; you can certainly turn off the tracing options if gated works OK for you. You will need
to change the xxx.xxx.yys into the network address of your own SLIP subnet (be sure to change the net mask in
the proto direct clause as well).
Once you have installed and configured gated on your system, you will need to tell the FreeBSD startup scripts to
run gated in place of routed. The easiest way to accomplish this is to set the router and router_flags
variables in /etc/rc.conf. Please see the manual page for gated for information on command-line parameters.
472
How to synchronize the time and date, and setup a time server, with the NTP protocol.
473
19.2.1 An Example
To illustrate different aspects of routing, we will use the following example from netstat:
% netstat -r
Routing tables
Destination
Gateway
default
outside-gw
localhost
localhost
test0
0:e0:b5:36:cf:4f
10.20.30.255
link#1
example.com
link#1
host1
0:e0:a8:37:8:1e
host2
0:e0:a8:37:8:1e
host2.example.com link#1
224
link#1
Flags
UGSc
UH
UHLW
UHLW
UC
UHLW
UHLW
UC
UC
Refs
37
0
5
1
0
3
0
0
0
Use
418
181
63288
2421
0
4601
5
0
0
Netif Expire
ppp0
lo0
ed0
77
lo0
lo0 =>
The first two lines specify the default route (which we will cover in the next section) and the localhost route.
The interface (Netif column) that this routing table specifies to use for localhost is lo0, also known as the
loopback device. This says to keep all traffic for this destination internal, rather than sending it out over the LAN,
since it will only end up back where it started.
The next thing that stands out are the addresses beginning with 0:e0:. These are Ethernet hardware addresses,
which are also known as MAC addresses. FreeBSD will automatically identify any hosts ( test0 in the example) on
the local Ethernet and add a route for that host, directly to it over the Ethernet interface, ed0. There is also a timeout
(Expire column) associated with this type of route, which is used if we fail to hear from the host in a specific
amount of time. When this happens, the route to this host will be automatically deleted. These hosts are identified
using a mechanism known as RIP (Routing Information Protocol), which figures out routes to local hosts based upon
a shortest path determination.
FreeBSD will also add subnet routes for the local subnet (10.20.30.255 is the broadcast address for the subnet
10.20.30, and example.com is the domain name associated with that subnet). The designation link#1 refers to
the first Ethernet card in the machine. You will notice no additional interface is specified for those.
Both of these groups (local network hosts and local subnets) have their routes automatically configured by a daemon
called routed. If this is not run, then only routes which are statically defined (i.e. entered explicitly) will exist.
The host1 line refers to our host, which it knows by Ethernet address. Since we are the sending host, FreeBSD
knows to use the loopback interface (lo0) rather than sending it out over the Ethernet interface.
The two host2 lines are an example of what happens when we use an ifconfig(8) alias (see the section on Ethernet
for reasons why we would do this). The => symbol after the lo0 interface says that not only are we using the
loopback (since this address also refers to the local host), but specifically it is an alias. Such routes only show up on
the host that supports the alias; all other hosts on the local network will simply have a link#1 line for such routes.
The final line (destination subnet 224) deals with multicasting, which will be covered in another section.
Finally, various attributes of each route can be seen in the Flags column. Below is a short table of some of these
flags and their meanings:
U
H
474
S
C
W
L
The hosts Local1 and Local2 are at your site. Local1 is connected to an ISP via a dial up PPP connection. This
PPP server computer is connected through a local area network to another gateway computer through an external
interface to the ISPs Internet feed.
The default routes for each of your machines will be:
Host
Default Gateway
Interface
Local2
Local1
Ethernet
Local1
T1-GW
PPP
A common question is Why (or how) would we set the T1-GW to be the default gateway for Local1, rather than the
ISP server it is connected to?.
Remember, since the PPP interface is using an address on the ISPs local network for your side of the connection,
routes for any other machines on the ISPs local network will be automatically generated. Hence, you will already
know how to reach the T1-GW machine, so there is no need for the intermediate step of sending traffic to the ISP
server.
475
Default Route
Local2 (10.20.30.2)
Local1 (10.20.30.1)
T1-GW (10.9.9.1)
This option will set the sysctl(8) variable net.inet.ip.forwarding to 1. If you should need to stop routing
temporarily, you can reset this to 0 temporarily.
Your new router will need routes to know where to send the traffic. If your network is simple enough you can use
static routes. FreeBSD also comes with the standard BSD routing daemon routed(8), which speaks RIP (both version
1 and version 2) and IRDP. Support for BGP v4, OSPF v2, and other sophisticated routing protocols is available with
the net/zebra package. Commercial products such as gated are also available for more complex network routing
solutions.
Even when FreeBSD is configured in this way, it does not completely comply with the Internet standard
requirements for routers. It comes close enough for ordinary use, however.
476
19.2.6 Troubleshooting
Sometimes, there is a problem with routing propagation, and some sites are unable to connect to you. Perhaps the
most useful command for trying to figure out where routing is breaking down is the traceroute(8) command. It is
equally useful if you cannot seem to make a connection to a remote machine (i.e. ping(8) fails).
The traceroute(8) command is run with the name of the remote host you are trying to connect to. It will show the
gateway hosts along the path of the attempt, eventually either reaching the target host, or terminating because of a
lack of connection.
For more information, see the manual page for traceroute(8).
In addition, the multicast routing daemon, mrouted(8) must be configured to set up tunnels and DVMRP via
/etc/mrouted.conf. More details on multicast configuration may be found in the man pages for mrouted.
477
19.3.1 Introduction
It can be very useful to be able to use a computer without the annoyance of having a network cable attached at all
times. FreeBSD can be used as a wireless client, and even as a wireless access point.
478
19.3.3.2.2 Setting It Up
First, make sure your system can see the wireless card:
# ifconfig -a
Do not worry about the details now, just make sure it shows you something to indicate you have a wireless card
installed. If you have trouble seeing the wireless interface, and you are using a PC Card, you may want to check out
pccardc(8) and pccardd(8) manual pages for more information.
Next, you will need to load a module in order to get the bridging part of FreeBSD ready for the access point. In order
to load the bridge(4) module, simply run the following command:
# kldload bridge
It should not have produced any errors when loading the module. If it did, you may need to compile the bridge(4)
code into your kernel. The Bridging section of the handbook should be able to help you accomplish that task.
Now that you have the bridging stuff done, we need to tell the FreeBSD kernel which interfaces to bridge together.
We do that by using sysctl(8):
# sysctl net.link.ether.bridge=1
# sysctl net.link.ether.bridge_cfg="wi0 xl0"
# sysctl net.inet.ip.forwarding=1
479
The ifconfig(8) line brings the wi0 interface up, sets its SSID to my_net, and sets the station name to FreeBSD AP.
The media DS/11Mbps sets the card into 11Mbps mode and is needed for any mediaopt to take effect. The
mediaopt hostap option places the interface into access point mode. The channel 11 option sets the 802.11b
channel to use. The wicontrol(8) man page has valid channel options for your regulatory domain.
Now you should have a complete functioning access point up and running. You are encouraged to read wicontrol(8),
ifconfig(8), and wi(4) for further information.
It is also suggested that you read the section on encryption that follows.
1 station:
00:09:b7:7b:9d:16
This shows that theres one station associated, along with its parameters. The signal indicated should be used as a
relative indication of strength only. Its translation to dBm or other units varies between different firmware revisions.
19.3.3.3 Clients
A wireless client is a system that accesses an access point or another client directly.
Typically, wireless clients only have one network device, the wireless networking card.
There are a few different ways to configure a wireless client. These are based on the different wireless modes,
generally BSS (infrastructure mode, which requires an access point), and IBSS (ad-hoc, or peer-to-peer mode). In
our example, we will use the most popular of the two, BSS mode, to talk to an access point.
19.3.3.3.1 Requirements
There is only one real requirement for setting up FreeBSD as a wireless client. You will need a wireless card that is
supported by FreeBSD.
480
Now, we will set the card to the correct settings for our network:
# ifconfig wi0 inet 192.168.0.20 netmask 255.255.255.0 ssid my_net
Replace 192.168.0.20 and 255.255.255.0 with a valid IP address and netmask on your wired network.
Remember, our access point is bridging the data between the wireless network, and the wired network, so it will
appear to the other devices on your network that you are on the wired network just as they are.
Once you have done that, you should be able to ping hosts on the wired network just as if you were connected using
a standard wired connection.
If you are experiencing problems with your wireless connection, check to make sure that your are associated
(connected) to the access point:
# ifconfig wi0
If it does not show associated, then you may be out of range of the access point, do not have encryption on, or
possibly have a configuration problem.
19.3.3.4 Encryption
Encryption on a wireless network is important because you no longer have the ability to keep the network contained
in a well protected area. Your wireless data will be broadcast across your entire neighborhood, so anyone who cares
to read it can. This is where encryption comes in. By encrypting the data that is sent over the airwaves, you make it
much more difficult for any interested party to grab your data right out of the air.
The two most common ways to encrypt the data between your client and the access point, are WEP, and ipsec(4).
19.3.3.4.1 WEP
WEP is an abbreviation for Wired Equivalency Protocol. WEP is an attempt to make wireless networks as safe and
secure as a wired network. Unfortunately, it has been cracked, and is fairly trivial to break. This also means it is not
something to rely on when it comes to encrypting sensitive data.
It is better than nothing, so use the following to turn on WEP on your new FreeBSD access point:
# ifconfig wi0 inet up ssid my_net wepmode on wepkey 0x1234567890 media DS/11Mbps mediaopt hostap
481
Note that you should replace the 0x1234567890 with a more unique key.
19.3.3.4.2 IPsec
ipsec(4) is a much more robust and powerful tool for encrypting data across a network. This is definitely the
preferred way to encrypt wireless data over a network. You can read more about ipsec(4) security and how to
implement it in the IPsec section of the handbook.
19.3.3.5 Tools
There are a small number of tools available for use in debugging and setting up your wireless network, and here we
will attempt to describe some of them and what they do.
19.3.3.5.1 The bsd-airtools Package
The bsd-airtools package is a complete toolset that includes wireless auditing tools for WEP key cracking, access
point detection, etc.
The bsd-airtools utilities can be installed from the net/bsd-airtools port. Information on installing ports can be
found in Chapter 4 of the handbook.
The program dstumbler is the packaged tool that allows for access point discovery and signal to noise ratio
graphing. If you are having a hard time getting your access point up and running, dstumbler may help you get
started.
To test your wireless network security, you may choose to use dweputils (dwepcrack, dwepdump and
dwepkeygen) to help you determine if WEP is the right solution to your wireless security needs.
482
19.3.3.6.2 Clients
Almost all 802.11b wireless cards are currently supported under FreeBSD. Most cards based on Prism, Spectrum24,
Hermes, Aironet, and Raylink will work as a wireless network card in IBSS (ad-hoc, peer-to-peer, and BSS) mode.
19.4 Bridging
Written by Steve Peterson.
19.4.1 Introduction
It is sometimes useful to divide one physical network (such as an Ethernet segment) into two separate network
segments without having to create IP subnets and use a router to connect the segments together. A device that
connects two networks together in this fashion is called a bridge. A FreeBSD system with two network interface
cards can act as a bridge.
The bridge works by learning the MAC layer addresses (Ethernet addresses) of the devices on each of its network
interfaces. It forwards traffic between two networks only when its source and destination are on different networks.
In many respects, a bridge is like an Ethernet switch with very few ports.
483
484
to enable bridging on the specified interfaces (replace if1 and if2 with the names of your two network interfaces).
If you want the bridged packets to be filtered by ipfw(8), you should add:
net.link.ether.bridge_ipfw=1
as well.
19.5 NFS
Reorganized and enhanced by Tom Rhodes. Written by Bill Swingle.
Among the many different filesystems that FreeBSD supports is the Network File System, also known as NFS. NFS
allows a system to share directories and files with others over a network. By using NFS, users and programs can
access files on remote systems almost as if they were local files.
Some of the most notable benefits that NFS can provide are:
Local workstations use less disk space because commonly used data can be stored on a single machine and still
remain accessible to others over the network.
There is no need for users to have separate home directories on every network machine. Home directories could be
setup on the NFS server and made available throughout the network.
Storage devices such as floppy disks, CDROM drives, and ZIP drives can be used by other machines on the
network. This may reduce the number of removable media drives throughout the network.
485
Description
nfsd
mountd
portmap
The client can also run a daemon, known as nfsiod. The nfsiod daemon services the requests from the NFS server.
This is optional, and improves performance, but is not required for normal and correct operation. See the nfsiod(8)
manual page for more information.
The /etc/exports file specifies which filesystems NFS should export (sometimes referred to as share). Each line
in /etc/exports specifies a filesystem to be exported and which machines have access to that filesystem. Along
with what machines have access to that filesystem, access options may also be specified. There are many such
options that can be used in this file but only a few will be mentioned here. You can easily discover other options by
reading over the exports(5) manual page.
Here are a few example /etc/exports entries:
The following examples give an idea of how to export filesystems, although the settings may be different depending
on your environment and network configuration. For instance, to export the /cdrom directory to three example
machines that have the same domain name as the server (hence the lack of a domain name for each) or have entries in
your /etc/hosts file. The -ro flag makes the exported filesystem read-only. With this flag, the remote system will
not be able to write any changes to the exported filesystem.
/cdrom -ro host1 host2 host3
The following line exports /home to three hosts by IP address. This is a useful setup if you have a private network
without a DNS server configured. Optionally the /etc/hosts file could be configured for internal hostnames;
please review hosts(5) for more information. The -alldirs flag allows the subdirectories to be mount points. In
other words, it will not mount the subdirectories but permit the client to mount only the directories that are required
or needed.
486
-alldirs
The following line exports /a so that two clients from different domains may access the filesystem. The
-maproot=root flag allows the root user on the remote system to write data on the exported filesystem as root. If
the -maproot=root flag is not specified, then even if a user has root access on the remote system, they will not be
able to modify files on the exported filesystem.
/a
-maproot=root
host.example.com box.example.org
In order for a client to access an exported filesystem, the client must have permission to do so. Make sure the client is
listed in your /etc/exports file.
In /etc/exports, each line represents the export information for one filesystem to one host. A remote host can
only be specified once per filesystem, and may only have one default entry. For example, assume that /usr is a
single filesystem. The following /etc/exports would be invalid:
/usr/src
client
/usr/ports client
One filesystem, /usr, has two lines specifying exports to the same host, client. The correct format for this
situation is:
/usr/src /usr/ports
client
The properties of one filesystem exported to a given host must all occur on one line. Lines without a client specified
are treated as a single host. This limits how you can export filesystems, but for most people this is not an issue.
The following is an example of a valid export list, where /usr and /exports are local filesystems:
# Export src and ports to client01 and client02, but only
# client01 has root privileges on it
/usr/src /usr/ports -maproot=root
client01
/usr/src /usr/ports
client02
# The client machines have root and can mount anywhere
# on /exports. Anyone in the world can mount /exports/obj read-only
/exports -alldirs -maproot=root
client01 client02
/exports/obj -ro
You must restart mountd whenever you modify /etc/exports so the changes can take effect. This can be
accomplished by sending the HUP signal to the mountd process:
# kill -HUP cat /var/run/mountd.pid
Alternatively, a reboot will make FreeBSD set everything up properly. A reboot is not necessary though. Executing
the following commands as root should start everything up.
On the NFS server:
# portmap
# nfsd -u -t -n 4
# mountd -r
487
This will mount the /home directory on the server at /mnt on the client. If everything is set up correctly you should
be able to enter /mnt on the client and see all the files that are on the server.
If you want to automatically mount a remote filesystem each time the computer boots, add the filesystem to the
/etc/fstab file. Here is an example:
server:/home /mnt nfs rw 0 0
Set several machines to share a CDROM or other media among them. This is cheaper and often a more convenient
method to install software on multiple machines.
On large networks, it might be more convenient to configure a central NFS server in which to store all the user
home directories. These home directories can then be exported to the network so that users would always have the
same home directory, regardless of which workstation they log in to.
Several machines could have a common /usr/ports/distfiles directory. That way, when you need to install
a port on several machines, you can quickly access the source without downloading it on each machine.
488
10.10.10.0
10.10.10.0
As seen in the example, the showmount shows /usr as an export. When changing directories to
/host/foobar/usr, amd attempts to resolve the hostname foobar and automatically mount the desired export.
amd can be started by the startup scripts by placing the following lines in /etc/rc.conf:
amd_enable="YES"
Additionally, custom flags can be passed to amd from the amd_flags option. By default, amd_flags is set to:
amd_flags="-a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map"
The /etc/amd.map file defines the default options that exports are mounted with. The /etc/amd.conf file defines
some of the more advanced features of amd.
Consult the amd(8) and amd.conf(5) manual pages for more information.
489
Nearly any 16-bit Ethernet adapter will allow operation without the above restrictions on the read or write size.
For anyone who cares, here is what happens when the failure occurs, which also explains why it is unrecoverable.
NFS typically works with a block size of 8 k (though it may do fragments of smaller sizes). Since the maximum
Ethernet packet is around 1500 bytes, the NFS block gets split into multiple Ethernet packets, even though it is still
a single unit to the upper-level code, and must be received, assembled, and acknowledged as a unit. The
high-performance workstations can pump out the packets which comprise the NFS unit one right after the other, just
as close together as the standard allows. On the smaller, lower capacity cards, the later packets overrun the earlier
packets of the same unit before they can be transferred to the host and the unit as a whole cannot be reconstructed or
acknowledged. As a result, the workstation will time out and try again, but it will try again with the entire 8 K unit,
and the process will be repeated, ad infinitum.
By keeping the unit size below the Ethernet packet size limitation, we ensure that any complete Ethernet packet
received can be acknowledged individually, avoiding the deadlock situation.
Overruns may still occur when a high-performance workstations is slamming data out to a PC system, but with the
better cards, such overruns are not guaranteed on NFS units. When an overrun occurs, the units affected will be
retransmitted, and there will be a fair chance that they will be received, assembled, and acknowledged.
There are at least two possible methods to load the kernel over the network:
PXE: Intels Preboot Execution Environment system is a form of smart boot ROM built into some networking
cards or motherboards. See pxeboot(8) for more details.
The etherboot port (net/etherboot) produces ROM-able code to boot kernels over the network. The code
can be either burnt into a boot PROM on a network card, or loaded from a local floppy (or hard) disk drive, or
from a running MS-DOS system. Many network cards are supported.
490
Standard system startup files exist in /etc to detect and support a diskless system startup.
There are many ways to set up diskless workstations. Many elements are involved, and most can be customized to
suit local taste. The following will describe the setup of a complete system, emphasizing simplicity and compatibility
with the standard FreeBSD startup scripts. The system described has the following characteristics:
The diskless workstations use a shared read-only root filesystem, and a shared read-only /usr.
The root filesystem is a copy of a standard FreeBSD root (typically the servers), with some configuration files
overridden by ones specific to diskless operation or, possibly, to the workstation they belong to.
The parts of the root which have to be writable are overlaid with mfs(8) filesystems. Any changes will be lost
when the system reboots.
The kernel is loaded by etherboot , using DHCP (or BOOTP) and TFTP.
Caution: As described, this system is insecure. It should live in a protected area of a network, and be untrusted
by other hosts.
etherboot uses DHCP (by default) or BOOTP (needs a configuration option) to find the kernel. (PXE uses DHCP).
It is possible to configure a system to use only BOOTP. The bootpd(8) server program is included in the base
FreeBSD system.
However, DHCP has a number of advantages over BOOTP (nicer configuration files, possibility of using PXE, plus
many others not directly related to diskless operation), and we shall describe both a pure BOOTP, and a
BOOTP+DHCP configuration, with an emphasis on the latter, which will use the ISC DHCP software package.
19.6.1.1.1 Configuration Using ISC DHCP
The isc-dhcp server can answer both BOOTP and DHCP requests.
As of release 4.4, isc-dhcp 3.0 is not part of the base system. You will first need to install the net/isc-dhcp3 port
or the corresponding package. Please refer to Chapter 4 for general information about ports and packages.
491
This option tells dhcpd to send the value in the host declarations as the hostname for the diskless host. An
alternate way would be to add an option host-name margaux inside the host declarations.
The next-server directive designates the TFTP server (the default is to use the same host as the DHCP server).
The filename directive defines the file that etherboot will load as a kernel.
Note: PXE appears to prefer a relative file name, and it loads pxeboot, not the kernel (option filename
"pxeboot").
The root-path option defines the path to the root filesystem, in usual NFS notation.
492
devicetype depends on the type of the Ethernet card in the diskless workstation. Refer to the NIC file in the same
directory to determine the right devicetype.
Create a directory from which tftpd will serve the files, i.e.: /tftpboot
2.
dgram
udp
wait
root
/usr/libexec/tftpd
tftpd -s /tftpboot
Note: It appears that at least some PXE versions want the TCP version of TFTP. In this case, add a second
line, replacing dgram udp with stream tcp.
3.
You can place the tftpboot directory anywhere on the server. Make sure that the location is set in both
inetd.conf and dhcpd.conf.
You also need to enable NFS and export the appropriate filesystem on the NFS server.
493
2.
Export the filesystem where the diskless root directory is located by adding the following to /etc/exports
(adjust the volume mount point and replace margaux with the name of the diskless workstation):
/data/misc -alldirs -ro margaux
3.
Tell mountd to reread its configuration file. If you actually needed to enable NFS in /etc/rc.conf at the first
step, you probably want to reboot instead.
# kill -HUP cat /var/run/mountd.pid
BOOTP
BOOTP_NFSROOT
BOOTP_COMPAT
You may also want to use BOOTP_NFSV3 and BOOTP_WIRED_TO (refer to LINT).
Build the kernel (See Chapter 9), and copy it to the tftp directory, under the name listed in dhcpd.conf.
The easiest way to do this is to use the /usr/share/examples/diskless/clone_root shell script. This script
needs customization, at least to adjust the place where the filesystem will be created (the DEST variable).
Refer to the comments at the top of the script for instructions. They explain how the base filesystem is built, and how
files may be selectively overridden by versions specific to diskless operation, to a subnetwork, or to an individual
workstation. They also give examples for the diskless /etc/fstab and /etc/rc.conf files.
The README files in /usr/share/examples/diskless contain a lot of interesting background information, but,
together with the other examples in the diskless directory, they actually document a configuration method which is
distinct from the one used by clone_root and /etc/rc.diskless[12], which is a little confusing. Use them for
reference only, except if you prefer the method that they describe, in which case you will need customized rc scripts.
494
The idea is that, at least for a FreeBSD client, DHCP/BOOTP option code 128 is the path to the NFS swap file,
and option code 129 is the swap size in kilobytes. Older versions of dhcpd allowed a syntax of option
option-128 "..., which does not seem to work any more.
/etc/bootptab would use the following syntax instead:
T128="192.168.4.4:/netswapvolume/netswap":T129=64000
2.
mkdir /netswapvolume/netswap
cd /netswapvolume/netswap
dd if=/dev/zero bs=1024 count=64000 of=swap.192.168.4.6
chmod 0600 swap.192.168.4.6
On the NFS swap file server, add the following line to /etc/exports:
/netswapvolume
495
19.7 ISDN
A good resource for information on ISDN technology and hardware is Dan Kegels ISDN Page
(http://alumni.caltech.edu/~dank/isdn/).
A quick simple road map to ISDN follows:
If you live in Europe you might want to investigate the ISDN card section.
If you are planning to use ISDN primarily to connect to the Internet with an Internet Provider on a dial-up
non-dedicated basis, you might look into Terminal Adapters. This will give you the most flexibility, with the
fewest problems, if you change providers.
If you are connecting two LANs together, or connecting to the Internet with a dedicated ISDN connection, you
might consider the stand alone router/bridge option.
Cost is a significant factor in determining what solution you will choose. The following options are listed from least
expensive to most expensive.
496
Adtran
Most other TAs will probably work as well, TA vendors try to make sure their product can accept most of the
standard modem AT command set.
The real problem with external TAs is that, like modems, you need a good serial card in your computer.
You should read the FreeBSD Serial Hardware (../../articles/serial-uart/index.html) tutorial for a detailed
understanding of serial devices, and the differences between asynchronous and synchronous serial ports.
A TA running off a standard PC serial port (asynchronous) limits you to 115.2 Kbs, even though you have a 128 Kbs
connection. To fully utilize the 128 Kbs that ISDN is capable of, you must move the TA to a synchronous serial card.
Do not be fooled into buying an internal TA and thinking you have avoided the synchronous/asynchronous issue.
Internal TAs simply have a standard PC serial port chip built into them. All this will do is save you having to buy
another serial cable and find another empty electrical socket.
A synchronous card with a TA is at least as fast as a stand-alone router, and with a simple 386 FreeBSD box driving
it, probably more flexible.
The choice of sync/TA v.s. stand-alone router is largely a religious issue. There has been some discussion of this in
the mailing lists. I suggest you search the archives (../../../../search/index.html) for the complete discussion.
497
Router
ISDN BRI Line
FreeBSD Box
The
Internet
Windows 95
Sun Workstation
If your home/branch office is only one computer you can use a twisted pair crossover cable to connect to the
stand-alone router directly.
498
Hub
Router
ISDN BRI Line
FreeBSD Box
Novell Server
Windows 95
The
Internet
Sun Workstation
One large advantage of most routers/bridges is that they allow you to have 2 separate independent PPP connections
to 2 separate sites at the same time. This is not supported on most TAs, except for specific (usually expensive)
models that have two serial ports. Do not confuse this with channel bonding, MPP, etc.
This can be a very useful feature if, for example, you have an dedicated ISDN connection at your office and would
like to tap into it, but do not want to get another ISDN line at work. A router at the office location can manage a
dedicated B channel connection (64 Kbps) to the Internet and use the other B channel for a separate data connection.
The second B channel can be used for dial-in, dial-out or dynamically bonding (MPP, etc.) with the first B channel
for more bandwidth.
An Ethernet bridge will also allow you to transmit more than just IP traffic. You can also send IPX/SPX or whatever
other protocols you use.
19.8 NIS/YP
Written by Bill Swingle. Enhanced by Eric Ogren and Udo Erdelhoff.
499
Description
NIS domainname
portmap
ypbind
ypserv
rpc.yppasswdd
500
A NIS master server. This server, analogous to a Windows NT primary domain controller, maintains the files used
by all of the NIS clients. The passwd, group, and other various files used by the NIS clients live on the master
server.
Note: It is possible for one machine to be an NIS master server for more than one NIS domain. However, this
will not be covered in this introduction, which assumes a relatively small-scale NIS environment.
NIS slave servers. Similar to NTs backup domain controllers, NIS slave servers maintain copies of the NIS
masters data files. NIS slave servers provide the redundancy, which is needed in important environments. They
also help to balance the load of the master server: NIS Clients always attach to the NIS server whose response they
get first, and this includes slave-server-replies.
NIS clients. NIS clients, like most NT workstations, authenticate against the NIS server (or the NT domain
controller in the NT Workstation case) to log on.
19.8.4.1 Planning
Let us assume that you are the administrator of a small university lab. This lab, which consists of 15 FreeBSD
machines, currently has no centralized point of administration; each machine has its own /etc/passwd and
/etc/master.passwd. These files are kept in sync with each other only through manual intervention; currently,
when you add a user to the lab, you must run adduser on all 15 machines. Clearly, this has to change, so you have
decided to convert the lab to use NIS, using two of the machines as servers.
Therefore, the configuration of the lab now looks something like:
Machine name
IP address
Machine role
ellington
10.0.0.2
NIS master
coltrane
10.0.0.3
NIS slave
basie
10.0.0.4
Faculty workstation
bird
10.0.0.5
Client machine
cli[1-11]
10.0.0.[6-17]
If you are setting up a NIS scheme for the first time, it is a good idea to think through how you want to go about it.
No matter what the size of your network, there are a few decisions that need to be made.
501
This line will set the NIS domainname to test-domain upon network setup (e.g. after reboot).
502
This will tell FreeBSD to start up the NIS server processes when the networking is next brought up.
3.
nis_yppasswdd_enable="YES"
This will enable the rpc.yppasswdd daemon which, as mentioned above, will allow users to change their NIS
password from a client machine.
Note: Depending on your NIS setup, you may need to add further entries. See the
section about NIS servers that are also NIS clients, below, for details.
Now, all you have to do is to run the command /etc/netstart as superuser. It will set up everything for you, using
the values you defined in /etc/rc.conf.
You should remove all entries regarding system accounts (bin, tty, kmem, games, etc), as well as any accounts that
you do not want to be propagated to the NIS clients (for example root and any other UID 0 (superuser) accounts).
Note: Make sure the /var/yp/master.passwd is neither group nor world readable (mode 600)! Use the chmod
command, if appropriate.
When you have finished, it is time to initialize the NIS maps! FreeBSD includes a script named ypinit to do this for
you (see its manual page for more information). Note that this script is available on most Unix Operating Systems,
but not on all. On Digital Unix/Compaq Tru64 Unix it is called ypsetup. Because we are generating maps for an
NIS master, we are going to pass the -m option to ypinit. To generate the NIS maps, assuming you already
performed the steps above, run:
ellington# ypinit -m test-domain
Server Type: MASTER Domain: test-domain
Creating an YP server will require that you answer a few questions.
Questions will all be asked at the beginning of the procedure.
Do you want this procedure to quit on non-fatal errors? [y/n: n] n
Ok, please remember to go back and redo manually whatever fails.
If you dont, something might not work.
At this point, we have to construct a list of this domains YP servers.
503
assumes that you are operating in a single server NIS environment with only FreeBSD machines. Since test-domain
has a slave server as well, you must edit /var/yp/Makefile:
ellington# vi /var/yp/Makefile
504
You should now have a directory called /var/yp/test-domain. Copies of the NIS master servers maps should be
in this directory. You will need to make sure that these stay updated. The following /etc/crontab entries on your
slave servers should do the job:
20
21
*
*
*
*
*
*
*
*
root
root
/usr/libexec/ypxfr passwd.byname
/usr/libexec/ypxfr passwd.byuid
These two lines force the slave to sync its maps with the maps on the master server. Although these entries are not
mandatory, since the master server attempts to ensure any changes to its NIS maps are communicated to its slaves
and because password information is vital to systems depending on the server, it is a good idea to force the updates.
This is more important on busy networks where map updates might not always complete.
Now, run the command /etc/netstart on the slave server as well, which again starts the NIS server.
505
Edit the file /etc/rc.conf and add the following lines in order to set the NIS domainname and start ypbind
upon network startup:
nisdomainname="test-domain"
nis_client_enable="YES"
2.
To import all possible password entries from the NIS server, remove all user accounts from your
/etc/master.passwd file and use vipw to add the following line to the end of the file:
+:::::::::
Note: This line will afford anyone with a valid account in the NIS servers password maps an account. There
are many ways to configure your NIS client by changing this line. See the netgroups section below for more
information. For more detailed reading see OReillys book on Managing NFS and NIS.
Note: You should keep at least one local account (i.e. not imported via NIS) in your /etc/master.passwd
and this account should also be a member of the group wheel. If there is something wrong with NIS, this
account can be used to log in remotely, become root, and fix things.
3.
To import all possible group entries from the NIS server, add this line to your /etc/group file:
+:*::
After completing these steps, you should be able to run ypcat passwd and see the NIS servers passwd map.
506
If ypserv(8) receives a request from an address that matches one of these rules, it will process the request normally. If
the address fails to match a rule, the request will be ignored and a warning message will be logged. If the
/var/yp/securenets file does not exist, ypserv will allow connections from any host.
The ypserv program also has support for Wietse Venemas tcpwrapper package. This allows the administrator to
use the tcpwrapper configuration files for access control instead of /var/yp/securenets.
Note: While both of these access control mechanisms provide some security, they, like the privileged port test,
are vulnerable to IP spoofing attacks. All NIS-related traffic should be blocked at your firewall.
Servers using /var/yp/securenets may fail to serve legitimate NIS clients with archaic TCP/IP
implementations. Some of these implementations set all host bits to zero when doing broadcasts and/or fail to
observe the subnet mask when calculating the broadcast address. While some of these problems can be fixed by
changing the client configuration, other problems may force the retirement of the client systems in question or the
abandonment of /var/yp/securenets.
Using /var/yp/securenets on a server with such an archaic implementation of TCP/IP is a really bad idea and
will lead to loss of NIS functionality for large parts of your network.
The use of the tcpwrapper package increases the latency of your NIS server. The additional delay may be long
enough to cause timeouts in client programs, especially in busy networks or with slow NIS servers. If one or
more of your client systems suffers from these symptoms, you should convert the client systems in question into
NIS slave servers and force them to bind to themselves.
507
Description
alpha, beta
508
Description
charlie, delta
Ordinary employees
Machine Name(s)
Description
trashcan
If you tried to implement these restrictions by separately blocking each user, you would have to add one -user line
to each systems passwd for each user who is not allowed to login onto that system. If you forget just one entry, you
could be in trouble. It may be feasible to do this correctly during the initial setup, however you will eventually forget
to add the lines for new users during day-to-day operations. After all, Murphy was an optimist.
Handling this situation with netgroups offers several advantages. Each user need not be handled separately; you
assign a user to one or more netgroups and allow or forbid logins for all members of the netgroup. If you add a new
machine, you will only have to define login restrictions for netgroups. If a new user is added, you will only have to
add the user to one or more netgroups. Those changes are independent of each other; no more for each combination
of user and machine do... If your NIS setup is planned carefully, you will only have to modify exactly one central
configuration file to grant or deny access to machines.
The first step is the initialization of the NIS map netgroup. FreeBSDs ypinit(8) does not create this map by default,
but its NIS implementation will support it once it has been created. To create an empty map, simply type
ellington# vi /var/yp/netgroup
and start adding content. For our example, we need at least four netgroups: IT employees, IT apprentices, normal
employees and interns.
IT_EMP
IT_APP
USERS
(,alpha,test-domain)
(,charlie,test-domain)
(,echo,test-domain)
(,golf,test-domain)
INTERNS (,able,test-domain)
(,beta,test-domain)
(,delta,test-domain)
(,foxtrott,test-domain) \
(,baker,test-domain)
IT_EMP, IT_APP etc. are the names of the netgroups. Each bracketed group adds one or more user accounts to it.
The three fields inside a group are:
1. The name of the host(s) where the following items are valid. If you do not specify a hostname, the entry is valid
on all hosts. If you do specify a hostname, you will enter a realm of darkness, horror and utter confusion.
2. The name of the account that belongs to this netgroup.
509
You can repeat this process if you need more than 225 users within a single netgroup.
This will generate the three NIS maps netgroup, netgroup.byhost and netgroup.byuser. Use ypcat(1) to
check if your new NIS maps are available:
ellington% ypcat -k netgroup
ellington% ypcat -k netgroup.byhost
ellington% ypcat -k netgroup.byuser
The output of the first command should resemble the contents of /var/yp/netgroup. The second command will
not produce output if you have not specified host-specific netgroups. The third command can be used to get the list of
netgroups for a user.
The client setup is quite simple. To configure the server war, you only have to start vipw(8) and replace the line
+:::::::::
with
+@IT_EMP:::::::::
Now, only the data for the users defined in the netgroup IT_EMP is imported into wars password database and only
these users are allowed to login.
Unfortunately, this limitation also applies to the ~ function of the shell and all routines converting between user
names and numerical user IDs. In other words, cd ~user will not work, ls -l will show the numerical id instead
of the username and find . -user joe -print will fail with No such user. To fix this, you will have to
import all user entries without allowing them to login onto your servers.
This can be achieved by adding another line to /etc/master.passwd. This line should contain:
510
After this change, you will only have to change one NIS map if a new employee joins the IT department. You could
use a similar approach for the less important servers by replacing the old +::::::::: in their local version of
/etc/master.passwd with something like this:
+@IT_EMP:::::::::
+@IT_APP:::::::::
+:::::::::/sbin/nologin
And everything would be fine until there is a policy change a few weeks later: The IT department starts hiring
interns. The IT interns are allowed to use the normal workstations and the less important servers; and the IT
apprentices are allowed to login onto the main servers. You add a new netgroup IT_INTERN, add the new IT interns
to this netgroup and start to change the config on each and every machine... As the old saying goes: Errors in
centralized planning lead to global mess.
NIS ability to create netgroups from other netgroups can be used to prevent situations like these. One possibility is
the creation of role-based netgroups. For example, you could create a netgroup called BIGSRV to define the login
restrictions for the important servers, another netgroup called SMALLSRV for the less important servers and a third
netgroup called USERBOX for the normal workstations. Each of these netgroups contains the netgroups that are
allowed to login onto these machines. The new entries for your NIS map netgroup should look like this:
BIGSRV
SMALLSRV
USERBOX
IT_EMP
IT_EMP
IT_EMP
IT_APP
IT_APP ITINTERN
ITINTERN USERS
This method of defining login restrictions works reasonably well if you can define groups of machines with identical
restrictions. Unfortunately, this is the exception and not the rule. Most of the time, you will need the ability to define
login restrictions on a per-machine basis.
Machine-specific netgroup definitions are the other possibility to deal with the policy change outlined above. In this
scenario, the /etc/master.passwd of each box contains two lines starting with +. The first of them adds a
netgroup with the accounts allowed to login onto this machine, the second one adds all other accounts with
/sbin/nologin as shell. It is a good idea to use the ALL-CAPS version of the machine name as the name of the
netgroup. In other words, the lines should look like this:
+@BOXNAME:::::::::
+:::::::::/sbin/nologin
511
If you are using some kind of database to manage your user accounts, you should be able to create the first part of the
map with your databases report tools. This way, new users will automatically have access to the boxes.
One last word of caution: It may not always be advisable to use machine-based netgroups. If you are deploying a
couple of dozen or even hundreds of identical machines for student labs, you should use role-based netgroups instead
of machine-based netgroups to keep the size of the NIS map within reasonable limits.
512
Every time you wish to add a user to the lab, you must add it to the master NIS server only, and you must
remember to rebuild the NIS maps. If you forget to do this, the new user will not be able to login anywhere except
on the NIS master. For example, if we needed to add a new user jsmith to the lab, we would:
# pw useradd jsmith
# cd /var/yp
# make test-domain
Keep the administration accounts out of the NIS maps. You do not want to be propagating administrative accounts
and passwords to machines that will have users that should not have access to those accounts.
Keep the NIS master and slave secure, and minimize their downtime. If somebody either hacks or simply turns off
these machines, they have effectively rendered many people without the ability to login to the lab.
This is the chief weakness of any centralized administration system, and it is probably the most important
weakness. If you do not protect your NIS servers, you will have a lot of angry users!
513
Other possible values for the passwd_format capability include blf and md5 (for Blowfish and MD5 encrypted
passwords, respectively).
If you have made changes to /etc/login.conf, you will also need to rebuild the login capability database, which
is achieved by running the following command as root:
# cap_mkdb /etc/login.conf
Note: The format of passwords already in /etc/master.passwd will not be updated until a user changes their
password for the first time after the login capability database is rebuilt.
Next, in order to ensure that passwords are encrypted with the format that you have chosen, you should also check
that the crypt_default in /etc/auth.conf gives precedence to your chosen password format. To do this, place
the format that you have chosen first in the list. For example, when using DES encrypted passwords, the entry would
be:
crypt_default = des blf md5
Having followed the above steps on each of the FreeBSD based NIS servers and clients, you can be sure that they all
agree on which password format is used within your network. If you have trouble authenticating on an NIS client,
this is a pretty good place to start looking for possible problems. Remember: if you want to deploy an NIS server for
a heterogenous network, you will probably have to use DES on all systems because it is the lowest common standard.
19.9 DHCP
Written by Greg Sutter.
514
Make sure that the bpf device is compiled into your kernel. To do this, add pseudo-device bpf to your kernel
configuration file, and rebuild the kernel. For more information about building kernels, see Chapter 9.
The bpf device is already part of the GENERIC kernel that is supplied with FreeBSD, so if you do not have a
custom kernel, you should not need to create one in order to get DHCP working.
Note: For those who are particularly security conscious, you should be warned that bpf is also the device that
allows packet sniffers to work correctly (although they still have to be run as root). bpf is required to use
DHCP, but if you are very sensitive about security, you probably should not add bpf to your kernel in the
expectation that at some point in the future you will be using DHCP.
515
If you are using a different location for dhclient, or if you wish to pass additional flags to dhclient, also
include the following (editing as necessary):
dhcp_program="/sbin/dhclient"
dhcp_flags=""
The DHCP server, dhcpd, is included as part of the net/isc-dhcp3 port in the ports collection. This port contains
the full ISC DHCP distribution, consisting of client, server, relay agent and documentation.
19.9.5 Files
/etc/dhclient.conf
dhclient requires a configuration file, /etc/dhclient.conf. Typically the file contains only comments, the
defaults being reasonably sane. This configuration file is described by the dhclient.conf(5) manual page.
/sbin/dhclient
dhclient is statically linked and resides in /sbin. The dhclient(8) manual page gives more information about
dhclient.
/sbin/dhclient-script
/var/db/dhclient.leases
The DHCP client keeps a database of valid leases in this file, which is written as a log. dhclient.leases(5) gives a
slightly longer description.
516
The next thing that you will need to do is edit the sample dhcpd.conf which was installed by the net/isc-dhcp3
port. By default, this will be /usr/local/etc/dhcpd.conf.sample, and you should copy this to
/usr/local/etc/dhcpd.conf before proceeding to make changes.
example :
option domain-name "example.com";
option domain-name-servers 192.168.4.100;
option subnet-mask 255.255.255.0;
default-lease-time 3600;
max-lease-time 86400;
ddns-update-style none;
subnet 192.168.4.0 netmask 255.255.255.0 {
range 192.168.4.129 192.168.4.254;
option routers 192.168.4.1;
}
host mailhost {
hardware ethernet 02:03:04:05:06:07;
fixed-address mailhost.example.com;(10)
}
This option specifies the domain that will be provided to clients as the default search domain. See resolv.conf(5)
for more information on what this means.
This option specifies a comma separated list of DNS servers that the client should use.
517
A client may request a specific length of time that a lease will be valid. Otherwise the server will assign a lease
with this expiry value (in seconds).
This is the maximum length of time that the server will lease for. Should a client request a longer lease, a lease
will be issued, although it will only be valid for max-lease-time seconds.
This option specifies whether the DHCP server should attempt to update DNS when a lease is accepted or
released. In the ISC implementation, this option is required.
This denotes which IP addresses should be used in the pool reserved for allocating to clients. IP addresses
between, and including, the ones stated are handed out to clients.
The hardware MAC address of a host (so that the DHCP server can recognize a host when it makes a request).
(10) Specifies that the host should always be given the same IP address. Note that a hostname is OK here, since the
DHCP server will resolve the hostname itself before returning the lease information.
Once you have finished writing your dhcpd.conf, you can proceed to start the server by issuing the following
command:
# /usr/local/etc/rc.d/isc-dhcpd.sh start
Should you need to make changes to the configuration of your server in the future, it is important to note that sending
a SIGHUP signal to dhcpd does not result in the configuration being reloaded, as it does with most daemons. You
will need to send a SIGTERM signal to stop the process, and then restart it using the command above.
19.9.7.4 Files
/usr/local/sbin/dhcpd
dhcpd is statically linked and resides in /usr/local/sbin. The dhcpd(8) manual page installed with the port
gives more information about dhcpd.
/usr/local/etc/dhcpd.conf
dhcpd requires a configuration file, /usr/local/etc/dhcpd.conf before it will start providing service to
clients. This file needs to contain all the information that should be provided to clients that are being serviced,
along with information regarding the operation of the server. This configuration file is described by the
dhcpd.conf(5) manual page installed by the port.
/var/db/dhcpd.leases
The DHCP server keeps a database of leases it has issued in this file, which is written as a log. The manual page
dhcpd.leases(5), installed by the port gives a slightly longer description.
/usr/local/sbin/dhcrelay
518
19.10 DNS
Contributed by Chern Lee.
19.10.1 Overview
FreeBSD utilizes, by default, a version of BIND (Berkeley Internet Name Domain), which is the most common
implementation of the DNS protocol. DNS is the protocol through which names are mapped to IP addresses, and
vice versa. For example, a query for www.FreeBSD.org will receive a reply with the IP address of The FreeBSD
Projects web server, whereas, a query for ftp.FreeBSD.org will return the IP address of the corresponding FTP
machine. Likewise, the opposite can happen. A query for an IP address can resolve its hostname. It is not necessary
to run a name server to perform DNS lookups on a system.
DNS is coordinated across the Internet through a somewhat complex system of authoritative root name servers, and
other smaller-scale name servers who host and cache individual domain information.
This document refers to BIND 8.x, as it is the stable version used in FreeBSD. BIND 9.x in FreeBSD can be installed
through the net/bind9 port.
RFC1034 and RFC1035 dictate the DNS protocol.
Currently, BIND is maintained by the Internet Software Consortium (www.isc.org) (http://www.isc.org/)
19.10.2 Terminology
To understand this document, some terms related to DNS must be understood.
Term
Definition
forward DNS
origin
named, bind, name server
resolver
reverse DNS
root zone
519
Definition
zone
Examples of zones:
org.
example.org is
foo.example.org. is
1.2.3.in-addr.arpa is
a zone referencing all IP addresses which fall under the 3.2.1.* IP space.
As one can see, the more specific part of a hostname appears to its left. For example, example.org. is more
specific than org., as org. is more specific than the root zone. The layout of each part of a hostname is much like a
filesystem: the /dev directory falls within the root, and so on.
one wants to serve DNS information to the world, replying authoritatively to queries.
a domain, such as example.org, is registered and IP addresses need to be assigned to hostnames under it.
a backup name server, called a slave, must reply to queries when the primary is down or inaccessible.
a local DNS server may cache and respond more quickly than querying an outside name server.
a reduction in overall network traffic is desired (DNS traffic has been measured to account for 5% or more of total
Internet traffic).
When one queries for www.FreeBSD.org, the resolver usually queries the uplink ISPs name server, and retrieves
the reply. With a local, caching DNS server, the query only has to be made once to the outside world by the caching
DNS server. Every additional query will not have to look to the outside of the local network, since the information is
cached locally.
Description
named
ndc
520
Description
/etc/namedb
/etc/namedb/named.conf
Zone files are usually contained within the /etc/namedb directory, and contain the DNS zone information served
by the name server.
19.10.6.2 /etc/namedb/named.conf
//
//
//
//
//
//
//
$FreeBSD$
Refer to the named(8) manual page for details. If you are ever going
to setup a primary server, make sure youve understood the hairy
details of how DNS is working. Even with simple mistakes, you can
break connectivity for affected parties, or cause huge amount of
useless Internet traffic.
options {
directory "/etc/namedb";
// In addition to the "forwarders" clause, you can force your name
// server to never initiate queries of its own, but always ask its
// forwarders only, by enabling the following line:
//
//
forward only;
521
Just as the comment says, to benefit from an uplinks cache, forwarders can be enabled here. Under normal
circumstances, a name server will recursively query the Internet looking at certain name servers until it finds the
answer it is looking for. Having this enabled will have it query the uplinks name server (or name server provided)
first, taking advantage of its cache. If the uplink name server in question is a heavily trafficked, fast name server,
enabling this may be worthwhile.
Warning: 127.0.0.1 will not work here. Change this IP address to a name server at your uplink.
/*
* If there is a firewall between you and name servers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
/*
* If running in a sandbox, you may have to specify a different
* location for the dumpfile.
*/
// dump-file "s/named_dump.db";
};
// Note: the following will be supported in a future release.
/*
host { any; } {
topology {
127.0.0.0/8;
};
};
*/
//
//
//
//
//
//
Setting up secondaries is way easier and the rough picture for this
is explained below.
If you enable a local name server, dont forget to enter 127.0.0.1
into your /etc/resolv.conf so this server will be queried first.
Also, make sure to enable it in /etc/rc.conf.
zone "." {
522
NB: Do not use the IP addresses below, they are faked, and only
serve demonstration/documentation purposes!
Example secondary config entries. It can be convenient to become
a secondary at least for the zone where your own domain is in. Ask
your network administrator for the IP address of the responsible
primary.
Never forget to include the reverse lookup (IN-ADDR.ARPA) zone!
(This is the first bytes of the respective IP address, in reverse
order, with ".IN-ADDR.ARPA" appended.)
Before starting to setup a primary zone, better make sure you fully
understand how DNS and BIND works, however. There are sometimes
unobvious pitfalls. Setting up a secondary is comparably simpler.
NB: Dont blindly enable the examples below. :-)
and addresses instead.
For more information on running BIND in a sandbox, see Running named in a sandbox.
/*
zone "example.com" {
type slave;
file "s/example.com.bak";
masters {
192.168.1.1;
};
};
523
In named.conf, these are examples of slave entries for a forward and reverse zone.
For each new zone served, a new zone entry must be added to named.conf
For example, the simplest zone entry for example.org can look like:
zone "example.org" {
type master;
file "example.org";
};
The zone is a master, as indicated by the type statement, holding its zone information in
/etc/namedb/example.org indicated by the file statement.
zone "example.org" {
type slave;
file "example.org";
};
In the slave case, the zone information is transferred from the master name server for the particular zone, and saved
in the file specified. If and when the master server dies or is unreachable, the slave name server will have the
transferred zone information and will be able to serve it.
ns1.example.org.
ns2.example.org.
; Machine Names
localhost
IN A
ns1
IN A
ns2
IN A
127.0.0.1
3.2.1.2
3.2.1.3
524
IN A
IN A
3.2.1.10
3.2.1.30
; Aliases
www
IN CNAME
; MX Record
@
IN MX
mail.example.org.
10
Note that every hostname ending in a . is an exact hostname, whereas everything without a trailing . is
referenced to the origin. For example, www is translated into www + origin. In our fictitious zone file, our origin is
example.org., so www would translate to www.example.org.
The format of a zone file follows:
recordname
IN recordtype
value
example.org.
the domain name, also the origin for this zone file.
525
the responsible person for this zone, email address with @ replaced. (<admin@example.org> becomes
admin.example.org)
5
the serial number of the file. this must be incremented each time the zone file is modified. Nowadays, many
admins prefer a yyyymmddrr format for the serial number. 2001041002 would mean last modified 04/10/2001,
the latter 02 being the second time the zone file has been modified this day. The serial number is important as it
alerts slave name servers for a zone when it is updated.
@
IN NS
ns1.example.org.
This is an NS entry. Every name server that is going to reply authoritatively for the zone must have one of these
entries. The @ as seen here could have been example.org. The @ translates to the origin.
localhost
ns1
ns2
mail
@
IN
IN
IN
IN
IN
A
A
A
A
A
127.0.0.1
3.2.1.2
3.2.1.3
3.2.1.10
3.2.1.30
The A record indicates machine names. As seen above, ns1.example.org would resolve to 3.2.1.2. Again, the
origin symbol, @, is used here, thus meaning example.org would resolve to 3.2.1.30.
www
IN CNAME
The canonical name record is usually used for giving aliases to a machine. In the example, www is aliased to the
machine addressed to the origin, or example.org (3.2.1.30). CNAMEs can be used to provide alias hostnames, or
round robin one hostname among multiple machines.
@
IN MX
10
mail.example.org.
The MX record indicates which mail servers are responsible for handling incoming mail for the zone.
mail.example.org is the hostname of the mail server, and 10 being the priority of that mail server.
One can have several mail servers, with priorities of 3, 2, 1. A mail server attempting to deliver to example.org
would first try the highest priority MX, then the second highest, etc, until the mail can be properly delivered.
For in-addr.arpa zone files (reverse DNS), the same format is used, except with PTR entries instead of A or CNAME.
$TTL 3600
1.2.3.in-addr.arpa. IN SOA ns1.example.org. admin.example.org. (
5
; Serial
10800
; Refresh
3600
; Retry
604800
; Expire
3600 )
; Minimum
526
IN NS
IN NS
ns1.example.org.
ns2.example.org.
2
3
10
30
IN
IN
IN
IN
ns1.example.org.
ns2.example.org.
mail.example.org.
example.org.
PTR
PTR
PTR
PTR
This file gives the proper IP address to hostname mappings of our above fictitious domain.
Since named will not be able to access anything outside of the sandbox (such as shared libraries, log sockets, and so
on), there are a number of steps that need to be followed in order to allow named to function correctly. In the
following checklist, it is assumed that the path to the sandbox is /etc/namedb and that you have made no prior
modifications to the contents of this directory. Perform the following steps as root.
named only needs write access to these directories, so that is all we give it.
#
#
#
#
#
527
Build a statically linked copy of named-xfer, and copy it into the sandbox:
#
#
#
#
#
#
#
cd /usr/src/lib/libisc
make cleandir && make cleandir && make
cd /usr/src/lib/libbind
make cleandir && make cleandir && make
cd /usr/src/libexec/named-xfer
make cleandir && make cleandir && make
cp named-xfer /etc/namedb/bin && chmod
After your statically linked named-xfer is installed some cleaning up is required, to avoid leaving stale copies of
libraries or programs in your source tree:
#
#
#
#
#
#
cd /usr/src/lib/libisc
make cleandir
cd /usr/src/lib/libbind
make cleandir
cd /usr/src/libexec/named-xfer
make cleandir
This step has been reported to fail occasionally. If this happens to you, then issue the command:
# cd /usr/src && make cleandir && make cleandir
This will clean out any cruft from your source tree, and retrying the steps above should then work.
528
Configure syslogd(8) to create an extra log socket that named can write to. To do this, add -l
/etc/namedb/dev/log to the syslogd_flags variable in /etc/rc.conf.
Arrange to have named start and chroot itself to the sandbox by adding the following to /etc/rc.conf:
named_enable="YES"
named_flags="-u bind -g bind -t /etc/namedb /etc/named.conf"
Note: Note that the configuration file /etc/named.conf is denoted by a full pathname relative to the
sandbox, i.e. in the line above, the file referred to is actually /etc/namedb/etc/named.conf.
The next step is to edit /etc/namedb/etc/named.conf so that named knows which zones to load and where to
find them on the disk. There follows a commented example (anything not specifically commented here is no different
from the setup for a DNS server not running in a sandbox):
options {
directory "/";
named-xfer "/bin/named-xfer";
version ""; // Dont reveal BIND version
query-source address * port 53;
};
// ndc control socket
controls {
unix "/var/run/ndc" perm 0600 owner 0 group 0;
};
// Zones follow:
zone "localhost" IN {
type master;
file "master/named.localhost";
allow-transfer { localhost; };
notify no;
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "master/localhost.rev";
allow-transfer { localhost; };
notify no;
};
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.int" {
type master;
file "master/localhost-v6.rev";
allow-transfer { localhost; };
notify no;
529
The directory statement is specified as /, since all files that named needs are within this directory (recall that
this is equivalent to a normal users /etc/namedb.
Specifies the full path to the named-xfer binary (from nameds frame of reference). This is necessary since
named is compiled to look for named-xfer in /usr/libexec by default.
Specifies the filename (relative to the directory statement above) where named can find the zonefile for this
zone.
Specifies the filename (relative to the directory statement above) where named should write a copy of the
zonefile for this zone after successfully transferring it from the master server. This is why we needed to change
the ownership of the directory slave to bind in the setup stages above.
After completing the steps above, either reboot your server or restart syslogd(8) and start named(8), making sure to
use the new options specified in syslogd_flags and named_flags. You should now be running a sandboxed copy
of named!
19.10.9 Security
Although BIND is the most common implementation of DNS, there is always the issue of security. Possible and
exploitable security holes are sometimes found.
It is a good idea to subscribe to CERT (http://www.cert.org/) and freebsd-security-notifications
(../handbook/eresources.html#ERESOURCES-MAIL) to stay up to date with the current Internet and FreeBSD
security issues.
Tip: If a problem arises, keeping sources up to date and having a fresh build of named would not hurt.
530
19.11 NTP
Contributed by Tom Hukins.
19.11.1 Overview
Over time, a computers clock is prone to drift. As time passes, the computers clock becomes less accurate. NTP
(Network Time Protocol) is one way to ensure your clock is right.
Many Internet services rely on, or greatly benefit from, computers clocks being accurate. For example, a Web server
may receive requests to send a file if it has modified since a certain time. Services such as cron(8) run commands at a
given time. If the clock is inaccurate, these commands may not run when expected.
FreeBSD ships with the ntpd(8) NTP server which can be used to query other NTP servers to set the clock on your
machine or provide time services to others.
531
to /etc/rc.conf. You will also need to specify all servers you wish to synchronize with and any flags to be passed
to ntpdate(8) in ntpdate_flags.
The server option specifies which servers are to be used, with one server listed on each line. If a server is specified
with the prefer argument, as with ntplocal.example.com, that server is preferred over other servers. A
response from a preferred server will be discarded if it differs significantly from other servers responses, otherwise
it will be used without any consideration to other responses. The prefer argument is normally used for NTP servers
that are known to be highly accurate, such as those with special time monitoring hardware.
The driftfile option specifies which file is used to store the system clocks frequency offset. ntpd(8) uses this to
automatically compensate for the clocks natural drift, allowing it to maintain a reasonably correct setting even if it is
cut off from all external time sources for a period of time.
The driftfile option specifies which file is used to store information about previous responses from the NTP
servers you are using. This file contains internal information for NTP. It should not be modified by any other process.
If you only want to allow machines within your own network to synchronize their clocks with your server, but ensure
they are not allowed to configure the server or used as peers to synchronize against, add
restrict 192.168.1.0 mask 255.255.255.0 notrust nomodify notrap
instead, where 192.168.1.0 is an IP address on your network and 255.255.255.0 is your networks netmask.
/etc/ntp.conf can contain multiple restrict options. For more details, see the Access Control Support
subsection of ntp.conf(5).
532
to /etc/rc.conf. If you wish to pass additional flags to ntpd(8) edit the xntpd_flags parameter in
/etc/rc.conf.
To start the server without rebooting your machine, run ntpd being sure to specify any additional parameters from
xntpd_flags in /etc/rc.conf. For example:
# ntpd -p /var/run/ntpd.pid
connection that is configured to dial out on demand, it is a good idea to prevent NTP traffic from triggering a dial out
or keeping the connection alive. If you are using user PPP, you can use filter directives in /etc/ppp/ppp.conf.
For example:
set filter dial 0 deny udp src eq 123
# Prevent NTP traffic from initiating dial out
set filter dial 1 permit 0 0
set filter alive 0 deny udp src eq 123
# Prevent incoming NTP traffic from keeping the connection open
set filter alive 1 deny udp dst eq 123
# Prevent outgoing NTP traffic from keeping the connection open
set filter alive 2 permit 0/0 0/0
For more details see the PACKET FILTERING section in ppp(8) and the examples in
/usr/share/examples/ppp/.
Note: Some Internet access providers block low-numbered ports, preventing NTP from functioning since replies
never reach your machine.
533
19.12.1 Overview
FreeBSDs Network Address Translation daemon, commonly known as natd(8) is a daemon that accepts incoming
raw IP packets, changes the source to the local machine and re-injects these packets back into the outgoing IP packet
stream. natd does this by changing the source IP address and port such that when data is received back, it is able to
determine the original location of the data and forward it back to its original requester.
The most common use of NAT is to perform what is commonly known as Internet Connection Sharing.
19.12.2 Setup
Due to the diminishing IP space in IPv4, and the increased number of users on high-speed consumer lines such as
cable or DSL, people are increasingly in need of an Internet Connection Sharing solution. The ability to connect
several computers online through one connection and IP address makes natd(8) a reasonable choice.
Most commonly, a user has a machine connected to a cable or DSL line with one IP address and wishes to use this
one connected computer to provide Internet access to several more over a LAN.
To do this, the FreeBSD machine on the Internet must act as a gateway. This gateway machine must have two
NICs--one for connecting to the Internet router, the other connecting to a LAN. All the machines on the LAN are
connected through a hub or switch.
Hub
Client A
Router
Client B
(FreeBSD Gateway)
The
Internet
A setup like this is commonly used to share an Internet connection. One of the LAN machines is connected to the
Internet. The rest of the machines access the Internet through that gateway machine.
19.12.3 Configuration
The following options must be in the kernel configuration file:
options IPFIREWALL
options IPDIVERT
534
gateway_enable="YES"
firewall_enable="YES"
firewall_type="OPEN"
natd_interface="fxp0"
natd_flags=""
Having the previous options defined in /etc/rc.conf would run natd -interface fxp0 at boot. This can also
be run manually.
Each machine and interface behind the LAN should be assigned IP address numbers in the private network space as
defined by RFC 1918 (ftp://ftp.isi.edu/in-notes/rfc1918.txt) and have a default gateway of the natd machines internal
IP address.
For example, client a and b behind the LAN have IP addresses of 192.168.0.2 and 192.168.0.3, while the natd
machines LAN interface has an IP address of 192.168.0.1. Client a and bs default gateway must be set to that of
the natd machine, 192.168.0.1. The natd machines external, or Internet interface does not require any special
modification for natd to work.
535
This will redirect the proper tcp ports to the LAN client machines.
The -redirect_port argument can be used to indicate port ranges over individual ports. For example, tcp
192.168.0.2:2000-3000 2000-3000 would redirect all connections received on ports 2000 to 3000 to ports
2000 to 3000 on Client A.
These options can be used when directly running natd(8) or placed within the
natd_flags=""
option in /etc/rc.conf.
For further configuration options, consult natd(8)
localIP
publicIP
Like -redirect_port, these arguments are also placed within natd_flags of /etc/rc.conf. With address redirection,
there is no need for port redirection since all data received on a particular IP address is redirected.
The external IP addresses on the natd machine must be active and aliased to the external interface. Look at rc.conf(5)
to do so.
536
19.13.1 Overview
inetd(8) is referred to as the Internet Super-Server because it manages connections for several daemons. Programs
that provide network service are commonly known as daemons. inetd serves as a managing server for other
daemons. When a connection is received by inetd, it determines which daemon the connection is destined for,
spawns the particular daemon and delegates the socket to it. Running one instance of inetd reduces the overall
system load as compared to running each daemon individually in stand-alone mode.
Primarily, inetd is used to spawn other daemons, but several trivial protocols are handled directly, such as chargen,
auth, and daytime.
This section will cover the basics in configuring inetd through its command-line options and its configuration file,
/etc/inetd.conf.
19.13.2 Settings
inetd is initialized through the /etc/rc.conf system. The inetd_enable option is set to NO by default, but is
often times turned on by sysinstall with the medium security profile. Placing:
inetd_enable="YES"
or
inetd_enable="NO"
-d
Turn on debugging.
-l
Turn on logging of successful connections.
-w
Turn on TCP Wrapping for external services (on by default).
537
-p
Specify an alternate file in which to store the process ID.
These options can be passed to inetd using the inetd_flags option in /etc/rc.conf. By default, inetd_flags
is set to -wW, which turns on TCP wrapping for inetds internal and external services. For novice users, these
parameters usually do not need to be modified or even entered in /etc/rc.conf.
Note: An external service is a daemon outside of inetd, which is invoked when a connection is received for it. On
the other hand, an internal service is one that inetd has the facility of offering within itself.
19.13.4 inetd.conf
Configuration of inetd is controlled through the /etc/inetd.conf file.
When a modification is made to /etc/inetd.conf, inetd can be forced to re-read its configuration file by sending
a HangUP signal to the inetd process as shown:
538
Each line of the configuration file specifies an individual daemon. Comments in the file are preceded by a #. The
format of /etc/inetd.conf is as follows:
service-name
socket-type
protocol
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute]]
user[:group][/login-class]
server-program
server-program-arguments
stream
tcp
nowait
root
/usr/libexec/ftpd
ftpd -l
service-name
This is the service name of the particular daemon. It must correspond to a service listed in /etc/services.
This determines which port inetd must listen to. If a new service is being created, it must be placed in
/etc/services first.
socket-type
Either stream, dgram, raw, or seqpacket. stream must be used for connection-based, TCP daemons, while
dgram is used for daemons utilizing the UDP transport protocol.
protocol
One of the following:
Protocol
Explanation
tcp, tcp4
TCP IPv4
udp, udp4
UDP IPv4
tcp6
TCP IPv6
udp6
UDP IPv6
tcp46
udp46
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute]]
wait|nowait indicates whether the daemon invoked from inetd is able to handle its own socket or not. dgram
socket types must use the wait option, while stream socket daemons, which are usually multi-threaded, should
use nowait. wait usually hands off multiple sockets to a single daemon, while nowait spawns a child daemon
for each new socket.
The maximum number of child daemons inetd may spawn can be set using the max-child option. If a limit of
539
tcp
user
The user is the username that the particular daemon should run as. Most commonly, daemons run as the root
user. For security purposes, it is common to find some servers running as the daemon user, or the least
privileged nobody user.
server-program
The full path of the daemon to be executed when a connection is received. If the daemon is a service provided
by inetd internally, then internal should be used.
server-program-arguments
This works in conjunction with server-program by specifying the arguments, starting with argv[0], passed to
the daemon on invocation. If mydaemon -d is the command line, mydaemon -d would be the value of server
program arguments. Again, if the daemon is an internal service, use internal here.
19.13.5 Security
Depending on the security profile chosen at install, many of inetds daemons may be enabled by default. If there is
no apparent need for a particular daemon, disable it! Place a # in front of the daemon in question, and send a
hangup signal to inetd. Some daemons, such as fingerd, may not be desired at all because they provide an attacker
with too much information.
Some daemons are not security-conscious and have long, or non-existent timeouts for connection attempts. This
allows an attacker to slowly send connections to a particular daemon, thus saturating available resources. It may be a
good idea to place ip-per-minute and max-child limitations on certain daemons.
By default, TCP wrapping is turned on. Consult the hosts_access(5) manual page for more information on placing
TCP restrictions on various inetd invoked daemons.
540
19.13.6 Miscellaneous
daytime, time, echo, discard, chargen, and auth are all internally provided services of inetd.
The auth service provides identity (ident, identd) network services, and is configurable to a certain degree.
Consult the inetd(8) manual page for more in-depth information.
A-End
B-End
Descr.
Post/Bit
DATA0
-ERROR
2
15
15
2
Data
0/0x01
1/0x08
DATA1
+SLCT
3
13
13
3
Data
0/0x02
1/0x10
DATA2
+PE
4
12
12
4
Data
0/0x04
1/0x20
DATA3
-ACK
5
10
10
5
Strobe
0/0x08
1/0x40
DATA4
BUSY
6
11
11
6
Data
0/0x10
1/0x80
GND
18-25
18-25
GND
541
IP Address
You now should have a working connection. Please read the manual pages lp(4) and lpt(4) for more details.
You should also add both hosts to /etc/hosts:
127.0.0.1
10.0.0.1
10.0.0.2
localhost.my.domain localhost
host1.my.domain host1
host2.my.domain
To confirm the connection works, go to each host and ping the other. For example, on host1:
# ifconfig lp0
lp0: flags=8851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 10.0.0.1 --> 10.0.0.2 netmask 0xff000000
# netstat -r
Routing tables
Internet:
Destination
Gateway
Flags
host2
host1
UH
# ping -c 4 host2
PING host2 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: icmp_seq=0 ttl=255
64 bytes from 10.0.0.2: icmp_seq=1 ttl=255
64 bytes from 10.0.0.2: icmp_seq=2 ttl=255
64 bytes from 10.0.0.2: icmp_seq=3 ttl=255
Refs
4
time=2.774
time=2.530
time=2.556
time=2.714
Use
127592
Netif Expire
lp0
ms
ms
ms
ms
--- host2 ping statistics --4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 2.530/2.643/2.774/0.103 ms
19.15 IPv6
Originally Written by Aaron Kaplan. Restructured and Added by Tom Rhodes.
IPv6 (also know as IPng IP next generation) is the new version of the well known IP protocol (also know as IPv4).
Like the other current *BSD systems, FreeBSD includes the KAME IPv6 reference implementation. So your
542
Running out of addresses. Today this is not so much of a concern anymore since private address spaces
(10.0.0.0/8, 192.168.0.0/24, etc.) and Network Address Translation (NAT) are being employed.
Router table entries were getting too large. This is still a concern today.
Routers will only store network aggregation addresses in their routing tables thus reducing the average space of a
routing table to 8192 entries.
There are also lots of other useful features of IPv6 such as:
Mobile IP
IPv6.org (http://www.ipv6.org)
KAME.net (http://www.kame.net)
6bone.net (http://www.6bone.net)
543
Often an address will have long substrings of all zeros therefore each such substring can be abbreviated by ::. For
example fe80::1 corresponds to the canonical form fe80:0000:0000:0000:0000:0000:0000:0001
A third form is to write the last 32 Bit part in the well known (decimal) IPv4 style with dots . as separators. For
example 2002::10.0.0.1 corresponds to the (hexadecimal) canonical representation
2002:0000:0000:0000:0000:0000:0a00:0001 which in turn is equivalent to writing 2002::a00:1
By now the reader should be able to understand the following:
# ifconfig
544
Getting an IPv6 network from your upstream provider. Talk to your Internet provider for instructions.
Here we will talk on how to connect to the 6bone since it currently seems to be the most popular way.
First take a look at the 6bone site and find a 6bone connection nearest to you. Write to the responsible person and
with a little bit of luck you will be given instructions on how to set up your connection. Usually this involves setting
up a GRE (gif) tunnel.
Here is a typical example on setting up a gif(4) tunnel:
# ifconfig gif0 create
# ifconfig gif0
Replace the capitalized words by the information you received from the upstream 6bone node.
This establishes the tunnel. Check if the tunnel is working by ping6(8) ing ff02::1%gif0. You should receive two
ping replies.
Note: In case you are intrigued by the address ff02:1%gif0, this is a multicast address. %gif0 states that the
multicast address at network interface gif0 is to be used. Since we ping a multicast address the other endpoint of
the tunnel should reply as well).
545
AAAA records,
A6 records
Using AAAA records is straightforward. Assign your hostname to the new IPv6 address you just got by adding:
MYHOSTNAME
AAAA
MYIPv6ADDR
To your primary zone DNS file. In case you do not serve your own DNS zones ask your DNS provider. Current
versions of bind (version 8.3 and 9) support AAAA records.
546
20.1 Synopsis
Electronic Mail, better known as email, is one of the most widely used forms of communication today. This
chapter provides a basic introduction to running a mail server on FreeBSD. However, it is not a complete reference
and in fact many important considerations are omitted. For more complete coverage of the subject, the reader is
referred to the many excellent books listed in Appendix B.
After reading this chapter, you will know:
What software components are involved in sending and receiving electronic mail.
How to block spammers from illegally using your mail server as a relay.
How to install and configure an alternate mail transfer agent on your system, replacing sendmail.
Properly setup the DNS information for your mail host (Chapter 19).
547
Get a POP or IMAP daemon from the ports collection (../../../../ports/mail.html) and install it on your system.
2.
Function
/etc/mail/access
/etc/mail/aliases
Mailbox aliases
/etc/mail/local-host-names
548
Function
/etc/mail/mailer.conf
/etc/mail/mailertable
/etc/mail/sendmail.cf
/etc/mail/virtusertable
20.3.1 /etc/mail/access
The access database defines what host(s) or IP addresses have access to the local mail server and what kind of access
they have. Hosts can be listed as OK, REJECT, RELAY or simply passed to sendmails error handling routine with a
given mailer error. Hosts that are listed as OK, which is the default, are allowed to send mail to this host as long as the
mails final destination is the local machine. Hosts that are listed as REJECT are rejected for all mail connections.
Hosts that have the RELAY option for their hostname are allowed to send mail for any destination through this mail
server.
Example 20-1. Configuring the sendmail Access Database
cyberspammer.com
FREE.STEALTH.MAILER@
another.source.of.spam
okay.cyberspammer.com
128.32
In this example we have five entries. Mail senders that match the left hand side of the table are affected by the action
on the right side of the table. The first two examples give an error code to sendmails error handling routine. The
message is printed to the remote host when a mail matches the left hand side of the table. The next entry rejects mail
from a specific host on the Internet, another.source.of.spam. The next entry accepts mail connections from a
host okay.cyberspammer.com, which is more exact than the cyberspammer.com line above. More specific
matches override less exact matches. The last entry allows relaying of electronic mail from hosts with an IP address
that begins with 128.32. These hosts would be able to send mail through this mail server that are destined for other
mail servers.
When this file is updated, you need to run make in /etc/mail/ to update the database.
20.3.2 /etc/mail/aliases
The aliases database contains a list of virtual mailboxes that are expanded to other user(s), files, programs or other
aliases. Here are a few examples that can be used in /etc/mail/aliases:
Example 20-2. Mail Aliases
root: localuser
ftp-bugs: joe,eric,paul
bit.bucket: /dev/null
procmail: "|/usr/local/bin/procmail"
The file format is simple; the mailbox name on the left side of the colon is expanded to the target(s) on the right. The
first example simply expands the mailbox root to the mailbox localuser, which is then looked up again in the
549
20.3.3 /etc/mail/local-host-names
This is a list of hostnames sendmail(8) is to accept as the local host name. Place any domains or hosts that sendmail
is to be receiving mail for. For example, if this mail server was to accept mail for the domain example.com and the
host mail.example.com, its local-host-names might look something like this:
example.com
mail.example.com
When this file is updated, sendmail(8) needs to be restarted to read the changes.
20.3.4 /etc/mail/sendmail.cf
sendmails master configuration file, sendmail.cf controls the overall behavior of sendmail, including everything
from rewriting e-mail addresses to printing rejection messages to remote mail servers. Naturally, with such a diverse
role, this configuration file is quite complex and its details are a bit out of the scope of this section. Fortunately, this
file rarely needs to be changed for standard mail servers.
The master sendmail configuration file can be built from m4(1) macros that define the features and behavior of
sendmail. Please see /usr/src/contrib/sendmail/cf/README for some of the details.
When changes to this file are made, sendmail needs to be restarted for the changes to take effect.
20.3.5 /etc/mail/virtusertable
The virtusertable maps mail addresses for virtual domains and mailboxes to real mailboxes. These mailboxes
can be local, remote, aliases defined in /etc/mail/aliases or files.
Example 20-3. Example Virtual Domain Mail Map
root@example.com
postmaster@example.com
@example.com
root
postmaster@noc.example.net
joe
In the above example, we have a mapping for a domain example.com. This file is processed in a first match order
down the file. The first item maps root@example.com to the local mailbox root. The next entry maps
postmaster@example.com to the mailbox postmaster on the host noc.example.net. Finally, if nothing from
example.com has matched so far, it will match the last mapping, which matches every other mail message
addressed to someone at example.com. This will be mapped to the local mailbox joe.
550
into /etc/rc.conf. This will disable sendmails incoming mail service, but if /etc/mail/mailer.conf (see
below) is not changed, sendmail will still be used to send e-mail.
in /etc/rc.conf.
Warning: If you disable sendmails outgoing mail service in this way, it is important that you replace it with a fully
working alternative mail delivery system. If you choose not to, system functions such as periodic(8) will be unable
to deliver their results by e-mail as they would normally expect to. Many parts of your system may expect to have
551
If you only want to disable sendmails incoming mail service, you should set
sendmail_enable="NO"
in /etc/rc.conf. More information on sendmails startup options is available from the rc.sendmail(8) manual
page.
which you can also use to manually start the server. At shutdown time, the system scripts will use the stop option,
running the command
/usr/local/etc/rc.d/supermailer.sh stop
which you can also use to manually stop the server while the system is running.
in /etc/rc.conf, where filename is the name of some script that you want executed at boot to start your MTA.
552
This means that when any of these common commands (such as sendmail itself) are run, the system actually
invokes a copy of mailwrapper named sendmail, which checks mailer.conf and executes
/usr/libexec/sendmail/sendmail instead. This system makes it easy to change what binaries are actually
executed when these default sendmail functions are invoked.
Therefore if you wanted /usr/local/supermailer/bin/sendmail-compat to be run instead of sendmail, you
could change /etc/mail/mailer.conf to read:
sendmail /usr/local/supermailer/bin/sendmail-compat
send-mail /usr/local/supermailer/bin/sendmail-compat
mailq /usr/local/supermailer/bin/mailq-compat
newaliases /usr/local/supermailer/bin/newaliases-compat
hoststat /usr/local/supermailer/bin/hoststat-compat
purgestat /usr/local/supermailer/bin/purgestat-compat
20.4.5 Finishing
Once you have everything configured the way you want it, you should either kill the sendmail processes that you no
longer need and start the processes belonging to your new software, or simply reboot. Rebooting will also give you
the opportunity to ensure that you have correctly configured your system to start your new MTA automatically on
boot.
20.5 Troubleshooting
1. Why do I have to use the FQDN for hosts on my site?
You will probably find that the host is actually in a different domain; for example, if you are in foo.bar.edu and
you wish to reach a host called mumble in the bar.edu domain, you will have to refer to it by the fully-qualified
domain name, mumble.bar.edu, instead of just mumble.
Traditionally, this was allowed by BSD BIND resolvers. However the current version of BIND that ships with
FreeBSD no longer provides default abbreviations for non-fully qualified domain names other than the domain you
are in. So an unqualified host mumble must either be found as mumble.foo.bar.edu, or it will be searched for in
the root domain.
This is different from the previous behavior, where the search continued across mumble.bar.edu, and
mumble.edu. Have a look at RFC 1535 for why this was considered bad practice, or even a security hole.
As a good workaround, you can place the line:
search foo.bar.edu bar.edu
553
into your /etc/resolv.conf. However, make sure that the search order does not go beyond the boundary
between local and public administration, as RFC 1535 calls it.
The sendmail FAQ can be found at http://www.sendmail.org/faq/ and is recommended reading if you want to do any
tweaking of your mail setup.
MX
MX
10
20
example.com.
example.net.
Only one host should be specified as the final recipient (add Cw example.com in /etc/mail/sendmail.cf on
example.com).
When the sending sendmail is trying to deliver the mail it will try to connect to you (example.com) over the
modem link. It will most likely time out because you are not online. The program sendmail will automatically
deliver it to the secondary MX site, i.e. your Internet provider (example.net). The secondary MX site will then
periodically try to connect to your host and deliver the mail to the primary MX host ( example.com).
You might want to use something like this as a login script:
554
If you are going to create a separate login script for a user you could use sendmail -qRexample.com instead in
the script above. This will force all mail in your queue for example.com to be processed immediately.
A further refinement of the situation is as follows:
Message stolen from the FreeBSD Internet service providers mailing list
(http://lists.FreeBSD.org/mailman/listinfo/freebsd-isp).
>
>
>
>
>
>
>
>
>
4. Why do I keep getting Relaying Denied errors when sending mail from other hosts?
In default FreeBSD installations, sendmail is configured to only send mail from the host it is running on. For
example, if a POP3 server is installed, then users will be able to check mail from school, work, or other remote
locations but they still will not be able to send outgoing emails from outside locations. Typically, a few moments
after the attempt, an email will be sent from MAILER-DAEMON with a 5.7 Relaying Denied error message.
There are several ways to get around this. The most straightforward solution is to put your ISPs address in a
relay-domains file at /etc/mail/relay-domains. A quick way to do this would be:
# echo "your.isp.example.com" > /etc/mail/relay-domains
555
Now any mail sent through your system, by any host in this list (provided the user has an account on your system),
will succeed. This is a very nice way to allow users to send mail from your system remotely without allowing people
to send SPAM through your system.
Run your own name server and have your own domain. For example, FreeBSD.org
Get mail delivered directly to your host. This is done by delivering mail directly to the current DNS name for your
machine. For example, example.FreeBSD.org.
Regardless of which of the above you choose, in order to have mail delivered directly to your host, it must have a
permanent static IP address (not a dynamic address, as with most PPP dial-up configurations). If you are behind a
firewall, it must pass SMTP traffic on to you. If you want to receive mail directly at your host, you need to be sure of
either of two things:
Make sure that the (lowest-numbered) MX record in your DNS points to your hosts IP address.
Either of the above will allow you to receive mail directly at your host.
Try this:
# hostname
example.FreeBSD.org
# host example.FreeBSD.org
example.FreeBSD.org has address 204.216.27.XX
556
All mail sent to your host (example.FreeBSD.org) will end up being collected on hub under the same username
instead of being sent directly to your host.
The above information is handled by your DNS server. The DNS record that carries mail routing information is the
Mail eXchange entry. If no MX record exists, mail will be delivered directly to the host by way of its IP address.
The MX entry for freefall.FreeBSD.org at one time looked like this:
freefall
freefall
freefall
freefall
MX
MX
MX
MX
30
40
10
20
mail.crl.net
agora.rdrop.com
freefall.FreeBSD.org
who.cdrom.com
As you can see, freefall had many MX entries. The lowest MX number is the host that receives mail directly if
available; if its not accessible for some reason, the others (sometimes called backup MXes) accept messages
temporarily, and pass it along when a lower-numbered host becomes available, eventually to the lowest-numbered
host.
Alternate MX sites should have separate Internet connections from your own in order to be most useful. Your ISP or
another friendly site should have no problem providing this service for you.
This will redirect mail for the workstation to the mailhost no matter where the A record points. The mail is sent to the
MX host.
You cannot do this yourself unless you are running a DNS server. If you are not, or cannot run your own DNS server,
talk to your ISP or whoever provides your DNS.
If you are doing virtual email hosting, the following information will come in handy. For this example, we will
assume you have a customer with his own domain, in this case customer1.org, and you want all the mail for
customer1.org sent to your mailhost, mail.myhost.com. The entry in your DNS should look like this:
557
You do not need an A record for customer1.org if you only want to handle email for that domain.
Note: Be aware that pinging customer1.org will not work unless an A record exists for it.
The last thing that you must do is tell sendmail on your mailhost what domains and/or hostnames it should be
accepting mail for. There are a few different ways this can be done. Either of the following will work:
Add the hosts to your /etc/mail/local-host-names file if you are using the FEATURE(use_cw_file). If
you are using a version of sendmail earlier than 8.10, the file is /etc/sendmail.cw.
contrib/sendmail
This extracts to only a few hundred kilobytes. The file README in the cf directory can serve as a basic introduction
to m4 configuration.
The best way to support UUCP delivery is to use the mailertable feature. This creates a database that sendmail
can use to make routing decisions.
First, you have to create your .mc file. The directory /usr/src/usr.sbin/sendmail/cf/cf contains a few
examples. Assuming you have named your file foo.mc, all you need to do in order to convert it into a valid
sendmail.cf is:
# cd /usr/src/usr.sbin/sendmail/cf/cf
# make foo.cf
# cp foo.cf /etc/mail/sendmail.cf
558
your.alias.host.name
youruucpnodename.UUCP
The first three lines handle special cases where domain-addressed mail should not be sent out to the default route, but
instead to some UUCP neighbor in order to shortcut the delivery path. The next line handles mail to the local
Ethernet domain that can be delivered using SMTP. Finally, the UUCP neighbors are mentioned in the .UUCP
pseudo-domain notation, to allow for a uucp-neighbor !recipient override of the default rules. The last line is
always a single dot, matching everything else, with UUCP delivery to a UUCP neighbor that serves as your universal
mail gateway to the world. All of the node names behind the uucp-dom: keyword must be valid UUCP neighbors,
as you can verify using the command uuname.
As a reminder that this file needs to be converted into a DBM database file before use. The command line to
accomplish this is best placed as a comment at the top of the mailertable. You always have to execute this command
each time you change your mailertable.
Final hint: if you are uncertain whether some particular mail routing would work, remember the -bt option to
sendmail. It starts sendmail in address test mode; simply enter 3,0, followed by the address you wish to test for the
559
If you are using sendmail (as shown below) to deliver mail to non-local accounts, you probably want to have
sendmail process your mailqueue as soon as your Internet connection is established. To do this, put this command
after the fetchmail command in /etc/ppp/ppp.linkup.
!bg su user -c "sendmail -q"
Assume that you have an account for user on bsd.home. In the home directory of user on bsd.home, create a
.fetchmailrc file:
poll example.net protocol pop3 fetchall pass MySecret
This file should not be readable by anyone except user as it contains the password MySecret.
In order to send mail with the correct from: header, you must tell sendmail to use user@example.net rather than
user@bsd.home. You may also wish to tell sendmail to send all mail via relay.example.net, allowing quicker
mail transmission.
The following .mc file should suffice:
VERSIONID(bsd.home.mc version 1.0)
OSTYPE(bsd4.4)dnl
FEATURE(nouucp)dnl
560
Refer to the previous section for details of how to turn this .mc file into a sendmail.cf file. Also, do not forget to
restart sendmail after updating sendmail.cf.
Install security/cyrus-sasl from the ports. You can find this port in security/cyrus-sasl.
security/cyrus-sasl has a number of compile time options to choose from and, for the method we will be
using here, make sure to select the pwcheck option.
2.
This method will enable sendmail to authenticate against your FreeBSD passwd database. This saves the
trouble of creating a new set of usernames and passwords for each user that needs to use SMTP authentication,
and keeps the login and mail password the same.
3.
These lines will give sendmail the proper configuration options for linking to cyrus-sasl at compile time.
Make sure that cyrus-sasl has been installed before recompiling sendmail.
4.
cd /usr/src/usr.sbin/sendmail
make cleandir
make obj
make
make install
561
After sendmail has been compiled and reinstalled, edit your /etc/mail/freebsd.mc file (or whichever file
you use as your .mc file. Many administrators choose to use the output from hostname(1) as the .mc file for
uniqueness). Add these lines to it:
dnl set SASL options
TRUST_AUTH_MECH(GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN)dnl
define(confAUTH_MECHANISMS, GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN)dnl
define(confDEF_AUTH_INFO, /etc/mail/auth-info)dnl
These options configure the different methods available to sendmail for authenticating users. If you would like
to use a method other than pwcheck, please see the included documentation.
6.
Finally, run make(1) while in /etc/mail. That will run your new .mc file and create a .cf file named
freebsd.cf (or whatever name you have used for your .mc file). Then use the command make install
restart, which will copy the file to sendmail.cf, and will properly restart sendmail. For more information
about this process, you should refer to /etc/mail/Makefile.
If all has gone correctly, you should be able to enter your login information into the mail client and send a test
message. For further investigation, set the LogLevel of sendmail to 13 and watch /var/log/maillog for any
errors.
You may wish to add the following lines to /etc/rc.conf so this service will be available after every system boot:
sasl_pwcheck_enable="YES"
sasl_pwcheck_program="/usr/local/sbin/pwcheck"
562
21.1 Synopsis
FreeBSD is under constant development between releases. For people who want to be on the cutting edge, there are
several easy mechanisms for keeping your system in sync with the latest developments. Be warnedthe cutting edge
is not for everyone! This chapter will help you decide if you want to track the development system, or stick with one
of the released versions.
After reading this chapter, you will know:
The difference between the two development branches: FreeBSD-STABLE and FreeBSD-CURRENT.
How to rebuild and reinstall the entire base system with make world.
563
2. Grab the sources from a FreeBSD mirror site. You can do this in one of three ways:
a. Use the cvsup program with this supfile
(ftp://ftp.jp.FreeBSD.org/pub/FreeBSD/FreeBSD-current/src/share/examples/cvsup/standard-supfile). This
is the most recommended method, since it allows you to grab the entire collection once and then only what
has changed from then on. Many people run cvsup from cron and keep their sources up-to-date
564
b. Use ftp. The source tree for FreeBSD-CURRENT is exported on some of the FTP mirrors in the
directory /pub/FreeBSD/FreeBSD-current/. Some of our FTP mirrors may also allow
compressed/tarred grabbing of whole trees. For example you see:
usr.bin/lex
You can do the following to get the whole directory as a tar file:
ftp> cd usr.bin
ftp> get lex.tar
Note: If you wish to download the entire FreeBSD-CURRENT source tree cvsup handles this much
better than mirroring a FTP site.
c. Use the CTM facility. If you have very bad connectivity (high price connections or only email access)
CTM is an option. However, it is a lot of hassle and can give you broken files. This leads to it being rarely
used, which again increases the chance of it not working for fairly long periods of time. We recommend
using CVSup for anybody with a 9600 bps modem or faster connection.
3. If you are grabbing the sources to run, and not just look at, then grab all of FreeBSD-CURRENT, not just
selected portions. The reason for this is that various parts of the source depend on updates elsewhere, and trying
to compile just a subset is almost guaranteed to get you into trouble.
Before compiling FreeBSD-CURRENT, read the Makefile in /usr/src carefully. You should at least run a
make world the first time through as part of the upgrading process. Reading the FreeBSD-CURRENT mailing
list (http://lists.FreeBSD.org/mailman/listinfo/freebsd-current) will keep you up-to-date on other bootstrapping
procedures that sometimes become necessary as we move toward the next release.
4. Be active! If you are running FreeBSD-CURRENT, we want to know what you have to say about it, especially if
you have suggestions for enhancements or bug fixes. Suggestions with accompanying code are received most
enthusiastically!
565
2. If you are installing a new system and want it to be as stable as possible, you can simply grab the latest dated
branch snapshot from ftp://releng4.FreeBSD.org/pub/FreeBSD/ and install it like any other release.
If you are already running a previous release of FreeBSD and wish to upgrade via sources then you can easily do
so from FreeBSD mirror site. This can be done in one of three ways:
a. Use the cvsup program with this supfile
(ftp://ftp.jp.FreeBSD.org/pub/FreeBSD/FreeBSD-current/src/share/examples/cvsup/stable-supfile). This is
the most recommended method, since it allows you to grab the entire collection once and then only what
has changed from then on. Many people run cvsup from cron to keep their sources up-to-date
566
b. Use ftp. The source tree for FreeBSD-STABLE is exported on some of the FTP mirrors in the directory
/pub/FreeBSD/FreeBSD-stable/. Some of our FTP mirrors may also allow compressed/tarred
grabbing of whole trees. For example you see:
usr.bin/lex
You can do the following to get the whole directory for you as a tar file:
ftp> cd usr.bin
ftp> get lex.tar
Note: If you wish to download the entire FreeBSD-STABLE source tree cvsup handles this much better
than mirroring a FTP site.
c. Use the CTM facility. If you do not have a fast and inexpensive connection to the Internet, this is the
method you should consider using.
3. Essentially, if you need rapid on-demand access to the source and communications bandwidth is not a
consideration, use cvsup or ftp. Otherwise, use CTM.
4. Before compiling FreeBSD-STABLE, read the Makefile in /usr/src carefully. You should at least run a
make world the first time through as part of the upgrading process. Reading the FreeBSD-STABLE mailing list
(http://lists.FreeBSD.org/mailman/listinfo/freebsd-stable) will keep you up-to-date on other bootstrapping
procedures that sometimes become necessary as we move toward the next release.
Anonymous CVS and CVSup use the pull model of updating sources. In the case of CVSup the user (or a cron
script) invokes the cvsup program, and it interacts with a cvsupd server somewhere to bring your files up-to-date.
567
Subscribe to the Right Mailing List: The FreeBSD-STABLE and FreeBSD-CURRENT branches are, by their
nature, in development. People that contribute to FreeBSD are human, and mistakes occasionally happen.
Sometimes these mistakes can be quite harmless, just causing your system to print a new diagnostic warning.
Or the change may be catastrophic, and render your system unbootable or destroy your file systems (or worse).
If problems like these occur, a heads up is posted to the appropriate mailing list, explaining the nature of the
problem and which systems it affects. And an all clear announcement is posted when the problem has been
solved.
If you try to track FreeBSD-STABLE or FreeBSD-CURRENT and do not read the FreeBSD-STABLE mailing list
(http://lists.FreeBSD.org/mailman/listinfo/freebsd-stable) or the FreeBSD-CURRENT mailing list
(http://lists.FreeBSD.org/mailman/listinfo/freebsd-current) respectively, then you are asking for trouble.
568
Tip: If you are feeling particularly paranoid, you can check your system to see which files are owned by the group
you are renaming or deleting:
569
will show all files owned by group GID (which can be either a group name or a numeric group ID).
fsck -p
mount -u /
mount -a -t ufs
swapon -a
This checks the file systems, remounts / read/write, mounts all the other UFS file systems referenced in
/etc/fstab and then turns swapping on.
Note: If your CMOS clock is set to local time and not to GMT (this is true if the output of the date(1) command
does not show the correct time and zone), you may also need to run the following command:
# adjkerntz -i
This will make sure that your local time-zone settings get set up correctly without this, you may later run into
some problems.
570
If you do this, do not save the output in /tmp. This directory may be cleared next time you reboot. A better place to
store it is in /var/tmp (as in the previous example) or in roots home directory.
(unless, of course, your source code is elsewhere, in which case change to that directory instead).
To rebuild the world you use the make(1) command. This command reads instructions from the Makefile, which
describes how the programs that comprise FreeBSD should be rebuilt, the order in which they should be built, and so
on.
The general format of the command line you will type is as follows:
# make -x -DVARIABLE target
In this example, -x is an option that you would pass to make(1). See the make(1) manual page for an example of the
options you can pass.
-DVARIABLE passes a variable to the Makefile. The behavior of the Makefile is controlled by these variables.
These are the same variables as are set in /etc/make.conf, and this provides another way of setting them.
# make -DNOPROFILE target
571
true
line in /etc/make.conf.
target tells make(1) what you want to do. Each Makefile defines a number of different targets, and your
choice of target determines what happens.
Some targets are listed in the Makefile, but are not meant for you to run. Instead, they are used by the build process
to break out the steps necessary to rebuild the system into a number of sub-steps.
Most of the time you will not need to pass any parameters to make(1), and so your command like will look like this:
# make target
Beginning with version 2.2.5 of FreeBSD (actually, it was first created on the FreeBSD-CURRENT branch, and then
retrofitted to FreeBSD-STABLE midway between 2.2.2 and 2.2.5) the world target has been split in two:
buildworld and installworld.
As the names imply, buildworld builds a complete new tree under /usr/obj, and installworld installs this
tree on the current machine.
This is very useful for 2 reasons. First, it allows you to do the build safe in the knowledge that no components of
your running system will be affected. The build is self hosted. Because of this, you can safely run buildworld on
a machine running in multi-user mode with no fear of ill-effects. It is still recommended that you run the
installworld part in single user mode, though.
Secondly, it allows you to use NFS mounts to upgrade multiple machines on your network. If you have three
machines, A, B and C that you want to upgrade, run make buildworld and make installworld on A. B and C
should then NFS mount /usr/src and /usr/obj from A, and you can then run make installworld to install the
results of the build on B and C.
Although the world target still exists, you are strongly encouraged not to use it.
Run
# make buildworld
It is now possible to specify a -j option to make which will cause it to spawn several simultaneous processes. This is
most useful on multi-CPU machines. However, since much of the compiling process is IO bound rather than CPU
bound it is also useful on single CPU machines.
On a typical single-CPU machine you would run:
# make -j4 buildworld
make(1) will then have up to 4 processes running at any one time. Empirical evidence posted to the mailing lists
shows this generally gives the best performance benefit.
If you have a multi-CPU machine and you are using an SMP configured kernel try values between 6 and 10 and see
how they speed things up.
Be aware that this is still somewhat experimental, and commits to the source tree may occasionally break this feature.
If the world fails to compile using this parameter try again without it before you report any problems.
572
In FreeBSD 4.2 and older you must replace KERNCONF= with KERNEL=. 4.2-STABLE that was fetched before Feb
2nd, 2001 does not recognize KERNCONF=.
Note that if you have raised kern.securelevel above 1 and you have set either the noschg or similar flags to
your kernel binary, you might find it necessary to drop into single user mode to use installkernel. Otherwise you
should be able to run both these commands from multi user mode without problems. See init(8) for details about
kern.securelevel and chflags(1) for details about the various file flags.
If you are upgrading to a version of FreeBSD below 4.0 you should use the old kernel build procedure. However, it is
recommended that you use the new version of config(8), using a command line like this.
# /usr/obj/usr/src/usr.sbin/config/config KERNELNAME
573
Note: If you specified variables on the make buildworld command line, you must specify the same variables in
the make installworld command line. This does not necessarily hold true for other options; for example, -j
must never be used with installworld.
For example, if you ran:
# make -DNOPROFILE buildworld
otherwise it would try to install profiled libraries that had not been built during the make buildworld phase.
To begin simply type mergemaster at your prompt, and watch it start going. mergemaster will then build a
temporary root environment, from / down, and populate it with various system configuration files. Those files are
then compared to the ones currently installed in your system. At this point, files that differ will be shown in diff(1)
format, with the + sign representing added or modified lines, and - representing lines that will be either removed
completely, or replaced with a new line. See the diff(1) manual page for more information about the diff(1) syntax
and how file differences are shown.
574
You need to build a dummy set of directories to install the new /etc and other files into. /var/tmp/root is a
reasonable choice, and there are a number of subdirectories required under this as well.
# mkdir /var/tmp/root
# cd /usr/src/etc
# make DESTDIR=/var/tmp/root distrib-dirs distribution
575
This will remove all empty directories. (Standard error is redirected to /dev/null to prevent the warnings about the
directories that are not empty.)
/var/tmp/root now contains all the files that should be placed in appropriate locations below /. You now have to
go through each of these files, determining how they differ with your existing files.
Note that some of the files that will have been installed in /var/tmp/root have a leading .. At the time of writing
the only files like this are shell startup files in /var/tmp/root/ and /var/tmp/root/root/, although there may
be others (depending on when you are reading this). Make sure you use ls -a to catch them.
The simplest way to do this is to use diff(1) to compare the two files:
# diff /etc/shells /var/tmp/root/etc/shells
This will show you the differences between your /etc/shells file and the new /var/tmp/root/etc/shells
file. Use these to decide whether to merge in changes that you have made or whether to copy over your old file.
Name the New Root Directory (/var/tmp/root) with a Time Stamp, so You Can Easily Compare
Differences Between Versions: Frequently rebuilding the world means that you have to update /etc frequently
as well, which can be a bit of a chore.
You can speed this process up by keeping a copy of the last set of changed files that you merged into /etc. The
following procedure gives one idea of how to do this.
1.
Make the world as normal. When you want to update /etc and the other directories, give the target directory
a name based on the current date. If you were doing this on the 14th of February 1998 you could do the
following:
# mkdir /var/tmp/root-19980214
# cd /usr/src/etc
# make DESTDIR=/var/tmp/root-19980214 \
distrib-dirs distribution
2.
3.
When you have downloaded the latest version of the source and remade it, follow step 1. This will give you a
new directory, which might be called /var/tmp/root-19980221 (if you wait a week between doing updates).
4.
You can now see the differences that have been made in the intervening week using diff(1) to create a
recursive diff between the two directories:
# cd /var/tmp
# diff -r root-19980214 root-19980221
Typically, this will be a much smaller set of differences than those between /var/tmp/root-19980221/etc
and /etc. Because the set of differences is smaller, it is easier to migrate those changes across into your
/etc directory.
5.
You can now remove the older of the two /var/tmp/root-* directories:
# rm -rf /var/tmp/root-19980214
576
Repeat this process every time you need to merge in changes to /etc.
You can use date(1) to automate the generation of the directory names:
# mkdir /var/tmp/root-date "+%Y%m%d"
In most cases, the mergemaster(8) tool will realize when it is necessary to update the device nodes, and offer to
complete it automatically. These instructions tell how to update the device nodes manually.
For safetys sake, this is a multi-step process.
1.
If you used mergemaster(8) to update /etc, then your MAKEDEV script should have been updated already,
though it cannot hurt to check (with diff(1)) and copy it manually if necessary.
2.
Now, take a snapshot of your current /dev. This snapshot needs to contain the permissions, ownerships, major
and minor numbers of each filename, but it should not contain the time stamps. The easiest way to do this is to
use awk(1) to strip out some of the information:
# cd /dev
# ls -l | awk {print $1, $2, $3, $4, $5, $6, $NF} > /var/tmp/dev.out
3.
4.
Write another snapshot of the directory, this time to /var/tmp/dev2.out. Now look through these two files
for any device node that you missed creating. There should not be any, but it is better to be safe than sorry.
# diff /var/tmp/dev.out /var/tmp/dev2.out
You are most likely to notice disk slice discrepancies which will involve commands such as:
# sh MAKEDEV sd0s1
577
21.4.13 Rebooting
You are now done. After you have verified that everything appears to be in the right place you can reboot the system.
A simple fastboot(8) should do it:
# fastboot
21.4.14 Finished
You should now have successfully upgraded your FreeBSD system. Congratulations.
If things went slightly wrong, it is easy to rebuild a particular piece of the system. For example, if you accidentally
deleted /etc/magic as part of the upgrade or merge of /etc, the file(1) command will stop working. In this case,
the fix would be to run:
# cd /usr/src/usr.bin/file
# make all install
21.4.15 Questions
1. Do I need to re-make the world for every change?
There is no easy answer to this one, as it depends on the nature of the change. For example, if you just ran CVSup,
and it has shown the following files as being updated:
src/games/cribbage/instr.c
src/games/sail/pl_main.c
src/release/sysinstall/config.c
src/release/sysinstall/media.c
src/share/mk/bsd.port.mk
it probably is not worth rebuilding the entire world. You could just go to the appropriate sub-directories and make
all install, and thats about it. But if something major changed, for example src/lib/libc/stdlib then you
should either re-make the world, or at least those parts of it that are statically linked (as well as anything else you
might have added that is statically linked).
At the end of the day, it is your call. You might be happy re-making the world every fortnight say, and let changes
accumulate over that fortnight. Or you might want to re-make just those things that have changed, and be confident
you can spot all the dependencies.
And, of course, this all depends on how often you want to upgrade, and whether you are tracking FreeBSD-STABLE
or FreeBSD-CURRENT.
578
2. My compile failed with lots of signal 11 (or other signal number) errors. What has happened?
This is normally indicative of hardware problems. (Re)making the world is an effective way to stress test your
hardware, and will frequently throw up memory problems. These normally manifest themselves as the compiler
mysteriously dying on receipt of strange signals.
A sure indicator of this is if you can restart the make and it dies at a different point in the process.
In this instance there is little you can do except start swapping around the components in your machine to determine
which one is failing.
after you have finished makes little sense, and will free up a large chunk of disk space (currently about 340 MB).
However, if you know what you are doing you can have make world skip this step. This will make subsequent
builds run much faster, since most of sources will not need to be recompiled. The flip side of this is that subtle
dependency problems can creep in, causing your build to fail in odd ways. This frequently generates noise on the
FreeBSD mailing lists, when one person complains that their build has failed, not realizing that it is because they
have tried to cut corners.
This will not undo the work of the previous make world.
If you see the message:
-------------------------------------------------------------Building everything..
--------------------------------------------------------------
579
Put the /usr/src and /usr/obj directories on separate file systems held on separate disks. If possible, put these
disks on separate disk controllers.
Better still, put these file systems across multiple disks using the ccd(4) (concatenated disk driver) device.
Turn off profiling (set NOPROFILE=true in /etc/make.conf). You almost certainly do not need it.
Also in /etc/make.conf, set CFLAGS to something like -O -pipe. The optimization -O2 is much slower, and
the optimization difference between -O and -O2 is normally negligible. -pipe lets the compiler use pipes rather
than temporary files for communication, which saves disk access (at the expense of memory).
Pass the -jn option to make(1) to run multiple processes in parallel. This usually helps regardless of whether you
have a single or a multi processor machine.
The file system holding /usr/src can be mounted (or remounted) with the noatime option. This prevents the
file system from recording the file access time. You probably do not need this information anyway.
# mount -u -o noatime /usr/src
Warning: The example assumes /usr/src is on its own file system. If it is not (if it is a part of /usr for
example) then you will need to use that file system mount point, and not /usr/src.
The file system holding /usr/obj can be mounted (or remounted) with the async option. This causes disk writes
to happen asynchronously. In other words, the write completes immediately, and the data is written to the disk a
few seconds later. This allows writes to be clustered together, and can be a dramatic performance boost.
Warning: Keep in mind that this option makes your file system more fragile. With this option there is an
increased chance that, should power fail, the file system will be in an unrecoverable state when the machine
restarts.
If /usr/obj is the only thing on this file system then it is not a problem. If you have other, valuable data on the
same file system then ensure your backups are fresh before you enable this option.
Warning: As above, if /usr/obj is not on its own file system, replace it in the example with the name of the
appropriate mount point.
580
21.5.1 Preliminaries
First, identify a set of machines that is going to run the same set of binaries, which we will call a build set. Each
machine can have a custom kernel, but they will be running the same userland binaries. From that set, choose a
machine to be the build machine. It is going to be the machine that the world and kernel are built on. Ideally, it
should be a fast machine that has sufficient spare CPU to run make world. You will also want to choose a machine
to be the test machine, which will test software updates before they are put into production. This must be a machine
that you can afford to have down for an extended period of time. It can be the build machine, but need not be.
All the machines in this build set need to mount /usr/obj and /usr/src from the same machine, and at the same
point. Ideally, those are on two different drives on the build machine, but they can be NFS mounted on that machine
as well. If you have multiple build sets, /usr/src should be on one build machine, and NFS mounted on the rest.
Finally make sure that /etc/make.conf on all the machines in the build set agrees with the build machine. That
means that the build machine must build all the parts of the base system that any machine in the build set is going to
install. Also, each build machine should have its kernel name set with KERNCONF in /etc/make.conf, and the build
machine should list them all in KERNCONF, listing its own kernel first. The build machine must have the kernel
configuration files for each machine in /usr/src/sys/arch/conf if it is going to build their kernels.
581
21.5.3 Ports
The same ideas can be used for the ports tree. The first critical step is mounting /usr/ports from the same machine
to all the machines in the build set. You can then set up /etc/make.conf properly to share distfiles. You should set
DISTDIR to a common shared directory that is writable by whichever user root is mapped to by your NFS mounts.
Each machine should set WRKDIRPREFIX to a local build directory. Finally, if you are going to be building and
distributing packages, you should set PACKAGES to a directory similar to DISTDIR.
Notes
1. That is not quite true. We can not continue to support old releases of FreeBSD forever, although we do support
them for many years. For a complete description of the current security policy for old releases of FreeBSD,
please see http://www.FreeBSD.org/security/ (../../../../security/index.html)
582
22.1 Synopsis
FreeBSD provides binary compatibility with several other Unix-like operating systems, including Linux. At this
point, you may be asking yourself why exactly, does FreeBSD need to be able to run Linux binaries? The answer to
that question is quite simple. Many companies and developers develop only for Linux, since it is the latest hot
thing in the computing world. That leaves the rest of us FreeBSD users bugging these same companies and
developers to put out native FreeBSD versions of their applications. The problem is, that most of these companies do
not really realize how many people would use their product if there were FreeBSD versions too, and most continue to
only develop for Linux. So what is a FreeBSD user to do? This is where the Linux binary compatibility of FreeBSD
comes into play.
In a nutshell, the compatibility allows FreeBSD users to run about 90% of all Linux applications without
modification. This includes applications such as Star Office, the Linux version of Netscape, Adobe Acrobat,
RealPlayer 5 and 7, VMWare, Oracle, WordPerfect, Doom, Quake, and more. It is also reported that in some
situations, Linux binaries perform better on FreeBSD than they do under Linux.
There are, however, some Linux-specific operating system features that are not supported under FreeBSD. Linux
binaries will not work on FreeBSD if they overly use the Linux /proc file system (which is different from
FreeBSDs /proc file system), or i386-specific calls, such as enabling virtual 8086 mode.
After reading this chapter, you will know:
22.2 Installation
Linux binary compatibility is not turned on by default. The easiest way to enable this functionality is to load the
linux KLD object (Kernel LoaDable object). You can load this module by simply typing linux at the command
prompt.
If you would like Linux compatibility to always be enabled, then you should add the following line to
/etc/rc.conf:
linux_enable="YES"
The kldstat(8) command can be used to verify that the KLD is loaded:
583
Id Refs Address
Size
1
2 0xc0100000 16bdb8
7
1 0xc24db000 d000
Name
kernel
linux.ko
If for some reason you do not want to or cannot load the KLD, then you may statically link Linux binary
compatibility into the kernel by adding options LINUX to your kernel configuration file. Then install your new
kernel as described in Chapter 9.
You should now have working Linux binary compatibility. Some programs may complain about incorrect minor
versions of the system libraries. In general, however, this does not seem to be a problem.
584
You would need to get all the files from the last column, and put them under /compat/linux, with the names in the
first column as symbolic links pointing to them. This means you eventually have these files on your FreeBSD system:
/compat/linux/usr/X11/lib/libXt.so.3.1.0
/compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0
/compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Note: Note that if you already have a Linux shared library with a matching major revision number to the first
column of the ldd output, you will not need to copy the file named in the last column to your system, the one
you already have should work. It is advisable to copy the shared library anyway if it is a newer version,
though. You can remove the old one, as long as you make the symbolic link point to the new one. So, if you
have these libraries on your system:
/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -> libc.so.4.6.27
and you find a new binary that claims to require a later version according to the output of ldd:
libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29
If it is only one or two versions out of date in the in the trailing digit then do not worry about copying
/lib/libc.so.4.6.29 too, because the program should work fine with the slightly older version. However,
if you like, you can decide to replace the libc.so anyway, and that should leave you with:
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29
Note: The symbolic link mechanism is only needed for Linux binaries. The FreeBSD runtime linker takes
care of looking for matching major revision numbers itself and you do not need to worry about it.
To help the FreeBSD kernel distinguish between a FreeBSD ELF binary from a Linux binary, use the brandelf(1)
utility.
585
The GNU toolchain now places the appropriate branding information into ELF binaries automatically, so this step
should become increasingly more rare in the future.
The order here specifies that /etc/hosts is searched first and DNS is searched second. When
/compat/linux/etc/host.conf is not installed, Linux applications find FreeBSDs /etc/host.conf and
complain about the incompatible FreeBSD syntax. You should remove bind if you have not configured a name
server using the /etc/resolv.conf file.
mount /cdrom
cp -rp /cdrom/Unix/ /localdir/
brandelf -t Linux /localdir/Files/SystemFiles/Kernel/Binaries/Linux/*
brandelf -t Linux /localdir/Files/SystemFiles/FrontEnd/Binaries/Linux/*
brandelf -t Linux /localdir/Files/SystemFiles/Installation/Binaries/Linux/*
brandelf -t Linux /localdir/Files/SystemFiles/Graphics/Binaries/Linux/*
brandelf -t Linux /localdir/Files/SystemFiles/Converters/Binaries/Linux/*
brandelf -t Linux /localdir/Files/SystemFiles/LicenseManager/Binaries/Linux/mathlm
cd /localdir/Installers/Linux/
./MathInstaller
586
This will make FreeBSD assume that unbranded ELF binaries use the Linux ABI and so you should be able to run
the installer straight from the CDROM.
disco.example.com 7115-70839-20412
When you register with Wolfram, either by email, phone or fax, you will give them the machine ID and they will
respond with a corresponding password consisting of groups of numbers. You can then enter this information when
you attempt to run Mathematica for the first time exactly as you would for any other Mathematica platform.
cd /usr/X11R6/lib/X11/fonts
mkdir X
mkdir MathType1
cd /cdrom/Unix/Files/SystemFiles/Fonts
cp X/* /usr/X11R6/lib/X11/fonts/X
cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1
cd /usr/X11R6/lib/X11/fonts/X
mkfontdir
cd ../MathType1
mkfontdir
587
If you are using the XFree86 server, you can have these font directories loaded automatically by adding them to your
XF86Config file.
If you do not already have a directory called /usr/X11R6/lib/X11/fonts/Type1, you can change the name of
the MathType1 directory in the example above to Type1.
Execute the INSTALL shell script from the product distribution. Choose the RedHat option when prompted by
the installation program. A typical installation directory might be /usr/local/maple.
2.
If you have not done so, order a license for Maple from Maple Waterloo Software (http://register.maplesoft.com)
and copy it to /usr/local/maple/license/license.dat.
3.
Install the FLEXlm license manager by running the INSTALL_LIC install shell script that comes with Maple.
Specify the primary hostname for your machine for the license server.
4.
Please note that after the "FreeBSD"|\ no other whitespace should be present.
This patch instructs Maple to recognize FreeBSD as a type of Linux system. The bin/maple shell script
calls the bin/maple.system.type shell script which in turn calls uname -a to find out the operating system
name. Depending on the OS name it will find out which binaries to use.
5.
588
6.
Test-start maple:
% cd /usr/local/maple/bin
% ./xmaple
You should be up and running. Make sure to write Maplesoft to let them know you would like a native FreeBSD
version!
The FLEXlm license manager can be a difficult tool to work with. Additional documentation on the subject can be
found at http://www.globetrotter.com/.
is known to be very picky about the license file and to core dump if there are any problems. A correct
license file should look like this:
lmgrd
# =======================================================
# License File for UNIX Installations ("Pointer File")
# =======================================================
SERVER chillig ANY
#USE_SERVER
VENDOR maplelmg
FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \
PLATFORMS=i86_r ISSUER="Waterloo Maple Inc." \
ISSUED=11-may-2000 NOTICE=" Technische Universitat Wien" \
589
Editing the license file works as long as you do not touch the FEATURE line (which is protected by the license
key).
22.5.1 Preface
This document describes the process of installing Oracle 8.0.5 and Oracle 8.0.5.1 Enterprise Edition for Linux onto a
FreeBSD machine.
590
22.5.3.3 Environment
Besides the normal Oracle variables, such as ORACLE_HOME and ORACLE_SID you must set the following
environment variables:
Variable
Value
LD_LIBRARY_PATH
$ORACLE_HOME/lib
CLASSPATH
$ORACLE_HOME/jdbc/lib/classes111.zip
PATH
/compat/linux/bin /compat/linux/sbin
/compat/linux/usr/bin
/compat/linux/usr/sbin /bin /sbin /usr/bin
/usr/sbin /usr/local/bin $ORACLE_HOME/bin
It is advised to set all the environment variables in .profile. A complete example is:
ORACLE_BASE=/oracle; export ORACLE_BASE
ORACLE_HOME=/oracle; export ORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_LIBRARY_PATH
ORACLE_SID=ORCL; export ORACLE_SID
ORACLE_TERM=386x; export ORACLE_TERM
CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip
export CLASSPATH
PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin
PATH=$PATH:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin
PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin
export PATH
591
cd $ORACLE_HOME/network/lib
make -f ins_network.mk ntcontab.o
cd $ORACLE_HOME/lib
ar r libnetwork.a ntcontab.o
cd $ORACLE_HOME/network/lib
make -f ins_network.mk install
When you do not install Oracle from CD, you can patch the source for root.sh. It is called rthd.sh and is located
in the orainst directory in the source tree.
592
22.6.1 Preface
This document describes a possible way of installing a SAP R/3-System with Oracle Database for Linux onto a
FreeBSD machine, including the installation of FreeBSD and Oracle. Two different configurations will be described:
Even though this document tries to describe all important steps in a greater detail, it is not intended as a replacement
for the Oracle and SAP R/3 installation guides.
Please see the documentation that comes with the SAP R/3 Linux edition for SAP- and Oracle-specific questions, as
well as resources from Oracle and SAP OSS.
22.6.2 Software
The following CD-ROMs have been used for SAP-installations:
593
Number
Description
KERNEL
51009113
RDBMS
51007558
EXPORT1
51010208
EXPORT2
51010209
EXPORT3
51010210
EXPORT4
51010211
EXPORT5
51010212
EXPORT6
51010213
Additionally, I used the Oracle 8 Server (Pre-production version 8.0.5 for Linux, Kernel Version 2.0.33) CD which
is not really necessary, and of course FreeBSD 4.3-STABLE (it was only a few days past 4.3 RELEASE).
Number
Description
KERNEL
51014004
RDBMS
51012930
EXPORT1
51013953
EXPORT1
51013953
EXPORT1
51013953
EXPORT1
51013953
LANG1
51013954
Depending on the languages you would like to install, additional language CDs might be necessary. Here were just
using DE and EN, so the first Language-CD is the only one needed. As a little note, the numbers for all four export
CDs are identical. All three language CDs also have the same number (this is different from the 4.6B IDES release
CD numbering). At the time of writing this installation is running on FreeBSD 4.5-STABLE (20.03.2002).
594
Title
0171356
0201147
0373203
0072984
0130581
0144978
0162266
Title
0015023
0045619
0171356
0195603
0212876
0300900
0377187
0387074
0387077
0387078
4.6B
4.6C
Processor
Memory
1GB ECC
2GB ECC
50-60GB (IDES)
50-60GB (IDES)
For use in production, Xeon-Processors with large cache, high-speed disk access (SCSI, RAID hardware controller),
USV and ECC-RAM is recommended. The large amount of hard disk space is due to the preconfigured IDES
System, which creates 27 GB of database files during installation. This space is also sufficient for initial production
systems and application data.
595
Size (1k-blocks)
Size (GB)
Mounted on
/dev/da0s1a
1.016.303
swap
/dev/da0s1b
/dev/da0s1e
2.032.623
/var
/dev/da0s1f
8.205.339
/usr
/dev/da1s1e
45.734.361
45
/compat/linux/oracle
/dev/da1s1f
2.032.623
/compat/linux/sapmnt
/dev/da1s1g
2.032.623
/compat/linux/usr/sap
Configure and initialize the two logical drives with the Mylex- or PERC/3 RAID software beforehand. The software
can be started during the bios boot phase.
Please note that this disk layout differs slightly from the SAP recommendations, as SAP suggests mounting the
oracle-subdirectories (and some others) separately - I decided to just create them as real subdirectories for simplicity.
596
Linux Development has only been installed for the SAP R/3 46B IDES-installation. It is not needed, if the Oracle
DB is not relinked on the FreeBSD system. This is the case if you are using the Oracle tarball from a Linux system.
For Oracle 8.0.5 to run the intelligent agent, I also had to install the RedHat Tcl package
tcl-8.0.5-30.i386.rpm (otherwise the relinking during Oracle install will not work). There are some other
issues regarding relinking of Oracle, but that is a Oracle-Linux issue, not FreeBSD specific.
597
size in GB
/compat/linux/oracle
45 GB
/compat/linux/sapmnt
2 GB
/compat/linux/usr/sap
2 GB
It is also necessary to created some links. Otherwise the SAP-Installer will complain, as it is checking the created
links:
# ln -s /compat/linux/oracle /oracle
# ln -s /compat/linux/sapmnt /sapmnt
# ln -s /compat/linux/usr/sap /usr/sap
Possible error message during installation (here with System PRD and the SAP R/3 4.6C SR2 installation):
INFO 2002-03-19 16:45:36 R3LINKS_IND_IND SyLinkCreate:200
Checking existence of symbolic link /usr/sap/PRD/SYS/exe/dbg to
/sapmnt/PRD/exe. Creating if it does not exist...
WARNING 2002-03-19 16:45:36 R3LINKS_IND_IND SyLinkCreate:400
Link /usr/sap/PRD/SYS/exe/dbg exists but it points to file
/compat/linux/sapmnt/PRD/exe instead of /sapmnt/PRD/exe. The
program cannot go on as long as this link exists at this
location. Move the link to another location.
ERROR 2002-03-19 16:45:36 R3LINKS_IND_IND Ins_SetupLinks:0
can not setup link /usr/sap/PRD/SYS/exe/dbg with content
/sapmnt/PRD/exe
group name
description
100
dba
101
sapsys
SAP System
102
oper
For a default Oracle-Installation, only group dba is used. As oper-group, one also uses group dba (see Oracle- and
598
user name
generic name
group
additional
groups
description
1000
idsadm/prdadm
sidadm
sapsys
oper
SAP Administrator
1002
oraids/oraprd
orasid
dba
oper
DB Administrator
Adding the users with adduser requires the following (please note shell and home directory) entries for
SAP-Administrator:
Name: sidadm
Password: ******
Fullname: SAP Administrator SID
Uid: 1000
Gid: 101 (sapsys)
Class:
Groups: sapsys dba
HOME: /home/sidadm
Shell: bash (/compat/linux/bin/bash)
This should also include group oper in case you are using both groups dba and oper.
chmod
chmod
chown
chown
chmod
775 /oracle
777 /sapmnt
root:dba /oracle
sidadm:sapsys /compat/linux/usr/sap
775 /compat/linux/usr/sap
Second we will create directories as user orasid . These will all be subdirectories of /oracle/SID :
599
su - orasid
cd /oracle/SID
mkdir mirrlogA mirrlogB origlogA origlogB
mkdir sapdata1 sapdata2 sapdata3 sapdata4 sapdata5 sapdata6
mkdir saparch sapreorg
exit
su - orasid
cd /oracle
mkdir 805_32
mkdir client stage
mkdir client/80x_32
mkdir stage/817_32
cd /oracle/SID
mkdir 817_32
Note: The directory client/80x_32 is used with exactly this name. Dont replace the x with some number or
anything.
su - sidadm
cd /usr/sap
mkdir SID
mkdir trans
exit
3200/tcp
3300/tcp #
3400/tcp #
3500/tcp #
3600/tcp #
4800/tcp
# SAP Dispatcher.
SAP Gateway.
3200
3300 +
3400 +
3500 +
SAP Message Server. 3600 +
# SAP Secure Gateway
4800
+ Instance-Number
Instance-Number
Instance-Number
Instance-Number
Instance-Number
+ Instance-Number
600
If they are not present, there will be some problems during the installation. If these are then subsequently ignored (by
setting the status of the offending steps to OK in file CENTRDB.R3S), it will be impossible to log onto the
SAP-system without some additional effort.
The minimum values are specified in the documentation that comes from SAP. As there is no description for Linux,
see the HP-UX-section (32-bit) for further information. As the system for the 4.6C SR2 installation has more main
memory, the shared segments can be larger both for SAP and Oracle, therefore choose a larger number of shared
memory pages.
601
where cd-name was one of KERNEL, RDBMS, EXPORT1, EXPORT2, EXPORT3, EXPORT4, EXPORT5 and EXPORT6 for
the 4.6B/IDES-installation, and KERNEL, RDBMS, DISK1, DISK2, DISK3, DISK4 and LANG for the 4.6C
SR2-installation. All the filenames on the mounted CDs should be in capital letters, otherwise use the -g option for
mounting. So use the following commands:
# mount_cd9660 -g /dev/cd0a /mnt
# cp -R /mnt/* /oracle/SID/sapreorg/cd-name
# umount /mnt
Then the install-script is started, which will copy nearly all the relevant files into the install-directory:
# /oracle/SID/sapreorg/KERNEL/UNIX/INSTTOOL.SH
The IDES-Installation (4.6B) comes with a fully customized SAP R/3 Demo-System, so there are six instead of just
three EXPORT-CDs. At this point the installation template CENTRDB.R3S is for installing a standard central instance
(R/3 and Database), not the IDES central instance, so one needs to copy the corresponding CENTRDB.R3S from the
EXPORT1 directory, otherwise R3SETUP will only ask for three EXPORT-CDs.
The newer SAP 4.6C SR2-release comes with four EXPORT-CDs. The parameter-file that controls the
installation-steps is CENTRAL.R3S. Contrary to earlier releases there are no separate installation templates for a
central instance with or without database. SAP is using a separate template for DB-installation. To restart the
installation later it is however sufficient to restart with the original file.
During and after installation, SAP requires hostname to return the computer name only, not the fully qualified
domain name. So either set the hostname accordingly, or set an alias with alias hostname=hostname -s for
602
The script then asks some questions (defaults in brackets, followed by actual input):
Question
Default
Input
[C11]
IDSEnter
[00]
Enter
[/sapmnt]
Enter
[troubadix.domain.de]
Enter
[troubadix]
Enter
[1] (WE8DEC)
Enter
1Enter
Enter
[/sapcd]
/oracle/IDS/sapreorg/KERNEL
[/sapcd]
/oracle/IDS/sapreorg/RDBMS
[/sapcd]
/oracle/IDS/sapreorg/EXPORT1
[/oracle/IDS/sapreorg/CD4_DIR]
Enter
[/sapcd]
/oracle/IDS/sapreorg/EXPORT2
[/oracle/IDS/sapreorg/CD5_DIR]
Enter
[/sapcd]
/oracle/IDS/sapreorg/EXPORT3
[/oracle/IDS/sapreorg/CD6_DIR]
Enter
[/sapcd]
/oracle/IDS/sapreorg/EXPORT4
[/oracle/IDS/sapreorg/CD7_DIR]
Enter
[/sapcd]
/oracle/IDS/sapreorg/EXPORT5
[/oracle/IDS/sapreorg/CD8_DIR]
Enter
[/sapcd]
/oracle/IDS/sapreorg/EXPORT6
[/oracle/IDS/sapreorg/CD9_DIR]
Enter
[3600]
Enter
603
Default
Input
[101]
Enter
[102]
Enter
[100]
Enter
[1000]
Enter
[1002]
Enter
[2]
Enter
If you had not copied the CDs to the different locations, then the SAP-Installer cannot find the CD needed (identified
by the LABEL.ASC-File on CD) and would then ask you to insert and mount the CD and confirm or enter the mount
path.
The CENTRDB.R3S might not be error-free. In my case, it requested EXPORT4 again (but indicated the correct key
(6_LOCATION, then 7_LOCATION etc.), so one can just continue with entering the correct values. Do not get
irritated.
Apart from some problems mentioned below, everything should go straight through up to the point where the Oracle
database software needs to be installed.
The script then asks some questions (defaults in brackets, followed by actual input):
Question
Default
Input
[C11]
PRDEnter
[00]
Enter
[/sapmnt]
Enter
[majestix]
Enter
[PRD]
PRDEnter
[majestix]
Enter
[1] (WE8DEC)
Enter
2Enter
Enter
[/sapcd]
/oracle/PRD/sapreorg/KERNEL
Enter
[3600]
604
Default
Input
[100]
Enter
[101]
Enter
[102]
Enter
[1002]
Enter
[1000]
Enter
LDAP support
[1] (continue)
Enter
Enter
So far, creation of users gives an error during installation in phases OSUSERDBSID_IND_ORA (for creating user
orasid ) and OSUSERSIDADM_IND_ORA (creating user sidadm).
Apart from some problems mentioned below, everything should go straight through up to the point where the Oracle
database software needs to be installed.
See the corresponding SAP-Notes or Oracle Readmes for further information. If this is no option (at the time of
installation I did not have enough time to check this), one could use the original binaries, or use the relinked binaries
from an original RedHat System.
For compiling the intelligent agent, the RedHat Tcl package must be installed. If you cannot get
tcl-8.0.3-20.i386.rpm, a newer one like tcl-8.0.5-30.i386.rpm for RedHat 6.1 should also do.
su - oraids
export TERM=xterm
export ORACLE_TERM=xterm
export ORACLE_HOME=/oracle/IDS
605
Confirm all Screens with Enter until the software is installed, except that one has to deselect the Oracle On-Line
Text Viewer, as this is not currently available for Linux. Oracle then wants to relink with
i386-glibc20-linux-gcc instead of the available gcc, egcs or i386-redhat-linux-gcc .
Due to time constrains I decided to use the binaries from an Oracle 8.0.5 PreProduction release, after the first
attempt at getting the version from the RDBMS-CD working, failed, and finding and accessing the correct RPMs
was a nightmare at that time.
22.6.9.2 Installing the Oracle 8.0.5 Pre-production Release for Linux (Kernel 2.0.33)
This installation is quite easy. Mount the CD, start the installer. It will then ask for the location of the Oracle home
directory, and copy all binaries there. I did not delete the remains of my previous RDBMS-installation tries, though.
Afterwards, Oracle Database could be started with no problems.
Input
sapEnter
sapEnter
change_on_installEnter
change_on_installEnter
managerEnter
managerEnter
At this point I had a few problems with dipgntab during the 4.6B installation.
606
Otherwise you might get ORA-12546 as the sockets will not have the correct permissions. See SAP note 072984.
Calling saplicense without options gives a list of options. Upon receiving the license key, it can be installed using:
# /sapmnt/IDS/exe/saplicense -install
=
=
=
=
=
SID, 3 chars
hardware key, 11 chars
installation, 10 digits
yyyymmdd, usually "99991231"
license key, 24 chars
607
Transaction
RZ10
RZ04
These and all the other post-installation steps are thoroughly described in SAP installation guides.
Explanations:
compress The tape I use is a HP DLT1 which does hardware compression.
archive_function This defines the default behavior for saving Oracle archive logs: New logfiles are saved to tape,
already saved logfiles are saved again and are then deleted. This prevents lots of trouble if you need to recover the
database, and one of the archive-tapes has gone bad.
cpio_flags Default is to use -B which sets block size to 5120 Bytes. For DLT-Tapes, HP recommends at least 32 K
block size, so I used --block-size=128 for 64 K. --format=newc is needed I have inode numbers greater than 65535.
The last option --quiet is needed as otherwise brbackup complains as soon as cpio outputs the numbers of blocks
saved.
cpio_in_flags Flags needed for loading data back from tape. Format is recognized automatically.
tape_size This usually gives the raw storage capability of the tape. For security reason (we use hardware
608
Value
ztta/roll_extension
abap/heap_area_dia
250000000
300000000
abap/heap_area_nondia
400000000
em/initial_size_MB
em/blocksize_kB
256
1024
ipc/shm_psize_40
70000000
SAP-Note 0013026:
Name
Value
ztta/dynpro_area
2500000
SAP-Note 0157246:
Name
Value
rdisp/ROLL_MAXFS
16000
rdisp/PG_MAXFS
30000
Note: With the above parameters, on a system with 1 gigabyte of memory, one may find memory consumption
similar to:
Mem: 547M Active, 305M Inact, 109M Wired, 40M Cache, 112M Buf, 3492K Free
for 4.6C, no matter whether the error occurred with CENTRAL.R3S or DATABASE.R3S.
Note: At some stages, R3SETUP assumes that both database- and SAP-processes are up and running (as
those were steps it already completed). Should errors occur and for example the database could not be started,
you have to start both database and SAP by hand after you fixed the errors and before starting R3SETUP again.
609
May 5
ERROR
May 5
ERROR
ERROR
ERROR
14:23:14 2001
=> no valid userarea given [trgmsgo. 0401]
14:23:22 2001
=> ERROR NR 24 occured [trgmsgi. 0410]
=> Error when generating text environment. [trgmsgi. 0435]
=> function failed [trgmsgi. 0447]
610
This behavior is due to SAP R/3 being unable to correctly assign a locale and also not being properly configured
itself (missing entries in some database tables). To be able to connect to SAP, add the following entries to file
DEFAULT.PFL (see note 0043288):
abap/set_etct_env_at_new_mode = 0
install/collate/active = 0
rscp/TCP0B = TCP0B
Restart the SAP system. Now you can connect to the system, even though country-specific language settings might
not work as expected. After correcting country-settings (and providing the correct locales), these entries can be
removed from DEFAULT.PFL and the SAP system can be restarted.
22.6.13.6 ORA-00001
This error only happened with Oracle 8.1.7 on FreeBSD 4.5. The reason was that the Oracle database could not
initialize itself properly and crashed, leaving semaphores and shared memory on the system. The next try to start the
database then returned ORA-00001.
Find them with ipcs -a and remove them with ipcrm.
Otherwise you might get ORA-12546 as the sockets will not have the correct permissions. See SAP note 0072984.
611
/compat/linux/usr/sap
# ls -l
total 4
drwxr-xr-x 3 idsadm sapsys
drwxr-x--x 5 idsadm sapsys
lrwxr-xr-x 1 root
sapsys
drwxrwxr-x 2 idsadm sapsys
drwxrwxr-x 11 idsadm sapsys
512 May
512 May
7 May 5
512 May
512 May
5 11:20 D00
5 11:35 IDS
11:35 SYS -> IDS/SYS
5 13:00 tmp
4 14:20 trans
I also found SAP notes (0029227 and 0008401) describing this behavior. I did not encounter any of these problems
with the SAP 4.6C-installation.
612