            Frequently Asked Questions for FreeBSD 2.X, 3.X and 4.X

  The FreeBSD Documentation Project

   Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 by The
   FreeBSD Documentation Project

   This is the FAQ for FreeBSD versions 2.X, 3.X, and 4.X. All entries are
   assumed to be relevant to FreeBSD 2.0.5 and later, unless otherwise noted.
   Any entries with a <XXX> are under construction. If you are interested in
   helping with this project, send email to the FreeBSD documentation project
   mailing list <freebsd-doc@FreeBSD.org>. The latest version of this
   document is always available from the FreeBSD World Wide Web server. It
   may also be downloaded as one large HTML file with HTTP or as plain text,
   postscript, PDF, etc. from the FreeBSD FTP server. You may also want to
   Search the FAQ.

   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

   1 Introduction

   2 Documentation and Support

   3 Installation

   4 Hardware compatibility

   5 Troubleshooting

   6 Commercial Applications

   7 User Applications

   8 Kernel Configuration

   9 Disks, Filesystems, and Boot Loaders

   10 System Administration

   11 The X Window System and Virtual Consoles

   12 Networking

   13 Security

   14 PPP

   15 Serial Communications

   16 Miscellaneous Questions

   17 The FreeBSD Funnies

   18 Advanced Topics

   19 Acknowledgments

   Bibliography

   List of Tables

   3-1. Maximum file sizes

   12-1. Network cards based on the DEC PCI chipset

   List of Examples

   11-1. ``Pointer'' Section for Wheeled Mouse in XFree86 3.3.x series
   XF86Config with moused Translation

   11-2. ``InputDevice'' Section for Wheeled Mouse in XFree86 4.x series
   XF86Config with X Server Translation

   11-3. ``.emacs'' example for naive page scrolling with Wheeled Mouse

   11-4. ``Pointer'' Section for Wheeled Mouse in XF86Config with X Server
   Translation

   11-5. ``InputDevice'' Section for Wheeled Mouse in XFree86 4.x series
   XF86Config with X Server Translation

   11-6. ``.emacs'' example for naive page scrolling with Wheeled Mouse

   11-7. Emacs Configuration for Imwheel

   11-8. Xemacs Configuration for Imwheel

     ----------------------------------------------------------------------

                             Chapter 1 Introduction

   Welcome to the FreeBSD 2.X-4.X FAQ!

   As is usual with Usenet FAQs, this document aims to cover the most
   frequently asked questions concerning the FreeBSD operating system (and of
   course answer them!). Although originally intended to reduce bandwidth and
   avoid the same old questions being asked over and over again, FAQs have
   become recognized as valuable information resources.

   Every effort has been made to make this FAQ as informative as possible; if
   you have any suggestions as to how it may be improved, please feel free to
   mail them to the FAQ Maintainer <faq@FreeBSD.org>.

   1.1. What is FreeBSD?

   1.2. What is the goal of the FreeBSD Project?

   1.3. Does the FreeBSD license have any restrictions?

   1.4. Can FreeBSD replace my current operating system?

   1.5. Why is it called FreeBSD?

   1.6. What is the latest version of FreeBSD?

   1.7. What is FreeBSD-CURRENT?

   1.8. What is the FreeBSD-STABLE concept?

   1.9. When are FreeBSD releases made?

   1.10. Who is responsible for FreeBSD?

   1.11. Where can I get FreeBSD?

   1.12. How do I access the Problem Report database?

   1.13. How do I become a FreeBSD Web mirror?

   1.14. What other sources of information are there?

   1.1. What is FreeBSD?

   Briefly, FreeBSD is a UN*X-like operating system for the i386 and
   Alpha/AXP platforms based on U.C. Berkeley's ``4.4BSD-Lite'' release, with
   some ``4.4BSD-Lite2'' enhancements. It is also based indirectly on William
   Jolitz's port of U.C. Berkeley's ``Net/2'' to the i386, known as
   ``386BSD'', though very little of the 386BSD code remains. A fuller
   description of what FreeBSD is and how it can work for you may be found on
   the FreeBSD home page.

   FreeBSD is used by companies, Internet Service Providers, researchers,
   computer professionals, students and home users all over the world in
   their work, education and recreation. See some of them in the FreeBSD
   Gallery.

   For more detailed information on FreeBSD, please see the FreeBSD Handbook.

   1.2. What is the goal of the FreeBSD Project?

   The goal of the FreeBSD Project is to provide software that may be used
   for any purpose and without strings attached. Many of us have a
   significant investment in the code (and project) and would certainly not
   mind a little financial compensation now and then, but we definitely do
   not insist on it. We believe that our first and foremost ``mission'' is to
   provide code to any and all comers, and for whatever purpose, so that the
   code gets the widest possible use and provides the widest possible
   benefit. This is, we believe, one of the most fundamental goals of Free
   Software and one that we enthusiastically support.

   That code in our source tree which falls under the GNU General Public
   License (GPL) or GNU Library General Public License (LGPL) comes with
   slightly more strings attached, though at least on the side of enforced
   access rather than the usual opposite. Due to the additional complexities
   that can evolve in the commercial use of GPL software, we do, however,
   endeavor to replace such software with submissions under the more relaxed
   FreeBSD copyright whenever possible.

   1.3. Does the FreeBSD license have any restrictions?

   Yes. Those restrictions do not control how you use the code, merely how
   you treat the FreeBSD Project itself. If you have serious license
   concerns, read the actual license. For the simply curious, the license can
   be summarized like this.

     * Do not claim that you wrote this.

     * Do not sue us if it breaks.

   1.4. Can FreeBSD replace my current operating system?

   For most people, yes. But this question is not quite that cut-and-dried.

   Most people do not actually use an operating system. They use
   applications. The applications are what really use the operating system.
   FreeBSD is designed to provide a robust and full-featured environment for
   applications. It supports a wide variety of web browsers, office suites,
   email readers, graphics programs, programming environments, network
   servers, and just about everything else you might want. Most of these
   applications can be managed through the Ports Collection.

   If you need to use an application that is only available on one operating
   system, you simply cannot replace that operating system. Chances are there
   is a very similar application on FreeBSD, however. If you want a solid
   office or Internet server, a reliable workstation, or just the ability to
   do your job without interruptions, FreeBSD will almost certainly do
   everything you need. Many computer users across the world, including both
   novices and experienced UNIX administrators, use FreeBSD as their only
   desktop operating system.

   If you are migrating to FreeBSD from some other UNIX environment, you
   already know most of what you need to. If your background is in
   graphic-driven operating systems such as Windows and older versions of Mac
   OS, expect to invest additional time learning the UNIX way of doing
   things. This FAQ and the FreeBSD Handbook are excellent places to start.

   1.5. Why is it called FreeBSD?

   * It may be used free of charge, even by commercial users.

   * Full source for the operating system is freely available, and the
     minimum possible restrictions have been placed upon its use,
     distribution and incorporation into other work (commercial or
     non-commercial).

   * Anyone who has an improvement or bug fix is free to submit their code
     and have it added to the source tree (subject to one or two obvious
     provisions).

   It is worth pointing out that the word ``free'' is being used in two ways
   here, one meaning ``at no cost'', the other meaning ``you can do whatever
   you like''. Apart from one or two things you cannot do with the FreeBSD
   code, for example pretending you wrote it, you can really do whatever you
   like with it.

   1.6. What is the latest version of FreeBSD?

   Version 4.7 is the latest RELEASE version; it was released in October,
   2002. This is also the latest STABLE version.

   Briefly, -STABLE is aimed at the ISP, corporate user, or any user who
   wants stability and a minimal number of changes compared to the new (and
   possibly unstable) features of the latest -CURRENT snapshot. Releases can
   come from either branch, but -CURRENT should only be used if you are
   prepared for its increased volatility (relative to -STABLE, that is).

   Releases are made every few months. While many people stay more up-to-date
   with the FreeBSD sources (see the questions on FreeBSD-CURRENT and
   FreeBSD-STABLE) than that, doing so is more of a commitment, as the
   sources are a moving target.

   1.7. What is FreeBSD-CURRENT?

   FreeBSD-CURRENT is the development version of the operating system, which
   will in due course become 5.0-RELEASE. As such, it is really only of
   interest to developers working on the system and die-hard hobbyists. See
   the relevant section in the handbook for details on running -CURRENT.

   If you are not familiar with the operating system or are not capable of
   identifying the difference between a real problem and a temporary problem,
   you should not use FreeBSD-CURRENT. This branch sometimes evolves quite
   quickly and can be un-buildable for a number of days at a time. People
   that use FreeBSD-CURRENT are expected to be able to analyze any problems
   and only report them if they are deemed to be mistakes rather than
   ``glitches''. Questions such as ``make world produces some error about
   groups'' on the -CURRENT mailing list may be treated with contempt.

   Every day, snapshot releases are made based on the current state of the
   -CURRENT and -STABLE branches. Distributions of the occasional snapshot
   are made available. The goals behind each snapshot release are:

     * To test the latest version of the installation software.

     * To give people who would like to run -CURRENT or -STABLE but who do
       not have the time or bandwidth to follow it on a day-to-day basis an
       easy way of bootstrapping it onto their systems.

     * To preserve a fixed reference point for the code in question, just in
       case we break something really badly later. (Although CVS normally
       prevents anything horrible like this happening :)

     * To ensure that all new features and fixes in need of testing have the
       greatest possible number of potential testers.

   No claims are made that any -CURRENT snapshot can be considered
   ``production quality'' for any purpose. If you want to run a stable and
   fully tested system, you will have to stick to full releases, or use the
   -STABLE snapshots.

   Snapshot releases are directly available from
   ftp://current.FreeBSD.org/pub/FreeBSD/ for 5.0-CURRENT and
   releng4.FreeBSD.org for 4-STABLE snapshots. 3-STABLE snapshots are not
   being produced at the time of this writing (May 2000).

   Snapshots are generated, on the average, daily for all actively developed
   branches.

   1.8. What is the FreeBSD-STABLE concept?

   Back when FreeBSD 2.0.5 was released, FreeBSD development branched in two.
   One branch was named -STABLE, one -CURRENT. FreeBSD-STABLE is intended for
   Internet Service Providers and other commercial enterprises for whom
   sudden shifts or experimental features are quite undesirable. It receives
   only well-tested bug fixes and other small incremental enhancements.
   FreeBSD-CURRENT, on the other hand, has been one unbroken line leading
   towards 5.0-RELEASE (and beyond) since 2.0 was released. If a little ASCII
   art would help, this is how it looks:

                      2.0
                       |
                       |
                       |  [2.1-STABLE]
      *BRANCH*       2.0.5 -> 2.1 -> 2.1.5 -> 2.1.6 -> 2.1.7.1  [2.1-STABLE ends]
                       |                            (Mar 1997)
                       |
                       |
                       |  [2.2-STABLE]
      *BRANCH*       2.2.1 -> 2.2.2-RELEASE -> 2.2.5 -> 2.2.6 -> 2.2.7 -> 2.2.8 [end]
                       |       (Mar 1997)    (Oct 97) (Apr 98) (Jul 98) (Dec 98)
                       |
                       |
                    3.0-SNAPs  (started Q1 1997)
                       |
                       |
                    3.0-RELEASE (Oct 1998)
                       |
                       |  [3.0-STABLE]
      *BRANCH*      3.1-RELEASE  (Feb 1999) -> 3.2 -> 3.3 -> 3.4 -> 3.5 -> 3.5.1
                       |                     (May 1999) (Sep 1999) (Dec 1999) (June 2000) (July 2000)
                       |
                       |  [4.0-STABLE]
      *BRANCH*        4.0  (Mar 2000) -> 4.1 -> 4.1.1 -> 4.2 -> 4.3 -> 4.4 -> ... future 4.X releases ...
                       |
                       |              (July 2000)   (Sep 2000)   (Nov 2000)
                      \|/
                       +
               [5.0-CURRENT continues]

   The 2.2-STABLE branch was retired with the release of 2.2.8. The 3-STABLE
   branch has ended with the release of 3.5.1, the final 3.X release. The
   only changes made to either of these branches will be, for the most part,
   security-related bug fixes.

   4-STABLE is the actively developed -STABLE branch. The latest release on
   the 4-STABLE is 4.7-RELEASE, which was released in October, 2002.

   The 5-CURRENT branch is slowly progressing toward 5.0-RELEASE and beyond.
   See What is FreeBSD-CURRENT? for more information on this branch.

   1.9. When are FreeBSD releases made?

   The Release Engineering Team <re@FreeBSD.org> releases a new version of
   FreeBSD about every four months, on average. Release dates are announced
   well in advance, so that the people working on the system know when their
   projects need to be finished and tested. A testing period precedes each
   release, in order to ensure that the addition of new features does not
   compromise the stability of the release. Many users regard this caution as
   one of the best things about FreeBSD, even though waiting for all the
   latest goodies to reach -STABLE can be a little frustrating.

   More information on the release engineering process (including a schedule
   of upcoming releases) can be found on the release engineering pages on the
   FreeBSD Web site.

   For people who need or want a little more excitement, binary snapshots are
   made daily as discussed above.

   1.10. Who is responsible for FreeBSD?

   The key decisions concerning the FreeBSD project, such as the overall
   direction of the project and who is allowed to add code to the source
   tree, are made by a core team of 9 people. There is a much larger team of
   more than 200 committers who are authorized to make changes directly to
   the FreeBSD source tree.

   However, most non-trivial changes are discussed in advance in the mailing
   lists, and there are no restrictions on who may take part in the
   discussion.

   1.11. Where can I get FreeBSD?

   Every significant release of FreeBSD is available via anonymous FTP from
   the FreeBSD FTP site:

     * For the current 3.X-STABLE release, 3.5.1-RELEASE, see the
       3.5.1-RELEASE directory.

     * The current 4-STABLE release, 4.7-RELEASE can be found in the
       4.7-RELEASE directory.

     * 4.X snapshots are usually made daily.

     * 5.0 Snapshot releases are made daily for the -CURRENT branch, these
       being of service purely to bleeding-edge testers and developers.

   Information about obtaining FreeBSD on CD, DVD, and other media can be
   found in the Handbook.

   1.12. How do I access the Problem Report database?

   The Problem Report database of all user change requests may be queried (or
   submitted to) by using our web-based PR submission and query interfaces.
   The send-pr(1) command can also be used to submit problem reports and
   change requests via electronic mail.

   Before submitting a problem report, please read Writing FreeBSD Problem
   Reports, an article on how to write good problem reports.

   1.13. How do I become a FreeBSD Web mirror?

   There are multiple ways to mirror the Web pages.

     * You can retrieve the formatted files from a FreeBSD CVSup server using
       the application net/cvsup. The file
       /usr/share/examples/cvsup/www-supfile contains an example CVSup
       configuration file for web mirrors.

     * You can download the web site source code from any FreeBSD FTP server
       using your favorite ftp mirror tool. Keep in mind that you have to
       build these sources before publishing them. Start mirroring at
       ftp://ftp.FreeBSD.org/pub/FreeBSD/FreeBSD-current/www.

   1.14. What other sources of information are there?

   Please check the Documentation list on the main FreeBSD web site.

     ----------------------------------------------------------------------

                      Chapter 2 Documentation and Support

   2.1. What good books are there about FreeBSD?

   2.2. Is the documentation available in other formats, such as plain text
   (ASCII), or Postscript?

   2.3. Where do I find info on the FreeBSD mailing lists?

   2.4. Where do I find the FreeBSD Y2K info?

   2.5. What FreeBSD news groups are available?

   2.6. Are there FreeBSD IRC (Internet Relay Chat) channels?

   2.7. Where can I get commercial FreeBSD training and support?

   2.1. What good books are there about FreeBSD?

   The project produces a wide range of documentation, available from this
   link: http://www.FreeBSD.org/docs.html. In addition, the Bibliography at
   the end of this FAQ, and the one in the Handbook reference other
   recommended books.

   2.2. Is the documentation available in other formats, such as plain text
   (ASCII), or Postscript?

   Yes. The documentation is available in a number of different formats and
   compression schemes on the FreeBSD FTP site, in the /pub/FreeBSD/doc/
   directory.

   The documentation is categorized in a number of different ways. These
   include:

     * The document's name, such as faq, or handbook.

     * The document's language and encoding. These are based on the locale
       names you will find under /usr/share/locale on your FreeBSD system.
       The current languages and encodings that we have for documentation are
       as follows:

       Name            Meaning                   
       en_US.ISO8859-1 US English                
       de_DE.ISO8859-1 German                    
       es_ES.ISO8859-1 Spanish                   
       fr_FR.ISO8859-1 French                    
       ja_JP.eucJP     Japanese (EUC encoding)   
       ru_RU.KOI8-R    Russian (KOI8-R encoding) 
       zh_TW.Big5      Chinese (Big5 encoding)   

         Note: Some documents may not be available in all languages.

     * The document's format. We produce the documentation in a number of
       different output formats. Each format has its own advantages and
       disadvantages. Some formats are better suited for online reading,
       while others are meant to be aesthetically pleasing when printed on
       paper. Having the documentation available in any of these formats
       ensures that our readers will be able to read the parts they are
       interested in, either on their monitor, or on paper after printing the
       documents. The currently available formats are:

       Format                 Meaning                                         
       html-split             A collection of small, linked, HTML files.      
       html                   One large HTML file containing the entire       
                              document                                        
       pdb                    Palm Pilot database format, for use with the    
                              iSilo reader.                                   
       pdf                    Adobe's Portable Document Format                
       ps                     Postscript                                      
       rtf                    Microsoft's Rich Text Format[a]                 
       txt                    Plain text                                      
       Notes:                 
       a. Page numbers are not automatically updated when loading this format
       into Word. Press CTRL+A, CTRL+END, F9 after loading the document, to
       update the page numbers.

     * The compression and packaging scheme. There are three of these
       currently in use.

         1. Where the format is html-split, the files are bundled up using
            tar(1). The resulting .tar file is then compressed using the
            compression schemes detailed in the next point.

         2. All the other formats generate one file, called book.format
            (i.e., book.pdb, book.html, and so on).

            These files are then compressed using three compression schemes.

            Scheme Description                                                
            zip    The Zip format. If you want to uncompress this on FreeBSD  
                   you will need to install the archivers/unzip port first.   
            gz     The GNU Zip format. Use gunzip(1) to uncompress these      
                   files, which is part of FreeBSD.                           
            bz2    The BZip2 format. Less widespread than the others, but     
                   generally gives smaller files. Install the archivers/bzip2 
                   port to uncompress these files.                            

            So the Postscript version of the Handbook, compressed using BZip2
            will be stored in a file called book.ps.bz2 in the handbook/
            directory.

         3. The formatted documentation is also available as a FreeBSD
            package, of which more later.

   After choosing the format and compression mechanism that you want to
   download, you must then decide whether or not you want to download the
   document as a FreeBSD package.

   The advantage of downloading and installing the package is that the
   documentation can then be managed using the normal FreeBSD package
   management comments, such as pkg_add(1) and pkg_delete(1).

   If you decide to download and install the package then you must know the
   filename to download. The documentation-as-packages files are stored in a
   directory called packages. Each package file looks like
   document-name.lang.encoding.format.tgz.

   For example, the FAQ, in English, formatted as PDF, is in the package
   called faq.en_US.ISO8859-1.pdf.tgz.

   Knowing this, you can use the following command to install the English PDF
   FAQ package.

     # pkg_add ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/packages/faq.en_US.ISO8859-1.pdf.tgz

   Having done that, you can use pkg_info(1) to determine where the file has
   been installed.

     # pkg_info -f faq.en_US.ISO8859-1.pdf
     Information for faq.en_US.ISO8859-1.pdf:
    
     Packing list:
             Package name: faq.en_US.ISO8859-1.pdf
             CWD to /usr/share/doc/en_US.ISO8859-1/books/faq
     File: book.pdf
             CWD to .
     File: +COMMENT (ignored)
     File: +DESC (ignored)

   As you can see, book.pdf will have been installed into
   /usr/share/doc/en_US.ISO8859-1/books/faq.

   If you do not want to use the packages then you will have to download the
   compressed files yourself, uncompress them, and then copy the appropriate
   documents into place.

   For example, the split HTML version of the FAQ, compressed using gzip(1),
   can be found in the doc/en_US.ISO8859-1/books/faq/book.html-split.tar.gz
   file. To download and uncompress that file you would have to do this.

     # fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/en_US.ISO8859-1/books/faq/book.html-split.tar.gz
     # gzip -d book.html-split.tar.gz
     # tar xvf book.html-split.tar

   You will be left with a collection of .html files. The main one is called
   index.html, which will contain the table of contents, introductory
   material, and links to the other parts of the document. You can then copy
   or move these to their final location as necessary.

   2.3. Where do I find info on the FreeBSD mailing lists?

   You can find full information in the Handbook entry on mailing-lists.

   2.4. Where do I find the FreeBSD Y2K info?

   You can find full information in the FreeBSD Y2K page.

   2.5. What FreeBSD news groups are available?

   You can find full information in the Handbook entry on newsgroups.

   2.6. Are there FreeBSD IRC (Internet Relay Chat) channels?

   Yes, most major IRC networks host a FreeBSD chat channel:

     * Channel #FreeBSD on EFNet is a FreeBSD forum, but do not go there for
       tech support or try to get folks there to help you avoid the pain of
       reading manual pages or doing your own research. It is a chat channel,
       first and foremost, and topics there are just as likely to involve
       sex, sports or nuclear weapons as they are FreeBSD. You Have Been
       Warned! Available at server irc.chat.org.

     * Channel #FreeBSDhelp on EFNet is a channel dedicated to helping
       FreeBSD users. They are much more sympathetic to questions than
       #FreeBSD is.

     * Channel #FreeBSD on DALNET is available at irc.dal.net in the US and
       irc.eu.dal.net in Europe.

     * Channel #FreeBSD on UNDERNET is available at us.undernet.org in the US
       and eu.undernet.org in Europe. Since it is a help channel, be prepared
       to read the documents you are referred to.

     * Channel #FreeBSD on HybNet. This channel is a help channel. A list of
       servers can be found on the HybNet web site.

   Each of these channels are distinct and are not connected to each other.
   Their chat styles also differ, so you may need to try each to find one
   suited to your chat style. As with all types of IRC traffic, if you are
   easily offended or cannot deal with lots of young people (and more than a
   few older ones) doing the verbal equivalent of jello wrestling, do not
   even bother with it.

   2.7. Where can I get commercial FreeBSD training and support?

   DaemonNews provides commercial training and support for FreeBSD. More
   information can be found at their BSD Mall site.

   FreeBSD Services Ltd provide commercial support for FreeBSD in the UK (as
   well as selling FreeBSD on DVD). See their web site for more information.

   The FreeBSD Mall provides commercial FreeBSD support. You can get more
   information at their web site.

   Any other organizations providing training and support should contact the
   project in order to be listed here.

     ----------------------------------------------------------------------

                             Chapter 3 Installation

   Nik Clayton

   3.1. Which file do I download to get FreeBSD?

   3.2. What do I do if the floppy images does not fit on a single floppy?

   3.3. Where are the instructions for installing FreeBSD?

   3.4. What do I need in order to run FreeBSD?

   3.5. I have only 4 MB of RAM. Can I install FreeBSD?

   3.6. How can I make my own custom install floppy?

   3.7. Can I have more than one operating system on my PC?

   3.8. Can Windows 95/98 co-exist with FreeBSD?

   3.9. Windows 95/98 killed my boot manager! How do I get it back?

   3.10. My A, T, or X series IBM Thinkpad locks up when I first booted up my
   FreeBSD installation. How can I solve this?

   3.11. Can I install on a disk with bad blocks?

   3.12. I have just upgraded from 3.X to 4.X, and my first boot failed with
   ``bad sector table not supported''

   3.13. How do I tell if a drive has bad144 information on it before I try
   to upgrade to FreeBSD 4.0 and it fails?

   3.14. How do I remove bad144 from my pre-4.X system so I can upgrade
   safely?

   3.15. Strange things happen when I boot the install floppy! What is
   happening?

   3.16. I booted from my ATAPI CDROM, but the install program says no CDROM
   is found. Where did it go?

   3.17. Can I install on my laptop over PLIP (Parallel Line IP)?

   3.18. Which geometry should I use for a disk drive?

   3.19. Are there any restrictions on how I divide the disk up?

   3.20. Is FreeBSD compatible with any disk managers?

   3.21. When I boot FreeBSD I get ``Missing Operating System''. What is
   happening?

   3.22. Why can I not get past the boot manager's F? prompt?

   3.23. Do I need to install the complete sources?

   3.24. Do I need to build a kernel?

   3.25. Should I use DES, Blowfish, or MD5 passwords and how do I specify
   which form my users receive?

   3.26. Why does the boot floppy start, but hang at the Probing Devices...
   screen?

   3.27. Why do I get a ``panic: can't mount root'' error when rebooting the
   system after installation?

   3.28. What are the limits for memory?

   3.29. What are the limits for ffs filesystems?

   3.30. Why do I get an error message, ``archsw.readin.failed'' after
   compiling and booting a new kernel?

   3.31. How do I upgrade from 3.X -> 4.X?

   3.32. What are these ``security profiles''?

   3.1. Which file do I download to get FreeBSD?

   Prior to release 3.1, you only needed one floppy image to install FreeBSD,
   namely floppies/boot.flp. However, since release 3.1 the Project has added
   out-of-the-box support for a wide variety of hardware, which takes up more
   space. For 3.X and later you need two floppy images: floppies/kernel.flp
   and floppies/mfsroot.flp. These images need to be copied onto floppies by
   tools like fdimage or dd(1).

   If you need to download the distributions yourself (for a DOS filesystem
   install, for instance), below are some recommendations for distributions
   to grab:

     * bin/

     * manpages/

     * compat*/

     * doc/

     * src/ssys.*

   Full instructions on this procedure and a little bit more about
   installation issues in general can be found in the Handbook entry on
   installing FreeBSD.

   3.2. What do I do if the floppy images does not fit on a single floppy?

   A 3.5 inch (1.44MB) floppy can accommodate 1474560 bytes of data. The boot
   image is exactly 1474560 bytes in size.

   Common mistakes when preparing the boot floppy are:

     * Not downloading the floppy image in binary mode when using FTP.

       Some FTP clients default their transfer mode to ascii and attempt to
       change any end-of-line characters received to match the conventions
       used by the client's system. This will almost invariably corrupt the
       boot image. Check the size of the downloaded boot image: if it is not
       exactly that on the server, then the download process is suspect.

       To workaround: type binary at the FTP command prompt after getting
       connected to the server and before starting the download of the image.

     * Using the DOS copy command (or equivalent GUI tool) to transfer the
       boot image to floppy.

       Programs like copy will not work as the boot image has been created to
       be booted into directly. The image has the complete content of the
       floppy, track for track, and is not meant to be placed on the floppy
       as a regular file. You have to transfer it to the floppy ``raw'',
       using the low-level tools (e.g. fdimage or rawrite) described in the
       installation guide to FreeBSD.

   3.3. Where are the instructions for installing FreeBSD?

   Installation instructions can be found in the Handbook entry on installing
   FreeBSD.

   3.4. What do I need in order to run FreeBSD?

   You will need a 386 or better PC, with 5 MB or more of RAM and at least 60
   MB of hard disk space. It can run with a low end MDA graphics card but to
   run X11R6, a VGA or better video card is needed.

   See also Chapter 4.

   3.5. I have only 4 MB of RAM. Can I install FreeBSD?

   FreeBSD 2.1.7 was the last version of FreeBSD that could be installed on a
   4MB system. FreeBSD 2.2 and later needs at least 5MB to install on a new
   system.

   All versions of FreeBSD will run in 4MB of RAM, they just cannot run the
   installation program in 4MB. You can add extra memory for the install
   process, if you like, and then after the system is up and running, go back
   to 4MB. Or you could swap your disk into a system which has >4MB, install
   onto the disk and then swap it back.

   FreeBSD 2.1.7 will not install with 640 kB base + 3 MB extended memory. If
   your motherboard can remap some of the ``lost'' memory out of the 640kB to
   1MB region, then you may still be able to get FreeBSD 2.1.7 up. Try to go
   into your BIOS setup and look for a ``remap'' option. Enable it. You may
   also have to disable ROM shadowing. It may be easier to get 4 more MB just
   for the install. Build a custom kernel with only the options you need and
   then remove the 4MB out. You can also install 2.0.5 and then upgrade your
   system to 2.1.7 with the ``upgrade'' option of the 2.1.7 installation
   program.

   After the installation, if you build a custom kernel, it will run in 4 MB.
   Someone has even successfully booted with 2 MB, although the system was
   almost unusable.

   3.6. How can I make my own custom install floppy?

   Currently there is no way to just make a custom install floppy. You have
   to cut a whole new release, which will include your install floppy.

   To make a custom release, follow the instructions in the Release
   Engineering article.

   3.7. Can I have more than one operating system on my PC?

   Have a look at the multi-OS page.

   3.8. Can Windows 95/98 co-exist with FreeBSD?

   Install Windows 95/98 first, after that FreeBSD. FreeBSD's boot manager
   will then manage to boot Win95/98 and FreeBSD. If you install Windows
   95/98 second, it will boorishly overwrite your boot manager without even
   asking. If that happens, see the next section.

   3.9. Windows 95/98 killed my boot manager! How do I get it back?

   You can reinstall the boot manager FreeBSD comes with in one of three
   ways:

     * Running DOS, go into the tools/ directory of your FreeBSD distribution
       and look for bootinst.exe. You run it like so:

     ...\TOOLS> bootinst.exe boot.bin

       and the boot manager will be reinstalled.

     * Boot the FreeBSD boot floppy again and go to the Custom installation
       menu item. Choose Partition. Select the drive which used to contain
       your boot manager (likely the first one) and when you come to the
       partition editor for it, as the very first thing (e.g. do not make any
       changes) select (W)rite. This will ask for confirmation, say yes, and
       when you get the Boot Manager selection prompt, be sure to select
       ``Boot Manager''. This will re-write the boot manager to disk. Now
       quit out of the installation menu and reboot off the hard disk as
       normal.

     * Boot the FreeBSD boot floppy (or CDROM) and choose the ``Fixit'' menu
       item. Select either the Fixit floppy or CDROM #2 (the ``live''
       filesystem option) as appropriate and enter the fixit shell. Then
       execute the following command:

     Fixit# fdisk -B -b /boot/boot0 bootdevice

       substituting bootdevice for your real boot device such as ad0 (first
       IDE disk), ad4 (first IDE disk on auxiliary controller), da0 (first
       SCSI disk), etc.

   3.10. My A, T, or X series IBM Thinkpad locks up when I first booted up my
   FreeBSD installation. How can I solve this?

   A bug in early revisions of IBM's BIOS on these machines mistakenly
   identifies the FreeBSD partition as a potential FAT suspend-to-disk
   partition. When the BIOS tries to parse the FreeBSD partition it hangs.

   According to IBM[1], the following model/BIOS release numbers incorporate
   the fix.

   Model BIOS revision     
   T20   IYET49WW or later 
   T21   KZET22WW or later 
   A20p  IVET62WW or later 
   A20m  IWET54WW or later 
   A21p  KYET27WW or later 
   A21m  KXET24WW or later 
   A21e  KUET30WW          

   It has been reported that later IBM BIOS revisions may have reintroduced
   the bug. This message from Jacques Vidrine to the FreeBSD laptop computer
   mailing list <freebsd-mobile@FreeBSD.org> describes a procedure which may
   work if your newer IBM laptop does not boot FreeBSD properly, and you can
   upgrade or downgrade the BIOS.

   If you have an earlier BIOS, and upgrading is not an option a workaround
   is to install FreeBSD, change the partition ID FreeBSD uses, and install
   new boot blocks that can handle the different partition ID.

   First, you will need to restore the machine to a state where it can get
   through its self-test screen. Doing this requires powering up the machine
   without letting it find a FreeBSD partition on its primary disk. One way
   is to remove the hard disk and temporarily move it to an older ThinkPad
   (such as a ThinkPad 600) or a desktop PC with an appropriate conversion
   cable. Once it is there, you can delete the FreeBSD partition and move the
   hard disk back. The ThinkPad should now be in a bootable state again.

   With the machine functional again, you can use the workaround procedure
   described here to get a working FreeBSD installation.

    1. Download boot1 and boot2 from
       http://people.FreeBSD.org/~bmah/ThinkPad/. Put these files somewhere
       you will be able to retrieve them later.

    2. Install FreeBSD as normal on to the ThinkPad. Do not use Dangerously
       Dedicated mode. Do not reboot when the install has finished.

    3. Either switch to the ``Emergency Holographic Shell'' (ALT+F4) or start
       a ``fixit'' shell.

    4. Use fdisk(8) to change the FreeBSD partition ID from 165 to 166 (this
       is the type used by OpenBSD).

    5. Bring the boot1 and boot2 files to the local filesystem.

    6. Use disklabel(8) to write boot1 and boot2 to your FreeBSD slice.

     # disklabel -B -b boot1 -s boot2 ad0sn

       n is the number of the slice where you installed FreeBSD.

    7. Reboot. At the boot prompt you will be given the option of booting
       OpenBSD. This will actually boot FreeBSD.

   Getting this to work in the case where you want to dual boot OpenBSD and
   FreeBSD on the same laptop is left as an exercise for the reader.

   3.11. Can I install on a disk with bad blocks?

   Prior to 3.0, FreeBSD included a utility known as bad144, which
   automatically remapped bad blocks. Because modern IDE drives perform this
   function themselves, bad144 has been removed from the FreeBSD source tree.
   If you wish to install FreeBSD 3.0 or later, we strongly suggest you
   purchase a newer disk drive. If you do not wish to do this, you must run
   FreeBSD 2.X.

   If you are seeing bad block errors with a modern IDE drive, chances are
   the drive is going to die very soon (the drive's internal remapping
   functions are no longer sufficient to fix the bad blocks, which means the
   disk is heavily corrupted); we suggest you buy a new hard drive.

   If you have a SCSI drive with bad blocks, see this answer.

   3.12. I have just upgraded from 3.X to 4.X, and my first boot failed with
   ``bad sector table not supported''

   FreeBSD 3.X and earlier supported bad144, which automatically remapped bad
   blocks. FreeBSD 4.X and later do not support this, as modern IDE drives
   include this functionality. See this question for more information.

   To fix this after an upgrade, you need to physically place the drive in a
   working system and use disklabel(8) as discussed in the following
   questions.

   3.13. How do I tell if a drive has bad144 information on it before I try
   to upgrade to FreeBSD 4.0 and it fails?

   Use disklabel(8) for this. disklabel -r drive device will give you the
   contents of your disk label. Look for a flags field. If you see flags:
   badsect, this drive is using bad144. For example, the following drive has
   bad144 enabled.:

     # disklabel -r wd0
     # /dev/rwd0c:
     type: ESDI
     disk: wd0s1
     label:
     flags: badsect
     bytes/sector: 512
     sectors/track: 63

   3.14. How do I remove bad144 from my pre-4.X system so I can upgrade
   safely?

   Use disklabel -e -rwd0 to edit the disklabel in place. Just remove the
   word badsect from the flags field, save, and exit. The bad144 file will
   still take up some space on your drive, but the disk itself will be
   usable.

   We still recommend you purchase a new disk if you have a large number of
   bad blocks.

   3.15. Strange things happen when I boot the install floppy! What is
   happening?

   If you are seeing things like the machine grinding to a halt or
   spontaneously rebooting when you try to boot the install floppy, here are
   three questions to ask yourself:-

    1. Did you use a new, freshly-formatted, error-free floppy (preferably a
       brand-new one straight out of the box, as opposed to the magazine
       cover disk that has been lying under the bed for the last three
       years)?

    2. Did you download the floppy image in binary (or image) mode? (do not
       be embarrassed, even the best of us have accidentally downloaded a
       binary file in ASCII mode at least once!)

    3. If you are using Windows95 or Win98 did you run fdimage or rawrite in
       pure DOS mode? These operating systems can interfere with programs
       that write directly to hardware, which the disk creation program does;
       even running it inside a DOS shell in the GUI can cause this problem.

   There have also been reports of Netscape causing problems when downloading
   the boot floppy, so it is probably best to use a different FTP client if
   you can.

   3.16. I booted from my ATAPI CDROM, but the install program says no CDROM
   is found. Where did it go?

   The usual cause of this problem is a mis-configured CDROM drive. Many PCs
   now ship with the CDROM as the slave device on the secondary IDE
   controller, with no master device on that controller. This is illegal
   according to the ATAPI specification, but Windows plays fast and loose
   with the specification, and the BIOS ignores it when booting. This is why
   the BIOS was able to see the CDROM to boot from it, but why FreeBSD cannot
   see it to complete the install.

   Reconfigure your system so that the CDROM is either the master device on
   the IDE controller it is attached to, or make sure that it is the slave on
   an IDE controller that also has a master device.

   3.17. Can I install on my laptop over PLIP (Parallel Line IP)?

   Yes. Use a standard Laplink cable. If necessary, you can check out the
   PLIP section of the Handbook for details on parallel port networking.

   If you are running FreeBSD 3.X or earlier, also look at the Mobile
   Computing page.

   3.18. Which geometry should I use for a disk drive?

   Note: By the ``geometry'' of a disk, we mean the number of cylinders,
   heads and sectors/track on a disk. We will refer to this as C/H/S for
   convenience. This is how the PC's BIOS works out which area on a disk to
   read/write from.

   This causes a lot of confusion among new system administrators. First of
   all, the physical geometry of a SCSI drive is totally irrelevant, as
   FreeBSD works in term of disk blocks. In fact, there is no such thing as
   ``the'' physical geometry, as the sector density varies across the disk.
   What manufacturers claim is the ``physical geometry'' is usually the
   geometry that they have determined wastes the least space. For IDE disks,
   FreeBSD does work in terms of C/H/S, but all modern drives internally
   convert this into block references.

   All that matters is the logical geometry. This is the answer that the BIOS
   gets when it asks the drive ``what is your geometry?'' It then uses this
   geometry to access the disk. As FreeBSD uses the BIOS when booting, it is
   very important to get this right. In particular, if you have more than one
   operating system on a disk, they must all agree on the geometry. Otherwise
   you will have serious problems booting!

   For SCSI disks, the geometry to use depends on whether extended
   translation support is turned on in your controller (this is often
   referred to as ``support for DOS disks >1GB'' or something similar). If it
   is turned off, then use N cylinders, 64 heads and 32 sectors/track, where
   N is the capacity of the disk in MB. For example, a 2GB disk should
   pretend to have 2048 cylinders, 64 heads and 32 sectors/track.

   If it is turned on (it is often supplied this way to get around certain
   limitations in MSDOS) and the disk capacity is more than 1GB, use M
   cylinders, 63 sectors per track (not 64), and 255 heads, where 'M' is the
   disk capacity in MB divided by 7.844238 (!). So our example 2GB drive
   would have 261 cylinders, 63 sectors per track and 255 heads.

   If you are not sure about this, or FreeBSD fails to detect the geometry
   correctly during installation, the simplest way around this is usually to
   create a small DOS partition on the disk. The BIOS should then detect the
   correct geometry, and you can always remove the DOS partition in the
   partition editor if you do not want to keep it. You might want to leave it
   around for programming network cards and the like, however.

   Alternatively, there is a freely available utility distributed with
   FreeBSD called pfdisk.exe. You can find it in the tools subdirectory on
   the FreeBSD CDROM or on the various FreeBSD FTP sites. This program can be
   used to work out what geometry the other operating systems on the disk are
   using. You can then enter this geometry in the partition editor.

   3.19. Are there any restrictions on how I divide the disk up?

   Yes. You must make sure that your root partition is below 1024 cylinders
   so the BIOS can boot the kernel from it. (Note that this is a limitation
   in the PC's BIOS, not FreeBSD).

   For a SCSI drive, this will normally imply that the root partition will be
   in the first 1024MB (or in the first 4096MB if extended translation is
   turned on - see previous question). For IDE, the corresponding figure is
   504MB.

   3.20. Is FreeBSD compatible with any disk managers?

   FreeBSD recognizes the Ontrack Disk Manager and makes allowances for it.
   Other disk managers are not supported.

   If you just want to use the disk with FreeBSD you do not need a disk
   manager. Just configure the disk for as much space as the BIOS can deal
   with (usually 504 megabytes), and FreeBSD should figure out how much space
   you really have. If you are using an old disk with an MFM controller, you
   may need to explicitly tell FreeBSD how many cylinders to use.

   If you want to use the disk with FreeBSD and another operating system, you
   may be able to do without a disk manager: just make sure the FreeBSD boot
   partition and the slice for the other operating system are in the first
   1024 cylinders. If you are reasonably careful, a 20 megabyte boot
   partition should be plenty.

   3.21. When I boot FreeBSD I get ``Missing Operating System''. What is
   happening?

   This is classically a case of FreeBSD and DOS or some other OS conflicting
   over their ideas of disk geometry. You will have to reinstall FreeBSD, but
   obeying the instructions given above will almost always get you going.

   3.22. Why can I not get past the boot manager's F? prompt?

   This is another symptom of the problem described in the preceding
   question. Your BIOS geometry and FreeBSD geometry settings do not agree!
   If your controller or BIOS supports cylinder translation (often marked as
   ``>1GB drive support''), try toggling its setting and reinstalling
   FreeBSD.

   3.23. Do I need to install the complete sources?

   In general, no. However, we would strongly recommend that you install, at
   a minimum, the base source kit, which includes several of the files
   mentioned here, and the sys (kernel) source kit, which includes sources
   for the kernel. There is nothing in the system which requires the presence
   of the sources to operate, however, except for the kernel-configuration
   program config(8). With the exception of the kernel sources, our build
   structure is set up so that you can read-only mount the sources from
   elsewhere via NFS and still be able to make new binaries (due to the
   kernel-source restriction, we recommend that you not mount this on
   /usr/src directly, but rather in some other location with appropriate
   symbolic links to duplicate the top-level structure of the source tree).

   Having the sources on-line and knowing how to build a system with them
   will make it much easier for you to upgrade to future releases of FreeBSD.

   To actually select a subset of the sources, use the Custom menu item when
   you are in the Distributions menu of the system installation tool.

   3.24. Do I need to build a kernel?

   Building a new kernel was originally pretty much a required step in a
   FreeBSD installation, but more recent releases have benefited from the
   introduction of a much friendlier kernel configuration tool. When at the
   FreeBSD boot prompt (boot:), use the -c flag and you will be dropped into
   a visual configuration screen which allows you to configure the kernel's
   settings for most common ISA cards.

   It is still recommended that you eventually build a new kernel containing
   just the drivers that you need, just to save a bit of RAM, but it is no
   longer a strict requirement for most systems.

   3.25. Should I use DES, Blowfish, or MD5 passwords and how do I specify
   which form my users receive?

   The default password format on FreeBSD is to use MD5-based passwords.
   These are believed to be more secure than the traditional Unix password
   format, which used a scheme based on the DES algorithm. DES passwords are
   still available if you need to share your password file with legacy
   operating systems which still use the less secure password format (they
   are available if you choose to install the ``crypto'' distribution in
   sysinstall, or by installing the crypto sources if building from source).
   Installing the crypto libraries will also allow you to use the Blowfish
   password format, which is more secure. Which password format to use for
   new passwords is controlled by the ``passwd_format'' login capability in
   /etc/login.conf, which takes values of ``des'', ``blf'' (if these are
   available) or ``md5''. See the login.conf(5) manual page for more
   information about login capabilities.

   3.26. Why does the boot floppy start, but hang at the Probing Devices...
   screen?

   If you have a IDE Zip or Jaz drive installed, remove it and try again. The
   boot floppy can get confused by the drives. After the system is installed
   you can reconnect the drive. Hopefully this will be fixed in a later
   release.

   3.27. Why do I get a ``panic: can't mount root'' error when rebooting the
   system after installation?

   This error comes from confusion between the boot block's and the kernel's
   understanding of the disk devices. The error usually manifests on two-disk
   IDE systems, with the hard disks arranged as the master or single device
   on separate IDE controllers, with FreeBSD installed on the secondary IDE
   controller. The boot blocks think the system is installed on wd1 (the
   second BIOS disk) while the kernel assigns the first disk on the secondary
   controller device wd2. After the device probing, the kernel tries to mount
   what the boot blocks think is the boot disk, wd1, while it is really wd2,
   and fails.

   To fix the problem, do one of the following:

    1. For FreeBSD 3.3 and later, reboot the system and hit Enter at the
       Booting kernel in 10 seconds; hit [Enter] to interrupt prompt. This
       will drop you into the boot loader.

       Then type set root_disk_unit="disk_number" . disk_number will be 0 if
       FreeBSD is installed on the master drive on the first IDE controller,
       1 if it is installed on the slave on the first IDE controller, 2 if it
       is installed on the master of the second IDE controller, and 3 if it
       is installed on the slave of the second IDE controller.

       Then type boot, and your system should boot correctly.

       To make this change permanent (ie so you do not have to do this every
       time you reboot or turn on your FreeBSD machine), put the line
       root_disk_unit="disk_number" in /boot/loader.conf.local .

    2. If using FreeBSD 3.2 or earlier, at the Boot: prompt, enter
       1:wd(2,a)kernel and press Enter. If the system starts, then run the
       command echo "1:wd(2,a)kernel" > /boot.config to make it the default
       boot string.

    3. Move the FreeBSD disk onto the primary IDE controller, so the hard
       disks are consecutive.

    4. Rebuild your kernel, modify the wd configuration lines to read:

     controller      wdc0    at isa? port "IO_WD1" bio irq 14 vector wdintr
     disk            wd0     at wdc0 drive 0
     # disk            wd1     at wdc0 drive 1 # comment out this line
    
     controller      wdc1    at isa? port "IO_WD2" bio irq 15 vector wdintr
     disk            wd1     at wdc1 drive 0 # change from wd2 to wd1
     disk            wd2     at wdc1 drive 1 # change from wd3 to wd2

       Install the new kernel. If you moved your disks and wish to restore
       the previous configuration, replace the disks in the desired
       configuration and reboot. Your system should boot successfully.

   3.28. What are the limits for memory?

   For memory, the limit is 4 gigabytes. If you plan to install this much
   memory into a machine, you need to be careful. You will probably want to
   use ECC memory and to reduce capacitive loading use 9 chip memory modules
   versus 18 chip memory modules.

   3.29. What are the limits for ffs filesystems?

   For ffs filesystems, the maximum theoretical limit is 8 terabytes (2G
   blocks), or 16TB for the default block size of 8K. In practice, there is a
   soft limit of 1 terabyte, but with modifications filesystems with 4
   terabytes are possible (and exist).

   The maximum size of a single ffs file is approximately 1G blocks, or 4TB
   with a block size of 4K.

   Table 3-1. Maximum file sizes

   +-------------------------------------------------------------------+
   | fs block size | 2.2.7-stable | 3.0-current | works  | should work |
   |---------------+--------------+-------------+--------+-------------|
   | 4K            | 4T-1         | 4T-1        | 4T-1   | >4T         |
   |---------------+--------------+-------------+--------+-------------|
   | 8K            | >32G         | 8T-1        | >32G   | 32T-1       |
   |---------------+--------------+-------------+--------+-------------|
   | 16K           | >128G        | 16T-1       | >128G  | 32T-1       |
   |---------------+--------------+-------------+--------+-------------|
   | 32K           | >512G        | 32T-1       | >512G  | 64T-1       |
   |---------------+--------------+-------------+--------+-------------|
   | 64K           | >2048G       | 64T-1       | >2048G | 128T-1      |
   +-------------------------------------------------------------------+

   When the fs block size is 4K, triple indirect blocks work and everything
   should be limited by the maximum fs block number that can be represented
   using triple indirect blocks (approx. 1K^3 + 1K^2 + 1K), but everything is
   limited by a (wrong) limit of 1G-1 on fs block numbers. The limit on fs
   block numbers should be 2G-1. There are some bugs for fs block numbers
   near 2G-1, but such block numbers are unreachable when the fs block size
   is 4K.

   For block sizes of 8K and larger, everything should be limited by the 2G-1
   limit on fs block numbers, but is actually limited by the 1G-1 limit on fs
   block numbers, except under -STABLE triple indirect blocks are
   unreachable, so the limit is the maximum fs block number that can be
   represented using double indirect blocks (approx. (blocksize/4)^2 +
   (blocksize/4)), and under -CURRENT exceeding this limit may cause
   problems. Using the correct limit of 2G-1 blocks does cause problems.

   3.30. Why do I get an error message, ``archsw.readin.failed'' after
   compiling and booting a new kernel?

   You can boot by specifying the kernel directly at the second stage,
   pressing any key when the | shows up before loader is started. More
   specifically, you have upgraded the source for your kernel, and installed
   a new kernel builtin from them without making world. This is not
   supported. Make world.

   3.31. How do I upgrade from 3.X -> 4.X?

   We strongly recommend that you use binary snapshots to do this. 4-STABLE
   snapshots are available at ftp://releng4.FreeBSD.org/.

   Because of the many changes between 3.X and 4-STABLE, a direct upgrade
   from source will probably fail. A source upgrade can be done, but only in
   stages. First, upgrade to the latest 3-STABLE (RELENG_3). Then upgrade to
   4.1.1-RELEASE (RELENG_4_1_1_RELEASE). Finally, upgrade to 4-STABLE
   (RELENG_4).

   If you wish to upgrade using source, please see the FreeBSD Handbook for
   more information.

     Caution: Upgrading via source is never recommended for new users, and
     upgrading from 3.X to 4.X is even less so; make sure you have read the
     instructions carefully before attempting to upgrade via source.

   3.32. What are these ``security profiles''?

   A ``security profile'' is a set of configuration options that attempts to
   achieve the desired ratio of security to convenience by enabling and
   disabling certain programs and other settings. For full details, see the
   Security Profile section of the Handbook's post-install chapter.

     ----------------------------------------------------------------------

                        Chapter 4 Hardware compatibility

   4.1. Does FreeBSD support architectures other than the x86?

   4.2. I want to get a piece of hardware for my FreeBSD system. Which
   model/brand/type is best?

   4.3. What kind of hard drives does FreeBSD support?

   4.4. Which SCSI controllers are supported?

   4.5. Which CDROM drives are supported by FreeBSD?

   4.6. Which CD-RW drives are supported by FreeBSD?

   4.7. Does FreeBSD support ZIP drives?

   4.8. Does FreeBSD support JAZ, EZ and other removable drives?

   4.9. Which multi-port serial cards are supported by FreeBSD?

   4.10. Does FreeBSD support my USB keyboard?

   4.11. I have an unusual bus mouse. How do I set it up?

   4.12. How do I use my PS/2 (``mouse port'' or ``keyboard'') mouse?

   4.13. Is it possible to make use of a mouse in any way outside the X
   Window system?

   4.14. How do I cut and paste text with a mouse in the text console?

   4.15. Does FreeBSD support any USB mice?

   4.16. My mouse has a fancy wheel and buttons. Can I use them in FreeBSD?

   4.17. Why does my wheel-equipped PS/2 mouse cause my mouse cursor to jump
   around the screen?

   4.18. How do I use the mouse/trackball/touchpad on my laptop?

   4.19. What types of tape drives are supported?

   4.20. Does FreeBSD support tape changers?

   4.21. Which sound cards are supported by FreeBSD?

   4.22. Workarounds for no sound from es1370 with pcm driver?

   4.23. Which network cards does FreeBSD support?

   4.24. I do not have a math co-processor - is that bad?

   4.25. What other devices does FreeBSD support?

   4.26. Does FreeBSD support power management on my laptop?

   4.27. Why does my Micron system hang at boot time?

   4.28. Why does FreeBSD not recognize my Adaptec SCSI controller card?

   4.29. Why is FreeBSD not finding my internal Plug & Play modem?

   4.30. Does FreeBSD support software modems, such as Winmodems?

   4.31. How do I get the boot: prompt to show on the serial console?

   4.32. Why does my 3Com PCI network card not work with my Micron computer?

   4.33. Does FreeBSD support Symmetric Multiprocessing (SMP)?

   4.34. The boot floppy hangs on a system with an ASUS K7V motherboard. How
   do I fix this?

   4.1. Does FreeBSD support architectures other than the x86?

   Yes. FreeBSD currently runs on both Intel x86 and DEC (now Compaq) Alpha
   architectures. Interest has also been expressed in a port of FreeBSD to
   the SPARC architecture, join the FreeBSD SPARC porting mailing list
   <freebsd-sparc@FreeBSD.org> if you are interested in joining that project.
   Most recent additions to the list of upcoming platforms are IA-64 and
   PowerPC, join the FreeBSD IA64 porting mailing list
   <freebsd-ia64@FreeBSD.org> or the FreeBSD PowerPC porting mailing list
   <freebsd-ppc@FreeBSD.org> respectively for more information about ongoing
   work on these platforms. For general discussion on new architectures, join
   the FreeBSD non-Intel platforms porting mailing list
   <freebsd-platforms@FreeBSD.org>.

   If your machine has a different architecture and you need something right
   now, we suggest you look at NetBSD or OpenBSD.

   4.2. I want to get a piece of hardware for my FreeBSD system. Which
   model/brand/type is best?

   This is discussed continually on the FreeBSD mailing lists. Since hardware
   changes so quickly, however, we expect this. We still strongly recommend
   that you read through the Hardware Notes and search the mailing list
   archives before asking about the latest and greatest hardware. Chances are
   a discussion about the type of hardware you are looking for took place
   just last week.

   If you are looking for a laptop, check the FreeBSD-mobile mailing list
   archives. Otherwise, you probably want the archives for FreeBSD-questions,
   or possibly a specific mailing list for a particular hardware type.

   4.3. What kind of hard drives does FreeBSD support?

   FreeBSD supports EIDE and SCSI drives (with a compatible controller; see
   the next section), and all drives using the original ``Western Digital''
   interface (MFM, RLL, ESDI, and of course IDE). A few ESDI controllers that
   use proprietary interfaces may not work: stick to WD1002/3/6/7 interfaces
   and clones.

   4.4. Which SCSI controllers are supported?

   See the complete list in the current Hardware Notes.

   4.5. Which CDROM drives are supported by FreeBSD?

   Any SCSI drive connected to a supported controller is supported.

   The following proprietary CDROM interfaces are also supported:

     * Mitsumi LU002 (8bit), LU005 (16bit) and FX001D (16bit 2x Speed).

     * Sony CDU 31/33A

     * Sound Blaster Non-SCSI CDROM

     * Matsushita/Panasonic CDROM

     * ATAPI compatible IDE CDROMs

   All non-SCSI cards are known to be extremely slow compared to SCSI drives,
   and some ATAPI CDROMs may not work.

   As of 2.2 the FreeBSD CDROM from the FreeBSD Mall supports booting
   directly from the CD.

   4.6. Which CD-RW drives are supported by FreeBSD?

   FreeBSD supports any ATAPI-compatible IDE CD-R or CD-RW drive. For FreeBSD
   versions 4.0 and later, see the manual page for burncd(8). For earlier
   FreeBSD versions, see the examples in /usr/share/examples/atapi.

   FreeBSD also supports any SCSI CD-R or CD-RW drives. Install and use the
   cdrecord command from the ports or packages system, and make sure that you
   have the pass device compiled in your kernel.

   4.7. Does FreeBSD support ZIP drives?

   FreeBSD supports the SCSI ZIP drive out of the box, of course. The ZIP
   drive can only be set to run at SCSI target IDs 5 or 6, but if your SCSI
   host adapter's BIOS supports it you can even boot from it. It is not clear
   which host adapters support booting from targets other than 0 or 1, so you
   will have to consult your adapter's documentation if you would like to use
   this feature.

   ATAPI (IDE) Zip drives are supported in FreeBSD 2.2.6 and later releases.

   FreeBSD has contained support for Parallel Port Zip Drives since version
   3.0. If you are using a sufficiently up to date version, then you should
   check that your kernel contains the scbus0, da0, ppbus0, and vp0 drivers
   (the GENERIC kernel contains everything except vp0). With all these
   drivers present, the Parallel Port drive should be available as
   /dev/da0s4. Disks can be mounted using mount /dev/da0s4 /mnt OR (for dos
   disks) mount_msdos /dev/da0s4 /mnt as appropriate.

   Also check out the FAQ on removable drives later in this chapter, and the
   note on ``formatting''in the Administration chapter.

   4.8. Does FreeBSD support JAZ, EZ and other removable drives?

   Apart from the IDE version of the EZ drive, these are all SCSI devices, so
   they should all look like SCSI disks to FreeBSD, and the IDE EZ should
   look like an IDE drive.

   I am not sure how well FreeBSD supports changing the media out while
   running. You will of course need to dismount the drive before swapping
   media, and make sure that any external units are powered on when you boot
   the system so FreeBSD can see them.

   See this note on ``formatting''.

   4.9. Which multi-port serial cards are supported by FreeBSD?

   There is a list of these in the Miscellaneous devices section of the
   handbook.

   Some unnamed clone cards have also been known to work, especially those
   that claim to be AST compatible.

   Check the sio(4) manual page to get more information on configuring such
   cards.

   4.10. Does FreeBSD support my USB keyboard?

   USB device support was added to FreeBSD 3.1. However, it is still in
   preliminary state and may not always work as of version 3.2. If you want
   to experiment with the USB keyboard support, follow the procedure
   described below.

    1. Use FreeBSD 3.2 or later.

    2. Add the following lines to your kernel configuration file, and rebuild
       the kernel.

     device  uhci
     device  ohci
     device  usb
     device  ukbd
     options KBD_INSTALL_CDEV

       In versions of FreeBSD before 4.0, use this instead:

     controller      uhci0
     controller      ohci0
     controller      usb0
     controller      ukbd0
     options         KBD_INSTALL_CDEV

    3. Go to the /dev directory and create device nodes as follows:

     # cd /dev
     # ./MAKEDEV kbd0 kbd1

    4. Edit /etc/rc.conf and add the following lines:

     usbd_enable="YES"
     usbd_flags=""

   After the system is rebooted, the AT keyboard becomes /dev/kbd0 and the
   USB keyboard becomes /dev/kbd1, if both are connected to the system. If
   there is the USB keyboard only, it will be /dev/ukbd0.

   If you want to use the USB keyboard in the console, you have to explicitly
   tell the console driver to use the existing USB keyboard. This can be done
   by running the following command as a part of system initialization.

     # kbdcontrol -k /dev/kbd1 < /dev/ttyv0 > /dev/null

   Note that if the USB keyboard is the only keyboard, it is accessed as
   /dev/kbd0, thus, the command should look like:

     # kbdcontrol -k /dev/kbd0 < /dev/ttyv0 > /dev/null

   /etc/rc.i386 is a good place to add the above command.

   Once this is done, the USB keyboard should work in the X environment as
   well without any special settings.

   Hot-plugging and unplugging of the USB keyboard may not work quite right
   yet. It is a good idea to connect the keyboard before you start the system
   and leave it connected until the system is shutdown to avoid troubles.

   See the ukbd(4) manual page for more information.

   4.11. I have an unusual bus mouse. How do I set it up?

   FreeBSD supports the bus mouse and the InPort bus mouse from such
   manufactures as Microsoft, Logitech and ATI. The bus device driver is
   compiled in the GENERIC kernel by default in FreeBSD versions 2.X, but not
   included in version 3.0 or later. If you are building a custom kernel with
   the bus mouse driver, make sure to add the following line to the kernel
   config file

   In FreeBSD 3.0 or before, add:

     device mse0 at isa? port 0x23c tty irq5 vector mseintr

   In FreeBSD 3.X, the line should be:

     device mse0 at isa? port 0x23c tty irq5

   And in FreeBSD 4.X and later, the line should read:

     device mse0 at isa? port 0x23c irq5

   Bus mice usually comes with dedicated interface cards. These cards may
   allow you to set the port address and the IRQ number other than shown
   above. Refer to the manual of your mouse and the mse(4) manual page for
   more information.

   4.12. How do I use my PS/2 (``mouse port'' or ``keyboard'') mouse?

   If you are running a post-2.2.5 version of FreeBSD, the necessary driver,
   psm, is included and enabled in the kernel. The kernel should detect your
   PS/2 mouse at boot time.

   If you are running a previous but relatively recent version of FreeBSD
   (2.1.X or better) then you can simply enable it in the kernel
   configuration menu at installation time, otherwise later with -c at the
   boot: prompt. It is disabled by default, so you will need to enable it
   explicitly.

   If you are running an older version of FreeBSD then you will have to add
   the following lines to your kernel configuration file and compile a new
   kernel.

   In FreeBSD 3.0 or earlier, the line should be:

     device psm0 at isa? port "IO_KBD" conflicts tty irq 12 vector psmintr

   In FreeBSD 3.1 or later, the line should be:

     device psm0 at isa? tty irq 12

   In FreeBSD 4.0 or later, the line should be:

     device psm0 at atkbdc? irq 12

   See the Handbook entry on configuring the kernel if you have no experience
   with building kernels.

   Once you have a kernel detecting psm0 correctly at boot time, make sure
   that an entry for psm0 exists in /dev. You can do this by typing:

     # cd /dev; sh MAKEDEV psm0

   when logged in as root.

   4.13. Is it possible to make use of a mouse in any way outside the X
   Window system?

   If you are using the default console driver, syscons, you can use a mouse
   pointer in text consoles to cut & paste text. Run the mouse daemon,
   moused, and turn on the mouse pointer in the virtual console:

     # moused -p /dev/xxxx -t yyyy
     # vidcontrol -m on

   Where xxxx is the mouse device name and yyyy is a protocol type for the
   mouse. See the moused(8) manual page for supported protocol types.

   You may wish to run the mouse daemon automatically when the system starts.
   In version 2.2.1, set the following variables in /etc/sysconfig.

     mousedtype="yyyy"
     mousedport="xxxx"
     mousedflags=""

   In versions 2.2.2 to 3.0, set the following variables in /etc/rc.conf.

     moused_type="yyyy"
     moused_port="xxxx"
     moused_flags=""

   In 3.1 and later, assuming you have a PS/2 mouse, all you need to is add
   moused_enable="YES" to /etc/rc.conf.

   In addition, if you would like to be able to use the mouse daemon on all
   virtual terminals instead of just console at boot-time, add the following
   to /etc/rc.conf.

     allscreens_flags="-m on"

   Staring from FreeBSD 2.2.6, the mouse daemon is capable of determining the
   correct protocol type automatically unless the mouse is a relatively old
   serial mouse model. Specify auto the protocol to invoke automatic
   detection.

   When the mouse daemon is running, access to the mouse needs to be
   coordinated between the mouse daemon and other programs such as the X
   Window. Refer to another section on this issue.

   4.14. How do I cut and paste text with a mouse in the text console?

   Once you get the mouse daemon running (see previous section), hold down
   the button 1 (left button) and move the mouse to select a region of text.
   Then, press the button 2 (middle button) or the button 3 (right button) to
   paste it at the text cursor.

   In versions 2.2.6 and later, pressing the button 2 will paste the text.
   Pressing the button 3 will ``extend'' the selected region of text. If your
   mouse does not have the middle button, you may wish to emulate it or remap
   buttons using moused options. See the moused(8) manual page for details.

   4.15. Does FreeBSD support any USB mice?

   Preliminary USB device support was added to FreeBSD 3.1. It did not always
   work through early versions of 3.X. As of FreeBSD 4.0, USB devices should
   work out of the box. If you want to experiment with the USB mouse support
   under FreeBSD 3.X, follow the procedure described below.

    1. Use FreeBSD 3.2 or later.

    2. Add the following lines to your kernel configuration file, and rebuild
       the kernel.

     device  uhci
     device  ohci
     device  usb
     device  ums

       In versions of FreeBSD before 4.0, use this instead:

     controller        uhci0
     controller        ohci0
     controller        usb0
     device            ums0

    3. Go to the /dev directory and create a device node as follows:

     # cd /dev
     # ./MAKEDEV ums0

    4. Edit /etc/rc.conf and add the following lines:

     moused_enable="YES"
     moused_type="auto"
     moused_port="/dev/ums0"
     moused_flags=""
     usbd_enable="YES"
     usbd_flags=""

       See the previous section for more detailed discussion on moused.

    5. In order to use the USB mouse in the X session, edit XF86Config. If
       you are using XFree86 3.3.2 or later, be sure to have the following
       lines in the Pointer section:

     Device          "/dev/sysmouse"
     Protocol        "Auto"

       If you are using earlier versions of XFree86, be sure to have the
       following lines in the Pointer section:

     Device          "/dev/sysmouse"
     Protocol        "SysMouse"

   Refer to another section on the mouse support in the X environment.

   Hot-plugging and unplugging of the USB mouse may not work quite right yet.
   It is a good idea connect the mouse before you start the system and leave
   it connected until the system is shutdown to avoid trouble.

   4.16. My mouse has a fancy wheel and buttons. Can I use them in FreeBSD?

   The answer is, unfortunately, ``It depends''. These mice with additional
   features require specialized driver in most cases. Unless the mouse device
   driver or the user program has specific support for the mouse, it will act
   just like a standard two, or three button mouse.

   For the possible usage of wheels in the X Window environment, refer to
   that section.

   4.17. Why does my wheel-equipped PS/2 mouse cause my mouse cursor to jump
   around the screen?

   The PS/2 mouse driver psm in FreeBSD versions 3.2 or earlier has
   difficulty with some wheel mice, including Logitech model M-S48 and its
   OEM siblings. Apply the following patch to /sys/i386/isa/psm.c and rebuild
   the kernel.

     Index: psm.c
     ===================================================================
     RCS file: /src/CVS/src/sys/i386/isa/Attic/psm.c,v
     retrieving revision 1.60.2.1
     retrieving revision 1.60.2.2
     diff -u -r1.60.2.1 -r1.60.2.2
     --- psm.c        1999/06/03 12:41:13 1.60.2.1
     +++ psm.c        1999/07/12 13:40:52 1.60.2.2
     @@ -959,14 +959,28 @@
          sc->mode.packetsize = vendortype[i].packetsize;
    
          /* set mouse parameters */
     +#if 0
     +    /*
     +     * A version of Logitech FirstMouse+ won't report wheel movement,
     +     * if SET_DEFAULTS is sent...  Don't use this command.
     +     * This fix was found by Takashi Nishida.
     +     */
          i = send_aux_command(sc->kbdc, PSMC_SET_DEFAULTS);
          if (verbose >= 2)
              printf("psm%d: SET_DEFAULTS return code:%04x\n", unit, i);
     +#endif
          if (sc->config & PSM_CONFIG_RESOLUTION) {
              sc->mode.resolution
                  = set_mouse_resolution(sc->kbdc,
     -                (sc->config & PSM_CONFIG_RESOLUTION) - 1);
     +                       (sc->config & PSM_CONFIG_RESOLUTION) - 1);
     +    } else if (sc->mode.resolution >= 0) {
     +        sc->mode.resolution
     +            = set_mouse_resolution(sc->kbdc, sc->dflt_mode.resolution);
     +    }
     +    if (sc->mode.rate > 0) {
     +        sc->mode.rate = set_mouse_sampling_rate(sc->kbdc, sc->dflt_mode.rate);
          }
     +    set_mouse_scaling(sc->kbdc, 1);
    
          /* request a data packet and extract sync. bits */
          if (get_mouse_status(sc->kbdc, stat, 1, 3) < 3) {

   Versions later than 3.2 should be all right.

   4.18. How do I use the mouse/trackball/touchpad on my laptop?

   Please refer to the answer to the previous question. Also check out the
   Mobile Computing page.

   4.19. What types of tape drives are supported?

   FreeBSD supports SCSI and QIC-36 (with a QIC-02 interface). This includes
   8-mm (aka Exabyte) and DAT drives.

   Some of the early 8-mm drives are not quite compatible with SCSI-2, and
   may not work well with FreeBSD.

   4.20. Does FreeBSD support tape changers?

   FreeBSD 2.2 supports SCSI changers using the ch(4) device and the chio(1)
   command. The details of how you actually control the changer can be found
   in the chio(1) manual page.

   If you are not using AMANDA or some other product that already understands
   changers, remember that they only know how to move a tape from one point
   to another, so you need to keep track of which slot a tape is in, and
   which slot the tape currently in the drive needs to go back to.

   4.21. Which sound cards are supported by FreeBSD?

   FreeBSD supports the SoundBlaster, SoundBlaster Pro, SoundBlaster 16, Pro
   Audio Spectrum 16, AdLib and Gravis UltraSound sound cards. There is also
   limited support for MPU-401 and compatible MIDI cards. Cards conforming to
   the Microsoft Sound System specification are also supported through the
   pcm driver.

     Note: This is only for sound! This driver does not support CDROMs, SCSI
     or joysticks on these cards, except for the SoundBlaster. The
     SoundBlaster SCSI interface and some non-SCSI CDROMs are supported, but
     you cannot boot off this device.

   4.22. Workarounds for no sound from es1370 with pcm driver?

   You can run the following command every time the machine booted up:

     # mixer pcm 100 vol 100 cd 100

   4.23. Which network cards does FreeBSD support?

   See the Ethernet cards section of the handbook for a more complete list.

   4.24. I do not have a math co-processor - is that bad?

   Note: This will only affect 386/486SX/486SLC owners - other machines will
   have one built into the CPU.

   In general this will not cause any problems, but there are circumstances
   where you will take a hit, either in performance or accuracy of the math
   emulation code (see the section on FP emulation). In particular, drawing
   arcs in X will be VERY slow. It is highly recommended that you buy a math
   co-processor; it is well worth it.

     Note: Some math co-processors are better than others. It pains us to say
     it, but nobody ever got fired for buying Intel. Unless you are sure it
     works with FreeBSD, beware of clones.

   4.25. What other devices does FreeBSD support?

   See the Handbook for the list of other devices supported.

   4.26. Does FreeBSD support power management on my laptop?

   FreeBSD supports APM on certain machines. Please look in the LINT kernel
   config file, searching for the APM keyword. Further information can be
   found in apm(4).

   4.27. Why does my Micron system hang at boot time?

   Certain Micron motherboards have a non-conforming PCI BIOS implementation
   that causes grief when FreeBSD boots because PCI devices do not get
   configured at their reported addresses.

   Disable the ``Plug and Play Operating System'' flag in the BIOS to work
   around this problem. More information can be found at
   http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html#micron

   4.28. Why does FreeBSD not recognize my Adaptec SCSI controller card?

   The newer AIC789x series Adaptec chips are supported under the CAM SCSI
   framework which made its debut in 3.0. Patches against 2.2-STABLE are in
   ftp://ftp.FreeBSD.org/pub/FreeBSD/development/cam/. A CAM-enhanced boot
   floppy is available at http://people.FreeBSD.org/~abial/cam-boot/. In both
   cases read the README before beginning.

   4.29. Why is FreeBSD not finding my internal Plug & Play modem?

   You will need to add the modem's PnP ID to the PnP ID list in the serial
   driver. To enable Plug & Play support, compile a new kernel with
   controller pnp0 in the configuration file, then reboot the system. The
   kernel will print the PnP IDs of all the devices it finds. Copy the PnP ID
   from the modem to the table in /sys/i386/isa/sio.c, at about line 2777.
   Look for the string SUP1310 in the structure siopnp_ids[] to find the
   table. Build the kernel again, install, reboot, and your modem should be
   found.

   You may have to manually configure the PnP devices using the pnp command
   in the boot-time configuration with a command like

     pnp 1 0 enable os irq0 3 drq0 0 port0 0x2f8

   to make the modem show.

   4.30. Does FreeBSD support software modems, such as Winmodems?

   FreeBSD supports many software modems via add-on software. The comms/ltmdm
   port adds support for modems based on the very popular Lucent LT chipset.
   The comms/mwavem port supports the modem in IBM Thinkpad 600 and 700
   laptops.

   You cannot install FreeBSD via a software modem; this software must be
   installed after the OS is installed.

   4.31. How do I get the boot: prompt to show on the serial console?

   * Build a kernel with options COMCONSOLE.

   * Create /boot.config and place -P as the only text in the file.

   * Unplug the keyboard from the system.

   See /usr/src/sys/i386/boot/biosboot/README.serial for information.

   4.32. Why does my 3Com PCI network card not work with my Micron computer?

   Certain Micron motherboards have a non-conforming PCI BIOS implementation
   that does not configure PCI devices at the addresses reported. This causes
   grief when FreeBSD boots.

   To work around this problem, disable the ``Plug and Play Operating
   System'' flag in the BIOS.

   More information on this problem is available at URL:
   http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html#micron

   4.33. Does FreeBSD support Symmetric Multiprocessing (SMP)?

   SMP is supported in 3.0-STABLE and later releases only. SMP is not enabled
   in the GENERIC kernel, so you will have to recompile your kernel to enable
   SMP. Take a look at /sys/i386/conf/LINT to figure out what options to put
   in your kernel config file.

   4.34. The boot floppy hangs on a system with an ASUS K7V motherboard. How
   do I fix this?

   Go into the BIOS setup and disable the ``boot virus protection''.

     ----------------------------------------------------------------------

                           Chapter 5 Troubleshooting

   5.1. What do I do when I have bad blocks on my hard drive?

   5.2. Why does FreeBSD not recognize my Bustek 742a EISA SCSI controller?

   5.3. Why does FreeBSD not detect my HP Netserver's SCSI controller?

   5.4. What is going on with my CMD640 IDE controller?

   5.5. I keep seeing messages like ``ed1: timeout''. What do these messages
   mean?

   5.6. Why did my 3COM 3C509 card stop working for no apparent reason?

   5.7. My parallel printer is ridiculously slow. What can I do?

   5.8. Why do my programs occasionally die with ``Signal 11'' errors?

   5.9. My system crashes with either ``Fatal trap 12: page fault in kernel
   mode'', or ``panic:'', and spits out a bunch of information. What should I
   do?

   5.10. Why does the screen go black and lose sync when I boot?

   5.11. Why does FreeBSD only use 64 MB of RAM when my system has 128 MB of
   RAM installed?

   5.12. Why does FreeBSD 2.0 panic with ``kmem_map too small!''?

   5.13. Why do I get the error ``/kernel: proc: table is full''?

   5.14. Why do I get an error reading ``CMAP busy'' when rebooting with a
   new kernel?

   5.15. What does the message ``ahc0: brkadrint, Illegal Host Access at
   seqaddr 0x0'' mean?

   5.16. When I boot my system, I get the error ``ahc0: illegal cable
   configuration''. My cabling is correct. What is going on?

   5.17. Why does Sendmail give me an error reading ````mail loops back to
   myself''''?

   5.18. Why do full screen applications on remote machines misbehave?

   5.19. Why does my machine print ``calcru: negative time...''?

   5.20. I see ``pcm0 not found'' or my sound card is found as pcm1 but I
   have device pcm0 in my kernel config file. What is going on?

   5.21. Why is my PnP card no longer found (or found as unknown) since
   upgrading to FreeBSD 4.X?

   5.22. Why do I get the error ``nlist failed'' when running, for example,
   top or systat?

   5.23. Why does it take so long to connect to my computer via ssh or
   telnet?

   5.24. What does ``stray IRQ'' mean?

   5.25. Why does ``file: table is full'' show up repeatedly in dmesg?

   5.26. Why does the clock on my laptop keep incorrect time?

   5.27. Why did my laptop fail to correctly probe PC cards?

   5.28. Why does FreeBSD's boot loader display ``Read error'' and stop after
   the BIOS screen?

   5.29. Another operating system destroyed my Boot Manager. How do I get it
   back?

   5.30. What does the error ``swap_pager: indefinite wait buffer:'' mean?

   5.1. What do I do when I have bad blocks on my hard drive?

   With SCSI drives, the drive should be capable of re-mapping these
   automatically. However, many drives are shipped with this feature
   disabled, for some mysterious reason...

   To enable this, you will need to edit the first device page mode, which
   can be done on FreeBSD by giving the command (as root)

     # scsi -f /dev/rsd0c -m 1 -e -P 3

   and changing the values of AWRE and ARRE from 0 to 1:-

     AWRE (Auto Write Reallocation Enbld):  1
     ARRE (Auto Read Reallocation Enbld):  1

   The following paragraphs were submitted by Ted Mittelstaedt
   <tedm@toybox.placo.com>:

   For IDE drives, any bad block is usually a sign of potential trouble. All
   modern IDE drives come with internal bad-block remapping turned on. All
   IDE hard drive manufacturers today offer extensive warranties and will
   replace drives with bad blocks on them.

   If you still want to attempt to rescue an IDE drive with bad blocks, you
   can attempt to download the IDE drive manufacturer's IDE diagnostic
   program, and run this against the drive. Sometimes these programs can be
   set to force the drive electronics to rescan the drive for bad blocks and
   lock them out.

   For ESDI, RLL and MFM drives, bad blocks are a normal part of the drive
   and are no sign of trouble, generally. With a PC, the disk drive
   controller card and BIOS handle the task of locking out bad sectors. This
   is fine for operating systems like DOS that use BIOS code to access the
   disk. However, FreeBSD's disk driver does not go through BIOS, therefore a
   mechanism, bad144, exists that replaces this functionality. bad144 only
   works with the wd driver (which means it is not supported in FreeBSD 4.0),
   it is NOT able to be used with SCSI. bad144 works by entering all bad
   sectors found into a special file.

   One caveat with bad144 - the bad block special file is placed on the last
   track of the disk. As this file may possibly contain a listing for a bad
   sector that would occur near the beginning of the disk, where the /kernel
   file might be located, it therefore must be accessible to the bootstrap
   program that uses BIOS calls to read the kernel file. This means that the
   disk with bad144 used on it must not exceed 1024 cylinders, 16 heads, and
   63 sectors. This places an effective limit of 500MB on a disk that is
   mapped with bad144.

   To use bad144, simply set the ``Bad Block'' scanning to ON in the FreeBSD
   fdisk screen during the initial install. This works up through FreeBSD
   2.2.7. The disk must have less than 1024 cylinders. It is generally
   recommended that the disk drive has been in operation for at least 4 hours
   prior to this to allow for thermal expansion and track wandering.

   If the disk has more than 1024 cylinders (such as a large ESDI drive) the
   ESDI controller uses a special translation mode to make it work under DOS.
   The wd driver understands about these translation modes, IF you enter the
   ``translated'' geometry with the ``set geometry'' command in fdisk. You
   must also NOT use the ``dangerously dedicated'' mode of creating the
   FreeBSD partition, as this ignores the geometry. Also, even though fdisk
   will use your overridden geometry, it still knows the true size of the
   disk, and will attempt to create a too large FreeBSD partition. If the
   disk geometry is changed to the translated geometry, the partition MUST be
   manually created with the number of blocks.

   A quick trick to use is to set up the large ESDI disk with the ESDI
   controller, boot it with a DOS disk and format it with a DOS partition.
   Then, boot the FreeBSD install and in the fdisk screen, read off and write
   down the blocksize and block numbers for the DOS partition. Then, reset
   the geometry to the same that DOS uses, delete the DOS partition, and
   create a ``cooperative'' FreeBSD partition using the blocksize you
   recorded earlier. Then, set the partition bootable and turn on bad block
   scanning. During the actual install, bad144 will run first, before any
   filesystems are created (you can view this with an Alt+F2). If it has any
   trouble creating the badsector file, you have set too large a disk
   geometry - reboot the system and start all over again (including
   repartitioning and reformatting with DOS).

   If remapping is enabled and you are seeing bad blocks, consider replacing
   the drive. The bad blocks will only get worse as time goes on.

   5.2. Why does FreeBSD not recognize my Bustek 742a EISA SCSI controller?

   This info is specific to the 742a but may also cover other Buslogic cards.
   (Bustek = Buslogic)

   There are 2 general ``versions'' of the 742a card. They are hardware
   revisions A-G, and revisions H - onwards. The revision letter is located
   after the Assembly number on the edge of the card. The 742a has 2 ROM
   chips on it, one is the BIOS chip and the other is the Firmware chip.
   FreeBSD does not care what version of BIOS chip you have but it does care
   about what version of firmware chip. Buslogic will send upgrade ROMs out
   if you call their tech support dept. The BIOS and Firmware chips are
   shipped as a matched pair. You must have the most current Firmware ROM in
   your adapter card for your hardware revision.

   The REV A-G cards can only accept BIOS/Firmware sets up to 2.41/2.21. The
   REV H- up cards can accept the most current BIOS/Firmware sets of
   4.70/3.37. The difference between the firmware sets is that the 3.37
   firmware supports ``round robin''.

   The Buslogic cards also have a serial number on them. If you have an old
   hardware revision card you can call the Buslogic RMA department and give
   them the serial number and attempt to exchange the card for a newer
   hardware revision. If the card is young enough they will do so.

   FreeBSD 2.1 only supports Firmware revisions 2.21 onward. If you have a
   Firmware revision older than this your card will not be recognized as a
   Buslogic card. It may be recognized as an Adaptec 1540, however. The early
   Buslogic firmware contains an AHA1540 ``emulation'' mode. This is not a
   good thing for an EISA card, however.

   If you have an old hardware revision card and you obtain the 2.21 firmware
   for it, you will need to check the position of jumper W1 to B-C, the
   default is A-B.

   5.3. Why does FreeBSD not detect my HP Netserver's SCSI controller?

   This is basically a known problem. The EISA on-board SCSI controller in
   the HP Netserver machines occupies EISA slot number 11, so all the
   ``true'' EISA slots are in front of it. Alas, the address space for EISA
   slots >= 10 collides with the address space assigned to PCI, and FreeBSD's
   auto-configuration currently cannot handle this situation very well.

   So now, the best you can do is to pretend there is no address range clash
   :), by bumping the kernel option EISA_SLOTS to a value of 12. Configure
   and compile a kernel, as described in the Handbook entry on configuring
   the kernel.

   Of course, this does present you with a chicken-and-egg problem when
   installing on such a machine. In order to work around this problem, a
   special hack is available inside UserConfig. Do not use the ``visual''
   interface, but the plain command-line interface there. Simply type

     eisa 12
     quit

   at the prompt, and install your system as usual. While it is recommended
   you compile and install a custom kernel anyway.

   Hopefully, future versions will have a proper fix for this problem.

     Note: You cannot use a dangerously dedicated disk with an HP Netserver.
     See this note for more info.

   5.4. What is going on with my CMD640 IDE controller?

   It is broken. It cannot handle commands on both channels simultaneously.

   There is a workaround available now and it is enabled automatically if
   your system uses this chip. For the details refer to the manual page of
   the disk driver (wd(4)).

   If you are already running FreeBSD 2.2.1 or 2.2.2 with a CMD640 IDE
   controller and you want to use the second channel, build a new kernel with
   options "CMD640" enabled. This is the default for 2.2.5 and later.

   5.5. I keep seeing messages like ``ed1: timeout''. What do these messages
   mean?

   This is usually caused by an interrupt conflict (e.g., two boards using
   the same IRQ). FreeBSD prior to 2.0.5R used to be tolerant of this, and
   the network driver would still function in the presence of IRQ conflicts.
   However, with 2.0.5R and later, IRQ conflicts are no longer tolerated.
   Boot with the -c option and change the ed0/de0/... entry to match your
   board.

   If you are using the BNC connector on your network card, you may also see
   device timeouts because of bad termination. To check this, attach a
   terminator directly to the NIC (with no cable) and see if the error
   messages go away.

   Some NE2000 compatible cards will give this error if there is no link on
   the UTP port or if the cable is disconnected.

   5.6. Why did my 3COM 3C509 card stop working for no apparent reason?

   This card has a bad habit of losing its configuration information. Refresh
   your card's settings with the DOS utility 3c5x9.exe.

   5.7. My parallel printer is ridiculously slow. What can I do?

   If the only problem is that the printer is terribly slow, try changing
   your printer port mode as discussed in the Printer Setup section of the
   Handbook.

   5.8. Why do my programs occasionally die with ``Signal 11'' errors?

   Signal 11 errors are caused when your process has attempted to access
   memory which the operating system has not granted it access to. If
   something like this is happening at seemingly random intervals then you
   need to start investigating things very carefully.

   These problems can usually be attributed to either:

    1. If the problem is occurring only in a specific application that you
       are developing yourself it is probably a bug in your code.

    2. If it is a problem with part of the base FreeBSD system, it may also
       be buggy code, but more often than not these problems are found and
       fixed long before us general FAQ readers get to use these bits of code
       (that is what -current is for).

   In particular, a dead giveaway that this is not a FreeBSD bug is if you
   see the problem when you are compiling a program, but the activity that
   the compiler is carrying out changes each time.

   For example, suppose you are running ``make buildworld'', and the compile
   fails while trying to compile ls.c into ls.o. If you then run ``make
   buildworld'' again, and the compile fails in the same place then this is a
   broken build -- try updating your sources and try again. If the compile
   fails elsewhere then this is almost certainly hardware.

   What you should do:

   In the first case you can use a debugger e.g. gdb to find the point in the
   program which is attempting to access a bogus address and then fix it.

   In the second case you need to verify that it is not your hardware at
   fault.

   Common causes of this include:

    1. Your hard disks might be overheating: Check the fans in your case are
       still working, as your disk (and perhaps other hardware might be
       overheating).

    2. The processor running is overheating: This might be because the
       processor has been overclocked, or the fan on the processor might have
       died. In either case you need to ensure that you have hardware running
       at what it is specified to run at, at least while trying to solve this
       problem. i.e. Clock it back to the default settings.

       If you are overclocking then note that it is far cheaper to have a
       slow system than a fried system that needs replacing! Also the wider
       community is not often sympathetic to problems on overclocked systems,
       whether you believe it is safe or not.

    3. Dodgy memory: If you have multiple memory SIMMS/DIMMS installed then
       pull them all out and try running the machine with each SIMM or DIMM
       individually and narrow the problem down to either the problematic
       DIMM/SIMM or perhaps even a combination.

    4. Over-optimistic Motherboard settings: In your BIOS settings, and some
       motherboard jumpers you have options to set various timings, mostly
       the defaults will be sufficient, but sometimes, setting the wait
       states on RAM too low, or setting the ``RAM Speed: Turbo'' option, or
       similar in the BIOS will cause strange behavior. A possible idea is to
       set to BIOS defaults, but it might be worth noting down your settings
       first!

    5. Unclean or insufficient power to the motherboard. If you have any
       unused I/O boards, hard disks, or CDROMs in your system, try
       temporarily removing them or disconnecting the power cable from them,
       to see if your power supply can manage a smaller load. Or try another
       power supply, preferably one with a little more power (for instance,
       if your current power supply is rated at 250 Watts try one rated at
       300 Watts).

   You should also read the SIG11 FAQ (listed below) which has excellent
   explanations of all these problems, albeit from a Linux viewpoint. It also
   discusses how memory testing software or hardware can still pass faulty
   memory.

   Finally, if none of this has helped it is possible that you have just
   found a bug in FreeBSD, and you should follow the instructions to send a
   problem report.

   There is an extensive FAQ on this at the SIG11 problem FAQ

   5.9. My system crashes with either ``Fatal trap 12: page fault in kernel
   mode'', or ``panic:'', and spits out a bunch of information. What should I
   do?

   The FreeBSD developers are very interested in these errors, but need some
   more information than just the error you see. Copy your full crash
   message. Then consult the FAQ section on kernel panics, build a debugging
   kernel, and get a backtrace. This might sound difficult, but you do not
   need any programming skills; you just have to follow the instructions.

   5.10. Why does the screen go black and lose sync when I boot?

   This is a known problem with the ATI Mach 64 video card. The problem is
   that this card uses address 2e8, and the fourth serial port does too. Due
   to a bug (feature?) in the sio(4) driver it will touch this port even if
   you do not have the fourth serial port, and even if you disable sio3 (the
   fourth port) which normally uses this address.

   Until the bug has been fixed, you can use this workaround:

    1. Enter -c at the boot prompt. (This will put the kernel into
       configuration mode).

    2. Disable sio0, sio1, sio2 and sio3 (all of them). This way the sio
       driver does not get activated -> no problems.

    3. Type exit to continue booting.

   If you want to be able to use your serial ports, you will have to build a
   new kernel with the following modification: in /usr/src/sys/i386/isa/sio.c
   find the one occurrence of the string 0x2e8 and remove that string and the
   preceding comma (keep the trailing comma). Now follow the normal procedure
   of building a new kernel.

   Even after applying these workarounds, you may still find that the X
   Window System does not work properly. If this is the case, make sure that
   the XFree86 version you are using is at least XFree86 3.3.3 or higher.
   This version and upwards has built-in support for the Mach64 cards and
   even a dedicated X server for those cards.

   5.11. Why does FreeBSD only use 64 MB of RAM when my system has 128 MB of
   RAM installed?

   Due to the manner in which FreeBSD gets the memory size from the BIOS, it
   can only detect 16 bits worth of Kbytes in size (65535 Kbytes = 64MB) (or
   less... some BIOSes peg the memory size to 16M). If you have more than
   64MB, FreeBSD will attempt to detect it; however, the attempt may fail.

   To work around this problem, you need to use the kernel option specified
   below. There is a way to get complete memory information from the BIOS,
   but we do not have room in the bootblocks to do it. Someday when lack of
   room in the bootblocks is fixed, we will use the extended BIOS functions
   to get the full memory information...but for now we are stuck with the
   kernel option.

   options "MAXMEM=n"

   Where n is your memory in Kilobytes. For a 128 MB machine, you would want
   to use 131072.

   5.12. Why does FreeBSD 2.0 panic with ``kmem_map too small!''?

   Note: The message may also be mb_map too small!

   The panic indicates that the system ran out of virtual memory for network
   buffers (specifically, mbuf clusters). You can increase the amount of VM
   available for mbuf clusters by adding:

   options "NMBCLUSTERS=n"

   to your kernel config file, where n is a number in the range 512-4096,
   depending on the number of concurrent TCP connections you need to support.
   I would recommend trying 2048 - this should get rid of the panic
   completely. You can monitor the number of mbuf clusters allocated/in use
   on the system with netstat -m (see netstat(1)). The default value for
   NMBCLUSTERS is 512 + MAXUSERS * 16.

   5.13. Why do I get the error ``/kernel: proc: table is full''?

   The FreeBSD kernel will only allow a certain number of processes to exist
   at one time. The number is based on the MAXUSERS option in the kernel
   configuration. MAXUSERS also affects various other in-kernel limits, such
   as network buffers (see this earlier question). If your machine is heavily
   loaded, you probably want to increase MAXUSERS. This will increase these
   other system limits in addition to the maximum number of processes.

   After FreeBSD 4.4, MAXUSERS became a tunable value that could be set with
   kern.maxusers in /boot/loader.conf. In earlier versions of FreeBSD, you
   need to adjust MAXUSERS in your kernel configuration.

   If your machine is lightly loaded, and you are simply running a very large
   number of processes, you can adjust this with the kern.maxproc sysctl. If
   these processes are being run by a single user, you will also need to
   adjust kern.maxprocperuid to be one less than your new kern.maxproc value.
   (It must be at least one less because one system program, init(8), must
   always be running.)

   To make a sysctl permanent across reboots, set this in /etc/sysctl.conf in
   recent versions of FreeBSD, or /etc/rc.local in older versions.

   5.14. Why do I get an error reading ``CMAP busy'' when rebooting with a
   new kernel?

   The logic that attempts to detect an out of date /var/db/kvm_*.db files
   sometimes fails and using a mismatched file can sometimes lead to panics.

   If this happens, reboot single-user and do:

     # rm /var/db/kvm_*.db

   5.15. What does the message ``ahc0: brkadrint, Illegal Host Access at
   seqaddr 0x0'' mean?

   This is a conflict with an Ultrastor SCSI Host Adapter.

   During the boot process enter the kernel configuration menu and disable
   uha0, which is causing the problem.

   5.16. When I boot my system, I get the error ``ahc0: illegal cable
   configuration''. My cabling is correct. What is going on?

   Your motherboard lacks the external logic to support automatic
   termination. Switch your SCSI BIOS to specify the correct termination for
   your configuration rather than automatic termination. The AIC7XXX driver
   cannot determine if the external logic for cable detection (and thus
   auto-termination) is available. The driver simply assumes that this
   support must exist if the configuration contained in the serial EEPROM is
   set to "automatic termination". Without the external cable detection logic
   the driver will often configure termination incorrectly, which can
   compromise the reliability of the SCSI bus.

   5.17. Why does Sendmail give me an error reading ````mail loops back to
   myself''''?

   This is answered in the sendmail FAQ as follows:-

           * I'm getting "Local configuration error" messages, such as:

           553 relay.domain.net config error: mail loops back to myself
           554 <user@domain.net>... Local configuration error

           How can I solve this problem?

           You have asked mail to the domain (e.g., domain.net) to be
           forwarded to a specific host (in this case, relay.domain.net)
           by using an MX record, but the relay machine does not recognize
           itself as domain.net.  Add domain.net to /etc/mail/local-host-names
           (if you are using FEATURE(use_cw_file)) or add "Cw domain.net"
           to /etc/mail/sendmail.cf.
               

   The current version of the sendmail FAQ is no longer maintained with the
   sendmail release. It is however regularly posted to comp.mail.sendmail,
   comp.mail.misc, comp.mail.smail, comp.answers, and news.answers. You can
   also receive a copy via email by sending a message to
   <mail-server@rtfm.mit.edu> with the command send
   usenet/news.answers/mail/sendmail-faq as the body of the message.

   5.18. Why do full screen applications on remote machines misbehave?

   The remote machine may be setting your terminal type to something other
   than the cons25 terminal type required by the FreeBSD console.

   There are a number of possible work-arounds for this problem:

     * After logging on to the remote machine, set your TERM shell variable
       to ansi or sco if the remote machine knows about these terminal types.

     * Use a VT100 emulator like screen at the FreeBSD console. screen offers
       you the ability to run multiple concurrent sessions from one terminal,
       and is a neat program in its own right. Each screen window behaves
       like a VT100 terminal, so the TERM variable at the remote end should
       be set to vt100.

     * Install the cons25 terminal database entry on the remote machine. The
       way to do this depends on the operating system on the remote machine.
       The system administration manuals for the remote system should be able
       to help you here.

     * Fire up an X server at the FreeBSD end and login to the remote machine
       using an X based terminal emulator such as xterm or rxvt. The TERM
       variable at the remote host should be set to xterm or vt100.

   5.19. Why does my machine print ``calcru: negative time...''?

   This can be caused by various hardware or software ailments relating to
   interrupts. It may be due to bugs but can also happen by nature of certain
   devices. Running TCP/IP over the parallel port using a large MTU is one
   good way to provoke this problem. Graphics accelerators can also get you
   here, in which case you should check the interrupt setting of the card
   first.

   A side effect of this problem are dying processes with the message
   ``SIGXCPU exceeded cpu time limit''.

   For FreeBSD 3.0 and later from Nov 29, 1998 forward: If the problem cannot
   be fixed otherwise the solution is to set this sysctl variable:

     # sysctl -w kern.timecounter.method=1

   This means a performance impact, but considering the cause of this
   problem, you probably will not notice. If the problem persists, keep the
   sysctl set to one and set the NTIMECOUNTER option in your kernel to
   increasingly large values. If by the time you have reached NTIMECOUNTER=20
   the problem is not solved, interrupts are too hosed on your machine for
   reliable time keeping.

   5.20. I see ``pcm0 not found'' or my sound card is found as pcm1 but I
   have device pcm0 in my kernel config file. What is going on?

   This occurs in FreeBSD 3.X with PCI sound cards. The pcm0 device is
   reserved exclusively for ISA-based cards so, if you have a PCI card, then
   you will see this error, and your card will appear as pcm1.

     Note: You cannot remove the warning by simply changing the line in the
     kernel config file to device pcm1 as this will result in pcm1 being
     reserved for ISA cards and your PCI card being found as pcm2 (along with
     the warning ``pcm1 not found'').

   If you have a PCI sound card you will also have to make the snd1 device
   rather than snd0:

     # cd /dev
     # ./MAKEDEV snd1

   This situation does not arise in FreeBSD 4.X as a lot of work has been
   done to make it more PnP-centric and the pcm0 device is no longer reserved
   exclusively for ISA cards

   5.21. Why is my PnP card no longer found (or found as unknown) since
   upgrading to FreeBSD 4.X?

   FreeBSD 4.X is now much more PnP-centric and this has had the side effect
   of some PnP devices (e.g. sound cards and internal modems) not working
   even though they worked under FreeBSD 3.X.

   The reasons for this behavior are explained by the following e-mail,
   posted to the freebsd-questions mailing list by Peter Wemm, in answer to a
   question about an internal modem that was no longer found after an upgrade
   to FreeBSD 4.X (the comments in [] have been added to clarify the context.

     Note: The contents of this quotation has been updated from its original
     text.

     The PNP bios preconfigured it [the modem] and left it laying around in
     port space, so [in 3.X] the old-style ISA probes ``found'' it there.

     Under 4.0, the ISA code is much more PnP-centric. It was possible [in
     3.X] for an ISA probe to find a ``stray'' device and then for the PNP
     device id to match and then fail due to resource conflicts. So, it
     disables the programmable cards first so this double probing cannot
     happen. It also means that it needs to know the PnP id's for supported
     PnP hardware. Making this more user tweakable is on the TODO list.

   To get the device working again requires finding its PnP id and adding it
   to the list that the ISA probes use to identify PnP devices. This is
   obtained using pnpinfo(8) to probe the device, for example this is the
   output from pnpinfo(8) for an internal modem:

     # pnpinfo
     Checking for Plug-n-Play devices...
    
     Card assigned CSN #1
     Vendor ID PMC2430 (0x3024a341), Serial Number 0xffffffff
     PnP Version 1.0, Vendor Version 0
     Device Description: Pace 56 Voice Internal Plug & Play Modem
    
     Logical Device ID: PMC2430 0x3024a341 #0
             Device supports I/O Range Check
     TAG Start DF
         I/O Range 0x3f8 .. 0x3f8, alignment 0x8, len 0x8
             [16-bit addr]
         IRQ: 4  - only one type (true/edge)

   [more TAG lines elided]

     TAG End DF
     End Tag
    
     Successfully got 31 resources, 1 logical fdevs
     -- card select # 0x0001
    
     CSN PMC2430 (0x3024a341), Serial Number 0xffffffff
    
     Logical device #0
     IO:  0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8
     IRQ 5 0
     DMA 4 0
     IO range check 0x00 activate 0x01

   The information you require is in the ``Vendor ID'' line at the start of
   the output. The hexadecimal number in parentheses (0x3024a341 in this
   example) is the PnP id and the string immediately before this (PMC2430) is
   a unique ASCII id.

   Alternatively, if pnpinfo(8) does not list the card in question,
   pciconf(8) can be used instead. This is part of the output from pciconf
   -vl for an onboard sound chip:

     # pciconf -vl
     chip1@pci0:31:5:        class=0x040100 card=0x00931028 chip=0x24158086 rev=0x02 hdr=0x00
         vendor   = 'Intel Corporation'
         device   = '82801AA 8xx Chipset AC'97 Audio Controller'
         class    = multimedia
         subclass = audio

   Here, you would use the chip value, ``0x24158086''.

   This information (Vendor ID or chip value) needs adding to the file
   /usr/src/sys/isa/sio.c.

   You should first make a backup of sio.c just in case things go wrong. You
   will also need it to make the patch to submit with your PR (you are going
   to submit a PR, are you not?) then edit sio.c and search for the line

     static struct isa_pnp_id sio_ids[] = {

   then scroll down to find the correct place to add the entry for your
   device. The entries look like this, and are sorted on the ASCII Vendor ID
   string which should be included in the comment to the right of the line of
   code along with all (if it will fit) or part of the Device Description
   from the output of pnpinfo(8):

     {0x0f804f3f, NULL},     /* OZO800f - Zoom 2812 (56k Modem) */
     {0x39804f3f, NULL},     /* OZO8039 - Zoom 56k flex */
     {0x3024a341, NULL},     /* PMC2430 - Pace 56 Voice Internal Modem */
     {0x1000eb49, NULL},     /* ROK0010 - Rockwell ? */
     {0x5002734a, NULL},     /* RSS0250 - 5614Jx3(G) Internal Modem */

   Add the hexadecimal Vendor ID for your device in the correct place, save
   the file, rebuild your kernel, and reboot. Your device should now be found
   as an sio device as it was under FreeBSD 3.X

   5.22. Why do I get the error ``nlist failed'' when running, for example,
   top or systat?

   The problem is that the application you are trying to run is looking for a
   specific kernel symbol, but, for whatever reason, cannot find it; this
   error stems from one of two problems:

     * Your kernel and userland are not synchronized (i.e., you built a new
       kernel but did not do an installworld, or vice versa), and thus the
       symbol table is different from what the user application thinks it is.
       If this is the case, simply complete the upgrade process (see
       /usr/src/UPDATING for the correct sequence).

     * You are not using /boot/loader to load your kernel, but doing it
       directly from boot2 (see boot(8)). While there is nothing wrong with
       bypassing /boot/loader, it generally does a better job of making the
       kernel symbols available to user applications.

   5.23. Why does it take so long to connect to my computer via ssh or
   telnet?

   The symptom: there is a long delay between the time the TCP connection is
   established and the time when the client software asks for a password (or,
   in telnet(1)'s case, when a login prompt appears).

   The problem: more likely than not, the delay is caused by the server
   software trying to resolve the client's IP address into a hostname. Many
   servers, including the Telnet and SSH servers that come with FreeBSD, do
   this in order to, among other things, store the hostname in a log file for
   future reference by the administrator.

   The remedy: if the problem occurs whenever you connect from your computer
   (the client) to any server, the problem is with the client; likewise, if
   the problem only occurs when someone connects to your computer (the
   server) the problem is with the server.

   If the problem is with the client, the only remedy is to fix the DNS so
   the server can resolve it. If this is on a local network, consider it a
   server problem and keep reading; conversely, if this is on the global
   Internet, you will most likely need to contact your ISP and ask them to
   fix it for you.

   If the problem is with the server, and this is on a local network, you
   need to configure the server to be able to resolve address-to-hostname
   queries for your local address range. See the hosts(5) and named(8) manual
   pages for more information. If this is on the global Internet, the problem
   may be that your server's resolver is not functioning correctly. To check,
   try to look up another host--say, www.yahoo.com. If it does not work, that
   is your problem.

   5.24. What does ``stray IRQ'' mean?

   Stray IRQs are indications of hardware IRQ glitches, mostly from hardware
   that removes its interrupt request in the middle of the interrupt request
   acknowledge cycle.

   One has three options for dealing with this:

     * Live with the warnings. All except the first 5 per irq are suppressed
       anyway.

     * Break the warnings by changing 5 to 0 in isa_strayintr() so that all
       the warnings are suppressed.

     * Break the warnings by installing parallel port hardware that uses irq
       7 and the PPP driver for it (this happens on most systems), and
       install an ide drive or other hardware that uses irq 15 and a suitable
       driver for it.

   5.25. Why does ``file: table is full'' show up repeatedly in dmesg?

   This error message indicates you have exhausted the number of available
   file descriptors on your system. Please see the kern.maxfiles section of
   the Tuning Kernel Limits section of the Handbook for a discussion and
   solution.

   5.26. Why does the clock on my laptop keep incorrect time?

   Your laptop has two or more clocks, and FreeBSD has chosen to use the
   wrong one.

   Run dmesg(8), and check for lines that contain Timecounter. The last line
   printed is the one that FreeBSD chose, and will almost certainly be TSC.

     # dmesg | grep Timecounter
     Timecounter "i8254"  frequency 1193182 Hz
     Timecounter "TSC"  frequency 595573479 Hz

   You can confirm this by checking the kern.timecounter.hardware sysctl(3).

     # sysctl kern.timecounter.hardware
     kern.timecounter.hardware: TSC

   The BIOS may modify the TSC clock--perhaps to change the speed of the
   processor when running from batteries, or going into a power saving mode,
   but FreeBSD is unaware of these adjustments, and appears to gain or lose
   time.

   In this example, the i8254 clock is also available, and can be selected by
   writing its name to the kern.timecounter.hardware sysctl(3).

     # sysctl -w kern.timecounter.hardware=i8254
     kern.timecounter.hardware: TSC -> i8254

   Your laptop should now start keeping more accurate time.

   To have this change automatically run at boot time, add the following line
   to /etc/sysctl.conf.

     kern.timecounter.hardware=i8254

   5.27. Why did my laptop fail to correctly probe PC cards?

   This problem is common on laptops that boot more than one operating
   system. Some non-BSD operating systems leave PC card hardware in an
   inconsistent state. pccardd will detect the card as ``"(null)""(null)"''
   instead of its actual model.

   You must remove all power from the PC card slot to fully reset the
   hardware. Completely power off the laptop. (Don't suspend it, don't let it
   go into standby; the power needs to be completely off.) Wait a few
   moments, and reboot. Your PC card should work now.

   Some laptop hardware lies when it claims to be off. If the above does not
   work shut down, remove the battery, wait a moment, replace the battery,
   and reboot.

   5.28. Why does FreeBSD's boot loader display ``Read error'' and stop after
   the BIOS screen?

   FreeBSD's boot loader is incorrectly recognizing the hard drive's
   geometry. This must be manually set within fdisk when creating or
   modifying FreeBSD's slice.

   The correct drive geometry values can be found within the machine's BIOS.
   Look for the number of cylinders, heads and sectors for the particular
   drive.

   Within sysinstall(8)'s fdisk, hit G to set the drive geometry.

   A dialog will pop up requesting the number of cylinders, heads and
   sectors. Type the numbers found from the BIOS separates by forward
   slashes.

   5000 cylinders, 250 sectors and 60 sectors would be entered as 5000/250/60

   Press enter to set the values, and hit W to write the new partition table
   to the drive.

   5.29. Another operating system destroyed my Boot Manager. How do I get it
   back?

   Enter sysinstall(8) and choose Configure, then Fdisk. Select the disk the
   Boot Manager resided on with the space key. Press W to write changes to
   the drive. A prompt will appear asking which boot loader to install.
   Select this, and it will be restored.

   5.30. What does the error ``swap_pager: indefinite wait buffer:'' mean?

   This means that a process is trying to page memory to disk, and the page
   attempt has hung trying to access the disk for more than 20 seconds. It
   might be caused by bad blocks on the disk drive, disk wiring, cables, or
   any other disk I/O-related hardware. If the drive itself is actually bad,
   you will also see disk errors in /var/log/messages and in the output of
   dmesg. Otherwise, check your cables and connections.

     ----------------------------------------------------------------------

                       Chapter 6 Commercial Applications

     Note: This section is still very sparse, though we are hoping, of
     course, that companies will add to it! :) The FreeBSD group has no
     financial interest in any of the companies listed here but simply lists
     them as a public service (and feels that commercial interest in FreeBSD
     can have very positive effects on FreeBSD's long-term viability). We
     encourage commercial software vendors to send their entries here for
     inclusion. See the Vendors page for a longer list.

   6.1. Where can I get an Office Suite for FreeBSD?

   6.2. Where can I get Motif for FreeBSD?

   6.3. Where can I get CDE for FreeBSD?

   6.4. Are there any commercial high-performance X servers?

   6.5. Are there any Database systems for FreeBSD?

   6.6. Can I run Oracle on FreeBSD?

   6.1. Where can I get an Office Suite for FreeBSD?

   * The FreeBSD Mall offers a FreeBSD native version of VistaSource
     ApplixWare 5.

     ApplixWare is a rich full-featured, commercial Office Suite for FreeBSD
     containing a word processor, spreadsheet, presentation program, vector
     drawing package, and other applications.

     ApplixWare is offered as part of the FreeBSD Mall's BSD Desktop Edition.

   * The Linux version of StarOffice works flawlessly on FreeBSD. The easiest
     way to install the Linux version of StarOffice is through the FreeBSD
     Ports collection. Future versions of the open-source OpenOffice suite
     should work as well.

   6.2. Where can I get Motif for FreeBSD?

   The Open Group has released the source code to Motif 2.1.30. You can
   install the open-motif package, or compile it from ports. Refer to the
   ports section of the Handbook for more information on how to do this.

     Note: The Open Motif distribution only allows redistribution if it is
     running on an open source operating system.

   In addition, there are commercial distributions of the Motif software
   available. These, however, are not for free, but their license allows them
   to be used in closed-source software. Contact Apps2go for the least
   expensive ELF Motif 2.1.20 distribution for FreeBSD (either i386 or
   Alpha).

   There are two distributions, the ``development edition'' and the ``runtime
   edition'' (for much less). These distributions includes:

     * OSF/Motif manager, xmbind, panner, wsm.

     * Development kit with uil, mrm, xm, xmcxx, include and Imake files.

     * Static and dynamic ELF libraries (for use with FreeBSD 3.0 and above).

     * Demonstration applets.

   Be sure to specify that you want the FreeBSD version of Motif when
   ordering (do not forget to mention the architecture you want too)!
   Versions for NetBSD and OpenBSD are also sold by Apps2go. This is
   currently a FTP only download.

   More info

           Apps2go WWW page

   or

           <sales@apps2go.com> or <support@apps2go.com>

   or

           phone (817) 431 8775 or +1 817 431-8775

   Contact Metro Link for an either ELF or a.out Motif 2.1 distribution for
   FreeBSD.

   This distribution includes:

     * OSF/Motif manager, xmbind, panner, wsm.

     * Development kit with uil, mrm, xm, xmcxx, include and Imake files.

     * Static and dynamic libraries (specify ELF for use with FreeBSD 3.0 and
       later; or a.out for use with FreeBSD 2.2.8 and earlier).

     * Demonstration applets.

     * Preformatted manual pages.

   Be sure to specify that you want the FreeBSD version of Motif when
   ordering! Versions for Linux are also sold by Metro Link. This is
   available on either a CDROM or for FTP download.

   Contact Xi Graphics for an a.out Motif 2.0 distribution for FreeBSD.

   This distribution includes:

     * OSF/Motif manager, xmbind, panner, wsm.

     * Development kit with uil, mrm, xm, xmcxx, include and Imake files.

     * Static and dynamic libraries (for use with FreeBSD 2.2.8 and earlier).

     * Demonstration applets.

     * Preformatted manual pages.

   Be sure to specify that you want the FreeBSD version of Motif when
   ordering! Versions for BSDI and Linux are also sold by Xi Graphics. This
   is currently a 4 diskette set... in the future this will change to a
   unified CD distribution like their CDE.

   6.3. Where can I get CDE for FreeBSD?

   Xi Graphics used to sell CDE for FreeBSD, but no longer do.

   KDE is an open source X11 desktop which is similar to CDE in many
   respects. You might also like the look and feel of xfce. KDE and xfce are
   both in the ports system.

   6.4. Are there any commercial high-performance X servers?

   Yes, Xi Graphics and Metro Link sell Accelerated-X product for FreeBSD and
   other Intel based systems.

   The Metro Link offering is a high performance X Server that offers easy
   configuration using the FreeBSD Package suite of tools, support for
   multiple concurrent video boards and is distributed in binary form only,
   in a convenient FTP download. Not to mention the Metro Link offering is
   available at the very reasonable price of $39.

   Metro Link also sells both ELF and a.out Motif for FreeBSD (see above).

   More info

           Metro Link WWW page

   or

           <sales@metrolink.com> or <tech@metrolink.com>

   or

           phone (954) 938-0283 or +1 954 938-0283

   The Xi Graphics offering is a high performance X Server that offers easy
   configuration, support for multiple concurrent video boards and is
   distributed in binary form only, in a unified diskette distribution for
   FreeBSD and Linux. Xi Graphics also offers a high performance X Server
   tailored for laptop support.

   There is a free ``compatibility demo'' of version 5.0 available.

   Xi Graphics also sells Motif and CDE for FreeBSD (see above).

   More info

           Xi Graphics WWW page

   or

           <sales@xig.com> or <support@xig.com>

   or

           phone (800) 946 7433 or +1 303 298-7478.

   6.5. Are there any Database systems for FreeBSD?

   Yes! See the Commercial Vendors section of FreeBSD's Web site.

   Also see the Databases section of the Ports collection.

   6.6. Can I run Oracle on FreeBSD?

   Yes. The following pages tell you exactly how to setup Linux-Oracle on
   FreeBSD:

     * http://www.scc.nl/~marcel/howto-oracle.html

     * 
 http://www.lf.net/lf/pi/oracle/install-linux-oracle-on-freebsd

     ----------------------------------------------------------------------

                          Chapter 7 User Applications

   7.1. So, where are all the user applications?

   7.2. Where do I find libc.so.3.0?

   7.3. Why do I get a message reading ``Error: can't find libc.so.4.0''?

   7.4. Why does ghostscript give lots of errors with my 386/486SX?

   7.5. Why do SCO/iBCS2 applications bomb on ``socksys''? (FreeBSD 3.0 and
   older only).

   7.6. How do I configure INN (Internet News) for my machine?

   7.7. What version of Microsoft FrontPage should I get?

   7.8. Does FreeBSD support Java?

   7.9. Why can I not build this port on my 3.X-STABLE machine?

   7.10. Where do I find ld.so?

   7.11. I updated the sources, now how do I update my installed ports?

   7.12. Why is /bin/sh so minimal? Why does FreeBSD not use bash or another
   shell?

   7.13. Why do Netscape and Opera take so long to start?

   7.1. So, where are all the user applications?

   Please take a look at the ports page for info on software packages ported
   to FreeBSD. The list currently tops 7,600 and is growing daily, so come
   back to check often or subscribe to the freebsd-announce mailing list for
   periodic updates on new entries.

   Most ports should be available for the 2.2, 3.X and 4.X branches, and many
   of them should work on 2.1.X systems as well. Each time a FreeBSD release
   is made, a snapshot of the ports tree at the time of release in also
   included in the ports/ directory.

   We also support the concept of a ``package'', essentially no more than a
   gzipped binary distribution with a little extra intelligence embedded in
   it for doing whatever custom installation work is required. A package can
   be installed and uninstalled again easily without having to know the gory
   details of which files it includes.

   Use the package installation menu in /stand/sysinstall (under the
   post-configuration menu item) or invoke the pkg_add(1) command on the
   specific package files you are interested in installing. Package files can
   usually be identified by their .tgz suffix and CDROM distribution people
   will have a packages/All directory on their CD which contains such files.
   They can also be downloaded over the net for various versions of FreeBSD
   at the following locations:

   for 2.2.8-RELEASE/2.2.8-STABLE

           ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-2.2.8/

   for 3.X-RELEASE/3.X-STABLE

           ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-3-stable/

   for 4.X-RELEASE/4-STABLE

           ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-4-stable/

   for 5.X-CURRENT

           ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-5-current

   or your nearest local mirror site.

   Note that all ports may not be available as packages since new ones are
   constantly being added. It is always a good idea to check back
   periodically to see which packages are available at the ftp.FreeBSD.org
   master site.

   7.2. Where do I find libc.so.3.0?

   You are trying to run a package built on 2.2 and later on a 2.1.X system.
   Please take a look at the previous section and get the correct
   port/package for your system.

   7.3. Why do I get a message reading ``Error: can't find libc.so.4.0''?

   You accidently downloaded packages meant for 4.X and 5.X systems and
   attempted to install them on your 2.X or 3.X FreeBSD system. Please
   download the correct version of the packages.

   7.4. Why does ghostscript give lots of errors with my 386/486SX?

   You do not have a math co-processor, right? You will need to add the
   alternative math emulator to your kernel; you do this by adding the
   following to your kernel config file and it will be compiled in.

     options GPL_MATH_EMULATE

     Note: You will need to remove the MATH_EMULATE option when you do this.

   7.5. Why do SCO/iBCS2 applications bomb on ``socksys''? (FreeBSD 3.0 and
   older only).

   You first need to edit the /etc/sysconfig (or /etc/rc.conf, see
   rc.conf(5)) file in the last section to change the following variable to
   YES:

     # Set to YES if you want ibcs2 (SCO) emulation loaded at startup
     ibcs2=NO

   It will load the ibcs2 kernel module at startup.

   You will then need to set up /compat/ibcs2/dev to look like:

     lrwxr-xr-x  1 root  wheel         9 Oct 15 22:20 X0R@ -> /dev/null
     lrwxr-xr-x  1 root  wheel         7 Oct 15 22:20 nfsd@ -> socksys
     -rw-rw-r--  1 root  wheel         0 Oct 28 12:02 null
     lrwxr-xr-x  1 root  wheel         9 Oct 15 22:20 socksys@ -> /dev/null
     crw-rw-rw-  1 root  wheel   41,   1 Oct 15 22:14 spx

   You just need socksys to go to /dev/null (see null(4)) to fake the open &
   close. The code in -CURRENT will handle the rest. This is much cleaner
   than the way it was done before. If you want the spx driver for a local
   socket X connection, define SPX_HACK when you compile the system.

   7.6. How do I configure INN (Internet News) for my machine?

   After installing the news/inn package or port, an excellent place to start
   is Dave Barr's INN Page where you will find the INN FAQ.

   7.7. What version of Microsoft FrontPage should I get?

   Use the Port, Luke! A pre-patched version of Apache, apache13-fp, is
   available in the ports tree.

   7.8. Does FreeBSD support Java?

   Yes. Please see http://www.FreeBSD.org/java/.

   7.9. Why can I not build this port on my 3.X-STABLE machine?

   If you are running a FreeBSD version that lags significantly behind
   -CURRENT or -STABLE, you may need a ports upgrade kit from
   http://www.FreeBSD.org/ports/. If you are up to date, then someone might
   have committed a change to the port which works for -CURRENT but which
   broke the port for -STABLE. Please submit a bug report on this with the
   send-pr(1) command, since the ports collection is supposed to work for
   both the -CURRENT and -STABLE branches.

   7.10. Where do I find ld.so?

   a.out applications like Netscape Navigator require a.out libraries. A
   version of FreeBSD built with ELF libraries does not install them by
   default. You will get complaints about not having /usr/libexec/ld.so if
   this is the case on your system. These libraries are available as an
   add-on in the compat22 distribution. Use sysinstall(8) to install them.
   You can also install them from the FreeBSD source code:

     # cd /usr/src/lib/compat/compat22
     # make install clean

   If you want to install the latest compat22 libraries whenever you run make
   world, edit /etc/make.conf to include COMPAT22=YES. Old compatibility
   libraries change rarely, if ever, so this is not generally needed.

   Also see the ERRATAs for 3.1-RELEASE and 3.2-RELEASE.

   7.11. I updated the sources, now how do I update my installed ports?

   FreeBSD does not include a port upgrading tool, but it does have some
   tools to make the upgrade process somewhat easier. You can also install
   additional tools to simplify port handling.

   The pkg_version(1) command can generate a script that will update
   installed ports to the latest version in the ports tree.

     # pkg_version -c > /tmp/myscript

   The output script must be edited by hand before you use it. Current
   versions of pkg_version(1) force this by inserting an exit(1) at the
   beginning of the script.

   You should save the output of the script, as it will note packages that
   depend on the one that has been updated. These may or may not need to be
   updated as well. The usual case where they need to be updated is that a
   shared library has changed version numbers, so the ports that used that
   library need to be rebuilt to use the new version.

   If you have the disk space, you can use the portupgrade tool to automate
   all of this. portupgrade includes various tools to simplify package
   handling. It is available under sysutils/portupgrade. Since it is written
   in Ruby, portupgrade is an unlikely candidate for integration with the
   main FreeBSD tree. That should not stop anyone from using it, however.

   If your system is up full time, the periodic(8) system can be used to
   generate a weekly list of ports that might need updating by setting
   weekly_status_pkg_enable="YES" in /etc/periodic.conf.

   7.12. Why is /bin/sh so minimal? Why does FreeBSD not use bash or another
   shell?

   Because POSIX says that there shall be such a shell.

   The more complicated answer: many people need to write shell scripts which
   will be portable across many systems. That is why POSIX specifies the
   shell and utility commands in great detail. Most scripts are written in
   Bourne shell, and because several important programming interfaces
   (make(1), system(3), popen(3), and analogues in higher-level scripting
   languages like Perl and Tcl) are specified to use the Bourne shell to
   interpret commands. Because the Bourne shell is so often and widely used,
   it is important for it to be quick to start, be deterministic in its
   behavior, and have a small memory footprint.

   The existing implementation is our best effort at meeting as many of these
   requirements simultaneously as we can. In order to keep /bin/sh small, we
   have not provided many of the convenience features that other shells have.
   That is why the Ports Collection includes more featureful shells like
   bash, scsh, tcsh, and zsh. (You can compare for yourself the memory
   utilization of all these shells by looking at the ``VSZ'' and ``RSS''
   columns in a ps -u listing.)

   7.13. Why do Netscape and Opera take so long to start?

   The usual answer is that DNS on your system is misconfigured. Both
   Netscape and Opera perform DNS checks when starting up. The browser will
   not appear on your desktop until the program either gets a response or
   determines that the system has no network connection.

     ----------------------------------------------------------------------

                         Chapter 8 Kernel Configuration

   8.1. I would like to customize my kernel. Is it difficult?

   8.2. My kernel compiles fail because _hw_float is missing. How do I solve
   this problem?

   8.3. Why is my kernel so big (over 10MB)?

   8.4. Why do I get interrupt conflicts with multi-port serial code?

   8.5. Why does every kernel I try to build fail to compile, even GENERIC?

   8.1. I would like to customize my kernel. Is it difficult?

   Not at all! Check out the kernel config section of the Handbook.

     Note: We recommend that you make a dated snapshot of your new /kernel
     called /kernel.YYMMDD after you get it working properly. Also back up
     your new /modules directory to /modules.YYMMDD. That way, if you make a
     mistake the next time you play with your configuration you can boot the
     backup kernel instead of having to fall back to kernel.GENERIC. This is
     particularly important if you are now booting from a controller that
     GENERIC does not support.

   8.2. My kernel compiles fail because _hw_float is missing. How do I solve
   this problem?

   Let me guess. You removed npx0 (see npx(4)) from your kernel configuration
   file because you do not have a math co-processor, right? Wrong! :-) The
   npx0 is MANDATORY. Even if you do not have a mathematic co-processor, you
   must include the npx0 device.

   8.3. Why is my kernel so big (over 10MB)?

   Chances are, you compiled your kernel in debug mode. Kernels built in
   debug mode contain many symbols that are used for debugging, thus greatly
   increasing the size of the kernel. Note that if you running a FreeBSD 3.0
   or later system, there will be little or no performance decrease from
   running a debug kernel, and it is useful to keep one around in case of a
   system panic.

   However, if you are running low on disk space, or you simply do not want
   to run a debug kernel, make sure that both of the following are true:

     * You do not have a line in your kernel configuration file that reads:

     makeoptions DEBUG=-g

     * You are not running config(8) with the -g option.

   Both of the above situations will cause your kernel to be built in debug
   mode. As long as you make sure you follow the steps above, you can build
   your kernel normally, and you should notice a fairly large size decrease;
   most kernels tend to be around 1.5MB to 2MB.

   8.4. Why do I get interrupt conflicts with multi-port serial code?

   When I compile a kernel with multi-port serial code, it tells me that only
   the first port is probed and the rest skipped due to interrupt conflicts.
   How do I fix this?

   The problem here is that FreeBSD has code built-in to keep the kernel from
   getting trashed due to hardware or software conflicts. The way to fix this
   is to leave out the IRQ settings on all but one port. Here is an example:

     #
     # Multiport high-speed serial line - 16550 UARTS
     #
     device sio2 at isa? port 0x2a0 tty irq 5 flags 0x501 vector siointr
     device sio3 at isa? port 0x2a8 tty flags 0x501 vector siointr
     device sio4 at isa? port 0x2b0 tty flags 0x501 vector siointr
     device sio5 at isa? port 0x2b8 tty flags 0x501 vector siointr

   8.5. Why does every kernel I try to build fail to compile, even GENERIC?

   There are a number of possible causes for this problem. They are, in no
   particular order:

     * You are not using the new make buildkernel and make installkernel
       targets, and your source tree is different from the one used to build
       the currently running system (e.g., you are compiling 4.3-RELEASE on a
       4.0-RELEASE system). If you are attempting an upgrade, please read the
       /usr/src/UPDATING file, paying particular attention to the ``COMMON
       ITEMS'' section at the end.

     * You are using the new make buildkernel and make installkernel targets,
       but you failed to assert the completion of the make buildworld target.
       The make buildkernel target relies on files generated by the make
       buildworld target to complete its job correctly.

     * Even if you are trying to build FreeBSD-STABLE, it is possible that
       you fetched the source tree at a time when it was either being
       modified, or broken for other reasons; only releases are absolutely
       guaranteed to be buildable, although FreeBSD-STABLE builds fine the
       majority of the time. If you have not already done so, try re-fetching
       the source tree and see if the problem goes away. Try using a
       different server in case the one you are using is having problems.

     ----------------------------------------------------------------------

                 Chapter 9 Disks, Filesystems, and Boot Loaders

   9.1. How can I add my new hard disk to my FreeBSD system?

   9.2. How do I move my system over to my huge new disk?

   9.3. Will a ``dangerously dedicated'' disk endanger my health?

   9.4. Which partitions can safely use softupdates? I have heard that
   softupdates on / can cause problems.

   9.5. What is inappropriate about my ccd?

   9.6. Why can I not edit the disklabel on my ccd?

   9.7. Can I mount other foreign filesystems under FreeBSD?

   9.8. How do I mount a secondary DOS partition?

   9.9. Is there a cryptographic filesystem for FreeBSD?

   9.10. How can I use the NT loader to boot FreeBSD?

   9.11. How do I boot FreeBSD and Linux from LILO?

   9.12. How do I boot FreeBSD and Linux using BootEasy?

   9.13. How do I change the boot prompt from ??? to something more
   meaningful?

   9.14. I have a new removable drive, how do I use it?

   9.15. Why do I get ``Incorrect super block'' when mounting a CDROM?

   9.16. Why do I get ``Device not configured'' when mounting a CDROM?

   9.17. Why do all non-English characters in filenames show up as ``?'' on
   my CDs when mounted in FreeBSD?

   9.18. I burned a CD under FreeBSD and now I can not read it under any
   other operating system. Why?

   9.19. How can I create an image of a data CD?

   9.20. Why can I not mount an audio CD?

   9.21. How do I mount a multi-session CD?

   9.22. How do I let ordinary users mount floppies, CDROMs and other
   removable media?

   9.23. The du and df commands show different amounts of disk space
   available. What is going on?

   9.24. How can I add more swap space?

   9.25. How is it possible for a partition to be more than 100% full?

   9.1. How can I add my new hard disk to my FreeBSD system?

   See the Disk Formatting Tutorial at www.FreeBSD.org.

   9.2. How do I move my system over to my huge new disk?

   The best way is to reinstall the OS on the new disk, then move the user
   data over. This is highly recommended if you have been tracking -STABLE
   for more than one release, or have updated a release instead of installing
   a new one. You can install booteasy on both disks with boot0cfg(8), and
   dual boot them until you are happy with the new configuration. Skip the
   next paragraph to find out how to move the data after doing this.

   Should you decide not to do a fresh install, you need to partition and
   label the new disk with either /stand/sysinstall, or fdisk(8) and
   disklabel(8). You should also install booteasy on both disks with
   boot0cfg(8), so that you can dual boot to the old or new system after the
   copying is done. See the formatting-media article for details on this
   process.

   Now you have the new disk set up, and are ready to move the data.
   Unfortunately, you cannot just blindly copy the data. Things like device
   files (in /dev), flags, and links tend to screw that up. You need to use
   tools that understand these things, which means dump(8). Although it is
   suggested that you move the data in single user mode, it is not required.

   You should never use anything but dump(8) and restore(8) to move the root
   filesystem. The tar(1) command may work - then again, it may not. You
   should also use dump(8) and restore(8) if you are moving a single
   partition to another empty partition. The sequence of steps to use dump to
   move a partitions data to a new partition is:

    1. newfs the new partition.

    2. mount it on a temporary mount point.

    3. cd to that directory.

    4. dump the old partition, piping output to the new one.

   For example, if you are going to move root to /dev/ad1s1a, with /mnt as
   the temporary mount point, it is:

     # newfs /dev/ad1s1a
     # mount /dev/ad1s1a /mnt
     # cd /mnt
     # dump 0af - / | restore xf -

   Rearranging your partitions with dump takes a bit more work. To merge a
   partition like /var into its parent, create the new partition large enough
   for both, move the parent partition as described above, then move the
   child partition into the empty directory that the first move created:

     # newfs /dev/ad1s1a
     # mount /dev/ad1s1a /mnt
     # cd /mnt
     # dump 0af - / | restore xf -
     # cd var
     # dump 0af - /var | restore xf -

   To split a directory from its parent, say putting /var on its own
   partition when it was not before, create both partitions, then mount the
   child partition on the appropriate directory in the temporary mount point,
   then move the old single partition:

     # newfs /dev/ad1s1a
     # newfs /dev/ad1s1d
     # mount /dev/ad1s1a /mnt
     # mkdir /mnt/var
     # mount /dev/ad1s1d /mnt/var
     # cd /mnt
     # dump 0af - / | restore xf -

   You might prefer cpio(1), pax(1), tar(1) to dump(8) for user data. At the
   time of this writing, these are known to lose file flag information, so
   use them with caution.

   9.3. Will a ``dangerously dedicated'' disk endanger my health?

   The installation procedure allows you to chose two different methods in
   partitioning your hard disk(s). The default way makes it compatible with
   other operating systems on the same machine, by using fdisk table entries
   (called ``slices'' in FreeBSD), with a FreeBSD slice that employs
   partitions of its own. Optionally, one can chose to install a
   boot-selector to switch between the possible operating systems on the
   disk(s). The alternative uses the entire disk for FreeBSD, and makes no
   attempt to be compatible with other operating systems.

   So why it is called ``dangerous''? A disk in this mode does not contain
   what normal PC utilities would consider a valid fdisk table. Depending on
   how well they have been designed, they might complain at you once they are
   getting in contact with such a disk, or even worse, they might damage the
   BSD bootstrap without even asking or notifying you. In addition, the
   ``dangerously dedicated'' disk's layout is known to confuse many BIOSes,
   including those from AWARD (e.g. as found in HP Netserver and Micronics
   systems as well as many others) and Symbios/NCR (for the popular 53C8xx
   range of SCSI controllers). This is not a complete list, there are more.
   Symptoms of this confusion include the ``read error'' message printed by
   the FreeBSD bootstrap when it cannot find itself, as well as system
   lockups when booting.

   Why have this mode at all then? It only saves a few kbytes of disk space,
   and it can cause real problems for a new installation. ``Dangerously
   dedicated'' mode's origins lie in a desire to avoid one of the most common
   problems plaguing new FreeBSD installers - matching the BIOS ``geometry''
   numbers for a disk to the disk itself.

   ``Geometry'' is an outdated concept, but one still at the heart of the
   PC's BIOS and its interaction with disks. When the FreeBSD installer
   creates slices, it has to record the location of these slices on the disk
   in a fashion that corresponds with the way the BIOS expects to find them.
   If it gets it wrong, you will not be able to boot.

   ``Dangerously dedicated'' mode tries to work around this by making the
   problem simpler. In some cases, it gets it right. But it is meant to be
   used as a last-ditch alternative - there are better ways to solve the
   problem 99 times out of 100.

   So, how do you avoid the need for ``DD'' mode when you are installing?
   Start by making a note of the geometry that your BIOS claims to be using
   for your disks. You can arrange to have the kernel print this as it boots
   by specifying -v at the boot: prompt, or using boot -v in the loader. Just
   before the installer starts, the kernel will print a list of BIOS
   geometries. Do not panic - wait for the installer to start and then use
   scrollback to read the numbers. Typically the BIOS disk units will be in
   the same order that FreeBSD lists your disks, first IDE, then SCSI.

   When you are slicing up your disk, check that the disk geometry displayed
   in the FDISK screen is correct (ie. it matches the BIOS numbers); if it is
   wrong, use the g key to fix it. You may have to do this if there is
   absolutely nothing on the disk, or if the disk has been moved from another
   system. Note that this is only an issue with the disk that you are going
   to boot from; FreeBSD will sort itself out just fine with any other disks
   you may have.

   Once you have got the BIOS and FreeBSD agreeing about the geometry of the
   disk, your problems are almost guaranteed to be over, and with no need for
   ``DD'' mode at all. If, however, you are still greeted with the dreaded
   ``read error'' message when you try to boot, it is time to cross your
   fingers and go for it - there is nothing left to lose.

   To return a ``dangerously dedicated'' disk for normal PC use, there are
   basically two options. The first is, you write enough NULL bytes over the
   MBR to make any subsequent installation believe this to be a blank disk.
   You can do this for example with

     # dd if=/dev/zero of=/dev/rda0 count=15

   Alternatively, the undocumented DOS ``feature''

     C:\> fdisk /mbr

   will to install a new master boot record as well, thus clobbering the BSD
   bootstrap.

   9.4. Which partitions can safely use softupdates? I have heard that
   softupdates on / can cause problems.

   Short answer: you can usually use softupdates safely on all partitions.

   Long answer: There used to be some concern over using softupdates on the
   root partition. Softupdates has two characteristics that caused this.
   First, a softupdates partition has a small chance of losing data during a
   system crash. (The partition will not be corrupted; the data will simply
   be lost.) Also, softupdates can cause temporary space shortages.

   When using softupdates, the kernel can take up to thirty seconds to
   actually write changes to the physical disk. If you delete a large file,
   the file still resides on disk until the kernel actually performs the
   deletion. This can cause a very simple race condition. Suppose you delete
   one large file and immediately create another large file. The first large
   file is not yet actually removed from the physical disk, so the disk might
   not have enough room for the second large file. You get an error that the
   partition does not have enough space, although you know perfectly well
   that you just released a large chunk of space! When you try again mere
   seconds later, the file creation works as you expect. This has left more
   than one user scratching his head and doubting his sanity, the FreeBSD
   filesystem, or both.

   If a system should crash after the kernel accepts a chunk of data for
   writing to disk, but before that data is actually written out, data could
   be lost or corrupted. This risk is extremely small, but generally
   manageable. Use of IDE write caching greatly increases this risk; it is
   strongly recommended that you disable IDE write caching when using
   softupdates.

   These issues affect all partitions using softupdates. So, what does this
   mean for the root partition?

   Vital information on the root partition changes very rarely. Files such as
   /kernel and the contents of /etc only change during system maintenance, or
   when users change their passwords. If the system crashed during the
   thirty-second window after such a change is made, it is possible that data
   could be lost. This risk is negligible for most applications, but you
   should be aware that it exists. If your system cannot tolerate this much
   risk, do not use softupdates on the root filesystem!

   / is traditionally one of the smallest partitions. By default, FreeBSD
   puts the /tmp directory on /. If you have a busy /tmp, you might see
   intermittent space problems. Symlinking /tmp to /var/tmp will solve this
   problem.

   9.5. What is inappropriate about my ccd?

   The symptom of this is:

     # ccdconfig -C
     ccdconfig: ioctl (CCDIOCSET): /dev/ccd0c: Inappropriate file type or format

   This usually happens when you are trying to concatenate the c partitions,
   which default to type unused. The ccd driver requires the underlying
   partition type to be FS_BSDFFS. Edit the disklabel of the disks you are
   trying to concatenate and change the types of partitions to 4.2BSD.

   9.6. Why can I not edit the disklabel on my ccd?

   The symptom of this is:

     # disklabel ccd0
     (it prints something sensible here, so let us try to edit it)
     # disklabel -e ccd0
     (edit, save, quit)
     disklabel: ioctl DIOCWDINFO: No disk label on disk;
     use "disklabel -r" to install initial label

   This is because the disklabel returned by ccd is actually a ``fake'' one
   that is not really on the disk. You can solve this problem by writing it
   back explicitly, as in:

     # disklabel ccd0 > /tmp/disklabel.tmp
     # disklabel -Rr ccd0 /tmp/disklabel.tmp
     # disklabel -e ccd0
     (this will work now)

   9.7. Can I mount other foreign filesystems under FreeBSD?

Digital UNIX

   UFS CDROMs can be mounted directly on FreeBSD. Mounting disk partitions
   from Digital UNIX and other systems that support UFS may be more complex,
   depending on the details of the disk partitioning for the operating system
   in question.

Linux

        As of 2.2, FreeBSD supports ext2fs partitions. See mount_ext2fs(8)
        for more information.

NT

        A read-only NTFS driver was introduced in FreeBSD 3.0. For more
        information, see mount_ntfs(8). For older versions of FreeBSD, see
        the tutorial by Mark Ovens at
        http://ukug.uk.FreeBSD.org/~mark/ntfs_install.html.

        Any other information on this subject would be appreciated.

   9.8. How do I mount a secondary DOS partition?

   The secondary DOS partitions are found after ALL the primary partitions.
   For example, if you have an ``E'' partition as the second DOS partition on
   the second SCSI drive, you need to create the special files for ``slice
   5'' in /dev, then mount /dev/da1s5:

     # cd /dev
     # sh MAKEDEV da1s5
     # mount -t msdos /dev/da1s5 /dos/e

   9.9. Is there a cryptographic filesystem for FreeBSD?

   Yes; see the security/cfs port.

   9.10. How can I use the NT loader to boot FreeBSD?

   This procedure is slightly different for 2.2.X and 3.X (with the 3-stage
   boot) systems.

   The general idea is that you copy the first sector of your native root
   FreeBSD partition into a file in the DOS/NT partition. Assuming you name
   that file something like c:\bootsect.bsd (inspired by c:\bootsect.dos),
   you can then edit the c:\boot.ini file to come up with something like
   this:

     [boot loader]
     timeout=30
     default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
     [operating systems]
     multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows NT"
     C:\BOOTSECT.BSD="FreeBSD"
     C:\="DOS"

   For 2.2.X systems this procedure assumes that DOS, NT, FreeBSD, or
   whatever have been installed into their respective fdisk partitions on the
   same disk. This example was tested on a system where DOS & NT were on the
   first fdisk partition, and FreeBSD on the second. FreeBSD was also set up
   to boot from its native partition, not the disk's MBR.

   Mount a DOS-formatted floppy (if you have converted to NTFS) or the FAT
   partition, under, say, /mnt.

     # dd if=/dev/rda0a of=/mnt/bootsect.bsd bs=512 count=1

   Reboot into DOS or NT. NTFS users copy the bootsect.bsd or the
   bootsect.lnx file from the floppy to C:\. Modify the attributes
   (permissions) on boot.ini with:

     C:\> attrib -s -r c:\boot.ini

   Edit to add the appropriate entries from the example boot.ini above, and
   restore the attributes:

     C:\> attrib +s +r c:\boot.ini

   If FreeBSD is booting from the MBR, restore it with the DOS fdisk command
   after you reconfigure them to boot from their native partitions.

   For FreeBSD 3.X systems the procedure is somewhat simpler.

   If FreeBSD is installed on the same disk as the NT boot partition simply
   copy /boot/boot1 to C:\BOOTSECT.BSD However, if FreeBSD is installed on a
   different disk /boot/boot1 will not work, /boot/boot0 is needed.

     Warning: DO NOT SIMPLY COPY /boot/boot0 INSTEAD OF /boot/boot1, YOU WILL
     OVERWRITE YOUR PARTITION TABLE AND RENDER YOUR COMPUTER UN-BOOTABLE!

   /boot/boot0 needs to be installed using sysinstall by selecting the
   FreeBSD boot manager on the screen which asks if you wish to use a boot
   manager. This is because /boot/boot0 has the partition table area filled
   with NULL characters but sysinstall copies the partition table before
   copying /boot/boot0 to the MBR.

   When the FreeBSD boot manager runs it records the last OS booted by
   setting the active flag on the partition table entry for that OS and then
   writes the whole 512-bytes of itself back to the MBR so if you just copy
   /boot/boot0 to C:\BOOTSECT.BSD then it writes an empty partition table,
   with the active flag set on one entry, to the MBR.

   9.11. How do I boot FreeBSD and Linux from LILO?

   If you have FreeBSD and Linux on the same disk, just follow LILO's
   installation instructions for booting a non-Linux operating system. Very
   briefly, these are:

   Boot Linux, and add the following lines to /etc/lilo.conf:

     other=/dev/hda2
             table=/dev/hda
             label=FreeBSD

   (the above assumes that your FreeBSD slice is known to Linux as /dev/hda2;
   tailor to suit your setup). Then, run lilo as root and you should be done.

   If FreeBSD resides on another disk, you need to add loader=/boot/chain.b
   to the LILO entry. For example:

     other=/dev/dab4
             table=/dev/dab
             loader=/boot/chain.b
             label=FreeBSD

   In some cases you may need to specify the BIOS drive number to the FreeBSD
   boot loader to successfully boot off the second disk. For example, if your
   FreeBSD SCSI disk is probed by BIOS as BIOS disk 1, at the FreeBSD boot
   loader prompt you need to specify:

     Boot: 1:da(0,a)/kernel

   On FreeBSD 2.2.5 and later, you can configure boot(8) to automatically do
   this for you at boot time.

   The Linux+FreeBSD mini-HOWTO is a good reference for FreeBSD and Linux
   interoperability issues.

   9.12. How do I boot FreeBSD and Linux using BootEasy?

   Install LILO at the start of your Linux boot partition instead of in the
   Master Boot Record. You can then boot LILO from BootEasy.

   If you are running Windows 95 and Linux this is recommended anyway, to
   make it simpler to get Linux booting again if you should need to reinstall
   Windows 95 (which is a Jealous Operating System, and will bear no other
   Operating Systems in the Master Boot Record).

   9.13. How do I change the boot prompt from ??? to something more
   meaningful?

   You can not do that with the standard boot manager without rewriting it.
   There are a number of other boot managers in the sysutils ports category
   that provide this functionality.

   9.14. I have a new removable drive, how do I use it?

   Whether it is a removable drive like a ZIP or an EZ drive (or even a
   floppy, if you want to use it that way), or a new hard disk, once it is
   installed and recognized by the system, and you have your
   cartridge/floppy/whatever slotted in, things are pretty much the same for
   all devices.

   (this section is based on Mark Mayo's ZIP FAQ)

   If it is a ZIP drive or a floppy, you have already got a DOS filesystem on
   it, you can use a command like this:

     # mount -t msdos /dev/fd0c /floppy

   if it is a floppy, or this:

     # mount -t msdos /dev/da2s4 /zip

   for a ZIP disk with the factory configuration.

   For other disks, see how they are laid out using fdisk(8) or
   sysinstall(8).

   The rest of the examples will be for a ZIP drive on da2, the third SCSI
   disk.

   Unless it is a floppy, or a removable you plan on sharing with other
   people, it is probably a better idea to stick a BSD filesystem on it. You
   will get long filename support, at least a 2X improvement in performance,
   and a lot more stability. First, you need to redo the DOS-level
   partitions/filesystems. You can either use fdisk(8) or /stand/sysinstall,
   or for a small drive that you do not want to bother with multiple
   operating system support on, just blow away the whole FAT partition table
   (slices) and just use the BSD partitioning:

     # dd if=/dev/zero of=/dev/rda2 count=2
     # disklabel -Brw da2 auto

   You can use disklabel or /stand/sysinstall to create multiple BSD
   partitions. You will certainly want to do this if you are adding swap
   space on a fixed disk, but it is probably irrelevant on a removable drive
   like a ZIP.

   Finally, create a new filesystem, this one is on our ZIP drive using the
   whole disk:

     # newfs /dev/rda2c

   and mount it:

     # mount /dev/da2c /zip

   and it is probably a good idea to add a line like this to /etc/fstab (see
   fstab(5)) so you can just type mount /zip in the future:

     /dev/da2c /zip ffs rw,noauto 0 0

   9.15. Why do I get ``Incorrect super block'' when mounting a CDROM?

   You have to tell mount(8) the type of the device that you want to mount.
   This is described in the Handbook section on optical media, specifically
   the section Using Data CDs.

   9.16. Why do I get ``Device not configured'' when mounting a CDROM?

   This generally means that there is no CDROM in the CDROM drive, or the
   drive is not visible on the bus. Please see the Using Data CDs section of
   the Handbook for a detailed discussion of this issue.

   9.17. Why do all non-English characters in filenames show up as ``?'' on
   my CDs when mounted in FreeBSD?

   Your CDROM probably uses the ``Joliet'' extension for storing information
   about files and directories. This is discussed in the Handbook chapter on
   creating and using CDROMs, specifically the section on Using Data CDROMs.

   9.18. I burned a CD under FreeBSD and now I can not read it under any
   other operating system. Why?

   You most likely burned a raw file to your CD, rather than creating an ISO
   9660 filesystem. Take a look at the Handbook chapter on creating CDROMs,
   particularly the section on burning raw data CDs.

   9.19. How can I create an image of a data CD?

   This is discussed in the Handbook section on duplicating data CDs. For
   more on working with CDROMs, see the Creating CDs Section in the Storage
   chapter in the Handbook.

   9.20. Why can I not mount an audio CD?

   If you try to mount an audio CD, you will get an error like ``cd9660:
   /dev/acd0c: Invalid argument''. This is because mount only works on
   filesystems. Audio CDs do not have filesystems; they just have data. You
   need a program that reads audio CDs, such as the audio/xmcd port.

   9.21. How do I mount a multi-session CD?

   By default, mount(8) will attempt to mount the last data track (session)
   of a CD. If you would like to load an earlier session, you must use the -s
   command line argument. Please see mount_cd9660(8) for specific examples.

   9.22. How do I let ordinary users mount floppies, CDROMs and other
   removable media?

   Ordinary users can be permitted to mount devices. Here is how:

    1. As root set the sysctl variable vfs.usermount to 1.

     # sysctl -w vfs.usermount=1

    2. As root assign the appropriate permissions to the block device
       associated with the removable media.

       For example, to allow users to mount the first floppy drive, use:

     # chmod 666 /dev/fd0

       To allow users in the group operator to mount the CDROM drive, use:

     # chgrp operator /dev/cd0c
     # chmod 640 /dev/cd0c

    3. Finally, add the line vfs.usermount=1 to the file /etc/sysctl.conf so
       that it is reset at system boot time.

   All users can now mount the floppy /dev/fd0 onto a directory that they
   own:

     % mkdir ~/my-mount-point
     % mount -t msdos /dev/fd0 ~/my-mount-point

   Users in group operator can now mount the CDROM /dev/cd0c onto a directory
   that they own:

     % mkdir ~/my-mount-point
     % mount -t cd9660 /dev/cd0c ~/my-mount-point

   Unmounting the device is simple:

     % umount ~/my-mount-point

   Enabling vfs.usermount, however, has negative security implications. A
   better way to access MSDOS formatted media is to use the mtools package in
   the ports collection.

   9.23. The du and df commands show different amounts of disk space
   available. What is going on?

   You need to understand what du and df really do. du goes through the
   directory tree, measures how large each file is, and presents the totals.
   df just asks the filesystem how much space it has left. They seem to be
   the same thing, but a file without a directory entry will affect df but
   not du.

   When a program is using a file, and you delete the file, the file is not
   really removed from the filesystem until the program stops using it. The
   file is immediately deleted from the directory listing, however. You can
   see this easily enough with a program such as more. Assume you have a file
   large enough that its presence affects the output of du and df. (Since
   disks can be so large today, this might be a very large file!) If you
   delete this file while using more on it, more does not immediately choke
   and complain that it cannot view the file. The entry is simply removed
   from the directory so no other program or user can access it. du shows
   that it is gone -- it has walked the directory tree and the file is not
   listed. df shows that it is still there, as the filesystem knows that more
   is still using that space. Once you end the more session, du and df will
   agree.

   Note that softupdates can delay the freeing of disk space; you might need
   to wait up to 30 seconds for the change to be visible!

   This situation is common on web servers. Many people set up a FreeBSD web
   server and forget to rotate the log files. The access log fills up /var.
   The new administrator deletes the file, but the system still complains
   that the partition is full. Stopping and restarting the web server program
   would free the file, allowing the system to release the disk space. To
   prevent this from happening, set up newsyslog(8).

   9.24. How can I add more swap space?

   In the Configuration and Tuning section of the Handbook, you will find a
   section describing how to do this.

   9.25. How is it possible for a partition to be more than 100% full?

   A portion of each UFS partition (8%, by default) is reserved for use by
   the operating system and the root user. df(1) does not count that space
   when calculating the Capacity column, so it can exceed 100%. Also, you'll
   notice that the Blocks column is always greater than the sum of the Used
   and Avail columns, usually by a factor of 8%.

   For more details, look up the -m option in tunefs(8).

     ----------------------------------------------------------------------

                        Chapter 10 System Administration

   10.1. Where are the system start-up configuration files?

   10.2. How do I add a user easily?

   10.3. Why do I keep getting messages like ``root: not found'' after
   editing my crontab file?

   10.4. Why do I get the error, ``you are not in the correct group to su
   root'' when I try to su to root?

   10.5. I made a mistake in rc.conf, or another startup file, and now I
   cannot edit it because the filesystem is read-only. What should I do?

   10.6. Why am I having trouble setting up my printer?

   10.7. How can I correct the keyboard mappings for my system?

   10.8. Why do I get messages like: ``unknown: <PNP0303> can't assign
   resources'' on boot?

   10.9. Why can I not get user quotas to work properly?

   10.10. Does FreeBSD support System V IPC primitives?

   10.11. How do I use sendmail for mail delivery with UUCP?

   10.12. How do I set up mail with a dialup connection to the 'net?

   10.13. What other mail-server software can I use, instead of Sendmail?

   10.14. I have forgotten the root password! What do I do?

   10.15. How do I keep Control+Alt+Delete from rebooting the system?

   10.16. How do I reformat DOS text files to Unix ones?

   10.17. How do I kill processes by name?

   10.18. Why is su bugging me about not being in root's ACL?

   10.19. How do I uninstall Kerberos?

   10.20. How do I add pseudoterminals to the system?

   10.21. Why can I not create the snd0 device?

   10.22. How do I re-read /etc/rc.conf and re-start /etc/rc without a
   reboot?

   10.23. What is a sandbox?

   10.24. What is securelevel?

   10.25. I tried to update my system to the latest -STABLE, but got -RC or
   -PRERELEASE! What is going on?

   10.26. I tried to install a new kernel, and the chflags failed. How do I
   get around this?

   10.27. I cannot change the time on my system by more than one second! How
   do I get around this?

   10.28. Why is rpc.statd using 256 megabytes of memory?

   10.29. Why can I not unset the schg file flag?

   10.30. Why does SSH authentication through .shosts not work by default in
   recent versions of FreeBSD?

   10.31. What is vnlru?

   10.1. Where are the system start-up configuration files?

   From 2.0.5R to 2.2.1R, the primary configuration file is /etc/sysconfig.
   All the options are to be specified in this file and other files such as
   /etc/rc (see rc(8)) and /etc/netstart just include it.

   Look in the /etc/sysconfig file and change the value to match your system.
   This file is filled with comments to show what to put in there.

   In post-2.2.1 and 3.0, /etc/sysconfig was renamed to a more
   self-describing rc.conf(5) file and the syntax cleaned up a bit in the
   process. /etc/netstart was also renamed to /etc/rc.network so that all
   files could be copied with a cp /usr/src/etc/rc* /etc command.

   And, in 3.1 and later, /etc/rc.conf has been moved to
   /etc/defaults/rc.conf. Do not edit this file! Instead, if there is any
   entry in /etc/defaults/rc.conf that you want to change, you should copy
   the line into /etc/rc.conf and change it there.

   For example, if you wish to start named, the DNS server included with
   FreeBSD in FreeBSD 3.1 or later, all you need to do is:

     # echo named_enable="YES" >> /etc/rc.conf

   To start up local services in FreeBSD 3.1 or later, place shell scripts in
   the /usr/local/etc/rc.d directory. These shell scripts should be set
   executable, and end with a .sh. In FreeBSD 3.0 and earlier releases, you
   should edit the /etc/rc.local file.

   The /etc/rc.serial is for serial port initialization (e.g. locking the
   port characteristics, and so on.).

   The /etc/rc.i386 is for Intel-specifics settings, such as iBCS2 emulation
   or the PC system console configuration.

   10.2. How do I add a user easily?

   Use the adduser(8) command. For more complicated usage, the pw(8) command.

   To remove the user again, use the rmuser(8) command. Once again, pw(8)
   will work as well.

   10.3. Why do I keep getting messages like ``root: not found'' after
   editing my crontab file?

   This is normally caused by editing the system crontab (/etc/crontab) and
   then using crontab(1) to install it:

     # crontab /etc/crontab

   This is not the correct way to do things. The system crontab has a
   different format to the per-user crontabs which crontab(1) updates (the
   crontab(5) manual page explains the differences in more detail).

   If this is what you did, the extra crontab is simply a copy of
   /etc/crontab in the wrong format it. Delete it with the command:

     # crontab -r

   Next time, when you edit /etc/crontab, you should not do anything to
   inform cron(8) of the changes, since it will notice them automatically.

   If you want something to be run once per day, week, or month, it is
   probably better to add shell scripts /usr/local/etc/periodic, and let the
   periodic(8) command run from the system cron schedule it with the other
   periodic system tasks.

   The actual reason for the error is that the system crontab has an extra
   field, specifying which user to run the command as. In the default system
   crontab provided with FreeBSD, this is root for all entries. When this
   crontab is used as the root user's crontab (which is not the same as the
   system crontab), cron(8) assumes the string root is the first word of the
   command to execute, but no such command exists.

   10.4. Why do I get the error, ``you are not in the correct group to su
   root'' when I try to su to root?

   This is a security feature. In order to su to root (or any other account
   with superuser privileges), you must be in the wheel group. If this
   feature were not there, anybody with an account on a system who also found
   out root's password would be able to gain superuser level access to the
   system. With this feature, this is not strictly true; su(1) will prevent
   them from even trying to enter the password if they are not in wheel.

   To allow someone to su to root, simply put them in the wheel group.

   10.5. I made a mistake in rc.conf, or another startup file, and now I
   cannot edit it because the filesystem is read-only. What should I do?

   When you get the prompt to enter the shell pathname, simply press ENTER,
   and run mount / to re-mount the root filesystem in read/write mode. You
   may also need to run mount -a -t ufs to mount the filesystem where your
   favourite editor is defined. If your favourite editor is on a network
   filesystem, you will need to either configure the network manually before
   you can mount network filesystems, or use an editor which resides on a
   local filesystem, such as ed(1).

   If you intend to use a full screen editor such as vi(1) or emacs(1), you
   may also need to run export TERM=cons25 so that these editors can load the
   correct data from the termcap(5) database.

   Once you have performed these steps, you can edit /etc/rc.conf as you
   usually would to fix the syntax error. The error message displayed
   immediately after the kernel boot messages should tell you the number of
   the line in the file which is at fault.

   10.6. Why am I having trouble setting up my printer?

   Please have a look at the Handbook entry on printing. It should cover most
   of your problem. See the Handbook entry on printing.

   Some printers require a host-based driver to do any kind of printing.
   These so-called ``WinPrinters'' are not natively supported by FreeBSD. If
   your printer does not work in DOS or Windows NT 4.0, it is probably a
   WinPrinter. Your only hope of getting one of these to work is to check if
   the print/pnm2ppa port supports it.

   10.7. How can I correct the keyboard mappings for my system?

   Please see the Handbook section on using localization, specifically the
   section on console setup.

   10.8. Why do I get messages like: ``unknown: <PNP0303> can't assign
   resources'' on boot?

   The following is an excerpt from a post to the freebsd-current mailing
   list.

     The ``can't assign resources'' messages indicate that the devices are    
     legacy ISA devices for which a non-PnP-aware driver is compiled into   
     the kernel. These include devices such as keyboard controllers, the    
     programmable interrupt controller chip, and several other bits of      
     standard infrastructure. The resources cannot be assigned because      
     there is already a driver using those addresses.                       
                     --Garrett Wollman <wollman@FreeBSD.org>, 24 April 2001   

   10.9. Why can I not get user quotas to work properly?

   * Do not turn on quotas on /,

   * Put the quota file on the filesystem that the quotas are to be enforced
     on. ie:

     Filesystem Quota file         
     /usr       /usr/admin/quotas  
     /home      /home/admin/quotas 
     ...        ...                

   10.10. Does FreeBSD support System V IPC primitives?

   Yes, FreeBSD supports System V-style IPC. This includes shared memory,
   messages and semaphores. You need to add the following lines to your
   kernel config to enable them.

     options    SYSVSHM          # enable shared memory
     options    SYSVSEM          # enable for semaphores
     options    SYSVMSG          # enable for messaging

     Note: In FreeBSD 3.2 and later, these options are already part of the
     GENERIC kernel, which means they should already be compiled into your
     system.

   Recompile and install your kernel.

   10.11. How do I use sendmail for mail delivery with UUCP?

   The sendmail configuration that ships with FreeBSD is suited for sites
   that connect directly to the Internet. Sites that wish to exchange their
   mail via UUCP must install another sendmail configuration file.

   Tweaking /etc/mail/sendmail.cf manually is considered something for
   purists. Sendmail version 8 comes with a new approach of generating config
   files via some m4(1) preprocessing, where the actual hand-crafted
   configuration is on a higher abstraction level. You should use the
   configuration files under /usr/src/usr.sbin/sendmail/cf.

   If you did not install your system with full sources, the sendmail config
   stuff has been broken out into a separate source distribution tarball just
   for you. Assuming you have got your CDROM mounted, do:

     # cd /cdrom/src
     # cat scontrib.?? | tar xzf - -C /usr/src contrib/sendmail

   Do not panic, this is only a few hundred kilobytes in size. The file
   README in the cf directory can serve as a basic introduction to m4
   configuration.

   For UUCP delivery, you are best advised to use the mailertable feature.
   This constitutes a database that sendmail can use to base its routing
   decision upon.

   First, you have to create your .mc file. The directory
   /usr/src/usr.sbin/sendmail/cf/cf is the home of these files. Look around,
   there are already 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

   A typical .mc file might look like:

     VERSIONID(`Your version number')
     OSTYPE(bsd4.4)
    
     FEATURE(accept_unresolvable_domains)
     FEATURE(nocanonify)
     FEATURE(mailertable, `hash -o /etc/mail/mailertable')
    
     define(`UUCP_RELAY', your.uucp.relay)
     define(`UUCP_MAX_SIZE', 200000)
     define(`confDONT_PROBE_INTERFACES')
    
     MAILER(local)
     MAILER(smtp)
     MAILER(uucp)
    
     Cw    your.alias.host.name
     Cw    youruucpnodename.UUCP

   The lines containing accept_unresolvable_domains, nocanonify, and
   confDONT_PROBE_INTERFACES features will prevent any usage of the DNS
   during mail delivery. The UUCP_RELAY clause is needed for bizarre reasons,
   do not ask. Simply put an Internet hostname there that is able to handle
   .UUCP pseudo-domain addresses; most likely, you will enter the mail relay
   of your ISP there.

   Once you have got this, you need this file called /etc/mail/mailertable.
   If you have only one link to the outside that is used for all your mails,
   the following file will be enough:

     #
     # makemap hash /etc/mail/mailertable.db < /etc/mail/mailertable
     .                             uucp-dom:your.uucp.relay

   A more complex example might look like this:

     #
     # makemap hash /etc/mail/mailertable.db < /etc/mail/mailertable
     #
     horus.interface-business.de   uucp-dom:horus
     .interface-business.de        uucp-dom:if-bus
     interface-business.de         uucp-dom:if-bus
     .heep.sax.de                  smtp8:%1
     horus.UUCP                    uucp-dom:horus
     if-bus.UUCP                   uucp-dom:if-bus
     .                             uucp-dom:

   As you can see, this is part of a real-life file. 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 being usable, 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 mail routing. The last line tells you the used internal mail
   agent, the destination host this agent will be called with, and the
   (possibly translated) address. Leave this mode by typing Control-D.

     % sendmail -bt
     ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
     Enter <ruleset> <address>
     > 3,0 foo@example.com
     canonify           input: foo @ example . com
     ...
     parse            returns: $# uucp-dom $@ your.uucp.relay $: foo < @ example . com . >
     > ^D

   10.12. How do I set up mail with a dialup connection to the 'net?

   If you have got a statically assigned IP number, you should not need to
   adjust anything from the default. Set your host name up as your assigned
   Internet name and sendmail will do the rest.

   If you have got a dynamically assigned IP number and use a dialup PPP
   connection to the Internet, you will probably be given a mailbox on your
   ISPs mail server. Lets assume your ISPs domain is example.net, and that
   your user name is user. Lets also assume you have called your machine
   bsd.home and that your ISP has told you that you may use relay.example.net
   as a mail relay.

   In order to retrieve mail from your mailbox, you will need to install a
   retrieval agent. Fetchmail is a good choice as it supports many different
   protocols. Usually, POP3 will be provided by your ISP. If you have chosen
   to use user-PPP, you can automatically fetch your mail when a connection
   to the 'net is established with the following entry in
   /etc/ppp/ppp.linkup:

     MYADDR:
       !bg su user -c fetchmail

   If you are using sendmail (as shown below) to deliver mail to non-local
   accounts, put the command

       !bg su user -c "sendmail -q"

   after the above shown entry. This forces sendmail to process your
   mailqueue as soon as the connection to the 'net is established.

   I am assuming 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
     MAILER(local)dnl
     MAILER(smtp)dnl
     Cwlocalhost
     Cwbsd.home
     MASQUERADE_AS(`example.net')dnl
     FEATURE(allmasquerade)dnl
     FEATURE(masquerade_envelope)dnl
     FEATURE(nocanonify)dnl
     FEATURE(nodns)dnl
     define(`SMART_HOST', `relay.example.net')
     Dmbsd.home
     define(`confDOMAIN_NAME',`bsd.home')dnl
     define(`confDELIVERY_MODE',`deferred')dnl

   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.

   10.13. What other mail-server software can I use, instead of Sendmail?

   Sendmail is the default mail-server software for FreeBSD, but you can
   easily replace it with one of the other MTA (for instance, an MTA
   installed from the ports).

   There are various alternative MTA's in the ports tree already, with
   mail/exim, mail/postfix, mail/qmail, mail/zmailer, being some of the most
   popular choices.

   Diversity is nice, and the fact that you have many different mail-servers
   to chose from is considered a good thing; therefore try to avoid asking
   questions like ``Is Sendmail better than Qmail?'' in the mailing lists. If
   you do feel like asking, first check the mailing list archives. The
   advantages and disadvantages of each and every one of the available MTA's
   have already been discussed a few times.

   10.14. I have forgotten the root password! What do I do?

   Do not Panic! Simply restart the system, type boot -s at the Boot: prompt
   (just -s for FreeBSD releases before 3.2) to enter Single User mode. At
   the question about the shell to use, hit ENTER. You will be dropped to a #
   prompt. Enter mount -u / to remount your root filesystem read/write, then
   run mount -a to remount all the filesystems. Run passwd root to change the
   root password then run exit(1) to continue booting.

   10.15. How do I keep Control+Alt+Delete from rebooting the system?

   If you are using syscons (the default console driver) in FreeBSD
   2.2.7-RELEASE or later, build and install a new kernel with the line

     options SC_DISABLE_REBOOT

   in the configuration file. If you use the PCVT console driver in FreeBSD
   2.2.5-RELEASE or later, use the following kernel configuration line
   instead:

     options PCVT_CTRL_ALT_DEL

   For older versions of FreeBSD, edit the keymap you are using for the
   console and replace the boot keywords with nop. The default keymap is
   /usr/share/syscons/keymaps/us.iso.kbd. You may have to instruct
   /etc/rc.conf to load this keymap explicitly for the change to take effect.
   Of course if you are using an alternate keymap for your country, you
   should edit that one instead.

   10.16. How do I reformat DOS text files to Unix ones?

   Simply use this perl command:

     % perl -i.bak -npe 's/\r\n/\n/g' file ...

   file is the file(s) to process. The modification is done in-place, with
   the original file stored with a .bak extension.

   Alternatively you can use the tr(1) command:

     % tr -d '\r' < dos-text-file > unix-file

   dos-text-file is the file containing DOS text while unix-file will contain
   the converted output. This can be quite a bit faster than using perl.

   10.17. How do I kill processes by name?

   Use killall(1).

   10.18. Why is su bugging me about not being in root's ACL?

   The error comes from the Kerberos distributed authentication system. The
   problem is not fatal but annoying. You can either run su with the -K
   option, or uninstall Kerberos as described in the next question.

   10.19. How do I uninstall Kerberos?

   To remove Kerberos from the system, reinstall the bin distribution for the
   release you are running. If you have the CDROM, you can mount the cd (we
   will assume on /cdrom) and run

     # cd /cdrom/bin
     # ./install.sh

   Alternately, you can remove all "MAKE_KERBEROS" options from
   /etc/make.conf and rebuild world.

   10.20. How do I add pseudoterminals to the system?

   If you have lots of telnet, ssh, X, or screen users, you will probably run
   out of pseudoterminals. Here is how to add more:

    1. Build and install a new kernel with the line

     pseudo-device pty 256

       in the configuration file.

    2. Run the commands

     # cd /dev
     # sh MAKEDEV pty{1,2,3,4,5,6,7}

       to make 256 device nodes for the new terminals.

    3. Edit /etc/ttys and add lines for each of the 256 terminals. They
       should match the form of the existing entries, i.e. they look like

     ttyqc none network

       The order of the letter designations is tty[pqrsPQRS][0-9a-v], using a
       regular expression.

    4. Reboot the system with the new kernel and you are ready to go.

   10.21. Why can I not create the snd0 device?

   There is no snd device. The name is used as a shorthand for the various
   devices that make up the FreeBSD sound driver, such as mixer, sequencer,
   and dsp.

   To create these devices you should

     # cd /dev
     # sh MAKEDEV snd0

   10.22. How do I re-read /etc/rc.conf and re-start /etc/rc without a
   reboot?

   Go into single user mode and then back to multi user mode.

   On the console do:

     # shutdown now
     (Note: without -r or -h)
    
     # return
     # exit

   10.23. What is a sandbox?

   ``Sandbox'' is a security term. It can mean two things:

     * A process which is placed inside a set of virtual walls that are
       designed to prevent someone who breaks into the process from being
       able to break into the wider system.

       The process is said to be able to ``play'' inside the walls. That is,
       nothing the process does in regards to executing code is supposed to
       be able to breech the walls so you do not have to do a detailed audit
       of its code to be able to say certain things about its security.

       The walls might be a userid, for example. This is the definition used
       in the security and named man pages.

       Take the ntalk service, for example (see /etc/inetd.conf). This
       service used to run as userid root. Now it runs as userid tty. The tty
       user is a sandbox designed to make it more difficult for someone who
       has successfully hacked into the system via ntalk from being able to
       hack beyond that user id.

     * A process which is placed inside a simulation of the machine. This is
       more hard-core. Basically it means that someone who is able to break
       into the process may believe that he can break into the wider machine
       but is, in fact, only breaking into a simulation of that machine and
       not modifying any real data.

       The most common way to accomplish this is to build a simulated
       environment in a subdirectory and then run the processes in that
       directory chroot'd (i.e. / for that process is this directory, not the
       real / of the system).

       Another common use is to mount an underlying filesystem read-only and
       then create a filesystem layer on top of it that gives a process a
       seemingly writeable view into that filesystem. The process may believe
       it is able to write to those files, but only the process sees the
       effects - other processes in the system do not, necessarily.

       An attempt is made to make this sort of sandbox so transparent that
       the user (or hacker) does not realize that he is sitting in it.

   Unix implements two core sandboxes. One is at the process level, and one
   is at the userid level.

   Every Unix process is completely firewalled off from every other Unix
   process. One process cannot modify the address space of another. This is
   unlike Windows where a process can easily overwrite the address space of
   any other, leading to a crash.

   A Unix process is owned by a particular userid. If the userid is not the
   root user, it serves to firewall the process off from processes owned by
   other users. The userid is also used to firewall off on-disk data.

   10.24. What is securelevel?

   The securelevel is a security mechanism implemented in the kernel.
   Basically, when the securelevel is positive, the kernel restricts certain
   tasks; not even the superuser (i.e., root) is allowed to do them. At the
   time of this writing, the securelevel mechanism is capable of, among other
   things, limiting the ability to,

     * unset certain file flags, such as schg (the system immutable flag),

     * write to kernel memory via /dev/mem and /dev/kmem,

     * load kernel modules, and

     * alter ipfirewall(4) rules.

   To check the status of the securelevel on a running system, simply execute
   the following command:

     # sysctl kern.securelevel

   The output will contain the name of the sysctl(8) variable (in this case,
   kern.securelevel) and a number. The latter is the current value of the
   securelevel. If it is positive (i.e., greater than 0), at least some of
   the securelevel's protections are enabled.

   You cannot lower the securelevel of a running system; being able to do
   that would defeat its purpose. If you need to do a task that requires that
   the securelevel be non-positive (e.g., an installworld or changing the
   date), you will have to change the securelevel setting in /etc/rc.conf
   (you want to look for the kern_securelevel and kern_securelevel_enable
   variables) and reboot.

   For more information on securelevel and the specific things all the levels
   do, please consult the init(8) manual page.

     Warning: Securelevel is not a silver bullet; it has many known
     deficiencies. More often than not, it provides a false sense of
     security.

     One of its biggest problems is that in order for it to be at all
     effective, all files used in the boot process up until the securelevel
     is set must be protected. If an attacker can get the system to execute
     their code prior to the securelevel being set (which happens quite late
     in the boot process since some things the system must do at start-up
     cannot be done at an elevated securelevel), its protections are
     invalidated. While this task of protecting all files used in the boot
     process is not technically impossible, if it is achieved, system
     maintenance will become a nightmare since one would have to take the
     system down, at least to single-user mode, to modify a configuration
     file.

     This point and others are often discussed on the mailing lists,
     particularly freebsd-security. Please search the archives here for an
     extensive discussion. Some people are hopeful that securelevel will soon
     go away in favor of a more fine-grained mechanism, but things are still
     hazy in this respect.

     Consider yourself warned.

   10.25. I tried to update my system to the latest -STABLE, but got -RC or
   -PRERELEASE! What is going on?

   Short answer: it is just a name. RC stands for ``Release Candidate''. It
   signifies that a release is imminent. In FreeBSD, -PRERELEASE is typically
   synonymous with the code freeze before a release. (For some releases, the
   -BETA label was used in the same way as -PRERELEASE.)

   Long answer: FreeBSD derives its releases from one of two places. Major,
   dot-zero, releases, such as 3.0-RELEASE and 4.0-RELEASE, are branched from
   the head of the development stream, commonly referred to as -CURRENT.
   Minor releases, such as 3.1-RELEASE or 4.2-RELEASE, have been snapshots of
   the active -STABLE branch. Starting with 4.3-RELEASE, each release also
   now has its own branch which can be tracked by people requiring an
   extremely conservative rate of development (typically only security
   advisories).

   When a release is about to be made, the branch from which it will be
   derived from has to undergo a certain process. Part of this process is a
   code freeze. When a code freeze is initiated, the name of the branch is
   changed to reflect that it is about to become a release. For example, if
   the branch used to be called 4.5-STABLE, its name will be changed to
   4.6-PRERELEASE to signify the code freeze and signify that extra
   pre-release testing should be happening. Bug fixes can still be committed
   to be part of the release. When the source code is in shape for the
   release the name will be changed to 4.6-RC to signify that a release is
   about to be made from it. Once in the RC stage, only the most critical
   bugs found can be fixed. Once the release (4.6-RELEASE in this example)
   and release branch have been made, the branch will be renamed to
   4.6-STABLE.

   For more information on version numbers and the various CVS branches,
   refer to the Release Engineering article.

   10.26. I tried to install a new kernel, and the chflags failed. How do I
   get around this?

   Short answer: You are probably at security level greater than 0. Reboot
   directly to single user mode to install the kernel.

   Long answer: FreeBSD disallows changing system flags at security levels
   greater than 0. You can check your security level with the command:

     # sysctl kern.securelevel

   You cannot lower the security level; you have to boot to single mode to
   install the kernel, or change the security level in /etc/rc.conf then
   reboot. See the init(8) manual page for details on securelevel, and see
   /etc/defaults/rc.conf and the rc.conf(5) manual page for more information
   on rc.conf.

   10.27. I cannot change the time on my system by more than one second! How
   do I get around this?

   Short answer: You are probably at security level greater than 1. Reboot
   directly to single user mode to change the date.

   Long answer: FreeBSD disallows changing the time by more that one second
   at security levels greater than 1. You can check your security level with
   the command:

     # sysctl kern.securelevel

   You cannot lower the security level; you have to boot to single mode to
   change the date, or change the security level in /etc/rc.conf then reboot.
   See the init(8) manual page for details on securelevel, and see
   /etc/defaults/rc.conf and the rc.conf(5) manual page for more information
   on rc.conf.

   10.28. Why is rpc.statd using 256 megabytes of memory?

   No, there is no memory leak, and it is not using 256 Mbytes of memory. It
   simply likes to (i.e., always does) map an obscene amount of memory into
   its address space for convenience. There is nothing terribly wrong with
   this from a technical standpoint; it just throws off things like top(1)
   and ps(1).

   rpc.statd(8) maps its status file (resident on /var) into its address
   space; to save worrying about remapping it later when it needs to grow, it
   maps it with a generous size. This is very evident from the source code,
   where one can see that the length argument to mmap(2) is 0x10000000, or
   one sixteenth of the address space on an IA32, or exactly 256MB.

   10.29. Why can I not unset the schg file flag?

   You are running at an elevated (i.e., greater than 0) securelevel. Lower
   the securelevel and try again. For more information, see the FAQ entry on
   securelevel and the init(8) manual page.

   10.30. Why does SSH authentication through .shosts not work by default in
   recent versions of FreeBSD?

   The reason why .shosts authentication does not work by default in more
   recent versions of FreeBSD is because ssh(1) is not installed suid root by
   default. To ``fix'' this, you can do one of the following:

     * As a permanent fix, set ENABLE_SUID_SSH to true in /etc/make.conf and
       rebuild ssh (or run make world).

     * As a temporary fix, change the mode on /usr/bin/ssh to 4555 by running
       chmod 4755 /usr/bin/ssh as root. Then add ENABLE_SUID_SSH= true to
       /etc/make.conf so the change takes effect the next time make world is
       run.

   10.31. What is vnlru?

   vnlru flushes and frees vnodes when the system hits the kern.maxvnodes
   limit. This kernel thread sits mostly idle, and only activates if you have
   a huge amount of RAM and are accessing tens of thousands of tiny files.

     ----------------------------------------------------------------------

              Chapter 11 The X Window System and Virtual Consoles

   11.1. I want to run X, how do I go about it?

   11.2. I tried to run X, but I get an ``KDENABIO failed (Operation not
   permitted)'' error when I type startx. What do I do now?

   11.3. Why does my mouse not work with X?

   11.4. My mouse has a fancy wheel. Can I use it in X?

   11.5. Why do X Window menus and dialog boxes not work right?

   11.6. What is a virtual console and how do I make more?

   11.7. How do I access the virtual consoles from X?

   11.8. How do I start XDM on boot?

   11.9. Why do I get ``Couldn't open console'' when I run xconsole?

   11.10. Before, I was able to run XFree86 as a regular user. Why does it
   now say that I must be root?

   11.11. Why does my PS/2 mouse misbehave under X?

   11.12. Why does my PS/2 mouse from MouseSystems not work?

   11.13. When building an X app, imake cannot find Imake.tmpl. Where is it?

   11.14. An X app I am building depends on XFree86 3.3.X, but I have XFree86
   4.X installed. What should I do?

   11.15. How do I reverse the mouse buttons?

   11.16. How do I install a splash screen and where do I find them?

   11.17. Can I use the Windows(R) keys on my keyboard in X?

   11.18. How can I get 3D hardware acceleration for OpenGL?

   11.1. I want to run X, how do I go about it?

   The easiest way is to simply specify that you want to run X during the
   installation process.

   Then read and follow the documentation on the xf86config tool, which
   assists you in configuring XFree86 for your particular graphics
   card/mouse/etc.

   You may also wish to investigate the Xaccel server. See the section on Xi
   Graphics or Metro Link for more details.

   11.2. I tried to run X, but I get an ``KDENABIO failed (Operation not
   permitted)'' error when I type startx. What do I do now?

   Your system is running at a raised securelevel, is not it? It is, indeed,
   impossible to start X at a raised securelevel. To see why, look at the
   init(8) man page.

   So the question is what else you should do instead, and you basically have
   two choices: set your securelevel back down to zero (usually from
   /etc/rc.conf), or run xdm(1) at boot time (before the securelevel is
   raised).

   See Q: 11.8. for more information about running xdm(1) at boot time.

   11.3. Why does my mouse not work with X?

   If you are using syscons (the default console driver), you can configure
   FreeBSD to support a mouse pointer on each virtual screen. In order to
   avoid conflicting with X, syscons supports a virtual device called
   /dev/sysmouse. All mouse events received from the real mouse device are
   written to the sysmouse device via moused. If you wish to use your mouse
   on one or more virtual consoles, and use X, see Q: 4.13. and set up
   moused.

   Then edit /etc/XF86Config and make sure you have the following lines.

     Section         Pointer
     Protocol        "SysMouse"
     Device          "/dev/sysmouse"
     .....

   The above example is for XFree86 3.3.2 or later. For earlier versions, the
   Protocol should be MouseSystems.

   Some people prefer to use /dev/mouse under X. To make this work,
   /dev/mouse should be linked to /dev/sysmouse (see sysmouse(4)):

     # cd /dev
     # rm -f mouse
     # ln -s sysmouse mouse

   11.4. My mouse has a fancy wheel. Can I use it in X?

   Yes. But you need to customize X client programs. See Colas Nahaboo's web
   page (http://www.inria.fr/koala/colas/mouse-wheel-scroll/) .

   If you want to use the imwheel program, just follow these simple steps.

    1. Translate the Wheel Events

       The imwheel program works by translating mouse button 4 and mouse
       button 5 events into key events. Thus, you have to get the mouse
       driver to translate mouse wheel events to button 4 and 5 events. There
       are two ways of doing this, the first way is to have moused(8) do the
       translation. The second way is for the X server itself to do the event
       translation.

         a. Using moused(8) to Translate Wheel Events

            To have moused(8) perform the event translations, simply add -z 4
            to the command line used to start moused(8). For example, if you
            normally start moused(8) via moused -p /dev/psm0 you would start
            it by entering moused -p /dev/psm0 -z 4 instead. If you start
            moused(8) automatically during bootup via /etc/rc.conf, you can
            simply add -z 4 to the moused_flags variable in /etc/rc.conf.

            You now need to tell X that you have a 5 button mouse. To do
            this, simply add the line Buttons 5 to the ``Pointer'' section of
            /etc/XF86Config. For example, you might have the following
            ``Pointer'' section in /etc/XF86Config.

            Example 11-1. ``Pointer'' Section for Wheeled Mouse in XFree86
            3.3.x series XF86Config with moused Translation

     Section "Pointer"
        Protocol        "SysMouse"
        Device          "/dev/sysmouse"
        Buttons         5
     EndSection

            Example 11-2. ``InputDevice'' Section for Wheeled Mouse in
            XFree86 4.x series XF86Config with X Server Translation

     Section "InputDevice"
        Identifier      "Mouse1"
        Driver          "mouse"
        Option          "Protocol" "auto"
        Option          "Device" "/dev/sysmouse"
        Option          "Buttons" "5"
     EndSection

            Example 11-3. ``.emacs'' example for naive page scrolling with
            Wheeled Mouse

     ;; wheel mouse
     (global-set-key [mouse-4] 'scroll-down)
     (global-set-key [mouse-5] 'scroll-up)

         b. Using Your X Server to Translate the Wheel Events

            If you are not running moused(8), or if you do not want moused(8)
            to translate your wheel events, you can have the X server do the
            event translation instead. This requires a couple of
            modifications to your /etc/XF86Config file. First, you need to
            choose the proper protocol for your mouse. Most wheeled mice use
            the ``IntelliMouse'' protocol. However, XFree86 does support
            other protocols, such as ``MouseManPlusPS/2'' for the Logitech
            MouseMan+ mice. Once you have chosen the protocol you will use,
            you need to add a Protocol line to the ``Pointer'' section.

            Secondly, you need to tell the X server to remap wheel scroll
            events to mouse buttons 4 and 5. This is done with the
            ZAxisMapping option.

            For example, if you are not using moused(8), and you have an
            IntelliMouse attached to the PS/2 mouse port you would use the
            following in /etc/XF86Config.

            Example 11-4. ``Pointer'' Section for Wheeled Mouse in XF86Config
            with X Server Translation

     Section "Pointer"
        Protocol        "IntelliMouse"
        Device          "/dev/psm0"
        ZAxisMapping    4 5
     EndSection

            Example 11-5. ``InputDevice'' Section for Wheeled Mouse in
            XFree86 4.x series XF86Config with X Server Translation

     Section "InputDevice"
        Identifier      "Mouse1"
        Driver          "mouse"
        Option          "Protocol" "auto"
        Option          "Device" "/dev/psm0"
        Option          "ZAxisMapping" "4 5"
     EndSection

            Example 11-6. ``.emacs'' example for naive page scrolling with
            Wheeled Mouse

     ;; wheel mouse
     (global-set-key [mouse-4] 'scroll-down)
     (global-set-key [mouse-5] 'scroll-up)

    2. Install imwheel

       Next, install imwheel from the Ports collection. It can be found in
       the x11 category. This program will map the wheel events from your
       mouse into keyboard events. For example, it might send Page Up to a
       program when you scroll the wheel forwards. Imwheel uses a
       configuration file to map the wheel events to key presses so that it
       can send different keys to different applications. The default imwheel
       configuration file is installed in /usr/X11R6/etc/imwheelrc. You can
       copy it to ~/.imwheelrc and then edit it if you wish to customize
       imwheel's configuration. The format of the configuration file is
       documented in imwheel(1).

    3. Configure Emacs to Work with Imwheel (optional)

       If you use emacs or Xemacs, then you need to add a small section to
       your ~/.emacs file. For emacs, add the following:

       Example 11-7. Emacs Configuration for Imwheel

     ;;; For imwheel
     (setq imwheel-scroll-interval 3)
     (defun imwheel-scroll-down-some-lines ()
       (interactive)
       (scroll-down imwheel-scroll-interval))
     (defun imwheel-scroll-up-some-lines ()
       (interactive)
       (scroll-up imwheel-scroll-interval))
     (global-set-key [?\M-\C-\)] 'imwheel-scroll-up-some-lines)
     (global-set-key [?\M-\C-\(] 'imwheel-scroll-down-some-lines)
     ;;; end imwheel section

       For Xemacs, add the following to your ~/.emacs file instead:

       Example 11-8. Xemacs Configuration for Imwheel

     ;;; For imwheel
     (setq imwheel-scroll-interval 3)
     (defun imwheel-scroll-down-some-lines ()
       (interactive)
       (scroll-down imwheel-scroll-interval))
     (defun imwheel-scroll-up-some-lines ()
       (interactive)
       (scroll-up imwheel-scroll-interval))
     (define-key global-map [(control meta \))] 'imwheel-scroll-up-some-lines)
     (define-key global-map [(control meta \()] 'imwheel-scroll-down-some-lines)
     ;;; end imwheel section

    4. Run Imwheel

       You can just type imwheel in an xterm to start it up once it is
       installed. It will background itself and take effect immediately. If
       you want to always use imwheel, simply add it to your .xinitrc or
       .xsession file. You can safely ignore any warnings imwheel displays
       about PID files. Those warnings only apply to the Linux version of
       imwheel.

   11.5. Why do X Window menus and dialog boxes not work right?

   Try turning off the Num Lock key.

   If your Num Lock key is on by default at boot-time, you may add the
   following line in the Keyboard section of the XF86Config file.

     # Let the server do the NumLock processing.  This should only be
     # required when using pre-R6 clients
         ServerNumLock

   11.6. What is a virtual console and how do I make more?

   Virtual consoles, put simply, enable you to have several simultaneous
   sessions on the same machine without doing anything complicated like
   setting up a network or running X.

   When the system starts, it will display a login prompt on the monitor
   after displaying all the boot messages. You can then type in your login
   name and password and start working (or playing!) on the first virtual
   console.

   At some point, you will probably wish to start another session, perhaps to
   look at documentation for a program you are running or to read your mail
   while waiting for an FTP transfer to finish. Just do Alt+F2 (hold down the
   Alt key and press the F2 key), and you will find a login prompt waiting
   for you on the second ``virtual console''! When you want to go back to the
   original session, do Alt+F1.

   The default FreeBSD installation has three virtual consoles enabled (8
   starting with 3.3-RELEASE), and Alt+F1, Alt+F2, and Alt+F3 will switch
   between these virtual consoles.

   To enable more of them, edit /etc/ttys (see ttys(5)) and add entries for
   ttyv4 to ttyvc after the comment on ``Virtual terminals'':

     # Edit the existing entry for ttyv3 in /etc/ttys and change
     # "off" to "on".
     ttyv3   "/usr/libexec/getty Pc"         cons25  on secure
     ttyv4   "/usr/libexec/getty Pc"         cons25  on secure
     ttyv5   "/usr/libexec/getty Pc"         cons25  on secure
     ttyv6   "/usr/libexec/getty Pc"         cons25  on secure
     ttyv7   "/usr/libexec/getty Pc"         cons25  on secure
     ttyv8   "/usr/libexec/getty Pc"         cons25  on secure
     ttyv9   "/usr/libexec/getty Pc"         cons25  on secure
     ttyva   "/usr/libexec/getty Pc"         cons25  on secure
     ttyvb   "/usr/libexec/getty Pc"         cons25  on secure

   Use as many or as few as you want. The more virtual terminals you have,
   the more resources that are used; this can be important if you have 8MB
   RAM or less. You may also want to change the secure to insecure.

     Important: If you want to run an X server you must leave at least one
     virtual terminal unused (or turned off) for it to use. That is to say
     that if you want to have a login prompt pop up for all twelve of your
     Alt-function keys, you are out of luck - you can only do this for eleven
     of them if you also want to run an X server on the same machine.

   The easiest way to disable a console is by turning it off. For example, if
   you had the full 12 terminal allocation mentioned above and you wanted to
   run X, you would change settings for virtual terminal 12 from:

     ttyvb   "/usr/libexec/getty Pc"         cons25  on  secure

   to:

     ttyvb   "/usr/libexec/getty Pc"         cons25  off secure

   If your keyboard has only ten function keys, you would end up with:

     ttyv9   "/usr/libexec/getty Pc"         cons25  off secure
     ttyva   "/usr/libexec/getty Pc"         cons25  off secure
     ttyvb   "/usr/libexec/getty Pc"         cons25  off secure

   (You could also just delete these lines.)

   Once you have edited /etc/ttys, the next step is to make sure that you
   have enough virtual terminal devices. The easiest way to do this is:

     # cd /dev
     # sh MAKEDEV vty12

   Next, the easiest (and cleanest) way to activate the virtual consoles is
   to reboot. However, if you really do not want to reboot, you can just shut
   down the X Window system and execute (as root):

     # kill -HUP 1

   It is imperative that you completely shut down X Window if it is running,
   before running this command. If you do not, your system will probably
   appear to hang/lock up after executing the kill command.

   11.7. How do I access the virtual consoles from X?

   Use Ctrl+Alt+Fn to switch back to a virtual console. Ctrl+Alt+F1 would
   return you to the first virtual console.

   Once you are back to a text console, you can then use Alt+Fn as normal to
   move between them.

   To return to the X session, you must switch to the virtual console running
   X. If you invoked X from the command line, (e.g., using startx) then the X
   session will attach to the next unused virtual console, not the text
   console from which it was invoked. If you have eight active virtual
   terminals then X will be running on the ninth, and you would use Alt+F9 to
   return.

   11.8. How do I start XDM on boot?

   There are two schools of thought on how to start xdm. One school starts
   xdm from /etc/ttys (see ttys(5)) using the supplied example, while the
   other simply runs xdm from rc.local (see rc(8)) or from a X.sh script in
   /usr/local/etc/rc.d. Both are equally valid, and one may work in
   situations where the other does not. In both cases the result is the same:
   X will pop up a graphical login: prompt.

   The ttys method has the advantage of documenting which vty X will start on
   and passing the responsibility of restarting the X server on logout to
   init. The rc.local method makes it easy to kill xdm if there is a problem
   starting the X server.

   If loaded from rc.local, xdm should be started without any arguments
   (i.e., as a daemon). xdm must start AFTER getty runs, or else getty and
   xdm will conflict, locking out the console. The best way around this is to
   have the script sleep 10 seconds or so then launch xdm.

   If you are to start xdm from /etc/ttys, there still is a chance of
   conflict between xdm and getty(8). One way to avoid this is to add the vt
   number in the /usr/X11R6/lib/X11/xdm/Xservers file.

     :0 local /usr/X11R6/bin/X vt4

   The above example will direct the X server to run in /dev/ttyv3. Note the
   number is offset by one. The X server counts the vty from one, whereas the
   FreeBSD kernel numbers the vty from zero.

   11.9. Why do I get ``Couldn't open console'' when I run xconsole?

   If you start X with startx, the permissions on /dev/console will not get
   changed, resulting in things like xterm -C and xconsole not working.

   This is because of the way console permissions are set by default. On a
   multi-user system, one does not necessarily want just any user to be able
   to write on the system console. For users who are logging directly onto a
   machine with a VTY, the fbtab(5) file exists to solve such problems.

   In a nutshell, make sure an uncommented line of the form

     /dev/ttyv0 0600 /dev/console

   is in /etc/fbtab (see fbtab(5)) and it will ensure that whomever logs in
   on /dev/ttyv0 will own the console.

   11.10. Before, I was able to run XFree86 as a regular user. Why does it
   now say that I must be root?

   All X servers need to be run as root in order to get direct access to your
   video hardware. Older versions of XFree86 (<= 3.3.6) installed all bundled
   servers to be automatically run as root (setuid to root). This is
   obviously a security hazard because X servers are large, complicated
   programs. Newer versions of XFree86 do not install the servers setuid to
   root for just this reason.

   Obviously, running an X server as the root user is not acceptable, nor a
   good idea security-wise. There are two ways to be able to use X as a
   regular user. The first is to use xdm or another display manager (e.g.,
   kdm); the second is to use the Xwrapper.

   xdm is a daemon that handles graphical logins. It is usually started at
   boot time, and is responsible for authenticating users and starting their
   sessions; it is essentially the graphical counterpart of getty(8) and
   login(1). For more information on xdm see the XFree86 documentation, and
   the the FAQ entry on it.

   Xwrapper is the X server wrapper; it is a small utility to enable one to
   manually run an X server while maintaining reasonable safety. It performs
   some sanity checks on the command line arguments given, and if they pass,
   runs the appropriate X server. If you do not want to run a display manger
   for whatever reason, this is for you. If you have installed the complete
   ports collection, you can find the port in /usr/ports/x11/wrapper.

   11.11. Why does my PS/2 mouse misbehave under X?

   Your mouse and the mouse driver may have somewhat become out of
   synchronization.

   In versions 2.2.5 and earlier, switching away from X to a virtual terminal
   and getting back to X again may make them re-synchronized. If the problem
   occurs often, you may add the following option in your kernel
   configuration file and recompile it.

     options PSM_CHECKSYNC

   See the section on building a kernel if you have no experience with
   building kernels.

   With this option, there should be less chance of synchronization problem
   between the mouse and the driver. If, however, you still see the problem,
   click any mouse button while holding the mouse still to re-synchronize the
   mouse and the driver.

   Note that unfortunately this option may not work with all the systems and
   voids the ``tap'' feature of the ALPS GlidePoint device attached to the
   PS/2 mouse port.

   In versions 2.2.6 and later, synchronization check is done in a slightly
   better way and is standard in the PS/2 mouse driver. It should even work
   with GlidePoint. (As the check code has become a standard feature,
   PSM_CHECKSYNC option is not available in these versions.) However, in rare
   case the driver may erroneously report synchronization problem and you may
   see the kernel message:

     psmintr: out of sync (xxxx != yyyy)

   and find your mouse does not seem to work properly.

   If this happens, disable the synchronization check code by setting the
   driver flags for the PS/2 mouse driver to 0x100. Enter UserConfig by
   giving the -c option at the boot prompt:

     boot: -c

   Then, in the UserConfig command line, type:

     UserConfig> flags psm0 0x100
     UserConfig> quit

   11.12. Why does my PS/2 mouse from MouseSystems not work?

   There have been some reports that certain model of PS/2 mouse from
   MouseSystems works only if it is put into the ``high resolution'' mode.
   Otherwise, the mouse cursor may jump to the upper-left corner of the
   screen every so often.

   Unfortunately there is no workaround for versions 2.0.X and 2.1.X. In
   versions 2.2 through 2.2.5, apply the following patch to
   /sys/i386/isa/psm.c and rebuild the kernel. See the section on building a
   kernel if you have no experience with building kernels.

     @@ -766,6 +766,8 @@
          if (verbose >= 2)
              log(LOG_DEBUG, "psm%d: SET_DEFAULTS return code:%04x\n",
                  unit, i);
     +    set_mouse_resolution(sc->kbdc, PSMD_RES_HIGH);
     +
      #if 0
          set_mouse_scaling(sc->kbdc);        /* 1:1 scaling */
          set_mouse_mode(sc->kbdc);                /* stream mode */

   In versions 2.2.6 or later, specify the flags 0x04 to the PS/2 mouse
   driver to put the mouse into the high resolution mode. Enter UserConfig by
   giving the -c option at the boot prompt:

     boot: -c

   Then, in the UserConfig command line, type:

     UserConfig> flags psm0 0x04
     UserConfig> quit

   See the previous section for another possible cause of mouse problems.

   11.13. When building an X app, imake cannot find Imake.tmpl. Where is it?

   Imake.tmpl is part of the Imake package, a standard X application building
   tool. Imake.tmpl, as well as several header files that are required to
   build X apps, is contained in the X prog distribution. You can install
   this from sysinstall or manually from the X distribution files.

   11.14. An X app I am building depends on XFree86 3.3.X, but I have XFree86
   4.X installed. What should I do?

   To tell the port build to link to the XFree86 4.X libraries, add the
   following to /etc/make.conf, (if you do not have this file, create it):

     XFREE86_VERSION=        4

   11.15. How do I reverse the mouse buttons?

   Run the command xmodmap -e "pointer = 3 2 1" from your .xinitrc or
   .xsession.

   11.16. How do I install a splash screen and where do I find them?

   Just prior to the release of FreeBSD 3.1, a new feature was added to allow
   the display of ``splash'' screens during the boot messages. The splash
   screens currently must be a 256 color bitmap (*.BMP) or ZSoft PCX (*.PCX)
   file. In addition, they must have a resolution of 320x200 or less to work
   on standard VGA adapters. If you compile VESA support into your kernel,
   then you can use larger bitmaps up to 1024x768. The actual VESA support
   can either be compiled directly into the kernel with the VESA kernel
   config option or by loading the VESA kld module during bootup.

   To use a splash screen, you need to modify the startup files that control
   the boot process for FreeBSD. The files for this changed prior to the
   release of FreeBSD 3.2, so there are now two ways of loading a splash
   screen:

     * FreeBSD 3.1

       The first step is to find a bitmap version of your splash screen.
       Release 3.1 only supports Windows bitmap splash screens. Once you have
       found your splash screen of choice copy it to /boot/splash.bmp. Next,
       you need to have a /boot/loader.rc file that contains the following
       lines:

     load kernel
     load -t splash_image_data /boot/splash.bmp
     load splash_bmp
     autoboot

     * FreeBSD 3.2+

       In addition to adding support for PCX splash screens, FreeBSD 3.2
       includes a nicer way of configuring the boot process. If you wish, you
       can use the method listed above for FreeBSD 3.1. If you do and you
       want to use PCX, replace splash_bmp with splash_pcx. If, on the other
       hand, you want to use the newer boot configuration, you need to create
       a /boot/loader.rc file that contains the following lines:

     include /boot/loader.4th
     start

       and a /boot/loader.conf that contains the following:

     splash_bmp_load="YES"
     bitmap_load="YES"

       This assumes you are using /boot/splash.bmp for your splash screen. If
       you would rather use a PCX file, copy it to /boot/splash.pcx, create a
       /boot/loader.rc as instructed above, and create a /boot/loader.conf
       that contains:

     splash_pcx_load="YES"
     bitmap_load="YES"
     bitmap_name="/boot/splash.pcx"

   Now all you need is a splash screen. For that you can surf on over to the
   gallery at http://www.baldwin.cx/splash/.

   11.17. Can I use the Windows(R) keys on my keyboard in X?

   Yes. All you need to do is use xmodmap(1) to define what function you wish
   them to perform.

   Assuming all ``Windows(R)'' keyboards are standard then the keycodes for
   the 3 keys are

     * 115 - Windows(R) key, between the left-hand Ctrl and Alt keys

     * 116 - Windows(R) key, to the right of the AltGr key

     * 117 - Menu key, to the left of the right-hand Ctrl key

   To have the left Windows(R) key print a comma, try this.

     # xmodmap -e "keycode 115 = comma"

   You will probably have to re-start your window manager to see the result.

   To have the Windows(R) key-mappings enabled automatically every time you
   start X either put the xmodmap commands in your ~/.xinitrc file or,
   preferably, create a file ~/.xmodmaprc and include the xmodmap options,
   one per line, then add the line

     xmodmap $HOME/.xmodmaprc

   to your ~/.xinitrc.

   For example, you could map the 3 keys to be F13, F14, and F15,
   respectively. This would make it easy to map them to useful functions
   within applications or your window manager, as demonstrated further down.

   To do this put the following in ~/.xmodmaprc.

     keycode 115 = F13
     keycode 116 = F14
     keycode 117 = F15

   If you use fvwm2, for example, you could map the keys so that F13
   iconifies (or de-iconifies) the window the cursor is in, F14 brings the
   window the cursor is in to the front or, if it is already at the front,
   pushes it to the back, and F15 pops up the main Workplace (application)
   menu even if the cursor is not on the desktop, which is useful if you do
   not have any part of the desktop visible (and the logo on the key matches
   its functionality).

   The following entries in ~/.fvwmrc implement the aforementioned setup:

     Key F13        FTIWS    A        Iconify
     Key F14        FTIWS    A        RaiseLower
     Key F15        A        A        Menu Workplace Nop

   11.18. How can I get 3D hardware acceleration for OpenGL?

   The availability of 3D acceleration depends on the version of XFree86 you
   are using and the type of video chip you have. If you have an NVIDIA chip,
   check out the FreeBSD NVIDIA Driver Initiative page, which discusses 3D
   acceleration for NVIDIA chips using XFree86-4. For other cards with
   XFree86-4, including the Matrox G200/G400, ATI Rage 128/Radeon, and 3dfx
   Voodoo 3, 4, 5, and Banshee, information on hardware acceleration is
   available on the XFree86-4 Direct Rendering on FreeBSD page. Users of
   XFree86 version 3.3 can use the Utah-GLX port found in graphics/utah-glx
   to get limited accelerated OpenGL on the Matrox Gx00, ATI Rage Pro, SiS
   6326, i810, Savage, and older NVIDIA chips.

     ----------------------------------------------------------------------

                             Chapter 12 Networking

   12.1. Where can I get information on ``diskless booting''?

   12.2. Can a FreeBSD box be used as a dedicated network router?

   12.3. Can I connect my Win95 box to the Internet via FreeBSD?

   12.4. Does FreeBSD support SLIP and PPP?

   12.5. Does FreeBSD support NAT or Masquerading?

   12.6. How do I connect two FreeBSD systems over a parallel line using
   PLIP?

   12.7. Why can I not create a /dev/ed0 device?

   12.8. How can I set up Ethernet aliases?

   12.9. How do I get my 3C503 to use the other network port?

   12.10. Why am I having trouble with NFS and FreeBSD?

   12.11. Why can I not NFS-mount from a Linux box?

   12.12. Why can I not NFS-mount from a Sun box?

   12.13. Why does mountd keep telling me it ``can't change attributes'' and
   that I have a ``bad exports list'' on my FreeBSD NFS server?

   12.14. Why am I having problems talking PPP to NeXTStep machines?

   12.15. How do I enable IP multicast support?

   12.16. Which network cards are based on the DEC PCI chipset?

   12.17. Why do I have to use the FQDN for hosts on my site?

   12.18. Why do I get an error, ``Permission denied'', for all networking
   operations?

   12.19. How much overhead does IPFW incur?

   12.20. Why is my ipfw ``fwd'' rule to redirect a service to another
   machine not working?

   12.21. How can I redirect service requests from one machine to another?

   12.22. Where can I get a bandwidth management tool?

   12.23. Why do I get ``/dev/bpf0: device not configured''?

   12.24. How do I mount a disk from a Windows machine that is on my network,
   like smbmount in Linux?

   12.25. What are these messages about ``icmp-response bandwidth limit
   300/200 pps'' in my log files?

   12.26. What are these ``arp: unknown hardware address format'' error
   messages?

   12.27. I've just installed CVSup but trying to execute it produces errors.
   What is wrong?

   12.1. Where can I get information on ``diskless booting''?

   ``Diskless booting'' means that the FreeBSD box is booted over a network,
   and reads the necessary files from a server instead of its hard disk. For
   full details, please read the Handbook entry on diskless booting

   12.2. Can a FreeBSD box be used as a dedicated network router?

   Yes. Please see the Handbook entry on advanced networking, specifically
   the section on routing and gateways.

   12.3. Can I connect my Win95 box to the Internet via FreeBSD?

   Typically, people who ask this question have two PC's at home, one with
   FreeBSD and one with Win95; the idea is to use the FreeBSD box to connect
   to the Internet and then be able to access the Internet from the Windows95
   box through the FreeBSD box. This is really just a special case of the
   previous question.

   ... and the answer is yes! In FreeBSD 3.X, user-mode ppp(8) contains a
   -nat option. If you run ppp(8) with the -nat option, set gateway_enable to
   YES in /etc/rc.conf, and configure your Windows machine correctly, this
   should work fine.

   For more information, please see the ppp(8) manual page.

   If you are using kernel-mode PPP, or have an Ethernet connection to the
   Internet, you will have to use natd(8). Please look at the natd section of
   this FAQ.

   12.4. Does FreeBSD support SLIP and PPP?

   Yes. See the manual pages for slattach(8), sliplogin(8), ppp(8), and
   pppd(8). ppp(8) and pppd(8) provide support for both incoming and outgoing
   connections, while sliplogin(8) deals exclusively with incoming
   connections, and slattach(8) deals exclusively with outgoing connections.

   For more information on how to use these, please see the Handbook chapter
   on PPP and SLIP.

   If you only have access to the Internet through a ``shell account'', you
   may want to have a look at the net/slirp package. It can provide you with
   (limited) access to services such as ftp and http direct from your local
   machine.

   12.5. Does FreeBSD support NAT or Masquerading?

   If you have a local subnet (one or more local machines), but have been
   allocated only a single IP number from your Internet provider (or even if
   you receive a dynamic IP number), you may want to look at the natd(8)
   program. natd(8) allows you to connect an entire subnet to the Internet
   using only a single IP number.

   The ppp(8) program has similar functionality built in via the -nat switch.
   The alias library (libalias(3)) is used in both cases.

   12.6. How do I connect two FreeBSD systems over a parallel line using
   PLIP?

   Please see the PLIP section of the Handbook.

   12.7. Why can I not create a /dev/ed0 device?

   Because they aren't necessary. In the Berkeley networking framework,
   network interfaces are only directly accessible by kernel code. Please see
   the /etc/rc.network file and the manual pages for the various network
   programs mentioned there for more information. If this leaves you totally
   confused, then you should pick up a book describing network administration
   on another BSD-related operating system; with few significant exceptions,
   administering networking on FreeBSD is basically the same as on SunOS 4.0
   or Ultrix.

   12.8. How can I set up Ethernet aliases?

   If the alias is on the same subnet as an address already configured on the
   interface, then add netmask 0xffffffff to your ifconfig(8) command-line,
   as in the following:

     # ifconfig ed0 alias 192.0.2.2 netmask 0xffffffff

   Otherwise, just specify the network address and netmask as usual:

     # ifconfig ed0 alias 172.16.141.5 netmask 0xffffff00

   12.9. How do I get my 3C503 to use the other network port?

   If you want to use the other ports, you will have to specify an additional
   parameter on the ifconfig(8) command line. The default port is link0. To
   use the AUI port instead of the BNC one, use link2. These flags should be
   specified using the ifconfig_* variables in /etc/rc.conf (see rc.conf(5)).

   12.10. Why am I having trouble with NFS and FreeBSD?

   Certain PC network cards are better than others (to put it mildly) and can
   sometimes cause problems with network intensive applications like NFS.

   See the Handbook entry on NFS for more information on this topic.

   12.11. Why can I not NFS-mount from a Linux box?

   Some versions of the Linux NFS code only accept mount requests from a
   privileged port; try

     # mount -o -P linuxbox:/blah /mnt

   12.12. Why can I not NFS-mount from a Sun box?

   Sun workstations running SunOS 4.X only accept mount requests from a
   privileged port; try

     # mount -o -P sunbox:/blah /mnt

   12.13. Why does mountd keep telling me it ``can't change attributes'' and
   that I have a ``bad exports list'' on my FreeBSD NFS server?

   The most frequent problem is not understanding the correct format of
   /etc/exports. Please review exports(5) and the NFS entry in the Handbook,
   especially the section on configuring NFS.

   12.14. Why am I having problems talking PPP to NeXTStep machines?

   Try disabling the TCP extensions in /etc/rc.conf (see rc.conf(5)) by
   changing the following variable to NO:

     tcp_extensions=NO

   Xylogic's Annex boxes are also broken in this regard and you must use the
   above change to connect thru them.

   12.15. How do I enable IP multicast support?

   Multicast host operations are fully supported in FreeBSD 2.0 and later by
   default. If you want your box to run as a multicast router, you will need
   to recompile your kernel with the MROUTING option and run mrouted(8).
   FreeBSD 2.2 and later will start mrouted(8) at boot time if the flag
   mrouted_enable is set to "YES" in /etc/rc.conf.

   MBONE tools are available in their own ports category, mbone. If you are
   looking for the conference tools vic and vat, look there!

   12.16. Which network cards are based on the DEC PCI chipset?

   Here is a list compiled by Glen Foster <gfoster@driver.nsta.org>, with
   some more modern additions:

   Table 12-1. Network cards based on the DEC PCI chipset

   +------------------------------------------------------------------------+
   | Vendor       | Model                                                   |
   |--------------+---------------------------------------------------------|
   | ASUS         | PCI-L101-TB                                             |
   |--------------+---------------------------------------------------------|
   | Accton       | ENI1203                                                 |
   |--------------+---------------------------------------------------------|
   | Cogent       | EM960PCI                                                |
   |--------------+---------------------------------------------------------|
   | Compex       | ENET32-PCI                                              |
   |--------------+---------------------------------------------------------|
   | D-Link       | DE-530                                                  |
   |--------------+---------------------------------------------------------|
   | Dayna        | DP1203, DP2100                                          |
   |--------------+---------------------------------------------------------|
   | DEC          | DE435, DE450                                            |
   |--------------+---------------------------------------------------------|
   | Danpex       | EN-9400P3                                               |
   |--------------+---------------------------------------------------------|
   | JCIS         | Condor JC1260                                           |
   |--------------+---------------------------------------------------------|
   | Linksys      | EtherPCI                                                |
   |--------------+---------------------------------------------------------|
   | Mylex        | LNP101                                                  |
   |--------------+---------------------------------------------------------|
   | SMC          | EtherPower 10/100 (Model 9332)                          |
   |--------------+---------------------------------------------------------|
   | SMC          | EtherPower (Model 8432)                                 |
   |--------------+---------------------------------------------------------|
   | TopWare      | TE-3500P                                                |
   |--------------+---------------------------------------------------------|
   | Znyx (2.2.x) | ZX312, ZX314, ZX342, ZX345, ZX346, ZX348                |
   |--------------+---------------------------------------------------------|
   | Znyx (3.x)   | ZX345Q, ZX346Q, ZX348Q, ZX412Q, ZX414, ZX442, ZX444,    |
   |              | ZX474, ZX478, ZX212, ZX214 (10mbps/hd)                  |
   +------------------------------------------------------------------------+

   12.17. 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.example.org and you wish to reach a host
   called mumble in the example.org domain, you will have to refer to it by
   the fully-qualified domain name, mumble.example.org, instead of just
   mumble.

   Traditionally, this was allowed by BSD BIND resolvers. However the current
   version of bind (see named(8)) 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.example.org, or it will be searched for in the root domain.

   This is different from the previous behavior, where the search continued
   across mumble.example.org, 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.example.org example.org

   instead of the previous

     domain foo.example.org

   into your /etc/resolv.conf file (see resolv.conf(5)). However, make sure
   that the search order does not go beyond the ``boundary between local and
   public administration'', as RFC 1535 calls it.

   12.18. Why do I get an error, ``Permission denied'', for all networking
   operations?

   If you have compiled your kernel with the IPFIREWALL option, you need to
   be aware that the default policy as of 2.1.7R (this actually changed
   during 2.1-STABLE development) is to deny all packets that are not
   explicitly allowed.

   If you had unintentionally misconfigured your system for firewalling, you
   can restore network operability by typing the following while logged in as
   root:

     # ipfw add 65534 allow all from any to any

   You can also set firewall_type="open" in /etc/rc.conf.

   For further information on configuring a FreeBSD firewall, see the
   Handbook section.

   12.19. How much overhead does IPFW incur?

   Please see the Handbook's Firewalls section, specifically the section on
   IPFW Overhead & Optimization.

   12.20. Why is my ipfw ``fwd'' rule to redirect a service to another
   machine not working?

   Possibly because you want to do network address translation (NAT) and not
   just forward packets. A ``fwd'' rule does exactly what it says; it
   forwards packets. It does not actually change the data inside the packet.
   Say we have a rule like:

     01000 fwd 10.0.0.1 from any to foo 21

   When a packet with a destination address of foo arrives at the machine
   with this rule, the packet is forwarded to 10.0.0.1, but it still has the
   destination address of foo! The destination address of the packet is not
   changed to 10.0.0.1. Most machines would probably drop a packet that they
   receive with a destination address that is not their own. Therefore, using
   a ``fwd'' rule does not often work the way the user expects. This behavior
   is a feature and not a bug.

   See the FAQ about redirecting services, the natd(8) manual, or one of the
   several port redirecting utilities in the ports collection for a correct
   way to do this.

   12.21. How can I redirect service requests from one machine to another?

   You can redirect FTP (and other service) request with the socket package,
   available in the ports tree in category ``sysutils''. Simply replace the
   service's command line to call socket instead, like so:

     ftp stream tcp nowait nobody /usr/local/bin/socket socket ftp.example.com ftp

   where ftp.example.com and ftp are the host and port to redirect to,
   respectively.

   12.22. Where can I get a bandwidth management tool?

   There are three bandwidth management tools available for FreeBSD.
   dummynet(4) is integrated into FreeBSD (or more specifically, ipfw(4));
   ALTQ is available for free; Bandwidth Manager from Emerging Technologies
   is a commercial product.

   12.23. Why do I get ``/dev/bpf0: device not configured''?

   You are running a program that requires the Berkeley Packet Filter
   (bpf(4)), but it's not in your kernel. Add this to your kernel config file
   and build a new kernel:

     pseudo-device bpf        # Berkeley Packet Filter

   After rebooting, create the device node. This can be accomplished by going
   to the /dev directory and running:

     # sh MAKEDEV bpf0

   Please see the Handbook entry on device nodes for more information on
   creating devices.

   12.24. How do I mount a disk from a Windows machine that is on my network,
   like smbmount in Linux?

   Use the SMBFS toolset. It includes a set of kernel modifications and a set
   of userland programs. The programs and information are available as
   net/smbfs in the ports collection, or in the base system as of 4.5-RELEASE
   and later.

   12.25. What are these messages about ``icmp-response bandwidth limit
   300/200 pps'' in my log files?

   This is the kernel telling you that some activity is provoking it to send
   more ICMP or TCP reset (RST) responses than it thinks it should. ICMP
   responses are often generated as a result of attempted connections to
   unused UDP ports. TCP resets are generated as a result of attempted
   connections to unopened TCP ports. Among others, these are the kinds of
   activities which may cause these messages:

     * Brute-force denial of service (DoS) attacks (as opposed to
       single-packet attacks which exploit a specific vulnerability).

     * Port scans which attempt to connect to a large number of ports (as
       opposed to only trying a few well-known ports).

   The first number in the message tells you how many packets the kernel
   would have sent if the limit was not in place, and the second number tells
   you the limit. You can control the limit using the net.inet.icmp.icmplim
   sysctl variable like this, where 300 is the limit in packets per second:

     # sysctl -w net.inet.icmp.icmplim=300

   If you do not want to see messages about this in your log files, but you
   still want the kernel to do response limiting, you can use the
   net.inet.icmp.icmplim_output sysctl variable to disable the output like
   this:

     # sysctl -w net.inet.icmp.icmplim_output=0

   Finally, if you want to disable response limiting, you can set the
   net.inet.icmp.icmplim sysctl variable (see above for an example) to 0.
   Disabling response limiting is discouraged for the reasons listed above.

   12.26. What are these ``arp: unknown hardware address format'' error
   messages?

   This means that some device on your local Ethernet is using a MAC address
   in a format that FreeBSD does not recognize. This is probably caused by
   someone experimenting with an Ethernet card somewhere else on the network.
   You will see this most commonly on cable modem networks. It is harmless,
   and should not affect the performance of your FreeBSD machine.

   12.27. I've just installed CVSup but trying to execute it produces errors.
   What is wrong?

   First, see if the error message you are receiving is like the one shown
   below.

     /usr/libexec/ld-elf.so.1: Shared object "libXaw.so.6" not found

   Errors like these are caused by installing the net/cvsup port on a machine
   which does not have the XFree86 suite. If you want to use the GUI included
   with CVSup you will need to install XFree86 now. Alternatively if you just
   wish to use CVSup from a command line you should delete the package
   previously installed. Then install the net/cvsup-without-gui port. This is
   covered in more detail in the CVSup section of the Handbook.

     ----------------------------------------------------------------------

                              Chapter 13 Security

   13.1. BIND (named) is listening on port 53 and some other high-numbered
   port. What is going on?

   13.2. Sendmail is listening on port 587 as well as the standard port 25!
   What is going on?

   13.3. What is this UID 0 toor account? Have I been compromised?

   13.4. Why is suidperl not working properly?

   13.1. BIND (named) is listening on port 53 and some other high-numbered
   port. What is going on?

   FreeBSD 3.0 and later use a version of BIND that uses a random
   high-numbered port for outgoing queries. If you want to use port 53 for
   outgoing queries, either to get past a firewall or to make yourself feel
   better, you can try the following in /etc/namedb/named.conf:

     options {
             query-source address * port 53;
     };

   You can replace the * with a single IP address if you want to tighten
   things further.

   Congratulations, by the way. It is good practice to read your sockstat(1)
   output and notice odd things!

   13.2. Sendmail is listening on port 587 as well as the standard port 25!
   What is going on?

   Recent versions of Sendmail support a mail submission feature that runs
   over port 587. This is not yet widely supported, but is growing in
   popularity.

   13.3. What is this UID 0 toor account? Have I been compromised?

   Do not worry. toor is an ``alternative'' superuser account (toor is root
   spelt backwards). Previously it was created when the bash(1) shell was
   installed but now it is created by default. It is intended to be used with
   a non-standard shell so you do not have to change root's default shell.
   This is important as shells which are not part of the base distribution
   (for example a shell installed from ports or packages) are likely be to be
   installed in /usr/local/bin which, by default, resides on a different
   filesystem. If root's shell is located in /usr/local/bin and /usr (or
   whatever filesystem contains /usr/local/bin) is not mounted for some
   reason, root will not be able to log in to fix a problem (although if you
   reboot into single user mode you will be prompted for the path to a
   shell).

   Some people use toor for day-to-day root tasks with a non-standard shell,
   leaving root, with a standard shell, for single user mode or emergencies.
   By default you cannot log in using toor as it does not have a password, so
   log in as root and set a password for toor if you want to use it.

   13.4. Why is suidperl not working properly?

   For security reasons, suidperl is installed without the suid bit by
   default. The system administrator can enable suid behavior with the
   following command.

     # chmod u+s /usr/bin/suidperl

   If you want suidperl to be built suid during upgrades from source, edit
   /etc/make.conf and add ENABLE_SUIDPERL=true before you run make
   buildworld.

     ----------------------------------------------------------------------

                                 Chapter 14 PPP

   14.1. I cannot make ppp(8) work. What am I doing wrong?

   14.2. Why does ppp(8) hang when I run it?

   14.3. Why will ppp(8) not dial in -auto mode?

   14.4. What does ``No route to host'' mean?

   14.5. Why does my connection drop after about 3 minutes?

   14.6. Why does my connection drop under heavy load?

   14.7. Why does my connection drop after a random amount of time?

   14.8. Why does my connection hang after a random amount of time?

   14.9. The remote end is not responding. What can I do?

   14.10. ppp(8) has hung. What can I do?

   14.11. Why does nothing happen after the ``Login OK!'' message?

   14.12. I keep seeing errors about magic being the same. What does it mean?

   14.13. LCP negotiations continue until the connection is closed. What is
   wrong?

   14.14. Why does ppp(8) lock up shortly after connection?

   14.15. Why does ppp(8) lock up when I shell out to test it?

   14.16. Why does ppp(8) over a null-modem cable never exit?

   14.17. Why does ppp(8) dial for no reason in -auto mode?

   14.18. What do these CCP errors mean?

   14.19. Why does ppp(8) lock up during file transfers with IO errors?

   14.20. Why does ppp(8) not log my connection speed?

   14.21. Why does ppp(8) ignore the \ character in my chat script?

   14.22. Why does ppp(8) get a seg-fault, but I see no ppp.core file?

   14.23. Why does the process that forces a dial in auto mode never connect?

   14.24. Why do most games not work with the -nat switch?

   14.25. Has anybody made a list of useful port numbers?

   14.26. What are FCS errors?

   14.27. Why do MacOS and Windows 98 connections freeze when running PPPoE
   on the gateway?

   14.28. None of this helps - I am desperate! What can I do?

   14.1. I cannot make ppp(8) work. What am I doing wrong?

   You should first read the ppp(8) manual page and the PPP section of the
   handbook. Enable logging with the command

     set log Phase Chat Connect Carrier lcp ipcp ccp command

   This command may be typed at the ppp(8) command prompt or it may be
   entered in the /etc/ppp/ppp.conf configuration file (the start of the
   default section is the best place to put it). Make sure that
   /etc/syslog.conf (see syslog.conf(5)) contains the lines

     !ppp
     *.*        /var/log/ppp.log

   and that the file /var/log/ppp.log exists. You can now find out a lot
   about what is going on from the log file. Do not worry if it does not all
   make sense. If you need to get help from someone, it may make sense to
   them.

   If your version of ppp(8) does not understand the set log command, you
   should download the latest version. It will build on FreeBSD version 2.1.5
   and higher.

   14.2. Why does ppp(8) hang when I run it?

   This is usually because your hostname will not resolve. The best way to
   fix this is to make sure that /etc/hosts is consulted by your resolver
   first by editing /etc/host.conf and putting the hosts line first. Then,
   simply put an entry in /etc/hosts for your local machine. If you have no
   local network, change your localhost line:

     127.0.0.1        foo.example.com foo localhost

   Otherwise, simply add another entry for your host. Consult the relevant
   manual pages for more details.

   You should be able to successfully ping -c1 `hostname` when you are done.

   14.3. Why will ppp(8) not dial in -auto mode?

   First, check that you have got a default route. By running netstat -rn
   (see netstat(1)), you should see two entries like this:

     Destination        Gateway            Flags     Refs     Use     Netif Expire
     default            10.0.0.2           UGSc        0        0      tun0
     10.0.0.2           10.0.0.1           UH          0        0      tun0

   This is assuming that you have used the addresses from the handbook, the
   manual page or from the ppp.conf.sample file. If you do not have a default
   route, it may be because you are running an old version of ppp(8) that
   does not understand the word HISADDR in the ppp.conf file. If your version
   of ppp(8) is from before FreeBSD 2.2.5, change the

     add 0 0 HISADDR

   line to one saying

     add 0 0 10.0.0.2

   Another reason for the default route line being missing is that you have
   mistakenly set up a default router in your /etc/rc.conf (see rc.conf(5))
   file (this file was called /etc/sysconfig prior to release 2.2.2), and you
   have omitted the line saying

     delete ALL

   from ppp.conf. If this is the case, go back to the Final system
   configuration section of the handbook.

   14.4. What does ``No route to host'' mean?

   This error is usually due to a missing

     MYADDR:
       delete ALL
       add 0 0 HISADDR

   section in your /etc/ppp/ppp.linkup file. This is only necessary if you
   have a dynamic IP address or do not know the address of your gateway. If
   you are using interactive mode, you can type the following after entering
   packet mode (packet mode is indicated by the capitalized PPP in the
   prompt):

     delete ALL
     add 0 0 HISADDR

   Refer to the PPP and Dynamic IP addresses section of the handbook for
   further details.

   14.5. Why does my connection drop after about 3 minutes?

   The default PPP timeout is 3 minutes. This can be adjusted with the line

     set timeout NNN

   where NNN is the number of seconds of inactivity before the connection is
   closed. If NNN is zero, the connection is never closed due to a timeout.
   It is possible to put this command in the ppp.conf file, or to type it at
   the prompt in interactive mode. It is also possible to adjust it on the
   fly while the line is active by connecting to ppp's server socket using
   telnet(1) or pppctl(8). Refer to the ppp(8) man page for further details.

   14.6. Why does my connection drop under heavy load?

   If you have Link Quality Reporting (LQR) configured, it is possible that
   too many LQR packets are lost between your machine and the peer. Ppp
   deduces that the line must therefore be bad, and disconnects. Prior to
   FreeBSD version 2.2.5, LQR was enabled by default. It is now disabled by
   default. LQR can be disabled with the line

     disable lqr

   14.7. Why does my connection drop after a random amount of time?

   Sometimes, on a noisy phone line or even on a line with call waiting
   enabled, your modem may hang up because it thinks (incorrectly) that it
   lost carrier.

   There is a setting on most modems for determining how tolerant it should
   be to temporary losses of carrier. On a USR Sportster for example, this is
   measured by the S10 register in tenths of a second. To make your modem
   more forgiving, you could add the following send-expect sequence to your
   dial string:

     set dial "...... ATS10=10 OK ......"

   Refer to your modem manual for details.

   14.8. Why does my connection hang after a random amount of time?

   Many people experience hung connections with no apparent explanation. The
   first thing to establish is which side of the link is hung.

   If you are using an external modem, you can simply try using ping(8) to
   see if the TD light is flashing when you transmit data. If it flashes (and
   the RD light does not), the problem is with the remote end. If TD does not
   flash, the problem is local. With an internal modem, you will need to use
   the set server command in your ppp.conf file. When the hang occurs,
   connect to ppp(8) using pppctl(8). If your network connection suddenly
   revives (PPP was revived due to the activity on the diagnostic socket) or
   if you cannot connect (assuming the set socket command succeeded at
   startup time), the problem is local. If you can connect and things are
   still hung, enable local async logging with set log local async and use
   ping(8) from another window or terminal to make use of the link. The async
   logging will show you the data being transmitted and received on the link.
   If data is going out and not coming back, the problem is remote.

   Having established whether the problem is local or remote, you now have
   two possibilities:

     * If the problem is remote, read on entry Q: 14.9..

     * If the problem is local, read on entry Q: 14.10..

   14.9. The remote end is not responding. What can I do?

   There is very little you can do about this. Most ISPs will refuse to help
   if you are not running a Microsoft OS. You can enable lqr in your ppp.conf
   file, allowing ppp(8) to detect the remote failure and hang up, but this
   detection is relatively slow and therefore not that useful. You may want
   to avoid telling your ISP that you are running user-PPP...

   First, try disabling all local compression by adding the following to your
   configuration:

     disable pred1 deflate deflate24 protocomp acfcomp shortseq vj
     deny pred1 deflate deflate24 protocomp acfcomp shortseq vj

   Then reconnect to ensure that this makes no difference. If things improve
   or if the problem is solved completely, determine which setting makes the
   difference through trial and error. This will provide good ammunition when
   you contact your ISP (although it may make it apparent that you are not
   running a Microsoft product).

   Before contacting your ISP, enable async logging locally and wait until
   the connection hangs again. This may use up quite a bit of disk space. The
   last data read from the port may be of interest. It is usually ascii data,
   and may even describe the problem (``Memory fault, core dumped''?).

   If your ISP is helpful, they should be able to enable logging on their
   end, then when the next link drop occurs, they may be able to tell you why
   their side is having a problem. Feel free to send the details to Brian
   Somers <brian@FreeBSD.org>, or even to ask your ISP to contact me
   directly.

   14.10. ppp(8) has hung. What can I do?

   Your best bet here is to rebuild ppp(8) by adding CFLAGS+=-g and STRIP= to
   the end of the Makefile, then doing a make clean && make && make install.
   When ppp(8) hangs, find the ppp(8) process id with ps ajxww | fgrep ppp
   and run gdb ppp PID. From the gdb prompt, you can then use bt to get a
   stack trace.

   Send the results to Brian Somers <brian@FreeBSD.org>.

   14.11. Why does nothing happen after the ``Login OK!'' message?

   Prior to FreeBSD version 2.2.5, once the link was established, ppp(8)
   would wait for the peer to initiate the Line Control Protocol (LCP). Many
   ISPs will not initiate negotiations and expect the client to do so. To
   force ppp(8) to initiate the LCP, use the following line:

     set openmode active

     Note: It usually does no harm if both sides initiate negotiation, so
     openmode is now active by default. However, the next section explains
     when it does do some harm.

   14.12. I keep seeing errors about magic being the same. What does it mean?

   Occasionally, just after connecting, you may see messages in the log that
   say ``magic is the same''. Sometimes, these messages are harmless, and
   sometimes one side or the other exits. Most PPP implementations cannot
   survive this problem, and even if the link seems to come up, you will see
   repeated configure requests and configure acknowledgments in the log file
   until ppp(8) eventually gives up and closes the connection.

   This normally happens on server machines with slow disks that are spawning
   a getty on the port, and executing ppp(8) from a login script or program
   after login. I have also heard reports of it happening consistently when
   using slirp. The reason is that in the time taken between getty(8) exiting
   and ppp(8) starting, the client-side ppp(8) starts sending Line Control
   Protocol (LCP) packets. Because ECHO is still switched on for the port on
   the server, the client ppp(8) sees these packets ``reflect'' back.

   One part of the LCP negotiation is to establish a magic number for each
   side of the link so that ``reflections'' can be detected. The protocol
   says that when the peer tries to negotiate the same magic number, a NAK
   should be sent and a new magic number should be chosen. During the period
   that the server port has ECHO turned on, the client ppp(8) sends LCP
   packets, sees the same magic in the reflected packet and NAKs it. It also
   sees the NAK reflect (which also means ppp(8) must change its magic). This
   produces a potentially enormous number of magic number changes, all of
   which are happily piling into the server's tty buffer. As soon as ppp(8)
   starts on the server, it is flooded with magic number changes and almost
   immediately decides it has tried enough to negotiate LCP and gives up.
   Meanwhile, the client, who no longer sees the reflections, becomes happy
   just in time to see a hangup from the server.

   This can be avoided by allowing the peer to start negotiating with the
   following line in your ppp.conf file:

     set openmode passive

   This tells ppp(8) to wait for the server to initiate LCP negotiations.
   Some servers however may never initiate negotiations. If this is the case,
   you can do something like:

     set openmode active 3

   This tells ppp(8) to be passive for 3 seconds, and then to start sending
   LCP requests. If the peer starts sending requests during this period,
   ppp(8) will immediately respond rather than waiting for the full 3 second
   period.

   14.13. LCP negotiations continue until the connection is closed. What is
   wrong?

   There is currently an implementation mis-feature in ppp(8) where it does
   not associate LCP, CCP & IPCP responses with their original requests. As a
   result, if one PPP implementation is more than 6 seconds slower than the
   other side, the other side will send two additional LCP configuration
   requests. This is fatal.

   Consider two implementations, A and B. A starts sending LCP requests
   immediately after connecting and B takes 7 seconds to start. When B
   starts, A has sent 3 LCP REQs. We are assuming the line has ECHO switched
   off, otherwise we would see magic number problems as described in the
   previous section. B sends a REQ, then an ACK to the first of A's REQs.
   This results in A entering the OPENED state and sending and ACK (the
   first) back to B. In the meantime, B sends back two more ACKs in response
   to the two additional REQs sent by A before B started up. B then receives
   the first ACK from A and enters the OPENED state. A receives the second
   ACK from B and goes back to the REQ-SENT state, sending another (forth)
   REQ as per the RFC. It then receives the third ACK and enters the OPENED
   state. In the meantime, B receives the forth REQ from A, resulting in it
   reverting to the ACK-SENT state and sending another (second) REQ and
   (forth) ACK as per the RFC. A gets the REQ, goes into REQ-SENT and sends
   another REQ. It immediately receives the following ACK and enters OPENED.

   This goes on until one side figures out that they are getting nowhere and
   gives up.

   The best way to avoid this is to configure one side to be passive - that
   is, make one side wait for the other to start negotiating. This can be
   done with the

     set openmode passive

   command. Care should be taken with this option. You should also use the

     set stopped N

   command to limit the amount of time that ppp(8) waits for the peer to
   begin negotiations. Alternatively, the

     set openmode active N

   command (where N is the number of seconds to wait before starting
   negotiations) can be used. Check the manual page for details.

   14.14. Why does ppp(8) lock up shortly after connection?

   Prior to version 2.2.5 of FreeBSD, it was possible that your link was
   disabled shortly after connection due to ppp(8) mis-handling Predictor1
   compression negotiation. This would only happen if both sides tried to
   negotiate different Compression Control Protocols (CCP). This problem is
   now corrected, but if you are still running an old version of ppp(8) the
   problem can be circumvented with the line

     disable pred1

   14.15. Why does ppp(8) lock up when I shell out to test it?

   When you execute the shell or ! command, ppp(8) executes a shell (or if
   you have passed any arguments, ppp(8) will execute those arguments). Ppp
   will wait for the command to complete before continuing. If you attempt to
   use the PPP link while running the command, the link will appear to have
   frozen. This is because ppp(8) is waiting for the command to complete.

   If you wish to execute commands like this, use the !bg command instead.
   This will execute the given command in the background, and ppp(8) can
   continue to service the link.

   14.16. Why does ppp(8) over a null-modem cable never exit?

   There is no way for ppp(8) to automatically determine that a direct
   connection has been dropped. This is due to the lines that are used in a
   null-modem serial cable. When using this sort of connection, LQR should
   always be enabled with the line

     enable lqr

   LQR is accepted by default if negotiated by the peer.

   14.17. Why does ppp(8) dial for no reason in -auto mode?

   If ppp(8) is dialing unexpectedly, you must determine the cause, and set
   up Dial filters (dfilters) to prevent such dialing.

   To determine the cause, use the following line:

     set log +tcp/ip

   This will log all traffic through the connection. The next time the line
   comes up unexpectedly, you will see the reason logged with a convenient
   timestamp next to it.

   You can now disable dialing under these circumstances. Usually, this sort
   of problem arises due to DNS lookups. To prevent DNS lookups from
   establishing a connection (this will not prevent ppp(8) from passing the
   packets through an established connection), use the following:

     set dfilter 1 deny udp src eq 53
     set dfilter 2 deny udp dst eq 53
     set dfilter 3 permit 0/0 0/0

   This is not always suitable, as it will effectively break your demand-dial
   capabilities - most programs will need a DNS lookup before doing any other
   network related things.

   In the DNS case, you should try to determine what is actually trying to
   resolve a host name. A lot of the time, sendmail(8) is the culprit. You
   should make sure that you tell sendmail not to do any DNS lookups in its
   configuration file. See the section on Mail Configuration for details on
   how to create your own configuration file and what should go into it. You
   may also want to add the following line to your .mc file:

     define(`confDELIVERY_MODE', `d')dnl

   This will make sendmail queue everything until the queue is run (usually,
   sendmail is invoked with -bd -q30m, telling it to run the queue every 30
   minutes) or until a sendmail -q is done (perhaps from your ppp.linkup
   file).

   14.18. What do these CCP errors mean?

   I keep seeing the following errors in my log file:

     CCP: CcpSendConfigReq
     CCP: Received Terminate Ack (1) state = Req-Sent (6)

   This is because ppp(8) is trying to negotiate Predictor1 compression, and
   the peer does not want to negotiate any compression at all. The messages
   are harmless, but if you wish to remove them, you can disable Predictor1
   compression locally too:

     disable pred1

   14.19. Why does ppp(8) lock up during file transfers with IO errors?

   Under FreeBSD 2.2.2 and before, there was a bug in the tun driver that
   prevents incoming packets of a size larger than the tun interface's MTU
   size. Receipt of a packet greater than the MTU size results in an IO error
   being logged via syslogd.

   The PPP specification says that an MTU of 1500 should always be accepted
   as a minimum, despite any LCP negotiations, therefore it is possible that
   should you decrease the MTU to less than 1500, your ISP will transmit
   packets of 1500 regardless, and you will tickle this non-feature - locking
   up your link.

   The problem can be circumvented by never setting an MTU of less than 1500
   under FreeBSD 2.2.2 or before.

   14.20. Why does ppp(8) not log my connection speed?

   In order to log all lines of your modem ``conversation'', you must enable
   the following:

     set log +connect

   This will make ppp(8) log everything up until the last requested
   ``expect'' string.

   If you wish to see your connect speed and are using PAP or CHAP (and
   therefore do not have anything to ``chat'' after the CONNECT in the dial
   script - no set login script), you must make sure that you instruct ppp(8)
   to ``expect'' the whole CONNECT line, something like this:

     set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 4 \
       \"\" ATZ OK-ATZ-OK ATDT\\T TIMEOUT 60 CONNECT \\c \\n"

   Here, we get our CONNECT, send nothing, then expect a line-feed, forcing
   ppp(8) to read the whole CONNECT response.

   14.21. Why does ppp(8) ignore the \ character in my chat script?

   Ppp parses each line in your config files so that it can interpret strings
   such as set phone "123 456 789" correctly and realize that the number is
   actually only one argument. In order to specify a " character, you must
   escape it using a backslash (\).

   When the chat interpreter parses each argument, it re-interprets the
   argument in order to find any special escape sequences such as \P or \T
   (see the manual page). As a result of this double-parsing, you must
   remember to use the correct number of escapes.

   If you wish to actually send a \ character to (say) your modem, you would
   need something like:

     set dial "\"\" ATZ OK-ATZ-OK AT\\\\X OK"

   resulting in the following sequence:

     ATZ
     OK
     AT\X
     OK

   or

     set phone 1234567
     set dial "\"\" ATZ OK ATDT\\T"

   resulting in the following sequence:

     ATZ
     OK
     ATDT1234567

   14.22. Why does ppp(8) get a seg-fault, but I see no ppp.core file?

   Ppp (or any other program for that matter) should never dump core. Because
   ppp(8) runs with an effective user id of 0, the operating system will not
   write ppp(8)'s core image to disk before terminating it. If, however
   ppp(8) is actually terminating due to a segmentation violation or some
   other signal that normally causes core to be dumped, and you are sure you
   are using the latest version (see the start of this section), then you
   should do the following:

     % tar xfz ppp-*.src.tar.gz
     % cd ppp*/ppp
     % echo STRIP= >>Makefile
     % echo CFLAGS+=-g >>Makefile
     % make clean all
     % su
     # make install
     # chmod 555 /usr/sbin/ppp

   You will now have a debuggable version of ppp(8) installed. You will have
   to be root to run ppp(8) as all of its privileges have been revoked. When
   you start ppp(8), take a careful note of what your current directory was
   at the time.

   Now, if and when ppp(8) receives the segmentation violation, it will dump
   a core file called ppp.core. You should then do the following:

     % su
     # gdb /usr/sbin/ppp ppp.core
     (gdb) bt
     .....
     (gdb) f 0
     ....
     (gdb) i args
     ....
     (gdb) l
     .....

   All of this information should be given alongside your question, making it
   possible to diagnose the problem.

   If you are familiar with gdb, you may wish to find out some other bits and
   pieces such as what actually caused the dump and the addresses & values of
   the relevant variables.

   14.23. Why does the process that forces a dial in auto mode never connect?

   This was a known problem with ppp(8) set up to negotiate a dynamic local
   IP number with the peer in auto mode. It is fixed in the latest version -
   search the manual page for iface.

   The problem was that when that initial program calls connect(2), the IP
   number of the tun interface is assigned to the socket endpoint. The kernel
   creates the first outgoing packet and writes it to the tun device. ppp(8)
   then reads the packet and establishes a connection. If, as a result of
   ppp(8)'s dynamic IP assignment, the interface address is changed, the
   original socket endpoint will be invalid. Any subsequent packets sent to
   the peer will usually be dropped. Even if they are not, any responses will
   not route back to the originating machine as the IP number is no longer
   owned by that machine.

   There are several theoretical ways to approach this problem. It would be
   nicest if the peer would re-assign the same IP number if possible :-) The
   current version of ppp(8) does this, but most other implementations do
   not.

   The easiest method from our side would be to never change the tun
   interface IP number, but instead to change all outgoing packets so that
   the source IP number is changed from the interface IP to the negotiated IP
   on the fly. This is essentially what the iface-alias option in the latest
   version of ppp(8) is doing (with the help of libalias(3) and ppp(8)'s -nat
   switch) - it is maintaining all previous interface addresses and NATing
   them to the last negotiated address.

   Another alternative (and probably the most reliable) would be to implement
   a system call that changes all bound sockets from one IP to another.
   ppp(8) would use this call to modify the sockets of all existing programs
   when a new IP number is negotiated. The same system call could be used by
   dhcp clients when they are forced to re-bind() their sockets.

   Yet another possibility is to allow an interface to be brought up without
   an IP number. Outgoing packets would be given an IP number of
   255.255.255.255 up until the first SIOCAIFADDR ioctl is done. This would
   result in fully binding the socket. It would be up to ppp(8) to change the
   source IP number, but only if it is set to 255.255.255.255, and only the
   IP number and IP checksum would need to change. This, however is a bit of
   a hack as the kernel would be sending bad packets to an improperly
   configured interface, on the assumption that some other mechanism is
   capable of fixing things retrospectively.

   14.24. Why do most games not work with the -nat switch?

   The reason games and the like do not work when libalias is in use is that
   the machine on the outside will try to open a connection or send
   (unsolicited) UDP packets to the machine on the inside. The NAT software
   does not know that it should send these packets to the interior machine.

   To make things work, make sure that the only thing running is the software
   that you are having problems with, then either run tcpdump on the tun
   interface of the gateway or enable ppp(8) tcp/ip logging (set log +tcp/ip)
   on the gateway.

   When you start the offending software, you should see packets passing
   through the gateway machine. When something comes back from the outside,
   it will be dropped (that is the problem). Note the port number of these
   packets then shut down the offending software. Do this a few times to see
   if the port numbers are consistent. If they are, then the following line
   in the relevant section of /etc/ppp/ppp.conf will make the software
   functional:

     nat port proto internalmachine:port port

   where proto is either tcp or udp, internalmachine is the machine that you
   want the packets to be sent to and port is the destination port number of
   the packets.

   You will not be able to use the software on other machines without
   changing the above command, and running the software on two internal
   machines at the same time is out of the question - after all, the outside
   world is seeing your entire internal network as being just a single
   machine.

   If the port numbers are not consistent, there are three more options:

    1. Submit support in libalias. Examples of ``special cases'' can be found
       in /usr/src/lib/libalias/alias_*.c (alias_ftp.c is a good prototype).
       This usually involves reading certain recognised outgoing packets,
       identifying the instruction that tells the outside machine to initiate
       a connection back to the internal machine on a specific (random) port
       and setting up a ``route'' in the alias table so that the subsequent
       packets know where to go.

       This is the most difficult solution, but it is the best and will make
       the software work with multiple machines.

    2. Use a proxy. The application may support socks5 for example, or (as in
       the ``cvsup'' case) may have a ``passive'' option that avoids ever
       requesting that the peer open connections back to the local machine.

    3. Redirect everything to the internal machine using nat addr. This is
       the sledge-hammer approach.

   14.25. Has anybody made a list of useful port numbers?

   Not yet, but this is intended to grow into such a list (if any interest is
   shown). In each example, internal should be replaced with the IP number of
   the machine playing the game.

     * Asheron's Call

       nat port udp internal :65000 65000

       Manually change the port number within the game to 65000. If you have
       got a number of machines that you wish to play on assign a unique port
       number for each (i.e. 65001, 65002, etc) and add a nat port line for
       each one.

     * Half Life

       nat port udp internal:27005 27015

     * PCAnywhere 8.0

       nat port udp internal:5632 5632

       nat port tcp internal:5631 5631

     * Quake

       nat port udp internal:6112 6112

       Alternatively, you may want to take a look at www.battle.net for Quake
       proxy support.

     * Quake 2

       nat port udp internal:27901 27910

       nat port udp internal:60021 60021

       nat port udp internal:60040 60040

     * Red Alert

       nat port udp internal:8675 8675

       nat port udp internal:5009 5009

   14.26. What are FCS errors?

   FCS stands for Frame Check Sequence. Each PPP packet has a checksum
   attached to ensure that the data being received is the data being sent. If
   the FCS of an incoming packet is incorrect, the packet is dropped and the
   HDLC FCS count is increased. The HDLC error values can be displayed using
   the show hdlc command.

   If your link is bad (or if your serial driver is dropping packets), you
   will see the occasional FCS error. This is not usually worth worrying
   about although it does slow down the compression protocols substantially.
   If you have an external modem, make sure your cable is properly shielded
   from interference - this may eradicate the problem.

   If your link freezes as soon as you have connected and you see a large
   number of FCS errors, this may be because your link is not 8 bit clean.
   Make sure your modem is not using software flow control (XON/XOFF). If
   your datalink must use software flow control, use the command set accmap
   0x000a0000 to tell ppp(8) to escape the ^Q and ^S characters.

   Another reason for seeing too many FCS errors may be that the remote end
   has stopped talking PPP. You may want to enable async logging at this
   point to determine if the incoming data is actually a login or shell
   prompt. If you have a shell prompt at the remote end, it is possible to
   terminate ppp(8) without dropping the line by using the close lcp command
   (a following term command will reconnect you to the shell on the remote
   machine.

   If nothing in your log file indicates why the link might have been
   terminated, you should ask the remote administrator (your ISP?) why the
   session was terminated.

   14.27. Why do MacOS and Windows 98 connections freeze when running PPPoE
   on the gateway?

   Thanks to Michael Wozniak <mwozniak@netcom.ca> for figuring this out and
   Dan Flemming <danflemming@mac.com> for the Mac solution:

   This is due to what is called a ``Black Hole'' router. MacOS and Windows
   98 (and maybe other Microsoft OSs) send TCP packets with a requested
   segment size too big to fit into a PPPoE frame (MTU is 1500 by default for
   Ethernet) and have the ``do not fragment'' bit set (default of TCP) and
   the Telco router is not sending ICMP ``must fragment'' back to the www
   site you are trying to load. (Alternatively, the router is sending the
   ICMP packet correctly, but the firewall at the www site is dropping it.)
   When the www server is sending you frames that do not fit into the PPPoE
   pipe the Telco router drops them on the floor and your page does not load
   (some pages/graphics do as they are smaller than a MSS.) This seems to be
   the default of most Telco PPPoE configurations (if only they knew how to
   program a router... sigh...)

   One fix is to use regedit on your 95/98 boxes to add the following
   registry entry...

     HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\0000\MaxMTU

   It should be a string with a value ``1436'', as some ADSL routers are
   reported to be unable to deal with packets larger than this. This registry
   key has been changed to Tcpip\Parameters\Interfaces\ID for adapter\MTU in
   Windows 2000 and becomes a DWORD.

   Refer to the Microsoft Knowledge Base documents Q158474 - Windows TCPIP
   Registry Entries and Q120642 - TCPIP & NBT Configuration Parameters for
   Windows NT for more information on changing Windows MTU to work with a NAT
   router.

   Another regedit possibility under Windows 2000 is to set the
   Tcpip\Parameters\Interfaces\ID for adapter\EnablePMTUBHDetect DWORD to 1
   as mentioned in the Microsoft document 120642 mentioned above.

   Unfortunately, MacOS does not provide an interface for changing TCP/IP
   settings. However, there is commercial software available, such as
   OTAdvancedTuner (OT for OpenTransport, the MacOS TCP/IP stack) by
   Sustainable Softworks, that will allow users to customize TCP/IP settings.
   MacOS NAT users should select ip_interface_MTU from the drop-down menu,
   enter 1450 instead of 1500 in the box, click the box next to Save as Auto
   Configure, and click Make Active.

   The latest version of ppp(8) (2.3 or greater) has an enable tcpmssfixup
   command that will automatically adjust the MSS to an appropriate value.
   This facility is enabled by default. If you are stuck with an older
   version of ppp(8), you may want to look at the tcpmssd port.

   14.28. None of this helps - I am desperate! What can I do?

   If all else fails, send as much information as you can, including your
   config files, how you are starting ppp(8), the relevant parts of your log
   file and the output of the netstat -rn command (before and after
   connecting) to the FreeBSD general questions mailing list
   <freebsd-questions@FreeBSD.org> or the comp.unix.bsd.freebsd.misc news
   group, and someone should point you in the right direction.

     ----------------------------------------------------------------------

                        Chapter 15 Serial Communications

   This section answers common questions about serial communications with
   FreeBSD. PPP and SLIP are covered in the Chapter 12 section.

   15.1. How do I tell if FreeBSD found my serial ports?

   15.2. How do I tell if FreeBSD found my modem cards?

   15.3. I just upgraded to 2.0.5 and my tty0X are missing! How do I solve
   this problem?

   15.4. How do I access the serial ports on FreeBSD?

   15.5. How do I enable support for a multiport serial card?

   15.6. Can FreeBSD handle multiport serial cards sharing irqs?

   15.7. Can I set the default serial parameters for a port?

   15.8. How can I enable dialup logins on my modem?

   15.9. How can I connect a dumb terminal to my FreeBSD box?

   15.10. Why can I not run tip or cu?

   15.11. My stock Hayes modem is not supported---what can I do?

   15.12. How am I expected to enter these AT commands?

   15.13. Why does the <@> sign for the pn capability not work?

   15.14. How can I dial a phone number on the command line?

   15.15. Do I have to type in the bps rate every time I do that?

   15.16. How can I more easily access a number of hosts through a terminal
   server?

   15.17. Can tip try more than one line for each site?

   15.18. Why do I have to hit CTRL+P twice to send CTRL+P once?

   15.19. Why is everything I type suddenly in UPPER CASE?

   15.20. How can I do file transfers with tip?

   15.21. How can I run zmodem with tip?

   15.22. Why does FreeBSD not find my serial ports, even when the settings
   are correct?

   15.1. How do I tell if FreeBSD found my serial ports?

   As the FreeBSD kernel boots, it will probe for the serial ports in your
   system for which the kernel was configured. You can either watch your
   system closely for the messages it prints or run the command

     % dmesg | grep sio

   after your system is up and running.

   Here is some example output from the above command:

     sio0 at 0x3f8-0x3ff irq 4 on isa
     sio0: type 16550A
     sio1 at 0x2f8-0x2ff irq 3 on isa
     sio1: type 16550A

   This shows two serial ports. The first is on irq 4, is using port address
   0x3f8, and has a 16550A-type UART chip. The second uses the same kind of
   chip but is on irq 3 and is at port address 0x2f8. Internal modem cards
   are treated just like serial ports---except that they always have a modem
   ``attached'' to the port.

   The GENERIC kernel includes support for two serial ports using the same
   irq and port address settings in the above example. If these settings are
   not right for your system, or if you have added modem cards or have more
   serial ports than your kernel is configured for, just reconfigure your
   kernel. See section about building a kernel for more details.

   15.2. How do I tell if FreeBSD found my modem cards?

   Refer to the answer to the previous question.

   15.3. I just upgraded to 2.0.5 and my tty0X are missing! How do I solve
   this problem?

   Do not worry, they have been merged with the ttydX devices. You will have
   to change any old configuration files you have, though.

   15.4. How do I access the serial ports on FreeBSD?

   The third serial port, sio2 (see sio(4), known as COM3 in DOS), is on
   /dev/cuaa2 for dial-out devices, and on /dev/ttyd2 for dial-in devices.
   What is the difference between these two classes of devices?

   You use ttydX for dial-ins. When opening /dev/ttydX in blocking mode, a
   process will wait for the corresponding cuaaX device to become inactive,
   and then wait for the carrier detect line to go active. When you open the
   cuaaX device, it makes sure the serial port is not already in use by the
   ttydX device. If the port is available, it ``steals'' it from the ttydX
   device. Also, the cuaaX device does not care about carrier detect. With
   this scheme and an auto-answer modem, you can have remote users log in and
   you can still dial out with the same modem and the system will take care
   of all the conflicts.

   15.5. How do I enable support for a multiport serial card?

   Again, the section on kernel configuration provides information about
   configuring your kernel. For a multiport serial card, place an sio(4) line
   for each serial port on the card in the kernel configuration file. But
   place the irq and vector specifiers on only one of the entries. All of the
   ports on the card should share one irq. For consistency, use the last
   serial port to specify the irq. Also, specify the COM_MULTIPORT option.

   The following example is for an AST 4-port serial card on irq 7:

     options "COM_MULTIPORT"
     device sio4 at isa? port 0x2a0 tty flags 0x781
     device sio5 at isa? port 0x2a8 tty flags 0x781
     device sio6 at isa? port 0x2b0 tty flags 0x781
     device sio7 at isa? port 0x2b8 tty flags 0x781 irq 7 vector siointr

   The flags indicate that the master port has minor number 7 (0x700),
   diagnostics enabled during probe (0x080), and all the ports share an irq
   (0x001).

   15.6. Can FreeBSD handle multiport serial cards sharing irqs?

   Not yet. You will have to use a different irq for each card.

   15.7. Can I set the default serial parameters for a port?

   The ttydX (or cuaaX) device is the regular device you will want to open
   for your applications. When a process opens the device, it will have a
   default set of terminal I/O settings. You can see these settings with the
   command

     # stty -a -f /dev/ttyd1

   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 bits, and XON/XOFF flow control by default for ttyd5, do:

     # stty -f /dev/ttyid5 clocal cs8 ixon ixoff

   A good place to do this is in /etc/rc.serial. Now, an application will
   have these settings by default when it opens ttyd5. It can still change
   these settings to its liking, though.

   You can also prevent certain settings from being changed by an application
   by making adjustments to the ``lock state'' device. For example, to lock
   the speed of ttyd5 to 57600 bps, do

     # 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 root. The MAKEDEV(8) script does NOT do this when it
   creates the device entries.

   15.8. How can I enable dialup logins on my modem?

   So you want to become an Internet service provider, eh? First, you will
   need one or more modems that can auto-answer. Your modem will need to
   assert carrier-detect when it detects a carrier and not assert it all the
   time. It will need to hang up the phone and reset itself when the data
   terminal ready (DTR) line goes from on to off. It should probably use
   RTS/CTS flow control or no local flow control at all. Finally, it must use
   a constant speed between the computer and itself, but (to be nice to your
   callers) it should negotiate a speed between itself and the remote modem.

   For many Hayes command-set--compatible modems, this command will make
   these settings and store them in nonvolatile memory:

     AT &C1 &D3 &K3 &Q6 S0=1 &W

   See the section on sending AT commands below for information on how to
   make these settings without resorting to an MS-DOS terminal program.

   Next, make an entry in /etc/ttys (see ttys(5)) for the modem. This file
   lists all the ports on which the operating system will await logins. Add a
   line that looks something like this:

     ttyd1 "/usr/libexec/getty std.57600" dialup on insecure

   This line indicates that the second serial port (/dev/ttyd1) has a modem
   connected running at 57600 bps and no parity (std.57600, which comes from
   the file /etc/gettytab, see gettytab(5)). The terminal type for this port
   is dialup. The port is on and is insecure---meaning root logins on the
   port are not allowed. For dialin ports like this one, use the ttydX entry.

   It is common practice to use dialup as the terminal type. Many users set
   up in their .profile or .login files a prompt for the actual terminal type
   if the starting type is dialup. The example shows the port as insecure. To
   become root on this port, you have to login as a regular user, then su(1)
   to become root. If you use secure then root can login in directly.

   After making modifications to /etc/ttys, you need to send a hangup or HUP
   signal to the init(8) process:

     # kill -HUP 1

   This forces the init(8) process to reread /etc/ttys. The init process will
   then start getty processes on all on ports. You can find out if logins are
   available for your port by typing

     % ps -ax | grep '[t]tyd1'

   You should see something like:

     747 ??  I      0:00.04 /usr/libexec/getty std.57600 ttyd1

   15.9. How can I connect a dumb terminal to my FreeBSD box?

   If you are using another computer as a terminal into your FreeBSD system,
   get a null modem cable to go between the two serial ports. If you are
   using an actual terminal, see its accompanying instructions.

   Then, modify /etc/ttys (see ttys(5)), like above. For example, if you are
   hooking up a WYSE-50 terminal to the fifth serial port, use an entry like
   this:

     ttyd4 "/usr/libexec/getty std.38400" wyse50 on secure

   This example shows that the port on /dev/ttyd4 has a wyse50 terminal
   connected at 38400 bps with no parity (std.38400 from /etc/gettytab, see
   gettytab(5)) and root logins are allowed (secure).

   15.10. Why can I not run tip or cu?

   On your system, the programs tip(1) and cu(1) are probably executable only
   by uucp and group dialer. You can use the group dialer to control who has
   access to your modem or remote systems. Just add yourself to group dialer.

   Alternatively, you can let everyone on your system run tip(1) and cu(1) by
   typing:

     # chmod 4511 /usr/bin/cu
     # chmod 4511 /usr/bin/tip

   15.11. My stock Hayes modem is not supported---what can I do?

   Actually, the manual page for tip(1) is out of date. There is a generic
   Hayes dialer already built in. Just use at=hayes in your /etc/remote (see
   remote(5)) file.

   The Hayes driver is not smart enough to recognize some of the advanced
   features of newer modems---messages like BUSY, NO DIALTONE, or CONNECT
   115200 will just confuse it. You should turn those messages off when you
   use tip(1) (using ATX0&W).

   Also, the dial timeout for tip(1) is 60 seconds. Your modem should use
   something less, or else tip will think there is a communication problem.
   Try ATS7=45&W.

   Actually, as shipped tip(1) does not yet support it fully. The solution is
   to edit the file tipconf.h in the directory /usr/src/usr.bin/tip/tip.
   Obviously you need the source distribution to do this.

   Edit the line #define HAYES 0 to #define HAYES 1. Then make and make
   install. Everything works nicely after that.

   15.12. How am I expected to enter these AT commands?

   Make what is called a ``direct'' entry in your /etc/remote file (see
   remote(5)). For example, if your modem is hooked up to the first serial
   port, /dev/cuaa0, then put in the following line:

     cuaa0:dv=/dev/cuaa0:br#19200:pa=none

   Use the highest bps rate your modem supports in the br capability. Then,
   type tip cuaa0 (see tip(1)) and you will be connected to your modem.

   If there is no /dev/cuaa0 on your system, do this:

     # cd /dev
     # sh MAKEDEV cuaa0

   Or use cu as root with the following command:

     # cu -lline -sspeed

   with line being the serial port (e.g. /dev/cuaa0) and speed being the
   speed (e.g.57600). When you are done entering the AT commands hit ~. to
   exit.

   15.13. Why does the <@> sign for the pn capability not work?

   The <@> sign in the phone number capability tells tip to look in
   /etc/phones for a phone number. But the <@> sign is also a special
   character in capability files like /etc/remote. Escape it with a
   backslash:

     pn=\@

   15.14. How can I dial a phone number on the command line?

   Put what is called a ``generic'' entry in your /etc/remote file (see
   remote(5)). For example:

     tip115200|Dial any phone number at 115200 bps:\
             :dv=/dev/cuaa0:br#115200:at=hayes:pa=none:du:
     tip57600|Dial any phone number at 57600 bps:\
             :dv=/dev/cuaa0:br#57600:at=hayes:pa=none:du:

   Then you can do something like tip -115200 5551234. If you prefer cu(1)
   over tip(1), use a generic cu entry:

     cu115200|Use cu to dial any number at 115200bps:\
             :dv=/dev/cuaa1:br#57600:at=hayes:pa=none:du:

   and type cu 5551234 -s 115200.

   15.15. Do I have to type in the bps rate every time I do that?

   Put in an entry for tip1200 or cu1200, but go ahead and use whatever bps
   rate is appropriate with the br capability. tip(1) thinks a good default
   is 1200 bps which is why it looks for a tip1200 entry. You do not have to
   use 1200 bps, though.

   15.16. How can I more easily access a number of hosts through a terminal
   server?

   Rather than waiting until you are connected and typing CONNECT host each
   time, use tip's cm capability. For example, these entries in /etc/remote
   (see remote(5)):

     pain|pain.deep13.com|Forrester's machine:\
             :cm=CONNECT pain\n:tc=deep13:
     muffin|muffin.deep13.com|Frank's machine:\
             :cm=CONNECT muffin\n:tc=deep13:
     deep13:Gizmonics Institute terminal server:\
             :dv=/dev/cuaa2:br#38400:at=hayes:du:pa=none:pn=5551234:

   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.

   15.17. 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 (see remote(5)) and use
   <\@> for the pn capability:

     big-university:\
             :pn=\@:tc=dialout
     dialout:\
             :dv=/dev/cuaa3:br#9600:at=courier:du:pa=none:

   Then, list the phone numbers for the university in /etc/phones (see
   phones(5)):

     big-university 5551111
     big-university 5551112
     big-university 5551113
     big-university 5551114

   tip(1) will try each one in the listed order, then give up. If you want to
   keep retrying, run tip(1) in a while loop.

   15.18. Why do I have to hit CTRL+P twice to send CTRL+P once?

   CTRL+P is the default ``force'' character, used to tell tip(1) that the
   next character is literal data. You can set the force character to any
   other character with the ~s escape, which means ``set a variable''.

   Type ~sforce=single-char followed by a newline. single-char is any single
   character. If you leave out single-char, then the force character is the
   nul character, which you can get by typing CTRL+2 or CTRL+SPACE. A pretty
   good value for single-char is SHIFT+CTRL+6, which I have seen only used on
   some terminal servers.

   You can have the force character be whatever you want by specifying the
   following in your $HOME/.tiprc file:

     force=single-char

   15.19. Why is everything I type suddenly in UPPER CASE?

   You must have pressed CTRL+A, tip(1) ``raise character'', specially
   designed for people with broken Caps Lock keys. Use ~s as above and set
   the variable ``raisechar'' to something reasonable. In fact, you can set
   it to the same as the force character, if you never expect to use either
   of these features.

   Here is a sample .tiprc file perfect for Emacs users who need to type
   CTRL+2 and CTRL+A a lot:

     force=^^
     raisechar=^^

   The ^^ is SHIFT+CTRL+6.

   15.20. How can I do file transfers with tip?

   If you are talking to another Unix system, you can send and receive files
   with ~p (put) and ~t (take). These commands run cat(1) and echo(1) on the
   remote system to accept and send files. The syntax is:

     ~p <local-file> [<remote-file>]
     ~t <remote-file> [<local-file>]

   There is no error checking, so you probably should use another protocol,
   like zmodem.

   15.21. How can I run zmodem with tip?

   First, install one of the zmodem programs from the ports collection (such
   as one of the two from the comms category, lrzsz or rzsz.

   To receive files, start the sending program on the remote end. Then, press
   enter and type ~C rz (or ~C lrz if you installed lrzsz) to begin receiving
   them locally.

   To send files, start the receiving program on the remote end. Then, press
   enter and type ~C sz files (or ~C lsz files) to send them to the remote
   system.

   15.22. Why does FreeBSD not find my serial ports, even when the settings
   are correct?

   Motherboards and cards with Acer UARTs do not probe properly under the
   FreeBSD sio probe. Obtain a patch from www.lemis.com to fix your problem.

     ----------------------------------------------------------------------

                       Chapter 16 Miscellaneous Questions

   16.1. FreeBSD uses far more swap space than Linux. Why?

   16.2. Why does top show very little free memory even when I have very few
   programs running?

   16.3. Why use (what are) a.out and ELF executable formats?

   16.4. Yes, but why are there so many different formats?

   16.5. Why will chmod not change the permissions on symlinks?

   16.6. Why are login names restricted to 8 characters or less in FreeBSD
   2.2.X and earlier?

   16.7. Can I run DOS binaries under FreeBSD?

   16.8. What do I need to do to translate a FreeBSD document into my native
   language?

   16.9. Why does my email to any address at FreeBSD.org bounce?

   16.10. Where can I find a free FreeBSD account?

   16.11. What is sup, and how do I use it?

   16.12. What is the cute little red guy's name?

   16.13. Can I use the BSD daemon image?

   16.14. Do you have any BSD daemon images I could use?

   16.15. What does MFC mean?

   16.16. What does BSD mean?

   16.17. What does POLA mean?

   16.18. What is a repo-copy?

   16.19. Why should I care what color the bikeshed is?

   16.1. FreeBSD uses far more swap space than Linux. Why?

   FreeBSD only appears to use more swap than Linux. In actual fact, it does
   not. The main difference between FreeBSD and Linux in this regard is that
   FreeBSD will proactively move entirely idle, unused pages of main memory
   into swap in order to make more main memory available for active use.
   Linux tends to only move pages to swap as a last resort. The perceived
   heavier use of swap is balanced by the more efficient use of main memory.

   Note that while FreeBSD is proactive in this regard, it does not
   arbitrarily decide to swap pages when the system is truly idle. Thus you
   will not find your system all paged out when you get up in the morning
   after leaving it idle overnight.

   16.2. Why does top show very little free memory even when I have very few
   programs running?

   The simple answer is that free memory is wasted memory. Any memory that
   your programs do not actively allocate is used within the FreeBSD kernel
   as disk cache. The values shown by top(1) labeled as Inact, Cache, and Buf
   are all cached data at different aging levels. This cached data means the
   system does not have to access a slow disk again for data it has accessed
   recently, thus increasing overall performance. In general, a low value
   shown for Free memory in top(1) is good, provided it is not very low.

   16.3. Why use (what are) a.out and ELF executable formats?

   To understand why FreeBSD uses the ELF format, you must first know a
   little about the 3 currently ``dominant'' executable formats for Unix:

     Note: Prior to FreeBSD 3.X, FreeBSD used the a.out format.

     * 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 has traditionally used the
   a.out(5) format, a technology tried and proven through many generations of
   BSD releases. Though it has also been possible for some time to build and
   run native ELF binaries (and kernels) on a FreeBSD system, 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 not so much to flee the a.out executable format as it was their
   inflexible jump-table based shared library mechanism, which made the
   construction of shared libraries very difficult for vendors and developers
   alike. Since the ELF tools available offered a solution to the shared
   library problem and were generally seen as ``the way forward'' anyway, the
   migration cost was accepted as necessary and the transition made.

   In FreeBSD's case, our shared library mechanism is based more closely on
   Sun's SunOS-style shared library mechanism and, as such, is very easy to
   use. However, starting with 3.0, FreeBSD officially supports ELF binaries
   as the default format. Even though the a.out executable format has served
   us well, the GNU people, who author the compiler tools we use, have
   dropped support for the a.out format. This has forced us to maintain a
   divergent version of the compiler and linker, and has kept us from reaping
   the benefits of the latest GNU development efforts. Also the demands of
   ISO-C++, notably constructors and destructors, has also led to native ELF
   support in future FreeBSD releases.

   16.4. Yes, but why are there so many different formats?

   Back in the dim, dark past, there was simple hardware. This simple
   hardware supported a simple, small system. a.out was completely adequate
   for the job of representing binaries on this simple system (a PDP-11). As
   people ported Unix from this simple system, they retained the a.out format
   because it was sufficient for the early ports of Unix to architectures
   like the Motorola 68k, VAXen, etc.

   Then some bright hardware engineer decided that if he could force software
   to do some sleazy tricks, then he would be able to shave a few gates off
   the design and allow his CPU core to run faster. While it was made to work
   with this new kind of hardware (known these days as RISC), a.out was
   ill-suited for this hardware, so many formats were developed to get to a
   better performance from this hardware than the limited, simple a.out
   format could offer. Things like COFF, ECOFF, and a few obscure others were
   invented and their limitations explored before things seemed to settle on
   ELF.

   In addition, program sizes were getting huge and disks (and physical
   memory) were still relatively small so the concept of a shared library was
   born. The VM system also became more sophisticated. While each one of
   these advancements was done using the a.out format, its usefulness was
   stretched more and more with each new feature. In addition, people wanted
   to dynamically load things at run time, or to junk parts of their program
   after the init code had run to save in core memory and swap space.
   Languages became more sophisticated and people wanted code called before
   main automatically. Lots of hacks were done to the a.out format to allow
   all of these things to happen, and they basically worked for a time. In
   time, a.out was not up to handling all these problems without an ever
   increasing overhead in code and complexity. While ELF solved many of these
   problems, it would be painful to switch from the system that basically
   worked. So ELF had to wait until it was more painful to remain with a.out
   than it was to migrate to ELF.

   However, as time passed, the build tools that FreeBSD derived their build
   tools from (the assembler and loader especially) evolved in two parallel
   trees. The FreeBSD tree added shared libraries and fixed some bugs. The
   GNU folks that originally write these programs rewrote them and added
   simpler support for building cross compilers, plugging in different
   formats at will, etc. Since many people wanted to build cross compilers
   targeting FreeBSD, they were out of luck since the older sources that
   FreeBSD had for as and ld were not up to the task. The new gnu tools chain
   (binutils) does support cross compiling, ELF, shared libraries, C++
   extensions, etc. In addition, many vendors are releasing ELF binaries, and
   it is a good thing for FreeBSD to run them. And if it is running ELF
   binaries, why bother having a.out any more? It is a tired old horse that
   has proven useful for a long time, but it is time to turn him out to
   pasture for his long, faithful years of service.

   ELF is more expressive than a.out and will allow more extensibility in the
   base system. The ELF tools are better maintained, and offer cross
   compilation support, which is important to many people. ELF may be a
   little slower than a.out, but trying to measure it can be difficult. There
   are also numerous details that are different between the two in how they
   map pages, handle init code, etc. None of these are very important, but
   they are differences. In time support for a.out will be moved out of the
   GENERIC kernel, and eventually removed from the kernel once the need to
   run legacy a.out programs is past.

   16.5. Why will chmod not change the permissions on symlinks?

   Symlinks do not have permissions, and by default, chmod(1) will not follow
   symlinks to change the permissions on the target file. So if you have a
   file, foo, and a symlink to that file, bar, then this command will always
   succeed.

     % chmod g-w bar

   However, the permissions on foo will not have changed.

   You have to use either -H or -L together with the -R option to make this
   work. See the chmod(1) and symlink(7) manual pages for more info.

     Warning: The -R option does a RECURSIVE chmod(1). Be careful about
     specifying directories or symlinks to directories to chmod(1). If you
     want to change the permissions of a directory referenced by a symlink,
     use chmod(1) without any options and follow the symlink with a trailing
     slash (/). For example, if foo is a symlink to directory bar, and you
     want to change the permissions of foo (actually bar), you would do
     something like:

     % chmod 555 foo/

     With the trailing slash, chmod(1) will follow the symlink, foo, to
     change the permissions of the directory, bar.

   16.6. Why are login names restricted to 8 characters or less in FreeBSD
   2.2.X and earlier?

   You would think it would be easy enough to change UT_NAMESIZE and rebuild
   the whole world, and everything would just work. Unfortunately there are
   often scads of applications and utilities (including system tools) that
   have hard-coded small numbers (not always 8 or 9, but oddball ones like 15
   and 20) in structures and buffers. Not only will this get you log files
   which are trashed (due to variable-length records getting written when
   fixed records were expected), but it can break Suns NIS clients and
   potentially cause other problems in interacting with other Unix systems.

   In FreeBSD 3.0 and later, the maximum name length has been increased to 16
   characters and those various utilities with hard-coded name sizes have
   been found and fixed. The fact that this touched so many areas of the
   system is why, in fact, the change was not made until 3.0.

   If you are absolutely confident in your ability to find and fix these
   sorts of problems for yourself when and if they pop up, you can increase
   the login name length in earlier releases by editing /usr/include/utmp.h
   and changing UT_NAMESIZE accordingly. You must also update MAXLOGNAME in
   /usr/include/sys/param.h to match the UT_NAMESIZE change. Finally, if you
   build from sources, do not forget that /usr/include is updated each time!
   Change the appropriate files in /usr/src/.. instead.

   16.7. Can I run DOS binaries under FreeBSD?

   Yes, starting with version 3.0 you can use BSDI's doscmd DOS emulation
   which has been integrated and enhanced. Send mail to the FreeBSD-emulation
   mailing list <freebsd-emulation@FreeBSD.org> if you are interested in
   joining this ongoing effort!

   For pre-3.0 systems, there is a neat utility called pcemu in the ports
   collection which emulates an 8088 and enough BIOS services to run DOS text
   mode applications. It requires the X Window System (provided as XFree86).

   16.8. What do I need to do to translate a FreeBSD document into my native
   language?

   See the Translation FAQ in the FreeBSD Documentation Project Primer.

   16.9. Why does my email to any address at FreeBSD.org bounce?

   The FreeBSD.org mail system implements some of the stricter Postfix checks
   on incoming mail and rejects mail that is either misconfigured or is
   potential spam. Your mail might bounce for one of the following reasons:

     * The email is being sent from a known spam domain or IP block.

       The FreeBSD mail servers reject email from known spam sources. If you
       have service through a company or domain who generates or relays spam,
       please switch to a service provider who does not.

     * The body of the email only contains HTML.

       Mail should be sent in plain text only. Please configure your mail
       user agent to send plain text.

     * The mailer at FreeBSD.org cannot resolve the IP address of the
       connecting host back to a symbolic name.

       Working reverse DNS is a standard requirement for accepting mail from
       a host. Set up reverse DNS for your mail server's IP address. Many
       home services (DSL, cable, dialup, etc.) will not give you this
       option. In this case, relay your email through your service provider's
       mail server.

     * The hostname given in the EHLO/HELO part of the SMTP exchange cannot
       be resolved to an IP address.

       A fully qualified, resolvable host name is necessary in this part of
       the SMTP dialogue before mail will be accepted. If you do not have a
       host name that is registered in the DNS, then you should use your
       service provider's mail server to relay your mail.

     * Your message had a message ID ending with the string ``localhost''.

       Some mail user agents generate bad message IDs which will not be
       accepted. You will need to persuade your mail user agent to generate a
       valid message ID or else configure your mail transfer agent to rewrite
       them.

   16.10. Where can I find a free FreeBSD account?

   While FreeBSD does not provide open access to any of their servers, others
   do provide open access Unix systems. The charge varies and limited
   services may be available.

   Arbornet, Inc, also known as M-Net, has been providing open access to Unix
   systems since 1983. Starting on an Altos running System III, the site
   switched to BSD/OS in 1991. In June of 2000, the site switched again to
   FreeBSD. M-Net can be accessed via telnet and SSH and provides basic
   access to the entire FreeBSD software suite. However, network access is
   limited to members and patrons who donate to the system, which is run as a
   non-profit organization. M-Net also provides an bulletin board system and
   interactive chat.

   Grex provides a site very similar to M-Net including the same bulletin
   board and interactive chat software. However, the machine is a Sun 4M and
   is running SunOS

   16.11. What is sup, and how do I use it?

   SUP stands for Software Update Protocol, and was developed by CMU for
   keeping their development trees in sync. We used it to keep remote sites
   in sync with our central development sources.

   SUP is not bandwidth friendly, and has been retired. The current
   recommended method to keep your sources up to date is CVSup

   16.12. What is the cute little red guy's name?

   He does not have one, and is just called ``the BSD daemon''. If you insist
   upon using a name, call him ``beastie''. Note that ``beastie'' is
   pronounced ``BSD''.

   You can learn more about the BSD daemon on his home page.

   16.13. Can I use the BSD daemon image?

   Perhaps. The BSD daemon is copyrighted by Marshall Kirk McKusick. You will
   want to check his Statement on the Use of the BSD Daemon Figure for
   detailed usage terms.

   In summary, you are free to use the image in a tasteful manner, for
   personal use, so long as appropriate credit is given. If you want to use
   him commercially, you must contact Kirk McKusick. More details are
   available on the BSD Daemon's home page.

   16.14. Do you have any BSD daemon images I could use?

   You will find eps and Xfig drawings under /usr/share/examples/BSD_daemon/.

   16.15. What does MFC mean?

   MFC is an acronym for ``Merged From -CURRENT''. It is used in the CVS logs
   to denote when a change was migrated from the CURRENT to the STABLE
   branches.

   16.16. What does BSD mean?

   It stands for something in a secret language that only members can know.
   It does not translate literally but its ok to tell you that BSD's
   translation is something between, ``Formula-1 Racing Team'', ``Penguins
   are tasty snacks'', and ``We have a better sense of humor than Linux''.
   :-)

   Seriously, BSD is an acronym for ``Berkeley Software Distribution'', which
   is the name the Berkeley CSRG (Computer Systems Research Group) chose for
   their Unix distribution way back when.

   16.17. What does POLA mean?

   Principle of Least Astonishment. It means that as FreeBSD evolves, changes
   visible to the user should be kept as unsurprising as possible. For
   example, arbitrarily rearranging system startup variables in
   /etc/defaults/rc.conf violates POLA. Developers consider POLA when
   contemplating user-visible system changes.

   16.18. What is a repo-copy?

   A repo-copy (which is a short form of ``repository copy'') refers to the
   direct copying of files within the CVS repository.

   Without a repo-copy, if a file needed to be copied or moved to another
   place in the repository, the committer would run cvs add to put the file
   in its new location, and then cvs rm on the old file if the old copy was
   being removed.

   The disadvantage of this method is that the history (i.e. the entries in
   the CVS logs) of the file would not be copied to the new location. As the
   FreeBSD Project considers this history very useful, a repository copy is
   often used instead. This is a process where one of the repository meisters
   will copy the files directly within the repository, rather than using the
   cvs(1) program.

   16.19. Why should I care what color the bikeshed is?

   The really, really short answer is that you should not. The somewhat
   longer answer is that just because you are capable of building a bikeshed
   does not mean you should stop others from building one just because you do
   not like the color they plan to paint it. This is a metaphor indicating
   that you need not argue about every little feature just because you know
   enough to do so. Some people have commented that the amount of noise
   generated by a change is inversely proportional to the complexity of the
   change.

   The longer and more complete answer is that after a very long argument
   about whether sleep(1) should take fractional second arguments,
   Poul-Henning Kamp <phk@FreeBSD.org> posted a long message entitled ``A
   bike shed (any colour will do) on greener grass...''. The appropriate
   portions of that message are quoted below.

     ``What is it about this bike shed?'' Some of you have asked me.          
                                                                            
     It is a long story, or rather it is an old story, but it is quite      
     short actually. C. Northcote Parkinson wrote a book in the early       
     1960s, called ``Parkinson's Law'', which contains a lot of insight     
     into the dynamics of management.                                       
                                                                            
     [snip a bit of commentary on the book]                                 
                                                                            
     In the specific example involving the bike shed, the other vital       
     component is an atomic power-plant, I guess that illustrates the age   
     of the book.                                                           
                                                                            
     Parkinson shows how you can go into the board of directors and get     
     approval for building a multi-million or even billion dollar atomic    
     power plant, but if you want to build a bike shed you will be tangled  
     up in endless discussions.                                             
                                                                            
     Parkinson explains that this is because an atomic plant is so vast, so 
     expensive and so complicated that people cannot grasp it, and rather   
     than try, they fall back on the assumption that somebody else checked  
     all the details before it got this far. Richard P. Feynmann gives a    
     couple of interesting, and very much to the point, examples relating   
     to Los Alamos in his books.                                            
                                                                            
     A bike shed on the other hand. Anyone can build one of those over a    
     weekend, and still have time to watch the game on TV. So no matter how 
     well prepared, no matter how reasonable you are with your proposal,    
     somebody will seize the chance to show that he is doing his job, that  
     he is paying attention, that he is here.                               
                                                                            
     In Denmark we call it ``setting your fingerprint''. It is about        
     personal pride and prestige, it is about being able to point somewhere 
     and say ``There! I did that.'' It is a strong trait in politicians,    
     but present in most people given the chance. Just think about          
     footsteps in wet cement.                                               
       --Poul-Henning Kamp <phk@FreeBSD.org> on freebsd-hackers, October 2,   
                                                                       1999 

     ----------------------------------------------------------------------

                         Chapter 17 The FreeBSD Funnies

   17.1. How cool is FreeBSD?

   17.2. Who is scratching in my memory banks??

   17.3. How many FreeBSD hackers does it take to change a lightbulb?

   17.4. Where does data written to /dev/null go?

   17.1. How cool is FreeBSD?

   Q. Has anyone done any temperature testing while running FreeBSD? I know
   Linux runs cooler than DOS, but have never seen a mention of FreeBSD. It
   seems to run really hot.

   A. No, but we have done numerous taste tests on blindfolded volunteers who
   have also had 250 micrograms of LSD-25 administered beforehand. 35% of the
   volunteers said that FreeBSD tasted sort of orange, whereas Linux tasted
   like purple haze. Neither group mentioned any significant variances in
   temperature. We eventually had to throw the results of this survey out
   entirely anyway when we found that too many volunteers were wandering out
   of the room during the tests, thus skewing the results. We think most of
   the volunteers are at Apple now, working on their new ``scratch and
   sniff'' GUI. It is a funny old business we are in!

   Seriously, both FreeBSD and Linux use the HLT (halt) instruction when the
   system is idle thus lowering its energy consumption and therefore the heat
   it generates. Also if you have APM (advanced power management) configured,
   then FreeBSD can also put the CPU into a low power mode.

   17.2. Who is scratching in my memory banks??

   Q. Is there anything ``odd'' that FreeBSD does when compiling the kernel
   which would cause the memory to make a scratchy sound? When compiling (and
   for a brief moment after recognizing the floppy drive upon startup, as
   well), a strange scratchy sound emanates from what appears to be the
   memory banks.

   A. Yes! You will see frequent references to ``daemons'' in the BSD
   documentation, and what most people do not know is that this refers to
   genuine, non-corporeal entities that now possess your computer. The
   scratchy sound coming from your memory is actually high-pitched whispering
   exchanged among the daemons as they best decide how to deal with various
   system administration tasks.

   If the noise gets to you, a good fdisk /mbr from DOS will get rid of them,
   but do not be surprised if they react adversely and try to stop you. In
   fact, if at any point during the exercise you hear the satanic voice of
   Bill Gates coming from the built-in speaker, take off running and do not
   ever look back! Freed from the counterbalancing influence of the BSD
   daemons, the twin demons of DOS and Windows are often able to re-assert
   total control over your machine to the eternal damnation of your soul. Now
   that you know, given a choice you would probably prefer to get used to the
   scratchy noises, no?

   17.3. How many FreeBSD hackers does it take to change a lightbulb?

   One thousand, one hundred and sixty-nine:

   Twenty-three to complain to -CURRENT about the lights being out;

   Four to claim that it is a configuration problem, and that such matters
   really belong on -questions;

   Three to submit PRs about it, one of which is misfiled under doc and
   consists only of ``it's dark'';

   One to commit an untested lightbulb which breaks buildworld, then back it
   out five minutes later;

   Eight to flame the PR originators for not including patches in their PRs;

   Five to complain about buildworld being broken;

   Thirty-one to answer that it works for them, and they must have cvsupped
   at a bad time;

   One to post a patch for a new lightbulb to -hackers;

   One to complain that he had patches for this three years ago, but when he
   sent them to -CURRENT they were just ignored, and he has had bad
   experiences with the PR system; besides, the proposed new lightbulb is
   non-reflexive;

   Thirty-seven to scream that lightbulbs do not belong in the base system,
   that committers have no right to do things like this without consulting
   the Community, and WHAT IS -CORE DOING ABOUT IT!?

   Two hundred to complain about the color of the bicycle shed;

   Three to point out that the patch breaks style(9);

   Seventeen to complain that the proposed new lightbulb is under GPL;

   Five hundred and eighty-six to engage in a flame war about the comparative
   advantages of the GPL, the BSD license, the MIT license, the NPL, and the
   personal hygiene of unnamed FSF founders;

   Seven to move various portions of the thread to -chat and -advocacy;

   One to commit the suggested lightbulb, even though it shines dimmer than
   the old one;

   Two to back it out with a furious flame of a commit message, arguing that
   FreeBSD is better off in the dark than with a dim lightbulb;

   Forty-six to argue vociferously about the backing out of the dim lightbulb
   and demanding a statement from -core;

   Eleven to request a smaller lightbulb so it will fit their Tamagotchi if
   we ever decide to port FreeBSD to that platform;

   Seventy-three to complain about the SNR on -hackers and -chat and
   unsubscribe in protest;

   Thirteen to post ``unsubscribe'', ``How do I unsubscribe?'', or ``Please
   remove me from the list'', followed by the usual footer;

   One to commit a working lightbulb while everybody is too busy flaming
   everybody else to notice;

   Thirty-one to point out that the new lightbulb would shine 0.364% brighter
   if compiled with TenDRA (although it will have to be reshaped into a
   cube), and that FreeBSD should therefore switch to TenDRA instead of GCC;

   One to complain that the new lightbulb lacks fairings;

   Nine (including the PR originators) to ask ``what is MFC?'';

   Fifty-seven to complain about the lights being out two weeks after the
   bulb has been changed.

   Nik Clayton <nik@FreeBSD.org> adds:

   I was laughing quite hard at this.

   And then I thought, ``Hang on, shouldn't there be '1 to document it.' in
   that list somewhere?''

   And then I was enlightened :-)

   17.4. Where does data written to /dev/null go?

   It goes into a special data sink in the CPU where it is converted to heat
   which is vented through the heatsink / fan assembly. This is why CPU
   cooling is increasingly important; as people get used to faster
   processors, they become careless with their data and more and more of it
   ends up in /dev/null, overheating their CPUs. If you delete /dev/null
   (which effectively disables the CPU data sink) your CPU may run cooler but
   your system will quickly become constipated with all that excess data and
   start to behave erratically. If you have a fast network connection you can
   cool down your CPU by reading data out of /dev/random and sending it off
   somewhere; however you run the risk of overheating your network connection
   and / or angering your ISP, as most of the data will end up getting
   converted to heat by their equipment, but they generally have good
   cooling, so if you do not overdo it you should be OK.

   Paul Robinson adds:

   There are other methods. As every good sysadmin knows, it is part of
   standard practise to send data to the screen of interesting variety to
   keep all the pixies that make up your picture happy. Screen pixies
   (commonly mis-typed or re-named as 'pixels') are categorised by the type
   of hat they wear (red, green or blue) and will hide or appear (thereby
   showing the colour of their hat) whenever they receive a little piece of
   food. Video cards turn data into pixie-food, and then send them to the
   pixies - the more expensive the card, the better the food, so the better
   behaved the pixies are. They also need constant stimulation - this is why
   screen savers exist.

   To take your suggestions further, you could just throw the random data to
   console, thereby letting the pixies consume it. This causes no heat to be
   produced at all, keeps the pixies happy and gets rid of your data quite
   quickly, even if it does make things look a bit messy on your screen.

   Incidentally, as an ex-admin of a large ISP who experienced many problems
   attempting to maintain a stable temperature in a server room, I would
   strongly discourage people sending the data they do not want out to the
   network. The fairies who do the packet switching and routing get annoyed
   by it as well.

     ----------------------------------------------------------------------

                           Chapter 18 Advanced Topics

   18.1. How can I learn more about FreeBSD's internals?

   18.2. How can I contribute to FreeBSD?

   18.3. What are SNAPs and RELEASEs?

   18.4. How do I make my own custom release?

   18.5. Why does make world clobber my existing installed binaries?

   18.6. Why does my system say ``(bus speed defaulted)'' when it boots?

   18.7. Can I follow -CURRENT with limited Internet access?

   18.8. How did you split the distribution into 240k files?

   18.9. I have written a kernel extension, who do I send it to?

   18.10. How are Plug N Play ISA cards detected and initialized?

   18.11. Can you assign a major number for a device driver I have written?

   18.12. What about alternative layout policies for directories?

   18.13. How can I make the most of the data I see when my kernel panics?

   18.14. Why has dlsym() stopped working for ELF executables?

   18.15. How can I increase or reduce the kernel address space?

   18.1. How can I learn more about FreeBSD's internals?

   At this time, there is no book on FreeBSD-specific OS internals. Much
   general UNIX knowledge is directly applicable to FreeBSD, however.
   Additionally, there are BSD-specific books that are still relevant.

   For a list, please check the Handbook's Operating System Internals
   Bibliography.

   18.2. How can I contribute to FreeBSD?

   Please see the article on Contributing to FreeBSD for specific advice on
   how to do this. Assistance is more than welcome!

   18.3. What are SNAPs and RELEASEs?

   There are currently three active/semi-active branches in the FreeBSD CVS
   Repository (the RELENG_2 branch is probably only changed twice a year,
   which is why there are only three active branches of development):

     * RELENG_2_2 AKA 2.2-STABLE

     * RELENG_3 AKA 3.X-STABLE

     * RELENG_4 AKA 4-STABLE

     * HEAD AKA -CURRENT AKA 5.0-CURRENT

   HEAD is not an actual branch tag, like the other two; it is simply a
   symbolic constant for ``the current, non-branched development stream''
   which we simply refer to as ``-CURRENT''.

   Right now, ``-CURRENT'' is the 5.0 development stream and the 4-STABLE
   branch, RELENG_4, forked off from ``-CURRENT'' in Mar 2000.

   The 2.2-STABLE branch, RELENG_2_2, departed -CURRENT in November 1996, and
   has pretty much been retired.

   18.4. How do I make my own custom release?

   Please see the Release Engineering article.

   18.5. Why does make world clobber my existing installed binaries?

   Yes, this is the general idea; as its name might suggest, make world
   rebuilds every system binary from scratch, so you can be certain of having
   a clean and consistent environment at the end (which is why it takes so
   long).

   If the environment variable DESTDIR is defined while running make world or
   make install, the newly-created binaries will be deposited in a directory
   tree identical to the installed one, rooted at ${DESTDIR}. Some random
   combination of shared libraries modifications and program rebuilds can
   cause this to fail in make world however.

   18.6. Why does my system say ``(bus speed defaulted)'' when it boots?

   The Adaptec 1542 SCSI host adapters allow the user to configure their bus
   access speed in software. Previous versions of the 1542 driver tried to
   determine the fastest usable speed and set the adapter to that. We found
   that this breaks some users' systems, so you now have to define the
   TUNE_1542 kernel configuration option in order to have this take place.
   Using it on those systems where it works may make your disks run faster,
   but on those systems where it does not, your data could be corrupted.

   18.7. Can I follow -CURRENT with limited Internet access?

   Yes, you can do this without downloading the whole source tree by using
   the CTM facility.

   18.8. How did you split the distribution into 240k files?

   Newer BSD based systems have a -b option to split that allows them to
   split files on arbitrary byte boundaries.

   Here is an example from /usr/src/Makefile.

     bin-tarball:
     (cd ${DISTDIR}; \
     tar cf - . \
     gzip --no-name -9 -c | \
     split -b 240640 - \
     ${RELEASEDIR}/tarballs/bindist/bin_tgz.)

   18.9. I have written a kernel extension, who do I send it to?

   Please take a look at the article on Contributing to FreeBSD to learn how
   to submit code.

   And thanks for the thought!

   18.10. How are Plug N Play ISA cards detected and initialized?

   By: Frank Durda IV <uhclem@nemesis.lonestar.org>

   In a nutshell, there a few I/O ports that all of the PnP boards respond to
   when the host asks if anyone is out there. So when the PnP probe routine
   starts, it asks if there are any PnP boards present, and all the PnP
   boards respond with their model # to a I/O read of the same port, so the
   probe routine gets a wired-OR ``yes'' to that question. At least one bit
   will be on in that reply. Then the probe code is able to cause boards with
   board model IDs (assigned by Microsoft/Intel) lower than X to go
   ``off-line''. It then looks to see if any boards are still responding to
   the query. If the answer was 0, then there are no boards with IDs above X.
   Now probe asks if there are any boards below X. If so, probe knows there
   are boards with a model numbers below X. Probe then asks for boards
   greater than X-(limit/4) to go off-line. If repeats the query. By
   repeating this semi-binary search of IDs-in-range enough times, the
   probing code will eventually identify all PnP boards present in a given
   machine with a number of iterations that is much lower than what 2^64
   would take.

   The IDs are two 32-bit fields (hence 2^64) + 8 bit checksum. The first 32
   bits are a vendor identifier. They never come out and say it, but it
   appears to be assumed that different types of boards from the same vendor
   could have different 32-bit vendor ids. The idea of needing 32 bits just
   for unique manufacturers is a bit excessive.

   The lower 32 bits are a serial #, Ethernet address, something that makes
   this one board unique. The vendor must never produce a second board that
   has the same lower 32 bits unless the upper 32 bits are also different. So
   you can have multiple boards of the same type in the machine and the full
   64 bits will still be unique.

   The 32 bit groups can never be all zero. This allows the wired-OR to show
   non-zero bits during the initial binary search.

   Once the system has identified all the board IDs present, it will
   reactivate each board, one at a time (via the same I/O ports), and find
   out what resources the given board needs, what interrupt choices are
   available, etc. A scan is made over all the boards to collect this
   information.

   This info is then combined with info from any ECU files on the hard disk
   or wired into the MLB BIOS. The ECU and BIOS PnP support for hardware on
   the MLB is usually synthetic, and the peripherals do not really do genuine
   PnP. However by examining the BIOS info plus the ECU info, the probe
   routines can cause the devices that are PnP to avoid those devices the
   probe code cannot relocate.

   Then the PnP devices are visited once more and given their I/O, DMA, IRQ
   and Memory-map address assignments. The devices will then appear at those
   locations and remain there until the next reboot, although there is
   nothing that says you cannot move them around whenever you want.

   There is a lot of oversimplification above, but you should get the general
   idea.

   Microsoft took over some of the primary printer status ports to do PnP, on
   the logic that no boards decoded those addresses for the opposing I/O
   cycles. I found a genuine IBM printer board that did decode writes of the
   status port during the early PnP proposal review period, but MS said
   ``tough''. So they do a write to the printer status port for setting
   addresses, plus that use that address + 0x800, and a third I/O port for
   reading that can be located anywhere between 0x200 and 0x3ff.

   18.11. Can you assign a major number for a device driver I have written?

   This depends on whether or not you plan on making the driver publicly
   available. If you do, then please send us a copy of the driver source
   code, plus the appropriate modifications to files.i386, a sample
   configuration file entry, and the appropriate MAKEDEV(8) code to create
   any special files your device uses. If you do not, or are unable to
   because of licensing restrictions, then character major number 32 and
   block major number 8 have been reserved specifically for this purpose;
   please use them. In any case, we would appreciate hearing about your
   driver on FreeBSD technical discussions mailing list
   <freebsd-hackers@FreeBSD.org>.

   18.12. What about alternative layout policies for directories?

   In answer to the question of alternative layout policies for directories,
   the scheme that is currently in use is unchanged from what I wrote in
   1983. I wrote that policy for the original fast filesystem, and never
   revisited it. It works well at keeping cylinder groups from filling up. As
   several of you have noted, it works poorly for find. Most filesystems are
   created from archives that were created by a depth first search (aka ftw).
   These directories end up being striped across the cylinder groups thus
   creating a worst possible scenario for future depth first searches. If one
   knew the total number of directories to be created, the solution would be
   to create (total / fs_ncg) per cylinder group before moving on. Obviously,
   one would have to create some heuristic to guess at this number. Even
   using a small fixed number like say 10 would make an order of magnitude
   improvement. To differentiate restores from normal operation (when the
   current algorithm is probably more sensible), you could use the clustering
   of up to 10 if they were all done within a ten second window. Anyway, my
   conclusion is that this is an area ripe for experimentation.

   Kirk McKusick, September 1998

   18.13. How can I make the most of the data I see when my kernel panics?

   [This section was extracted from a mail written by Bill Paul
   <wpaul@FreeBSD.org> on the freebsd-current mailing list by Dag-Erling C.
   Smo/rgrav <des@FreeBSD.org>, who fixed a few typos and added the bracketed
   comments]

     From: Bill Paul <wpaul@skynet.ctr.columbia.edu>
     Subject: Re: the fs fun never stops
     To: Ben Rosengart
     Date: Sun, 20 Sep 1998 15:22:50 -0400 (EDT)
     Cc: current@FreeBSD.org

   Ben Rosengart posted the following panic message]

     > Fatal trap 12: page fault while in kernel mode
     > fault virtual address   = 0x40
     > fault code              = supervisor read, page not present
     > instruction pointer     = 0x8:0xf014a7e5
                                     ^^^^^^^^^^
     > stack pointer           = 0x10:0xf4ed6f24
     > frame pointer           = 0x10:0xf4ed6f28
     > code segment            = base 0x0, limit 0xfffff, type 0x1b
     >                         = DPL 0, pres 1, def32 1, gran 1
     > processor eflags        = interrupt enabled, resume, IOPL = 0
     > current process         = 80 (mount)
     > interrupt mask          =
     > trap number             = 12
     > panic: page fault

   [When] you see a message like this, it is not enough to just reproduce it
   and send it in. The instruction pointer value that I highlighted up there
   is important; unfortunately, it is also configuration dependent. In other
   words, the value varies depending on the exact kernel image that you are
   using. If you are using a GENERIC kernel image from one of the snapshots,
   then it is possible for somebody else to track down the offending
   function, but if you are running a custom kernel then only you can tell us
   where the fault occurred.

   What you should do is this:

    1. Write down the instruction pointer value. Note that the 0x8: part at
       the beginning is not significant in this case: it is the 0xf0xxxxxx
       part that we want.

    2. When the system reboots, do the following:

     % nm -n /kernel.that.caused.the.panic | grep f0xxxxxx

       where f0xxxxxx is the instruction pointer value. The odds are you will
       not get an exact match since the symbols in the kernel symbol table
       are for the entry points of functions and the instruction pointer
       address will be somewhere inside a function, not at the start. If you
       do not get an exact match, omit the last digit from the instruction
       pointer value and try again, i.e.:

     % nm -n /kernel.that.caused.the.panic | grep f0xxxxx

       If that does not yield any results, chop off another digit. Repeat
       until you get some sort of output. The result will be a possible list
       of functions which caused the panic. This is a less than exact
       mechanism for tracking down the point of failure, but it is better
       than nothing.

   I see people constantly show panic messages like this but rarely do I see
   someone take the time to match up the instruction pointer with a function
   in the kernel symbol table.

   The best way to track down the cause of a panic is by capturing a crash
   dump, then using gdb(1) to generate a stack trace on the crash dump.

   In any case, the method I normally use is this:

    1. Set up a kernel config file, optionally adding options DDB if you
       think you need the kernel debugger for something. (I use this mainly
       for setting breakpoints if I suspect an infinite loop condition of
       some kind.)

    2. Use config -g KERNELCONFIG to set up the build directory.

    3. cd /sys/compile/ KERNELCONFIG; make

    4. Wait for kernel to finish compiling.

    5. make install

    6. reboot

   The make(1) process will have built two kernels. kernel and kernel.debug.
   kernel was installed as /kernel, while kernel.debug can be used as the
   source of debugging symbols for gdb(1).

   To make sure you capture a crash dump, you need edit /etc/rc.conf and set
   dumpdev to point to your swap partition. This will cause the rc(8) scripts
   to use the dumpon(8) command to enable crash dumps. You can also run
   dumpon(8) manually. After a panic, the crash dump can be recovered using
   savecore(8); if dumpdev is set in /etc/rc.conf, the rc(8) scripts will run
   savecore(8) automatically and put the crash dump in /var/crash.

     Note: FreeBSD crash dumps are usually the same size as the physical RAM
     size of your machine. That is, if you have 64MB of RAM, you will get a
     64MB crash dump. Therefore you must make sure there is enough space in
     /var/crash to hold the dump. Alternatively, you run savecore(8) manually
     and have it recover the crash dump to another directory where you have
     more room. It is possible to limit the size of the crash dump by using
     options MAXMEM=(foo) to set the amount of memory the kernel will use to
     something a little more sensible. For example, if you have 128MB of RAM,
     you can limit the kernel's memory usage to 16MB so that your crash dump
     size will be 16MB instead of 128MB.

   Once you have recovered the crash dump, you can get a stack trace with
   gdb(1) as follows:

     % gdb -k /sys/compile/KERNELCONFIG/kernel.debug /var/crash/vmcore.0
     (gdb) where

   Note that there may be several screens worth of information; ideally you
   should use script(1) to capture all of them. Using the unstripped kernel
   image with all the debug symbols should show the exact line of kernel
   source code where the panic occurred. Usually you have to read the stack
   trace from the bottom up in order to trace the exact sequence of events
   that lead to the crash. You can also use gdb(1) to print out the contents
   of various variables or structures in order to examine the system state at
   the time of the crash.

   Now, if you are really insane and have a second computer, you can also
   configure gdb(1) to do remote debugging such that you can use gdb(1) on
   one system to debug the kernel on another system, including setting
   breakpoints, single-stepping through the kernel code, just like you can do
   with a normal user-mode program. I have not played with this yet as I do
   not often have the chance to set up two machines side by side for
   debugging purposes.

   [Bill adds: "I forgot to mention one thing: if you have DDB enabled and
   the kernel drops into the debugger, you can force a panic (and a crash
   dump) just by typing 'panic' at the ddb prompt. It may stop in the
   debugger again during the panic phase. If it does, type 'continue' and it
   will finish the crash dump." -ed]

   18.14. Why has dlsym() stopped working for ELF executables?

   The ELF toolchain does not, by default, make the symbols defined in an
   executable visible to the dynamic linker. Consequently dlsym() searches on
   handles obtained from calls to dlopen(NULL, flags) will fail to find such
   symbols.

   If you want to search, using dlsym(), for symbols present in the main
   executable of a process, you need to link the executable using the
   -export-dynamic option to the ELF linker (ld(1)).

   18.15. How can I increase or reduce the kernel address space?

   By default, the kernel address space is 256 MB on FreeBSD 3.X and 1 GB on
   FreeBSD 4.X. If you run a network-intensive server (e.g. a large FTP or
   HTTP server), you might find that 256 MB is not enough.

   So how do you increase the address space? There are two aspects to this.
   First, you need to tell the kernel to reserve a larger portion of the
   address space for itself. Second, since the kernel is loaded at the top of
   the address space, you need to lower the load address so it does not bump
   its head against the ceiling.

   The first goal is achieved by increasing the value of NKPDE in
   src/sys/i386/include/pmap.h. Here is what it looks like for a 1 GB address
   space:

     #ifndef NKPDE
     #ifdef SMP
     #define NKPDE                   254     /* addressable number of page tables/pde's */
     #else
     #define NKPDE                   255     /* addressable number of page tables/pde's */
     #endif  /* SMP */
     #endif

   To find the correct value of NKPDE, divide the desired address space size
   (in megabytes) by four, then subtract one for UP and two for SMP.

   To achieve the second goal, you need to compute the correct load address:
   simply subtract the address space size (in bytes) from 0x100100000; the
   result is 0xc0100000 for a 1 GB address space. Set LOAD_ADDRESS in
   src/sys/i386/conf/Makefile.i386 to that value; then set the location
   counter in the beginning of the section listing in
   src/sys/i386/conf/kernel.script to the same value, as follows:

     OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
     OUTPUT_ARCH(i386)
     ENTRY(btext)
     SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/obj/elf/home/src/tmp/usr/i386-unknown-freebsdelf/lib);
     SECTIONS
     {
       /* Read-only sections, merged into text segment: */
       . = 0xc0100000 + SIZEOF_HEADERS;
       .interp     : { *(.interp)    }

   Then reconfig and rebuild your kernel. You will probably have problems
   with ps(1) top(1) and the like; make world should take care of it (or a
   manual rebuild of libkvm, ps(1) and top(1) after copying the patched
   pmap.h to /usr/include/vm/.

   NOTE: the size of the kernel address space must be a multiple of four
   megabytes.

   [David Greenman <dg@FreeBSD.org> adds: I think the kernel address space
   needs to be a power of two, but I am not certain about that. The old(er)
   boot code used to monkey with the high order address bits and I think
   expected at least 256MB granularity.]

     ----------------------------------------------------------------------

                           Chapter 19 Acknowledgments

     If you see a problem with this FAQ, or wish to submit an entry, please   
     mail the FAQ Maintainer <faq@FreeBSD.org>. We appreciate your          
     feedback, and cannot make this a better FAQ without your help!         
                                                        --FreeBSD Core Team   

   Jordan K. Hubbard <jkh@FreeBSD.org>

           Occasional fits of FAQ-reshuffling and updating.

   Doug White <dwhite@FreeBSD.org>

           Services above and beyond the call of duty on freebsd-questions

   Jo:rg Wunsch <joerg@FreeBSD.org>

           Services above and beyond the call of duty on Usenet

   Garrett Wollman <wollman@FreeBSD.org>

           Networking and formatting

   Jim Lowe

           Multicast information

   Peter da Silva <pds@FreeBSD.org>

           FreeBSD FAQ typing machine slavey

   The FreeBSD Team

           Kvetching, moaning, submitting data

   And to any others we have forgotten, apologies and heartfelt thanks!

     ----------------------------------------------------------------------

                                  Bibliography

   FreeBSD Unleashed, Michael Urban and Brian Tiemann, Sams, 1st Edition,
   992, October 2001, ISBN 0-67232-206-4.

   4.4BSD System Manager's Manual, Computer Systems Research Group,
   University of California, Berkeley, O'Reilly and Associates, 1st Edition,
   June 1994, 804 pages, ISBN 1-56592-080-5.

   4.4BSD User's Reference Manual, Computer Systems Research Group,
   University of California, Berkeley, O'Reilly and Associates, 1st Edition,
   June 1994, 905 pages, ISBN 1-56592-075-9.

   4.4BSD User's Supplementary Documents, Computer Systems Research Group,
   University of California, Berkeley, O'Reilly and Associates, 1st Edition,
   June 1994, 712 pages, ISBN 1-56592-076-7.

   4.4BSD Programmer's Reference Manual, Computer Systems Research Group,
   University of California, Berkeley, O'Reilly and Associates, 1st Edition,
   June 1994, 866 pages, ISBN 1-56592-078-3.

   4.4BSD Programmer's Supplementary Documents, Computer Systems Research
   Group, University of California, Berkeley, O'Reilly and Associates, 1st
   Edition, June 1994, 596 pages, ISBN 1-56592-079-1.

   The Design and Implementation of the 4.4BSD Operating System, M. K.
   McKusick, Kirk Marshall, Keith Bostic, Michael J Karels, and John
   Quarterman, Addison-Wesley, Reading, 1996, ISBN 0-201-54979-4.

   Unix System Administration Handbook, Evi Nemeth, Garth Snyder, Scott
   Seebass, Trent R. Hein, and John Quarterman, Prentice-Hall, 3rd edition,
   2000, ISBN 0-13-020601-6.

   The Complete FreeBSD, Greg Lehey, Walnut Creek, 3rd edition, June 1999,
   773 pages, ISBN 1-57176-246-9.

   The FreeBSD Handbook, FreeBSD Documentation Project, BSDi, 1st Edition,
   November 1999, 489 pages, ISBN 1-57176-241-8.

   [McKusick et al, 1994] Berkeley Software Architecture Manual, 4.4BSD
   Edition, M. K. McKusick, M. J. Karels, S. J. Leffler, W. N. Joy, and R. S.
   Faber, 5:1-42.

   FreeBSD for PC 98'ers (in Japanese), SHUWA System Co, LTD., ISBN
   4-87966-468-5 C3055 P2900E.

   FreeBSD (in Japanese), CUTT, ISBN 4-906391-22-2.

   Complete Introduction to FreeBSD (in Japanese), Shoeisha Co., Ltd, ISBN
   4-88135-473-6 P3600E.

   Personal UNIX Starter Kit FreeBSD (in Japanese), ASCII, ISBN 4-7561-1733-3
   P3000E.

   FreeBSD Handbook (Japanese translation), ASCII, ISBN 4-7561-1580-2 P3800E.

   FreeBSD mit Methode (in German), Computer und Literature Verlag/Vertrieb
   Hanser, 1998, ISBN 3-932311-31-0.

   FreeBSD install and Utilization Manual (in Japanese), Mainichi
   Communications Inc..

   Building Internet Server with FreeBSD (in Indonesia Language), Elex Media
   Komputindo, Onno W Purbo, Dodi Maryanto, Syahrial Hubbany, Widjil Widodo.

   The FreeBSD Corporate Networker's Guide, Addison-Wesley.

   UNIX in a Nutshell, O'Reilly & Associates, Inc., 1990, ISBN 093717520X.

   What You Need To Know When You Can't Find Your Unix System Administrator,
   O'Reilly & Associates, Inc., 1995, Linda Mui, ISBN 1-56592-104-6.

   FreeBSD User's Reference Manual (Japanese translation), Mainichi
   Communications Inc., Jpman Project, Japan FreeBSD Users Group, 1998, ISBN
   4-8399-0088-4 P3800E.

   Online Guide for newcomers to the UNIX environment, Edinburgh University.

   DNS and BIND, O'Reilly & Associates, Inc, ISBN 1-56592-512-2, Paul Albitz
   Albitz, Cricket Liu, 1998, 3rd.

   Sendmail, O'Reilly & Associates, Inc, 1997, 2nd, Brian Costales, ISBN
   1-56592-222-0.

   Essential System Administration, AEleen Frisch, 2nd, O'Reilly &
   Associates, 1995, ISBN 1-56592-127-5.

   TCP/IP Network Administration, Craig Hunt, 2nd, O'Reilly & Associates,
   Inc, 1997, ISBN 1-56592-322-7.

   UNIX System Administration Handbook, Evi Nemeth, 2000, Prentice Hall, 3rd,
   ISBN 0-13-020601-6.

   Managing NFS and NIS, Hal Stern, O'Reilly & Associates, Inc, 1991, ISBN
   0-937175-75-7.

   FreeBSD System Administration's Manual, Jpman Project, Japan FreeBSD Users
   Group, Mainichi Communications Inc., 1998, ISBN 4-8399-0109-0 P3300E.

   X Window System Toolkit, Digital Press, Paul Asente, ISBN 1-55558-051-3.

   C: A Reference Manual, Prentice Hall, 1995, 4th, Samuel P. Harbison, Guy
   L. Jr. Steele, ISBN 0-13-326224-3.

   The C Programming Language, Prentice Hall, 1998, Brian, Kernighan and
   Dennis Ritchie, ISBN 0-13-110362-9.

   Porting UNIX Software, Greg Lehey, O'Reilly & Associates, Inc., 1995, ISBN
   1-56592-126-7.

   The Standard C Library, Prentice Hall, 1992, P. J. Plauger, ISBN
   0-13-131509-9.

   Advanced Programming in the UNIX Environment, Addison-Wesley, 1992, W.
   Richard Stevens, ISBN 0-201-56317-7.

   UNIX Network Programming, W. Richard Stevens, Prentice Hall, 1998, 2nd,
   ISBN 0-13-490012-X.

   Writing Serial Drivers for UNIX, Bill Wells, December 1994, Dr. Dobb's
   Journal, pp68-71, pp97-99.

   UNIX System Architecture, Prentice-Hall, Inc, 1990, Prabhat K. Andleigh,
   ISBN 0-13-949843-5.

   Porting UNIX to the 386, William Jolitz, Dr. Dobb's Journal, January
   1991-July 1992.

   TCP/IP Illustrated, Volume 1: The Protocols, W. Richard Stevens,
   Addison-Wesley, 1996, ISBN 0-201-63346-9.

   Unix Systems for Modern Architectures, Addison-Wesley, Curt Schimmel,
   1994, ISBN 0-201-63338-8.

   TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP and the
   UNIX Domain Protocols, Addison-Wesley, 1996, W. Richard Stevens, ISBN
   0-201-63495-3.

   UNIX Internals -- The New Frontiers, Uresh Vahalia, Prentice Hall, 1996,
   ISBN 0-13-101908-2.

   TCP/IP Illustrated, Volume 2: The Implementation, Gary R. Wright, W.
   Richard Stevens, 1995, Addison-Wesley, ISBN 0-201-63354-X.

   Firewalls and Internet Security: Repelling the Wily Hacker, William R.
   CHeswick, Steven M. Bellovin, Addison-Wesley, 1995, ISBN 0-201-63357-4.

   Practical UNIX Security, Simson Garfinkel, Gene Spafford, 1996, 2nd,
   O'Reilly & Associates, Inc, ISBN 1-56592-148-8.

   PGP Pretty Good Privacy, Simson Garfinkel, O'Reilly & Associates, Inc,
   1995, ISBN 1-56592-098-8.

   Pentium Processor System Architecture, Don Anderson, Tom Shanley,
   Addison-Wesley, 1995, 2nd, ISBN 0-201-40992-5.

   Programmer's Guide to the EGA, VGA, and Super VGA Cards, Richard F.
   Ferraro, 3rd, Addison-Wesley, 1995, ISBN 0-201-62490-7.

   80486 System Architecture, Tom Shanley, Addison-Wesley, 1995, 3rd, ISBN
   0-201-40994-1.

   ISA System Architecture, Tom Shanley, Addison-Wesley, 3rd, 1995, ISBN
   0-201-40996-8.

   PCI System Architecture, Tom Shanley, Addison-Wesley, 1995, 3rd, ISBN
   0-201-40993-3.

   The Undocumented PC, Frank Van Gilluwe, Addison-Wesley, 1994, ISBN
   0-201-62277-7.

   Lion's Commentary on UNIX, John Lion, ITP Media Group, 1996, 6th, ISBN
   1573980137.

   The New Hacker's Dictionary, Eric S. Raymond, MIT Press, 1996, 3rd, ISBN
   0-262-68092-0.

   A quarter century of UNIX, Peter H. Salus, Addison-Wesley, 1994, ISBN
   0-201-54777-5.

   The UNIX-HATERS Handbook, Steven Strassman, Daniel Weise, Simon Garfinkel,
   IDG Books Worldwide, Inc, 1994, ISBN 1-56884-203-1.

   Life with UNIX -- special edition, Don Libes, Sandy Ressler,
   Prentice-Hall, 1989, ISBN 0-13-536657-7.

   The BSD Family Tree, 1997.

   The C/C++ Users Journal, R&D Publications Inc., ISSN 1075-2838.

   Sys Admin -- The Journal for UNIX System Administrators, Miller Freeman,
   Inc, ISSN 1061-2688.

  Notes

   [1] In an e-mail from Keith Frechette <kfrechet@us.ibm.com>.               

     ----------------------------------------------------------------------

               This, and other documents, can be downloaded from
                    ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

     For questions about FreeBSD, read the documentation before contacting
                            <questions@FreeBSD.org>.
       For questions about this documentation, e-mail <doc@FreeBSD.org>.
