(Edited.)
authornmatavka <nmatavka@web>
Sun, 12 Jan 2014 10:30:06 +0000 (10:30 +0000)
committerCharlie Root <root@leaf.dragonflybsd.org>
Sun, 12 Jan 2014 10:30:06 +0000 (10:30 +0000)
nmatavka/index.mdwn

index 74de9c0..fddac04 100644 (file)
@@ -4105,1610 +4105,8148 @@ To power down a DragonFly machine on architectures and systems that support powe
 
 <!-- this section needs the info about sernos and vfs.mountrootfrom or whatever it's called -->
 
-# The DragonFly Booting Process 
+# Users and Basic Account Management 
+
+***Contributed by Neil Blakey-Milner. ***
+
 [[!toc  levels=3]]
 
 ## Synopsis 
 
-The process of starting a computer and loading the operating system is referred to as ***the bootstrap process***, or simply ***booting***. DragonFly's boot process provides a great deal of flexibility in customizing what happens when you start the system, allowing you to select from different operating systems installed on the same computer, or even different versions of the same operating system or installed kernel.
-
-This chapter details the configuration options you can set and how to customize the DragonFly boot process. This includes everything that happens until the DragonFly kernel has started, probed for devices, and started [init(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#init&section8). If you are not quite sure when this happens, it occurs when the text color changes from bright white to grey.
+DragonFly allows multiple users to use the computer at the same time. Obviously, only one of those users can be sitting in front of the screen and keyboard at any one time [(1)](#FTN.AEN6502), but any number of users can log in through the network to get their work done. To use the system every user must have an account.
 
 After reading this chapter, you will know:
 
-* What the components of the DragonFly bootstrap system are, and how they interact.
+* The differences between the various user accounts on a DragonFly system.
 
-* The options you can give to the components in the DragonFly bootstrap to control the boot process.
+* How to add user accounts.
 
-* The basics of [device.hints(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#device.hints&section5&manpath=FreeBSD+5.2-current).
+* How to remove user accounts.
 
- **x86 Only:** This chapter only describes the boot process for DragonFly running on x86 systems.
+* How to change account details, such as the user's full name, or preferred shell.
 
-## The Booting Problem 
+* How to set limits on a per-account basis, to control the resources such as memory and CPU time that accounts and groups of accounts are allowed to access.
 
-Turning on a computer and starting the operating system poses an interesting dilemma. By definition, the computer does not know how to do anything until the operating system is started. This includes running programs from the disk. So if the computer can not run a program from the disk without the operating system, and the operating system programs are on the disk, how is the operating system started?
+* How to use groups to make account management easier.
 
-This problem parallels one in the book ***The Adventures of Baron Munchausen***. A character had fallen part way down a manhole, and pulled himself out by grabbing his bootstraps, and lifting. In the early days of computing the term ***bootstrap*** was applied to the mechanism used to load the operating system, which has become shortened to ***booting***.
+Before reading this chapter, you should:
 
-On x86 hardware the Basic Input/Output System (BIOS) is responsible for loading the operating system. To do this, the BIOS looks on the hard disk for the Master Boot Record (MBR), which must be located on a specific place on the disk. The BIOS has enough knowledge to load and run the MBR, and assumes that the MBR can then carry out the rest of the tasks involved in loading the operating system possibly with the help of the BIOS.
+* Understand the basics of UNIX® and DragonFly ([Chapter 3](basics.html)).
 
-The code within the MBR is usually referred to as a ***boot manager***, especially when it interacts with the user. In this case the boot manager usually has more code in the first ***track*** of the disk or within some OS's file system. (A boot manager is sometimes also called a ***boot loader***, but FreeBSD uses that term for a later stage of booting.) Popular boot managers include  **boot0**  (a.k.a.  **Boot Easy** , the standard DragonFly boot manager),  **Grub** ,  **GAG** , and  **LILO** . (Only  **boot0**  fits within the MBR.)
+## Introduction 
 
-If you have only one operating system installed on your disks then a standard PC MBR will suffice. This MBR searches for the first bootable (a.k.a. active) slice on the disk, and then runs the code on that slice to load the remainder of the operating system. The MBR installed by [fdisk(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=fdisk&section=8), by default, is such an MBR. It is based on `/boot/mbr`.
+All access to the system is achieved via accounts, and all processes are run by users, so user and account management are of integral importance on DragonFly systems.
 
-If you have installed multiple operating systems on your disks then you can install a different boot manager, one that can display a list of different operating systems, and allows you to choose the one to boot from. Two of these are discussed in the next subsection.
+Every account on a DragonFly system has certain information associated with it to identify the account.
 
-The remainder of the DragonFly bootstrap system is divided into three stages. The first stage is run by the MBR, which knows just enough to get the computer into a specific state and run the second stage. The second stage can do a little bit more, before running the third stage. The third stage finishes the task of loading the operating system. The work is split into these three stages because the PC standards put limits on the size of the programs that can be run at stages one and two. Chaining the tasks together allows DragonFly to provide a more flexible loader.
+* User name: The user name as it would be typed at the login: prompt. User names must be unique across the computer; you may not have two users with the same user name. There are a number of rules for creating valid user names, documented in [passwd(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=passwd&section=5); you would typically use user names that consist of eight or fewer all lower case characters.Password:: Each account has a password associated with it. The password may be blank, in which case no password will be required to access the system. This is normally a very bad idea; every account should have a password.
 
-The kernel is then started and it begins to probe for devices and initialize them for use. Once the kernel boot process is finished, the kernel passes control to the user process [init(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=init&section=8), which then makes sure the disks are in a usable state. [init(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=init&section=8) then starts the user-level resource configuration which mounts file systems, sets up network cards to communicate on the network, and generally starts all the processes that usually are run on a DragonFly system at startup.
+* User ID (UID): The UID is a number, traditionally from 0 to 65535[(1)](#FTN.USERS-LARGEUIDGID), used to uniquely identify the user to the system. Internally, DragonFly uses the UID to identify users--any DragonFly commands that allow you to specify a user name will convert it to the UID before working with it. This means that you can have several accounts with different user names but the same UID. As far as DragonFly is concerned, these accounts are one user. It is unlikely you will ever need to do this.
 
-----
+* Group ID (GID): The GID is a number, traditionally from 0 to 65535[users-introduction.html#FTN.USERS-LARGEUIDGID (1)], used to uniquely identify the primary group that the user belongs to. Groups are a mechanism for controlling access to resources based on a user's GID rather than their UID. This can significantly reduce the size of some configuration files. A user may also be in more than one group.
 
-## The Boot Manager and Boot Stages 
+* Login class: Login classes are an extension to the group mechanism that provide additional flexibility when tailoring the system to different users.
 
-### The Boot Manager 
+* Password change time: By default DragonFly does not force users to change their passwords periodically. You can enforce this on a per-user basis, forcing some or all of your users to change their passwords after a certain amount of time has elapsed.
 
-The code in the MBR or boot manager is sometimes referred to as ***stage zero*** of the boot process. This subsection discusses two of the boot managers previously mentioned:  **boot0**  and  **LILO** .
+* Account expiry time: By default DragonFly does not expire accounts. If you are creating accounts that you know have a limited lifespan, for example, in a school where you have accounts for the students, then you can specify when the account expires. After the expiry time has elapsed the account cannot be used to log in to the system, although the account's directories and files will remain.
 
- **The** boot0 ** Boot Manager:** The MBR installed by FreeBSD's installer or [boot0cfg(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=boot0cfg&section=8), by default, is based on `/boot/boot0`. (The  **boot0**  program is very simple, since the program in the MBR can only be 446 bytes long because of the slice table and `0x55AA` identifier at the end of the MBR.) If you have installed  **boot0**  and multiple operating systems on your hard disks, then you will see a display similar to this one at boot time:
+* User's full name: The user name uniquely identifies the account to DragonFly, but does not necessarily reflect the user's real name. This information can be associated with the account.
 
- **Example 7-1. `boot0` Screenshot** 
+* Home directory: The home directory is the full path to a directory on the system in which the user will start when logging on to the system. A common convention is to put all user home directories under `/home/`***username***. The user would store their personal files in their home directory, and any directories they may create in there.
 
-    
+* User shell: The shell provides the default environment users use to interact with the system. There are many different kinds of shells, and experienced users will have their own preferences, which can be reflected in their account settings.
 
-    F1 DOS
+There are three main types of accounts: the Superuser, system users and user accounts. The Superuser account, usually called `root`, is used to manage the system with no limitations on privileges. System users run services. Finally, user accounts are used by real people, who log on, read mail, and so forth.
 
-    F2 FreeBSD
+## The Superuser Account 
 
-    F3 Linux
+The superuser account, usually called `root`, comes preconfigured to facilitate system administration, and should not be used for day-to-day tasks like sending and receiving mail, general exploration of the system, or programming.
 
-    F4 ??
+This is because the superuser, unlike normal user accounts, can operate without limits, and misuse of the superuser account may result in spectacular disasters. User accounts are unable to destroy the system by mistake, so it is generally best to use normal user accounts whenever possible, unless you especially need the extra privilege.
 
-    F5 Drive 1
+You should always double and triple-check commands you issue as the superuser, since an extra space or missing character can mean irreparable data loss.
 
-    
+So, the first thing you should do after reading this chapter is to create an unprivileged user account for yourself for general usage if you have not already. This applies equally whether you are running a multi-user or single-user machine. Later in this chapter, we discuss how to create additional accounts, and how to change between the normal user and superuser.
 
-    Default: F2
+## System Accounts 
 
-Other operating systems, in particular Windows®, have been known to overwrite an existing MBR with their own. If this happens to you, or you want to replace your existing MBR with the DragonFly MBR then use the following command:
+System users are those used to run services such as DNS, mail, web servers, and so forth. The reason for this is security; if all services ran as the superuser, they could act without restriction.
 
-    
+Examples of system users are `daemon`, `operator`, `bind` (for the Domain Name Service), and `news`. Often sysadmins create `httpd` to run web servers they install.
 
-    # fdisk -B -b /boot/boot0 device
+`nobody` is the generic unprivileged system user. However, it is important to keep in mind that the more services that use `nobody`, the more files and processes that user will become associated with, and hence the more privileged that user becomes.
 
-where `***device***` is the device that you boot from, such as `ad0` for the first IDE disk, `ad2` for the first IDE disk on a second IDE controller, `da0` for the first SCSI disk, and so on. Or, if you want a custom configuration of the MBR, use [boot0cfg(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=boot0cfg&section=8).
+## User Accounts 
 
- **The LILO Boot Manager:** To install this boot manager so it will also boot DragonFly, first start Linux and add the following to your existing `/etc/lilo.conf` configuration file:
+User accounts are the primary means of access for real people to the system, and these accounts insulate the user and the environment, preventing the users from damaging the system or other users, and allowing users to customize their environment without affecting others.
 
-    
+Every person accessing your system should have a unique user account. This allows you to find out who is doing what, prevent people from clobbering each others' settings or reading each others' mail, and so forth.
 
-    other=/dev/hdXY
+Each user can set up their own environment to accommodate their use of the system, by using alternate shells, editors, key bindings, and language.
 
-    table=/dev/hdX
+## Modifying Accounts 
 
-    loader=/boot/chain.b
+There are a variety of different commands available in the UNIX® environment to manipulate user accounts. The most common commands are summarized below, followed by more detailed examples of their usage.
 
-    label=DragonFly
+[[!table  data="""
+Command | Summary 
+ [adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8) | The recommended command-line application for adding new users. 
+ [rmuser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rmuser&section=8) | The recommended command-line application for removing users. 
+ [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1) | A flexible tool to change user database information. 
+ [passwd(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=passwd&section=1) | The simple command-line tool to change user passwords. 
+ [pw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=pw&section=8) | A powerful and flexible tool to modify all aspects of user accounts. |
 
-In the above, specify DragonFly's primary partition and drive using Linux specifiers, replacing `***X***` with the Linux drive letter and `***Y***` with the Linux primary partition number. If you are using a SCSI drive, you will need to change `***/dev/hd***` to read something similar to `***/dev/sd***`. The `loader=/boot/chain.b` line can be omitted if you have both operating systems on the same drive. Now run `/sbin/lilo -v` to commit your new changes to the system; this should be verified by checking its screen messages.
+"""]]
 
-### Stage One, /boot/boot1, and Stage Two, /boot/boot2 
+### adduser 
 
-Conceptually the first and second stages are part of the same program, on the same area of the disk. Because of space constraints they have been split into two, but you would always install them together. They are copied from the combined file `/boot/boot` by the installer or  **disklabel**  (see below).
+[adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8) is a simple program for adding new users. It creates entries in the system `passwd` and `group` files. It will also create a home directory for the new user, copy in the default configuration files (***dotfiles***) from `/usr/share/skel`, and can optionally mail the new user a welcome message.
 
-They are located outside file systems, in the first track of the boot slice, starting with the first sector. This is where [ boot0](boot-blocks.html#BOOT-BOOT0), or any other boot manager, expects to find a program to run which will continue the boot process. The number of sectors used is easily determined from the size of `/boot/boot`.
+To create the initial configuration file, use `adduser -s -config_create`. Next, we configure [adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8) defaults, and create our first user account, since using `root` for normal usage is evil and nasty.
 
-They are found on the boot sector of the boot slice, which is where [ boot0](boot-blocks.html#BOOT-BOOT0), or any other program on the MBR expects to find the program to run to continue the boot process. The files in the `/boot` directory are copies of the real files, which are stored outside of the DragonFly file system.
+ **Example 8-1. Configuring `adduser` and adding a user** 
 
-`boot1` is very simple, since it can only be 512 bytes in size, and knows just enough about the DragonFly ***disklabel***, which stores information about the slice, to find and execute `boot2`.
+   
 
-`boot2` is slightly more sophisticated, and understands the DragonFly file system enough to find files on it, and can provide a simple interface to choose the kernel or loader to run.
+    # adduser -v
 
-Since the [ loader](boot-blocks.html#BOOT-LOADER) is much more sophisticated, and provides a nice easy-to-use boot configuration, `boot2` usually runs it, but previously it was tasked to run the kernel directly.
+    Use option -silent if you don't want to see all warnings and questions.
 
- **Example 7-2. boot2 Screenshot** 
+    Check /etc/shells
 
-    
+    Check /etc/master.passwd
 
-    >> DragonFly/i386 BOOT
+    Check /etc/group
 
-    Default: 0:ad(0,a)/boot/loader
+    Enter your default shell: csh date no sh tcsh zsh [sh]: zsh
 
-    boot:
+    Your default shell is: zsh -&gt; /usr/local/bin/zsh
 
-If you ever need to replace the installed `boot1` and `boot2` use [disklabel(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel&section=8):
+    Enter your default HOME partition: [/home]:
 
-    
+    Copy dotfiles from: /usr/share/skel no [/usr/share/skel]:
 
-    # disklabel -B diskslice
+    Send message from file: /etc/adduser.message no
 
-where `***diskslice***` is the disk and slice you boot from, such as `ad0s1` for the first slice on the first IDE disk.
+    [/etc/adduser.message]: no
 
-### Stage Three, `/boot/loader` 
+    Do not send message
 
-The loader is the final stage of the three-stage bootstrap, and is located on the file system, usually as `/boot/loader`.
+    Use passwords (y/n) [y]: y
 
-The loader is intended as a user-friendly method for configuration, using an easy-to-use built-in command set, backed up by a more powerful interpreter, with a more complex command set.
+    
 
-#### Loader Program Flow 
+    Write your changes to /etc/adduser.conf? (y/n) [n]: y
 
-During initialization, the loader will probe for a console and for disks, and figure out what disk it is booting from. It will set variables accordingly, and an interpreter is started where user commands can be passed from a script or interactively.
+    
 
-The loader will then read `/boot/loader.rc`, which by default reads in `/boot/defaults/loader.conf` which sets reasonable defaults for variables and reads `/boot/loader.conf` for local changes to those variables. `loader.rc` then acts on these variables, loading whichever modules and kernel are selected.
+    Ok, let's go.
 
-Finally, by default, the loader issues a 10 second wait for key presses, and boots the kernel if it is not interrupted. If interrupted, the user is presented with a prompt which understands the easy-to-use command set, where the user may adjust variables, unload all modules, load modules, and then finally boot or reboot.
+    Don't worry about mistakes. I will give you the chance later to correct any input.
 
-#### Loader Built-In Commands 
+    Enter username [a-z0-9_-]: jru
 
-These are the most commonly used loader commands. For a complete discussion of all available commands, please see [loader(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=loader&section=8).
+    Enter full name []: J. Random User
 
-* autoboot `***seconds***`: Proceeds to boot the kernel if not interrupted within the time span given, in seconds. It displays a countdown, and the default time span is 10 seconds.
+    Enter shell csh date no sh tcsh zsh [zsh]:
 
-* boot [`***-options***`] [`***kernelname***`]: Immediately proceeds to boot the kernel, with the given options, if any, and with the kernel name given, if it is.
+    Enter home directory (full path) [/home/jru]:
 
-*boot-conf: Goes through the same automatic configuration of modules based on variables as what happens at boot. This only makes sense if you use `unload` first, and change some variables, most commonly `kernel`.
+    Uid [1001]:
 
-* help [`***topic***`]: Shows help messages read from `/boot/loader.help`. If the topic given is `index`, then the list of available topics is given.
+    Enter login class: default []:
 
-* include `***filename***` ...: Processes the file with the given filename. The file is read in, and interpreted line by line. An error immediately stops the include command.
+    Login group jru [jru]:
 
-* load [`-t` `***type***`] `***filename***`: Loads the kernel, kernel module, or file of the type given, with the filename given. Any arguments after filename are passed to the file.
+    Login group is ***jru***. Invite jru into other groups: guest no
 
-* ls [`-l`] [`***path***`]: Displays a listing of files in the given path, or the root directory, if the path is not specified. If `-l` is specified, file sizes will be shown too.
+    [no]: wheel
 
-* lsdev [`-v`]: Lists all of the devices from which it may be possible to load modules. If `-v` is specified, more details are printed.
+    Enter password []:
 
-* lsmod [`-v`]: Displays loaded modules. If `-v` is specified, more details are shown.
+    Enter password again []:
 
-* more `***filename***`: Displays the files specified, with a pause at each `LINES` displayed.
+    
 
-* reboot: Immediately reboots the system.
+    Name:        jru
 
-* set `***variable***`, set `***variable***`=`***value***`: Sets the loader's environment variables.
+    Password: ****
 
-* unload: Removes all loaded modules.
+    Fullname: J. Random User
 
-#### Loader Examples 
+    Uid:         1001
 
-Here are some practical examples of loader usage:
+    Gid:         1001 (jru)
 
-* To simply boot your usual kernel, but in single-user mode:
+    Class:
 
-      
+    Groups:      jru wheel
 
-          boot -s
+    HOME:     /home/jru
 
-  
+    Shell:       /usr/local/bin/zsh
 
-* To unload your usual kernel and modules, and then load just your old (or another) kernel:
+    OK? (y/n) [y]: y
 
-      
+    Added user ***jru***
 
-          unload
+    Copy files from /usr/share/skel to /home/jru
 
-          load kernel.old
+    Add another user? (y/n) [y]: n
 
-  
+    Goodbye!
 
-  You can use `kernel.GENERIC` to refer to the generic kernel that comes on the install disk, or `kernel.old` to refer to your previously installed kernel (when you have upgraded or configured your own kernel, for example).
+    #
 
-   **Note:** Use the following to load your usual modules with another kernel:
+In summary, we changed the default shell to  **zsh**  (an additional shell found in pkgsrc®), and turned off the sending of a welcome mail to added users. We then saved the configuration, created an account for `jru`, and made sure `jru` is in `wheel` group (so that she may assume the role of `root` with the [su(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=su&section=1) command.)
 
-      
+ **Note:** The password you type in is not echoed, nor are asterisks displayed. Make sure you do not mistype the password twice.
 
-          unload
+ **Note:** Just use [adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8) without arguments from now on, and you will not have to go through changing the defaults. If the program asks you to change the defaults, exit the program, and try the `-s` option.
 
-          set kernel="kernel.old"
+### rmuser 
 
-          boot-conf
+You can use [rmuser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rmuser&section=8) to completely remove a user from the system. [rmuser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rmuser&section=8) performs the following steps:
 
-  
+  1. Removes the user's [crontab(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=crontab&section=1) entry (if any).
 
-* To load a kernel configuration script (an automated script which does the things you would normally do in the kernel boot-time configurator):
+  1. Removes any [at(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=at&section=1) jobs belonging to the user.
 
-      
+  1. Kills all processes owned by the user.
 
-         load -t userconfig_script /boot/kernel.conf
+  1. Removes the user from the system's local password file.
 
-  
+  1. Removes the user's home directory (if it is owned by the user).
 
-----
+  1. Removes the incoming mail files belonging to the user from `/var/mail`.
 
-## Kernel Interaction During Boot 
+  1. Removes all files owned by the user from temporary file storage areas such as `/tmp`.
 
-Once the kernel is loaded by either [ loader](boot-blocks.html#BOOT-LOADER) (as usual) or [ boot2](boot-blocks.html#BOOT-BOOT1) (bypassing the loader), it examines its boot flags, if any, and adjusts its behavior as necessary.
+  1. Finally, removes the username from all groups to which it belongs in `/etc/group`.
 
-### Kernel Boot Flags 
+   **Note:** If a group becomes empty and the group name is the same as the username, the group is removed; this complements the per-user unique groups created by [adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8).
 
-Here are the more common boot flags:
+[rmuser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rmuser&section=8) cannot be used to remove superuser accounts, since that is almost always an indication of massive destruction.
 
-`-a`:: during kernel initialization, ask for the device to mount as the root file system.`-C`:: boot from CDROM.`-c`:: run UserConfig, the boot-time kernel configurator`-s`:: boot into single-user mode`-v`:: be more verbose during kernel startup
+By default, an interactive mode is used, which attempts to make sure you know what you are doing.
 
- **Note:** There are other boot flags; read [boot(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=boot&section=8) for more information on them.
+ **Example 8-2. `rmuser` Interactive Account Removal** 
 
-## Init: Process Control Initialization 
+    
 
-Once the kernel has finished booting, it passes control to the user process [init(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=init&section=8), which is located at `/sbin/init`, or the program path specified in the `init_path` variable in `loader`.
+    # rmuser jru
 
-### Automatic Reboot Sequence 
+    Matching password entry:
 
-The automatic reboot sequence makes sure that the file systems available on the system are consistent. If they are not, and [fsck(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=fsck&section=8) cannot fix the inconsistencies, [init(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=init&section=8) drops the system into [single-user mode](boot-init.html#BOOT-SINGLEUSER) for the system administrator to take care of the problems directly.
+    jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
 
-### Single-User Mode 
+    Is this the entry you wish to remove? y
 
-This mode can be reached through the [automatic reboot sequence](boot-init.html#BOOT-AUTOREBOOT), or by the user booting with the `-s` option or setting the `boot_single` variable in `loader`.
+    Remove user's home directory (/home/jru)? y
 
-It can also be reached by calling [shutdown(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=shutdown&section=8) without the reboot (`-r`) or halt (`-h`) options, from [multi-user mode](boot-init.html#BOOT-MULTIUSER).
+    Updating password file, updating databases, done.
 
-If the system `console` is set to `insecure` in `/etc/ttys`, then the system prompts for the `root` password before initiating single-user mode.
+    Updating group file: trusted (removing group jru -- personal group is empty) done.
 
-***'Example 7-3. An Insecure Console in `/etc/ttys`***'
+    Removing user's incoming mail file /var/mail/jru: done.
 
-    
+    Removing files belonging to jru from /tmp: done.
 
-    # name  getty                           type    status          comments
+    Removing files belonging to jru from /var/tmp: done.
+
+    Removing files belonging to jru from /var/tmp/vi.recover: done.
 
     #
 
-    # If console is marked "insecure", then init will ask for the root password
+### chpass 
 
-    # when going to single-user mode.
+[chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1) changes user database information such as passwords, shells, and personal information.
 
-    console none                            unknown off insecure
+Only system administrators, as the superuser, may change other users' information and passwords with [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1).
 
- **Note:** An `insecure` console means that you consider your physical security to the console to be insecure, and want to make sure only someone who knows the `root` password may use single-user mode, and it does not mean that you want to run your console insecurely. Thus, if you want security, choose `insecure`, not `secure`.
+When passed no options, aside from an optional username, [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1) displays an editor containing user information. When the user exists from the editor, the user database is updated with the new information.
 
-### Multi-User Mode 
+***'Example 8-3. Interactive `chpass` by Superuser***'
 
-If [init(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=init&section=8) finds your file systems to be in order, or once the user has finished in [single-user mode](boot-init.html#BOOT-SINGLEUSER), the system enters multi-user mode, in which it starts the resource configuration of the system.
+    
 
-#### Resource Configuration (rc) 
+    #Changing user database information for jru.
 
-The resource configuration system reads in configuration defaults from `/etc/defaults/rc.conf`, and system-specific details from `/etc/rc.conf`, and then proceeds to mount the system file systems mentioned in `/etc/fstab`, start up networking services, start up miscellaneous system daemons, and finally runs the startup scripts of locally installed packages.
+    Login: jru
 
-The [rc(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc&section=8) manual page is a good reference to the resource configuration system, as is examining the scripts themselves.
+    Password: *
 
-## Shutdown Sequence 
+    Uid [#]: 1001
 
-Upon controlled shutdown, via [shutdown(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=shutdown&section=8), [init(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=init&section=8) will attempt to run the script `/etc/rc.shutdown`, and then proceed to send all processes the `TERM` signal, and subsequently the `KILL` signal to any that do not terminate timely.
+    Gid [# or name]: 1001
 
-To power down a DragonFly machine on architectures and systems that support power management, simply use the command `shutdown -p now` to turn the power off immediately. To just reboot a DragonFly system, just use `shutdown -r now`. You need to be `root` or a member of `operator` group to run [shutdown(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=shutdown&section=8). The [halt(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=halt&section=8) and [reboot(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=reboot&section=8) commands can also be used, please refer to their manual pages and to [shutdown(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=shutdown&section=8)'s one for more information.
+    Change [month day year]:
 
- **Note:** Power management requires [acpi(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=acpi&section=4) support in the kernel or loaded as a module, or [apm(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=apm&section=4) support.
+    Expire [month day year]:
 
-<!-- this section needs the info about sernos and vfs.mountrootfrom or whatever it's called -->
+    Class:
 
-# Users and Basic Account Management 
+    Home directory: /home/jru
 
-***Contributed by Neil Blakey-Milner. ***
+    Shell: /usr/local/bin/zsh
 
-[[!toc  levels=3]]
+    Full Name: J. Random User
 
-## Synopsis 
+    Office Location:
 
-DragonFly allows multiple users to use the computer at the same time. Obviously, only one of those users can be sitting in front of the screen and keyboard at any one time [(1)](#FTN.AEN6502), but any number of users can log in through the network to get their work done. To use the system every user must have an account.
+    Office Phone:
 
-After reading this chapter, you will know:
+    Home Phone:
 
-* The differences between the various user accounts on a DragonFly system.
+    Other information:
 
-* How to add user accounts.
+The normal user can change only a small subset of this information, and only for themselves.
 
-* How to remove user accounts.
+ **Example 8-4. Interactive chpass by Normal User** 
 
-* How to change account details, such as the user's full name, or preferred shell.
+    
 
-* How to set limits on a per-account basis, to control the resources such as memory and CPU time that accounts and groups of accounts are allowed to access.
+    #Changing user database information for jru.
 
-* How to use groups to make account management easier.
+    Shell: /usr/local/bin/zsh
 
-Before reading this chapter, you should:
+    Full Name: J. Random User
 
-* Understand the basics of UNIX® and DragonFly ([Chapter 3](basics.html)).
+    Office Location:
 
-## Introduction 
+    Office Phone:
 
-All access to the system is achieved via accounts, and all processes are run by users, so user and account management are of integral importance on DragonFly systems.
+    Home Phone:
 
-Every account on a DragonFly system has certain information associated with it to identify the account.
+    Other information:
 
-* User name: The user name as it would be typed at the login: prompt. User names must be unique across the computer; you may not have two users with the same user name. There are a number of rules for creating valid user names, documented in [passwd(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=passwd&section=5); you would typically use user names that consist of eight or fewer all lower case characters.Password:: Each account has a password associated with it. The password may be blank, in which case no password will be required to access the system. This is normally a very bad idea; every account should have a password.
+ **Note:** [chfn(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chfn&section=1) and [chsh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chsh&section=1) are just links to [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1), as are [ypchpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ypchpass&section=1), [ypchfn(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ypchfn&section=1), and [ypchsh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ypchsh&section=1). NIS support is automatic, so specifying the `yp` before the command is not necessary. If this is confusing to you, do not worry, NIS will be covered in [advanced-networking.html Chapter 19].
 
-* User ID (UID): The UID is a number, traditionally from 0 to 65535[(1)](#FTN.USERS-LARGEUIDGID), used to uniquely identify the user to the system. Internally, DragonFly uses the UID to identify users--any DragonFly commands that allow you to specify a user name will convert it to the UID before working with it. This means that you can have several accounts with different user names but the same UID. As far as DragonFly is concerned, these accounts are one user. It is unlikely you will ever need to do this.
+### passwd 
 
-* Group ID (GID): The GID is a number, traditionally from 0 to 65535[users-introduction.html#FTN.USERS-LARGEUIDGID (1)], used to uniquely identify the primary group that the user belongs to. Groups are a mechanism for controlling access to resources based on a user's GID rather than their UID. This can significantly reduce the size of some configuration files. A user may also be in more than one group.
+[passwd(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=passwd&section=1) is the usual way to change your own password as a user, or another user's password as the superuser.
 
-* Login class: Login classes are an extension to the group mechanism that provide additional flexibility when tailoring the system to different users.
+ **Note:** To prevent accidental or unauthorized changes, the original password must be entered before a new password can be set.
 
-* Password change time: By default DragonFly does not force users to change their passwords periodically. You can enforce this on a per-user basis, forcing some or all of your users to change their passwords after a certain amount of time has elapsed.
+ **Example 8-5. Changing Your Password** 
 
-* Account expiry time: By default DragonFly does not expire accounts. If you are creating accounts that you know have a limited lifespan, for example, in a school where you have accounts for the students, then you can specify when the account expires. After the expiry time has elapsed the account cannot be used to log in to the system, although the account's directories and files will remain.
+    
 
-* User's full name: The user name uniquely identifies the account to DragonFly, but does not necessarily reflect the user's real name. This information can be associated with the account.
+    % passwd
 
-* Home directory: The home directory is the full path to a directory on the system in which the user will start when logging on to the system. A common convention is to put all user home directories under `/home/`***username***. The user would store their personal files in their home directory, and any directories they may create in there.
+    Changing local password for jru.
 
-* User shell: The shell provides the default environment users use to interact with the system. There are many different kinds of shells, and experienced users will have their own preferences, which can be reflected in their account settings.
+    Old password:
 
-There are three main types of accounts: the Superuser, system users and user accounts. The Superuser account, usually called `root`, is used to manage the system with no limitations on privileges. System users run services. Finally, user accounts are used by real people, who log on, read mail, and so forth.
+    New password:
 
-## The Superuser Account 
+    Retype new password:
 
-The superuser account, usually called `root`, comes preconfigured to facilitate system administration, and should not be used for day-to-day tasks like sending and receiving mail, general exploration of the system, or programming.
+    passwd: updating the database...
 
-This is because the superuser, unlike normal user accounts, can operate without limits, and misuse of the superuser account may result in spectacular disasters. User accounts are unable to destroy the system by mistake, so it is generally best to use normal user accounts whenever possible, unless you especially need the extra privilege.
+    passwd: done
 
-You should always double and triple-check commands you issue as the superuser, since an extra space or missing character can mean irreparable data loss.
+***'Example 8-6. Changing Another User's Password as the Superuser***'
 
-So, the first thing you should do after reading this chapter is to create an unprivileged user account for yourself for general usage if you have not already. This applies equally whether you are running a multi-user or single-user machine. Later in this chapter, we discuss how to create additional accounts, and how to change between the normal user and superuser.
+    
 
-## System Accounts 
+    # passwd jru
 
-System users are those used to run services such as DNS, mail, web servers, and so forth. The reason for this is security; if all services ran as the superuser, they could act without restriction.
+    Changing local password for jru.
 
-Examples of system users are `daemon`, `operator`, `bind` (for the Domain Name Service), and `news`. Often sysadmins create `httpd` to run web servers they install.
+    New password:
 
-`nobody` is the generic unprivileged system user. However, it is important to keep in mind that the more services that use `nobody`, the more files and processes that user will become associated with, and hence the more privileged that user becomes.
+    Retype new password:
 
-## User Accounts 
+    passwd: updating the database...
 
-User accounts are the primary means of access for real people to the system, and these accounts insulate the user and the environment, preventing the users from damaging the system or other users, and allowing users to customize their environment without affecting others.
+    passwd: done
 
-Every person accessing your system should have a unique user account. This allows you to find out who is doing what, prevent people from clobbering each others' settings or reading each others' mail, and so forth.
+ **Note:** As with [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1), [yppasswd(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=yppasswd&section=1) is just a link to [passwd(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=passwd&section=1), so NIS works with either command.
 
-Each user can set up their own environment to accommodate their use of the system, by using alternate shells, editors, key bindings, and language.
+### pw 
 
-## Modifying Accounts 
+[pw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=pw&section=8) is a command line utility to create, remove, modify, and display users and groups. It functions as a front end to the system user and group files. [pw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=pw&section=8) has a very powerful set of command line options that make it suitable for use in shell scripts, but new users may find it more complicated than the other commands presented here.
 
-There are a variety of different commands available in the UNIX® environment to manipulate user accounts. The most common commands are summarized below, followed by more detailed examples of their usage.
+#### Notes 
 
 [[!table  data="""
-Command | Summary 
- [adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8) | The recommended command-line application for adding new users. 
- [rmuser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rmuser&section=8) | The recommended command-line application for removing users. 
- [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1) | A flexible tool to change user database information. 
- [passwd(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=passwd&section=1) | The simple command-line tool to change user passwords. 
- [pw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=pw&section=8) | A powerful and flexible tool to modify all aspects of user accounts. |
-
+<tablestyle#"width:100%"> The `-s` makes [adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8) default to quiet. We use `-v` later when we want to change defaults. |
+| | 
 """]]
 
-### adduser 
-
-[adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8) is a simple program for adding new users. It creates entries in the system `passwd` and `group` files. It will also create a home directory for the new user, copy in the default configuration files (***dotfiles***) from `/usr/share/skel`, and can optionally mail the new user a welcome message.
-
-To create the initial configuration file, use `adduser -s -config_create`. Next, we configure [adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8) defaults, and create our first user account, since using `root` for normal usage is evil and nasty.
-
- **Example 8-1. Configuring `adduser` and adding a user** 
+## Limiting Users 
 
-   
+<!-- XXX: check this section, I got the feeling there might be something outdated in it. I'm not familiar with it -->
 
-    # adduser -v
+If you have users, the ability to limit their system use may have come to mind. DragonFly provides several ways an administrator can limit the amount of system resources an individual may use. These limits are divided into two sections: disk quotas, and other resource limits.
 
-    Use option -silent if you don't want to see all warnings and questions.
+Disk quotas limit disk usage to users, and they provide a way to quickly check that usage without calculating it every time. Quotas are discussed in [quotas.html Section 12.12].
 
-    Check /etc/shells
+The other resource limits include ways to limit the amount of CPU, memory, and other resources a user may consume. These are defined using login classes and are discussed here.
 
-    Check /etc/master.passwd
+Login classes are defined in `/etc/login.conf`. The precise semantics are beyond the scope of this section, but are described in detail in the [login.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=login.conf&section=5) manual page. It is sufficient to say that each user is assigned to a login class (`default` by default), and that each login class has a set of login capabilities associated with it. A login capability is a `name=value` pair, where `name` is a well-known identifier and `value` is an arbitrary string processed accordingly depending on the name. Setting up login classes and capabilities is rather straight-forward and is also described in [login.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=login.conf&section=5).
 
-    Check /etc/group
+Resource limits are different from plain vanilla login capabilities in two ways. First, for every limit, there is a soft (current) and hard limit. A soft limit may be adjusted by the user or application, but may be no higher than the hard limit. The latter may be lowered by the user, but never raised. Second, most resource limits apply per process to a specific user, not the user as a whole. Note, however, that these differences are mandated by the specific handling of the limits, not by the implementation of the login capability framework (i.e., they are not ***really*** a special case of login capabilities).
 
-    Enter your default shell: csh date no sh tcsh zsh [sh]: zsh
+And so, without further ado, below are the most commonly used resource limits (the rest, along with all the other login capabilities, may be found in [login.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=login.conf&section=5)).
 
-    Your default shell is: zsh -&gt; /usr/local/bin/zsh
+* `coredumpsize`: The limit on the size of a core file generated by a program is, for obvious reasons, subordinate to other limits on disk usage (e.g., `filesize`, or disk quotas). Nevertheless, it is often used as a less-severe method of controlling disk space consumption: since users do not generate core files themselves, and often do not delete them, setting this may save them from running out of disk space should a large program (e.g.,  **emacs** ) crash.
 
-    Enter your default HOME partition: [/home]:
+* `cputime`: This is the maximum amount of CPU time a user's process may consume. Offending processes will be killed by the kernel.
 
-    Copy dotfiles from: /usr/share/skel no [/usr/share/skel]:
+ **Note:** This is a limit on CPU ***time*** consumed, not percentage of the CPU as displayed in some fields by [top(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=top&section=1) and [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ps&section=1). A limit on the latter is, at the time of this writing, not possible, and would be rather useless: legitimate use of a compiler, for instance, can easily use almost 100% of a CPU for some time.
 
-    Send message from file: /etc/adduser.message no
+* `filesize`: This is the maximum size of a file the user may possess. Unlike [quotas.html disk quotas], this limit is enforced on individual files, not the set of all files a user owns.
 
-    [/etc/adduser.message]: no
+* `maxproc`: This is the maximum number of processes a user may be running. This includes foreground and background processes alike. For obvious reasons, this may not be larger than the system limit specified by the `kern.maxproc` [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8). Also note that setting this too small may hinder a user's productivity: it is often useful to be logged in multiple times or execute pipelines. Some tasks, such as compiling a large program, also spawn multiple processes (e.g., [make(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=make&section=1), [cc(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=cc&section=1), and other intermediate preprocessors).
 
-    Do not send message
+* `memorylocked`: This is the maximum amount a memory a process may have requested to be locked into main memory (e.g., see [mlock(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=mlock&section2)). Some system-critical programs, such as [amd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=amd&section=8), lock into main memory such that in the event of being swapped out, they do not contribute to a system's trashing in time of trouble.
 
-    Use passwords (y/n) [y]: y
+* `memoryuse`: This is the maximum amount of memory a process may consume at any given time. It includes both core memory and swap usage. This is not a catch-all limit for restricting memory consumption, but it is a good start.
 
-    
+* `openfiles`: This is the maximum amount of files a process may have open. In DragonFly, files are also used to represent sockets and IPC channels; thus, be careful not to set this too low. The system-wide limit for this is defined by the `kern.maxfiles` [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8).
 
-    Write your changes to /etc/adduser.conf? (y/n) [n]: y
+* `sbsize`: This is the limit on the amount of network memory, and thus mbufs, a user may consume. This originated as a response to an old DoS attack by creating a lot of sockets, but can be generally used to limit network communications.
 
-    
+* `stacksize`: This is the maximum size a process' stack may grow to. This alone is not sufficient to limit the amount of memory a program may use; consequently, it should be used in conjunction with other limits.
 
-    Ok, let's go.
+There are a few other things to remember when setting resource limits. Following are some general tips, suggestions, and miscellaneous comments.
 
-    Don't worry about mistakes. I will give you the chance later to correct any input.
+* Processes started at system startup by `/etc/rc` are assigned to the `daemon` login class.
 
-    Enter username [a-z0-9_-]: jru
+* Although the `/etc/login.conf` that comes with the system is a good source of reasonable values for most limits, only you, the administrator, can know what is appropriate for your system. Setting a limit too high may open your system up to abuse, while setting it too low may put a strain on productivity.
 
-    Enter full name []: J. Random User
+* Users of the X Window System (X11) should probably be granted more resources than other users. X11 by itself takes a lot of resources, but it also encourages users to run more programs simultaneously.
 
-    Enter shell csh date no sh tcsh zsh [zsh]:
+* Remember that many limits apply to individual processes, not the user as a whole. For example, setting `openfiles` to 50 means that each process the user runs may open up to 50 files. Thus, the gross amount of files a user may open is the value of `openfiles` multiplied by the value of `maxproc`. This also applies to memory consumption.
 
-    Enter home directory (full path) [/home/jru]:
+For further information on resource limits and login classes and capabilities in general, please consult the relevant manual pages: [cap_mkdb(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#cap_mkdb&section1), [getrlimit(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=getrlimit&section=2), [login.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=login.conf&section=5).
 
-    Uid [1001]:
+## Personalizing Users 
 
-    Enter login class: default []:
+Localization is an environment set up by the system administrator or user to accommodate different languages, character sets, date and time standards, and so on. This is discussed in [this chapter](l10n.html).
 
-    Login group jru [jru]:
+## Groups 
 
-    Login group is ***jru***. Invite jru into other groups: guest no
+A group is simply a list of users. Groups are identified by their group name and GID (Group ID). In DragonFly (and most other UNIX® like systems), the two factors the kernel uses to decide whether a process is allowed to do something is its user ID and list of groups it belongs to. Unlike a user ID, a process has a list of groups associated with it. You may hear some things refer to the ***group ID*** of a user or process; most of the time, this just means the first group in the list.
 
-    [no]: wheel
+The group name to group ID map is in `/etc/group`. This is a plain text file with four colon-delimited fields. The first field is the group name, the second is the encrypted password, the third the group ID, and the fourth the comma-delimited list of members. It can safely be edited by hand (assuming, of course, that you do not make any syntax errors!). For a more complete description of the syntax, see the [group(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#group&section5) manual page.
 
-    Enter password []:
+If you do not want to edit `/etc/group` manually, you can use the [pw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#pw&section8) command to add and edit groups. For example, to add a group called `teamtwo` and then confirm that it exists you can use:
 
-    Enter password again []:
+ **Example 8-7. Adding a Group Using pw(8)** 
 
     
 
-    Name:        jru
+    # pw groupadd teamtwo
 
-    Password: ****
+    # pw groupshow teamtwo
 
-    Fullname: J. Random User
+    teamtwo:*:1100:
 
-    Uid:         1001
+The number `1100` above is the group ID of the group `teamtwo`. Right now, `teamtwo` has no members, and is thus rather useless. Let's change that by inviting `jru` to the `teamtwo` group.
 
-    Gid:         1001 (jru)
+ **Example 8-8. Adding Somebody to a Group Using pw(8)** 
 
-    Class:
+    
 
-    Groups:      jru wheel
+    # pw groupmod teamtwo -M jru
 
-    HOME:     /home/jru
+    # pw groupshow teamtwo
 
-    Shell:       /usr/local/bin/zsh
+    teamtwo:*:1100:jru
 
-    OK? (y/n) [y]: y
+The argument to the `-M` option is a comma-delimited list of users who are members of the group. From the preceding sections, we know that the password file also contains a group for each user. The latter (the user) is automatically added to the group list by the system; the user will not show up as a member when using the `groupshow` command to [pw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#pw&section8), but will show up when the information is queried via [id(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=id&section=1) or similar tool. In other words, [pw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=pw&section=8) only manipulates the `/etc/group` file; it will never attempt to read additionally data from `/etc/passwd`.
 
-    Added user ***jru***
+ **Example 8-9. Using id(1) to Determine Group Membership** 
 
-    Copy files from /usr/share/skel to /home/jru
+    
 
-    Add another user? (y/n) [y]: n
+    % id jru
 
-    Goodbye!
+    uid#1001(jru) gid1001(jru) groups=1001(jru), 1100(teamtwo)
 
-    #
+As you can see, `jru` is a member of the groups `jru` and `teamtwo`.
 
-In summary, we changed the default shell to  **zsh**  (an additional shell found in pkgsrc®), and turned off the sending of a welcome mail to added users. We then saved the configuration, created an account for `jru`, and made sure `jru` is in `wheel` group (so that she may assume the role of `root` with the [su(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=su&section=1) command.)
+For more information about [pw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#pw&section8), see its manual page, and for more information on the format of `/etc/group`, consult the [group(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=group&section=5) manual page.
 
- **Note:** The password you type in is not echoed, nor are asterisks displayed. Make sure you do not mistype the password twice.
+# Configuring the DragonFly Kernel 
 
- **Note:** Just use [adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8) without arguments from now on, and you will not have to go through changing the defaults. If the program asks you to change the defaults, exit the program, and try the `-s` option.
+***Updated and restructured by Jim Mock. Originally contributed by Jake Hamby.***
 
-### rmuser 
+[[!toc  levels=3]]
 
-You can use [rmuser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rmuser&section=8) to completely remove a user from the system. [rmuser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rmuser&section=8) performs the following steps:
+## Synopsis 
 
-  1. Removes the user's [crontab(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=crontab&section=1) entry (if any).
+The kernel is the core of the DragonFly operating system. It is responsible for managing memory, enforcing security controls, networking, disk access, and much more. While more and more of DragonFly becomes dynamically configurable it is still occasionally necessary to reconfigure and recompile your kernel.
 
-  1. Removes any [at(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=at&section=1) jobs belonging to the user.
+After reading this chapter, you will know:
 
-  1. Kills all processes owned by the user.
+* Why you might need to build a custom kernel.
+* How to write a kernel configuration file, or alter an existing configuration file.
+* How to use the kernel configuration file to create and build a new kernel.
+* How to install the new kernel.
+* How to troubleshoot if things go wrong.
 
-  1. Removes the user from the system's local password file.
+## Why Build a Custom Kernel? 
 
-  1. Removes the user's home directory (if it is owned by the user).
+Traditionally, DragonFly has had what is called a ***monolithic*** kernel. This means that the kernel was one large program, supported a fixed list of devices, and if you wanted to change the kernel's behavior then you had to compile a new kernel, and then reboot your computer with the new kernel.
 
-  1. Removes the incoming mail files belonging to the user from `/var/mail`.
+Today, DragonFly is rapidly moving to a model where much of the kernel's functionality is contained in modules which can be dynamically loaded and unloaded from the kernel as necessary. This allows the kernel to adapt to new hardware suddenly becoming available (such as PCMCIA cards in a laptop), or for new functionality to be brought into the kernel that was not necessary when the kernel was originally compiled. This is known as a modular kernel. Colloquially these are called KLDs.
 
-  1. Removes all files owned by the user from temporary file storage areas such as `/tmp`.
+Despite this, it is still necessary to carry out some static kernel configuration. In some cases this is because the functionality is so tied to the kernel that it can not be made dynamically loadable. In others it may simply be because no one has yet taken the time to write a dynamic loadable kernel module for that functionality yet.
 
-  1. Finally, removes the username from all groups to which it belongs in `/etc/group`.
+Building a custom kernel is one of the most important rites of passage nearly every UNIX® user must endure. This process, while time consuming, will provide many benefits to your DragonFly system. Unlike the `GENERIC` kernel, which must support a wide range of hardware, a custom kernel only contains support for ***your*** PC's hardware. This has a number of benefits, such as:
 
-   **Note:** If a group becomes empty and the group name is the same as the username, the group is removed; this complements the per-user unique groups created by [adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8).
+* Faster boot time. Since the kernel will only probe the hardware you have on your system, the time it takes your system to boot will decrease dramatically.
 
-[rmuser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rmuser&section=8) cannot be used to remove superuser accounts, since that is almost always an indication of massive destruction.
+* Less memory usage. A custom kernel often uses less memory than the `GENERIC` kernel, which is important because the kernel must always be present in real memory. For this reason, a custom kernel is especially useful on a system with a small amount of RAM.
 
-By default, an interactive mode is used, which attempts to make sure you know what you are doing.
+* Additional hardware support. A custom kernel allows you to add in support for devices such as sound cards, which are not present in the `GENERIC` kernel.
 
- **Example 8-2. `rmuser` Interactive Account Removal** 
+## Building and Installing a Custom Kernel 
 
-    
+First, let us take a quick tour of the kernel build directory. All directories mentioned will be relative to the main `/usr/src/sys` directory, which is also accessible through `/sys`. There are a number of subdirectories here representing different parts of the kernel, but the most important, for our purposes, is `config`, where you will edit your custom kernel configuration, and `compile`, which is the staging area where your kernel will be built.  Notice the logical organization of the directory structure, with each supported device, file system, and option in its own subdirectory.
 
-    # rmuser jru
+### Installing the Source
 
-    Matching password entry:
+If there is ***no*** `/usr/src/sys` directory on your system, then the kernel source has not been installed. One method to do this is via git.  An alternative is to install the kernel source tree from the archive distributed on the DragonFly CD named `src-sys.tar.bz2`.  This is especially useful when you do not have ready access to the internet. Use the Makefile in `/usr` to fetch the source or to unpack the archive. When installing kernel source only, use the alternate build procedure below.
 
-    jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
+The preferred way of installing the sources is:
 
-    Is this the entry you wish to remove? y
+    # cd /usr
+    # make src-create
+    
+This will download the whole source tree via git into /usr/src. This method also allows for easy updating of the source tree by using:
 
-    Remove user's home directory (/home/jru)? y
+    # make src-update
 
-    Updating password file, updating databases, done.
+### Your Custom Config File
 
-    Updating group file: trusted (removing group jru -- personal group is empty) done.
+Next, move to the `config` directory and copy the `GENERIC` configuration file to the name you want to give your kernel. For example:
 
-    Removing user's incoming mail file /var/mail/jru: done.
+    # cd /usr/src/sys/config
+    # cp GENERIC MYKERNEL
 
-    Removing files belonging to jru from /tmp: done.
+Traditionally, this name is in all capital letters and, if you are maintaining multiple DragonFly machines with different hardware, it is a good idea to name it after your machine's hostname. We will call it `MYKERNEL` for the purpose of this example.
 
-    Removing files belonging to jru from /var/tmp: done.
+**Tip:** Storing your kernel config file directly under `/usr/src` can be a bad idea. If you are experiencing problems it can be tempting to just delete `/usr/src` and start again. Five seconds after you do that you realize that you have deleted your custom kernel config file. Do not edit `GENERIC` directly, as it may get overwritten the next time you [update your source tree](updating.html#UPDATING-SETUP), and your kernel modifications will be lost.  You might want to keep your kernel config file elsewhere, and then create a symbolic link to the file in the `config` directory.
 
-    Removing files belonging to jru from /var/tmp/vi.recover: done.
+For example:
 
-    #
+    # cd /usr/src/sys/config
+    # mkdir /root/kernels
+    # cp GENERIC /root/kernels/MYKERNEL
+    # ln -s /root/kernels/MYKERNEL
 
-### chpass 
+**Note:** You must execute these and all of the following commands under the `root` account or you will get permission denied errors.
 
-[chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1) changes user database information such as passwords, shells, and personal information.
+Now, edit `MYKERNEL` with your favorite text editor. If you are just starting out, the only editor available will probably be ***vi***, which is too complex to explain here, but is covered well in many books in the [bibliography](bibliography.html). However, DragonFly does offer an easier editor called ***ee*** which, if you are a beginner, should be your editor of choice. Feel free to change the comment lines at the top to reflect your configuration or the changes you have made to differentiate it from `GENERIC`.
 
-Only system administrators, as the superuser, may change other users' information and passwords with [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1).
+If you have built a kernel under SunOS™ or some other BSD operating system, much of this file will be very familiar to you. If you are coming from some other operating system such as DOS, on the other hand, the `GENERIC` configuration file might seem overwhelming to you, so follow the descriptions in the [[Configuration File|handbook-kernelconfig-config]] section slowly and carefully.
 
-When passed no options, aside from an optional username, [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1) displays an editor containing user information. When the user exists from the editor, the user database is updated with the new information.
+### Building a Kernel - Full Source Tree
 
-***'Example 8-3. Interactive `chpass` by Superuser***'
+**Note:** Be sure to always check the file `/usr/src/UPDATING`, before you perform any update steps, in the case you [sync your source tree](updating.html#UPDATING-SETUP) with the latest sources of the DragonFly project. In this file all important issues with updating DragonFly are typed out. `/usr/src/UPDATING` always fits your version of the DragonFly source, and is therefore more accurate for new information than the handbook.
 
-    
+ 1. Change to the `/usr/src` directory.
 
-    #Changing user database information for jru.
+     
 
-    Login: jru
+          # cd /usr/src
 
-    Password: *
+ 1. Compile the kernel.
 
-    Uid [#]: 1001
+          # make buildkernel KERNCONF=MYKERNEL
 
-    Gid [# or name]: 1001
+ 1. Install the new kernel.     
 
-    Change [month day year]:
+          # make installkernel KERNCONF=MYKERNEL
 
-    Expire [month day year]:
+    
 
-    Class:
+If you have ***not*** upgraded your source tree in any way since the last time you successfully completed a `buildworld`-`installworld` cycle (you have not run `git pull` ), then it is safe to use the `quickworld` and `quickkernel`, `buildworld`, `buildkernel` sequence.
 
-    Home directory: /home/jru
+### Building a Kernel - Kernel Source Only
 
-    Shell: /usr/local/bin/zsh
+When only the kernel source is installed, you need to change step 2, above, to this:
+     
 
-    Full Name: J. Random User
+      # make nativekernel KERNCONF=MYKERNEL
 
-    Office Location:
+The other steps are the same.
 
-    Office Phone:
+### Running Your New Kernel
 
-    Home Phone:
+The installer copies the new kernel and modules to `/boot/kernel/`, the kernel being `/boot/kernel/kernel` and the modules being `/boot/kernel/*.ko`. The old kernel and modules are moved to `/boot/kernel.old/`. Now, shutdown the system and reboot to use your new kernel. In case something goes wrong, there are some [troubleshooting](kernelconfig-trouble.html) instructions at the end of this chapter. Be sure to read the section which explains how to recover in case your new kernel [does not boot](kernelconfig-trouble.html#KERNELCONFIG-NOBOOT).
 
-    Other information:
+**Note:** If you have added any new devices (such as sound cards), you may have to add some device nodes to your `/dev` directory before you can use them. For more information, take a look at device nodes section later on in this chapter.
 
-The normal user can change only a small subset of this information, and only for themselves.
+## The Configuration File 
+<!-- XXX: do we really want to mention all these million config options? -->
+The general format of a configuration file is quite simple. Each line contains a keyword and one or more arguments. For simplicity, most lines only contain one argument. Anything following a `#` is considered a comment and ignored. The following sections describe each keyword, generally in the order they are listed in `GENERIC`, although some related keywords have been grouped together in a single section (such as Networking) even though they are actually scattered throughout the `GENERIC` file.  An exhaustive list of options and more detailed explanations of the device lines is present in the `LINT` configuration file, located in the same directory as `GENERIC`. If you are in doubt as to the purpose or necessity of a line, check first in `LINT`.
 
- **Example 8-4. Interactive chpass by Normal User** 
+The following is an example `GENERIC` kernel configuration file with various additional comments where needed for clarity. This example should match your copy in `/usr/src/sys/config/GENERIC` fairly closely. For details of all the possible kernel options, see `/usr/src/sys/config/LINT`.
 
     
 
-    #Changing user database information for jru.
+    #
 
-    Shell: /usr/local/bin/zsh
+    #
 
-    Full Name: J. Random User
+    # GENERIC -- Generic kernel configuration file for DragonFly/i386
 
-    Office Location:
+    #
 
-    Office Phone:
+    # Check the LINT configuration file in sys/config, for an
 
-    Home Phone:
+    # exhaustive list of options.
 
-    Other information:
+    #
 
- **Note:** [chfn(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chfn&section=1) and [chsh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chsh&section=1) are just links to [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1), as are [ypchpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ypchpass&section=1), [ypchfn(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ypchfn&section=1), and [ypchsh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ypchsh&section=1). NIS support is automatic, so specifying the `yp` before the command is not necessary. If this is confusing to you, do not worry, NIS will be covered in [advanced-networking.html Chapter 19].
+    # $DragonFly: src/sys/config/GENERIC,v 1.56 2007/12/26 14:02:36 sephe Exp $
 
-### passwd 
+The following are the mandatory keywords required in ***every*** kernel you build:
 
-[passwd(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=passwd&section=1) is the usual way to change your own password as a user, or another user's password as the superuser.
+    
 
- **Note:** To prevent accidental or unauthorized changes, the original password must be entered before a new password can be set.
+    machine         i386
 
- **Example 8-5. Changing Your Password** 
+This is the machine architecture. It must be `i386` at the moment.  Support for `amd64` will be added in the future.
 
     
 
-    % passwd
+    cpu          I386_CPU
 
-    Changing local password for jru.
+    cpu          I486_CPU
 
-    Old password:
+    cpu          I586_CPU
 
-    New password:
+    cpu          I686_CPU
 
-    Retype new password:
+The above option specifies the type of CPU you have in your system. You may have multiple instances of the CPU line (i.e., you are not sure whether you should use `I586_CPU` or `I686_CPU`), however, for a custom kernel, it is best to specify only the CPU you have. If you are unsure of your CPU type, you can check the `/var/run/dmesg.boot` file to view your boot up messages.
 
-    passwd: updating the database...
+    
 
-    passwd: done
+    ident          GENERIC
 
-***'Example 8-6. Changing Another User's Password as the Superuser***'
+This is the identification of the kernel. You should change this to whatever you named your kernel, i.e. `MYKERNEL` if you have followed the instructions of the previous examples. The value you put in the `ident` string will print when you boot up the kernel, so it is useful to give the new kernel a different name if you want to keep it separate from your usual kernel (i.e. you want to build an experimental kernel).
 
     
 
-    # passwd jru
+    maxusers          0
 
-    Changing local password for jru.
+The `maxusers` option sets the size of a number of important system tables. This number is supposed to be roughly equal to the number of simultaneous users you expect to have on your machine.
 
-    New password:
+(Recommended) The system will auto-tune this setting for you if you explicitly set it to `0`[(1)](#FTN.AEN7414). If you want to manage it yourself you will want to set `maxusers` to at least 4, especially if you are using the X Window System or compiling software. The reason is that the most important table set by `maxusers` is the maximum number of processes, which is set to `20 + 16 * maxusers`, so if you set `maxusers` to 1, then you can only have 36 simultaneous processes, including the 18 or so that the system starts up at boot time, and the 15 or so you will probably create when you start the X Window System. Even a simple task like reading a manual page will start up nine processes to filter, decompress, and view it. Setting `maxusers` to 64 will allow you to have up to 1044 simultaneous processes, which should be enough for nearly all uses. If, however, you see the dreaded proc table full error when trying to start another program, or are running a server with a large number of simultaneous users, you can always increase the number and rebuild.
 
-    Retype new password:
+ **Note:** `maxusers` does ***not*** limit the number of users which can log into your machine. It simply sets various table sizes to reasonable values considering the maximum number of users you will likely have on your system and how many processes each of them will be running. One keyword which ***does*** limit the number of simultaneous ***remote logins and X terminal windows*** is [kernelconfig-config.html#KERNELCONFIG-PTYS `pseudo-device pty 16`].
 
-    passwd: updating the database...
+    
 
-    passwd: done
+    # Floating point support - do not disable.
 
- **Note:** As with [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1), [yppasswd(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=yppasswd&section=1) is just a link to [passwd(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=passwd&section=1), so NIS works with either command.
+    device          npx0     at nexus? port IO_NPX irq 13
 
-### pw 
+`npx0` is the interface to the floating point math unit in DragonFly, which is either the hardware co-processor or the software math emulator. This is ***not*** optional.
 
-[pw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=pw&section=8) is a command line utility to create, remove, modify, and display users and groups. It functions as a front end to the system user and group files. [pw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=pw&section=8) has a very powerful set of command line options that make it suitable for use in shell scripts, but new users may find it more complicated than the other commands presented here.
+    
 
-#### Notes 
+    # Pseudo devices - the number indicates how many units to allocate.
 
-[[!table  data="""
-<tablestyle#"width:100%"> The `-s` makes [adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8) default to quiet. We use `-v` later when we want to change defaults. |
-| | 
-"""]]
+    pseudo-device   loop          # Network loopback
 
-## Limiting Users 
+This is the generic loopback device for TCP/IP. If you telnet or FTP to `localhost` (a.k.a., `127.0.0.1`) it will come back at you through this device. This is ***mandatory***.
 
-<!-- XXX: check this section, I got the feeling there might be something outdated in it. I'm not familiar with it -->
+Everything that follows is more or less optional. See the notes underneath or next to each option for more information.
 
-If you have users, the ability to limit their system use may have come to mind. DragonFly provides several ways an administrator can limit the amount of system resources an individual may use. These limits are divided into two sections: disk quotas, and other resource limits.
+    
 
-Disk quotas limit disk usage to users, and they provide a way to quickly check that usage without calculating it every time. Quotas are discussed in [quotas.html Section 12.12].
+    #makeoptions     DEBUG=-g          #Build kernel with gdb(1) debug symbols
 
-The other resource limits include ways to limit the amount of CPU, memory, and other resources a user may consume. These are defined using login classes and are discussed here.
+The normal build process of the DragonFly does not include debugging information when building the kernel and strips most symbols after the resulting kernel is linked, to save some space at the install location. If you are going to do tests of kernels in the DEVELOPMENT branch or develop changes of your own for the DragonFly kernel, you might want to uncomment this line. It will enable the use of the `-g` option which enables debugging information when passed to [gcc(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#gcc&section1).
 
-Login classes are defined in `/etc/login.conf`. The precise semantics are beyond the scope of this section, but are described in detail in the [login.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=login.conf&section=5) manual page. It is sufficient to say that each user is assigned to a login class (`default` by default), and that each login class has a set of login capabilities associated with it. A login capability is a `name=value` pair, where `name` is a well-known identifier and `value` is an arbitrary string processed accordingly depending on the name. Setting up login classes and capabilities is rather straight-forward and is also described in [login.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=login.conf&section=5).
+    
 
-Resource limits are different from plain vanilla login capabilities in two ways. First, for every limit, there is a soft (current) and hard limit. A soft limit may be adjusted by the user or application, but may be no higher than the hard limit. The latter may be lowered by the user, but never raised. Second, most resource limits apply per process to a specific user, not the user as a whole. Note, however, that these differences are mandated by the specific handling of the limits, not by the implementation of the login capability framework (i.e., they are not ***really*** a special case of login capabilities).
+    options          MATH_EMULATE      #Support for x87 emulation
 
-And so, without further ado, below are the most commonly used resource limits (the rest, along with all the other login capabilities, may be found in [login.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=login.conf&section=5)).
+This line allows the kernel to simulate a math co-processor if your computer does not have one (386 or 486SX). If you have a 486DX, or a 386 or 486SX (with a separate 387 or 487 chip), or higher (Pentium®, Pentium II, etc.), you can comment this line out.
 
-* `coredumpsize`: The limit on the size of a core file generated by a program is, for obvious reasons, subordinate to other limits on disk usage (e.g., `filesize`, or disk quotas). Nevertheless, it is often used as a less-severe method of controlling disk space consumption: since users do not generate core files themselves, and often do not delete them, setting this may save them from running out of disk space should a large program (e.g.,  **emacs** ) crash.
+ **Note:** The normal math co-processor emulation routines that come with DragonFly are ***not*** very accurate. If you do not have a math co-processor, and you need the best accuracy, it is recommended that you change this option to `GPL_MATH_EMULATE` to use the GNU math support, which is not included by default for licensing reasons.
 
-* `cputime`: This is the maximum amount of CPU time a user's process may consume. Offending processes will be killed by the kernel.
+    
 
- **Note:** This is a limit on CPU ***time*** consumed, not percentage of the CPU as displayed in some fields by [top(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=top&section=1) and [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ps&section=1). A limit on the latter is, at the time of this writing, not possible, and would be rather useless: legitimate use of a compiler, for instance, can easily use almost 100% of a CPU for some time.
+    options          INET          #InterNETworking
 
-* `filesize`: This is the maximum size of a file the user may possess. Unlike [quotas.html disk quotas], this limit is enforced on individual files, not the set of all files a user owns.
+Networking support. Leave this in, even if you do not plan to be connected to a network. Most programs require at least loopback networking (i.e., making network connections within your PC), so this is essentially mandatory.
 
-* `maxproc`: This is the maximum number of processes a user may be running. This includes foreground and background processes alike. For obvious reasons, this may not be larger than the system limit specified by the `kern.maxproc` [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8). Also note that setting this too small may hinder a user's productivity: it is often useful to be logged in multiple times or execute pipelines. Some tasks, such as compiling a large program, also spawn multiple processes (e.g., [make(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=make&section=1), [cc(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=cc&section=1), and other intermediate preprocessors).
+    
 
-* `memorylocked`: This is the maximum amount a memory a process may have requested to be locked into main memory (e.g., see [mlock(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=mlock&section2)). Some system-critical programs, such as [amd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=amd&section=8), lock into main memory such that in the event of being swapped out, they do not contribute to a system's trashing in time of trouble.
+    options          INET6          #IPv6 communications protocols
 
-* `memoryuse`: This is the maximum amount of memory a process may consume at any given time. It includes both core memory and swap usage. This is not a catch-all limit for restricting memory consumption, but it is a good start.
+This enables the IPv6 communication protocols.
 
-* `openfiles`: This is the maximum amount of files a process may have open. In DragonFly, files are also used to represent sockets and IPC channels; thus, be careful not to set this too low. The system-wide limit for this is defined by the `kern.maxfiles` [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8).
+    
 
-* `sbsize`: This is the limit on the amount of network memory, and thus mbufs, a user may consume. This originated as a response to an old DoS attack by creating a lot of sockets, but can be generally used to limit network communications.
+    options          FFS          #Berkeley Fast Filesystem
 
-* `stacksize`: This is the maximum size a process' stack may grow to. This alone is not sufficient to limit the amount of memory a program may use; consequently, it should be used in conjunction with other limits.
+    options          FFS_ROOT     #FFS usable as root device [keep this!]
 
-There are a few other things to remember when setting resource limits. Following are some general tips, suggestions, and miscellaneous comments.
+This is the basic hard drive Filesystem. Leave it in if you boot from the hard disk.
 
-* Processes started at system startup by `/etc/rc` are assigned to the `daemon` login class.
+    
 
-* Although the `/etc/login.conf` that comes with the system is a good source of reasonable values for most limits, only you, the administrator, can know what is appropriate for your system. Setting a limit too high may open your system up to abuse, while setting it too low may put a strain on productivity.
+    options          UFS_DIRHASH  #Improve performance on big directories
 
-* Users of the X Window System (X11) should probably be granted more resources than other users. X11 by itself takes a lot of resources, but it also encourages users to run more programs simultaneously.
+This option includes functionality to speed up disk operations on large directories, at the expense of using additional memory. You would normally keep this for a large server, or interactive workstation, and remove it if you are using DragonFly on a smaller system where memory is at a premium and disk access speed is less important, such as a firewall.
 
-* Remember that many limits apply to individual processes, not the user as a whole. For example, setting `openfiles` to 50 means that each process the user runs may open up to 50 files. Thus, the gross amount of files a user may open is the value of `openfiles` multiplied by the value of `maxproc`. This also applies to memory consumption.
+    
 
-For further information on resource limits and login classes and capabilities in general, please consult the relevant manual pages: [cap_mkdb(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#cap_mkdb&section1), [getrlimit(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=getrlimit&section=2), [login.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=login.conf&section=5).
+    options          SOFTUPDATES  #Enable FFS Soft Updates support
 
-## Personalizing Users 
+This option enables Soft Updates in the kernel, this will help speed up write access on the disks. Even when this functionality is provided by the kernel, it must be turned on for specific disks. Review the output from [mount(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#mount&section8) to see if Soft Updates is enabled for your system disks. If you do not see the `soft-updates` option then you will need to activate it using the [tunefs(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=tunefs&section=8) (for existing filesystems) or [newfs(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=newfs&section=8) (for new filesystems) commands.
 
-Localization is an environment set up by the system administrator or user to accommodate different languages, character sets, date and time standards, and so on. This is discussed in [this chapter](l10n.html).
+    
 
-## Groups 
+    options          MFS          #Memory Filesystem
 
-A group is simply a list of users. Groups are identified by their group name and GID (Group ID). In DragonFly (and most other UNIX® like systems), the two factors the kernel uses to decide whether a process is allowed to do something is its user ID and list of groups it belongs to. Unlike a user ID, a process has a list of groups associated with it. You may hear some things refer to the ***group ID*** of a user or process; most of the time, this just means the first group in the list.
+    options          MD_ROOT      #MD is a potential root device
 
-The group name to group ID map is in `/etc/group`. This is a plain text file with four colon-delimited fields. The first field is the group name, the second is the encrypted password, the third the group ID, and the fourth the comma-delimited list of members. It can safely be edited by hand (assuming, of course, that you do not make any syntax errors!). For a more complete description of the syntax, see the [group(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#group&section5) manual page.
+This is the memory-mapped filesystem. This is basically a RAM disk for fast storage of temporary files, useful if you have a lot of swap space that you want to take advantage of. A perfect place to mount an MFS partition is on the `/tmp` directory, since many programs store temporary data here. To mount an MFS RAM disk on `/tmp`, add the following line to `/etc/fstab`:
 
-If you do not want to edit `/etc/group` manually, you can use the [pw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#pw&section8) command to add and edit groups. For example, to add a group called `teamtwo` and then confirm that it exists you can use:
+    
 
- **Example 8-7. Adding a Group Using pw(8)** 
+    /dev/ad1s2b     /tmp mfs rw 0 0
+
+Now you simply need to either reboot, or run the command `mount /tmp`.
 
     
 
-    # pw groupadd teamtwo
+    options          NFS          #Network Filesystem
 
-    # pw groupshow teamtwo
+    options          NFS_ROOT     #NFS usable as root device, NFS required
 
-    teamtwo:*:1100:
+The network Filesystem. Unless you plan to mount partitions from a UNIX® file server over TCP/IP, you can comment these out.
 
-The number `1100` above is the group ID of the group `teamtwo`. Right now, `teamtwo` has no members, and is thus rather useless. Let's change that by inviting `jru` to the `teamtwo` group.
+    
 
- **Example 8-8. Adding Somebody to a Group Using pw(8)** 
+    options          MSDOSFS      #MSDOS Filesystem
+
+The MS-DOS® Filesystem. Unless you plan to mount a DOS formatted hard drive partition at boot time, you can safely comment this out. It will be automatically loaded the first time you mount a DOS partition, as described above. Also, the excellent ***mtools*** software (in pkgsrc®) allows you to access DOS floppies without having to mount and unmount them (and does not require `MSDOSFS` at all).
 
     
 
-    # pw groupmod teamtwo -M jru
+    options          CD9660       #ISO 9660 Filesystem
 
-    # pw groupshow teamtwo
+    options          CD9660_ROOT  #CD-ROM usable as root, CD9660 required
 
-    teamtwo:*:1100:jru
+The ISO 9660 Filesystem for CDROMs. Comment it out if you do not have a CDROM drive or only mount data CDs occasionally (since it will be dynamically loaded the first time you mount a data CD). Audio CDs do not need this Filesystem.
 
-The argument to the `-M` option is a comma-delimited list of users who are members of the group. From the preceding sections, we know that the password file also contains a group for each user. The latter (the user) is automatically added to the group list by the system; the user will not show up as a member when using the `groupshow` command to [pw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#pw&section8), but will show up when the information is queried via [id(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=id&section=1) or similar tool. In other words, [pw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=pw&section=8) only manipulates the `/etc/group` file; it will never attempt to read additionally data from `/etc/passwd`.
+    
 
- **Example 8-9. Using id(1) to Determine Group Membership** 
+    options          PROCFS       #Process filesystem
+
+The process filesystem. This is a ***pretend*** filesystem mounted on `/proc` which allows programs like [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ps&section1) to give you more information on what processes are running. ***
 
     
 
-    % id jru
+Compatibility with 4.3BSD. Leave this in; some programs will act strangely if you comment this out.
 
-    uid#1001(jru) gid1001(jru) groups=1001(jru), 1100(teamtwo)
+    
 
-As you can see, `jru` is a member of the groups `jru` and `teamtwo`.
+    options          SCSI_DELAY=5000    #Delay (in ms) before probing SCSI
 
-For more information about [pw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#pw&section8), see its manual page, and for more information on the format of `/etc/group`, consult the [group(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=group&section=5) manual page.
+This causes the kernel to pause for 15 seconds before probing each SCSI device in your system. If you only have IDE hard drives, you can ignore this, otherwise you will probably want to lower this number, perhaps to five seconds (5000 ms), to speed up booting. Of course, if you do this, and DragonFly has trouble recognizing your SCSI devices, you will have to raise it back up.
 
-# Configuring the DragonFly Kernel 
+    
 
-***Updated and restructured by Jim Mock. Originally contributed by Jake Hamby.***
+    options          UCONSOLE            #Allow users to grab the console
 
-[[!toc  levels=3]]
+Allow users to grab the console, which is useful for X users. For example, you can create a console ***xterm*** by typing `xterm -C`, which will display any [write(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#write&section1), [talk(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=talk&section=1), and any other messages you receive, as well as any console messages sent by the kernel.
 
-## Synopsis 
+    
 
-The kernel is the core of the DragonFly operating system. It is responsible for managing memory, enforcing security controls, networking, disk access, and much more. While more and more of DragonFly becomes dynamically configurable it is still occasionally necessary to reconfigure and recompile your kernel.
+    options          USERCONFIG          #boot -c editor
 
-After reading this chapter, you will know:
+This option allows you to boot the configuration editor from the boot menu.
 
-* Why you might need to build a custom kernel.
-* How to write a kernel configuration file, or alter an existing configuration file.
-* How to use the kernel configuration file to create and build a new kernel.
-* How to install the new kernel.
-* How to troubleshoot if things go wrong.
+    
 
-## Why Build a Custom Kernel? 
-
-Traditionally, DragonFly has had what is called a ***monolithic*** kernel. This means that the kernel was one large program, supported a fixed list of devices, and if you wanted to change the kernel's behavior then you had to compile a new kernel, and then reboot your computer with the new kernel.
-
-Today, DragonFly is rapidly moving to a model where much of the kernel's functionality is contained in modules which can be dynamically loaded and unloaded from the kernel as necessary. This allows the kernel to adapt to new hardware suddenly becoming available (such as PCMCIA cards in a laptop), or for new functionality to be brought into the kernel that was not necessary when the kernel was originally compiled. This is known as a modular kernel. Colloquially these are called KLDs.
+    options          VISUAL_USERCONFIG   #visual boot -c editor
 
-Despite this, it is still necessary to carry out some static kernel configuration. In some cases this is because the functionality is so tied to the kernel that it can not be made dynamically loadable. In others it may simply be because no one has yet taken the time to write a dynamic loadable kernel module for that functionality yet.
+This option allows you to boot the visual configuration editor from the boot menu.
 
-Building a custom kernel is one of the most important rites of passage nearly every UNIX® user must endure. This process, while time consuming, will provide many benefits to your DragonFly system. Unlike the `GENERIC` kernel, which must support a wide range of hardware, a custom kernel only contains support for ***your*** PC's hardware. This has a number of benefits, such as:
+    
 
-* Faster boot time. Since the kernel will only probe the hardware you have on your system, the time it takes your system to boot will decrease dramatically.
+    options          KTRACE              #ktrace(1) support
 
-* Less memory usage. A custom kernel often uses less memory than the `GENERIC` kernel, which is important because the kernel must always be present in real memory. For this reason, a custom kernel is especially useful on a system with a small amount of RAM.
+This enables kernel process tracing, which is useful in debugging.
 
-* Additional hardware support. A custom kernel allows you to add in support for devices such as sound cards, which are not present in the `GENERIC` kernel.
+    
 
-## Building and Installing a Custom Kernel 
+    options          SYSVSHM             #SYSV-style shared memory
 
-First, let us take a quick tour of the kernel build directory. All directories mentioned will be relative to the main `/usr/src/sys` directory, which is also accessible through `/sys`. There are a number of subdirectories here representing different parts of the kernel, but the most important, for our purposes, is `config`, where you will edit your custom kernel configuration, and `compile`, which is the staging area where your kernel will be built.  Notice the logical organization of the directory structure, with each supported device, file system, and option in its own subdirectory.
+This option provides for System V shared memory. The most common use of this is the XSHM extension in X, which many graphics-intensive programs will automatically take advantage of for extra speed. If you use X, you will definitely want to include this.
 
-### Installing the Source
+    
 
-If there is ***no*** `/usr/src/sys` directory on your system, then the kernel source has not been installed. One method to do this is via git.  An alternative is to install the kernel source tree from the archive distributed on the DragonFly CD named `src-sys.tar.bz2`.  This is especially useful when you do not have ready access to the internet. Use the Makefile in `/usr` to fetch the source or to unpack the archive. When installing kernel source only, use the alternate build procedure below.
+    options          SYSVSEM             #SYSV-style semaphores
 
-The preferred way of installing the sources is:
+Support for System V semaphores. Less commonly used but only adds a few hundred bytes to the kernel.
 
-    # cd /usr
-    # make src-create
     
-This will download the whole source tree via git into /usr/src. This method also allows for easy updating of the source tree by using:
-
-    # make src-update
-
-### Your Custom Config File
 
-Next, move to the `config` directory and copy the `GENERIC` configuration file to the name you want to give your kernel. For example:
+    options          SYSVMSG             #SYSV-style message queues
 
-    # cd /usr/src/sys/config
-    # cp GENERIC MYKERNEL
+Support for System V messages. Again, only adds a few hundred bytes to the kernel.
 
-Traditionally, this name is in all capital letters and, if you are maintaining multiple DragonFly machines with different hardware, it is a good idea to name it after your machine's hostname. We will call it `MYKERNEL` for the purpose of this example.
+ **Note:** The [ipcs(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipcs&section1) command will list any processes using each of these System V facilities.
 
-**Tip:** Storing your kernel config file directly under `/usr/src` can be a bad idea. If you are experiencing problems it can be tempting to just delete `/usr/src` and start again. Five seconds after you do that you realize that you have deleted your custom kernel config file. Do not edit `GENERIC` directly, as it may get overwritten the next time you [update your source tree](updating.html#UPDATING-SETUP), and your kernel modifications will be lost.  You might want to keep your kernel config file elsewhere, and then create a symbolic link to the file in the `config` directory.
+    
 
-For example:
+    options         P1003_1B                #Posix P1003_1B real-time extensions
 
-    # cd /usr/src/sys/config
-    # mkdir /root/kernels
-    # cp GENERIC /root/kernels/MYKERNEL
-    # ln -s /root/kernels/MYKERNEL
+    options         _KPOSIX_PRIORITY_SCHEDULING
 
-**Note:** You must execute these and all of the following commands under the `root` account or you will get permission denied errors.
+Real-time extensions added in the 1993 POSIX®. Certain applications in the ports collection use these (such as  **StarOffice™** ).
 
-Now, edit `MYKERNEL` with your favorite text editor. If you are just starting out, the only editor available will probably be ***vi***, which is too complex to explain here, but is covered well in many books in the [bibliography](bibliography.html). However, DragonFly does offer an easier editor called ***ee*** which, if you are a beginner, should be your editor of choice. Feel free to change the comment lines at the top to reflect your configuration or the changes you have made to differentiate it from `GENERIC`.
+    
 
-If you have built a kernel under SunOS™ or some other BSD operating system, much of this file will be very familiar to you. If you are coming from some other operating system such as DOS, on the other hand, the `GENERIC` configuration file might seem overwhelming to you, so follow the descriptions in the [[Configuration File|handbook-kernelconfig-config]] section slowly and carefully.
+    options         ICMP_BANDLIM            #Rate limit bad replies
 
-### Building a Kernel - Full Source Tree
+This option enables ICMP error response bandwidth limiting. You typically want this option as it will help protect the machine from denial of service packet attacks.
 
-**Note:** Be sure to always check the file `/usr/src/UPDATING`, before you perform any update steps, in the case you [sync your source tree](updating.html#UPDATING-SETUP) with the latest sources of the DragonFly project. In this file all important issues with updating DragonFly are typed out. `/usr/src/UPDATING` always fits your version of the DragonFly source, and is therefore more accurate for new information than the handbook.
+    
 
- 1. Change to the `/usr/src` directory.
+    # To make an SMP kernel, the next two are needed
 
-     
+    #options        SMP                     # Symmetric MultiProcessor Kernel
 
-          # cd /usr/src
+    #options        APIC_IO                 # Symmetric (APIC) I/O
 
- 1. Compile the kernel.
+The above are both required for SMP support.
 
-          # make buildkernel KERNCONF=MYKERNEL
+    
 
- 1. Install the new kernel.     
+    device          isa
 
-          # make installkernel KERNCONF=MYKERNEL
+All PCs supported by DragonFly have one of these. Do not remove, even if you have no ISA slots. If you have an IBM PS/2 (Micro Channel Architecture), DragonFly provides some limited support at this time. For more information about the MCA support, see `/usr/src/sys/config/LINT`.
 
     
 
-If you have ***not*** upgraded your source tree in any way since the last time you successfully completed a `buildworld`-`installworld` cycle (you have not run `git pull` ), then it is safe to use the `quickworld` and `quickkernel`, `buildworld`, `buildkernel` sequence.
+    device          eisa
 
-### Building a Kernel - Kernel Source Only
+Include this if you have an EISA motherboard. This enables auto-detection and configuration support for all devices on the EISA bus.
 
-When only the kernel source is installed, you need to change step 2, above, to this:
-     
+    
 
-      # make nativekernel KERNCONF=MYKERNEL
+    device          pci
 
-The other steps are the same.
+Include this if you have a PCI motherboard. This enables auto-detection of PCI cards and gatewaying from the PCI to ISA bus.
 
-### Running Your New Kernel
+    
 
-The installer copies the new kernel and modules to `/boot/kernel/`, the kernel being `/boot/kernel/kernel` and the modules being `/boot/kernel/*.ko`. The old kernel and modules are moved to `/boot/kernel.old/`. Now, shutdown the system and reboot to use your new kernel. In case something goes wrong, there are some [troubleshooting](kernelconfig-trouble.html) instructions at the end of this chapter. Be sure to read the section which explains how to recover in case your new kernel [does not boot](kernelconfig-trouble.html#KERNELCONFIG-NOBOOT).
+    device          agp
 
-**Note:** If you have added any new devices (such as sound cards), you may have to add some device nodes to your `/dev` directory before you can use them. For more information, take a look at device nodes section later on in this chapter.
+Include this if you have an AGP card in the system. This will enable support for AGP, and AGP GART for boards which have these features.
 
-## The Configuration File 
-<!-- XXX: do we really want to mention all these million config options? -->
-The general format of a configuration file is quite simple. Each line contains a keyword and one or more arguments. For simplicity, most lines only contain one argument. Anything following a `#` is considered a comment and ignored. The following sections describe each keyword, generally in the order they are listed in `GENERIC`, although some related keywords have been grouped together in a single section (such as Networking) even though they are actually scattered throughout the `GENERIC` file.  An exhaustive list of options and more detailed explanations of the device lines is present in the `LINT` configuration file, located in the same directory as `GENERIC`. If you are in doubt as to the purpose or necessity of a line, check first in `LINT`.
+    
 
-The following is an example `GENERIC` kernel configuration file with various additional comments where needed for clarity. This example should match your copy in `/usr/src/sys/config/GENERIC` fairly closely. For details of all the possible kernel options, see `/usr/src/sys/config/LINT`.
+    # Floppy drives
 
-    
+    device          fdc0        at isa? port IO_FD1 irq 6 drq 2
 
-    #
+    device          fd0         at fdc0 drive 0
 
-    #
+    device          fd1         at fdc0 drive 1
 
-    # GENERIC -- Generic kernel configuration file for DragonFly/i386
+This is the floppy drive controller. `fd0` is the `A:` floppy drive, and `fd1` is the `B:` drive.
 
-    #
+    
 
-    # Check the LINT configuration file in sys/config, for an
+    device          ata
 
-    # exhaustive list of options.
+This driver supports all ATA and ATAPI devices. You only need one `device ata` line for the kernel to detect all PCI ATA/ATAPI devices on modern machines.
 
-    #
+    
 
-    # $DragonFly: src/sys/config/GENERIC,v 1.56 2007/12/26 14:02:36 sephe Exp $
+    device          atadisk                 # ATA disk drives
 
-The following are the mandatory keywords required in ***every*** kernel you build:
+This is needed along with `device ata` for ATA disk drives.
 
     
 
-    machine         i386
+    device          atapicd                 # ATAPI CDROM drives
 
-This is the machine architecture. It must be `i386` at the moment.  Support for `amd64` will be added in the future.
+This is needed along with `device ata` for ATAPI CDROM drives.
 
     
 
-    cpu          I386_CPU
+    device          atapifd                 # ATAPI floppy drives
 
-    cpu          I486_CPU
+This is needed along with `device ata` for ATAPI floppy drives.
 
-    cpu          I586_CPU
+    
 
-    cpu          I686_CPU
+    device          atapist                 # ATAPI tape drives
 
-The above option specifies the type of CPU you have in your system. You may have multiple instances of the CPU line (i.e., you are not sure whether you should use `I586_CPU` or `I686_CPU`), however, for a custom kernel, it is best to specify only the CPU you have. If you are unsure of your CPU type, you can check the `/var/run/dmesg.boot` file to view your boot up messages.
+This is needed along with `device ata` for ATAPI tape drives.
 
     
 
-    ident          GENERIC
+    options         ATA_STATIC_ID           #Static device numbering
 
-This is the identification of the kernel. You should change this to whatever you named your kernel, i.e. `MYKERNEL` if you have followed the instructions of the previous examples. The value you put in the `ident` string will print when you boot up the kernel, so it is useful to give the new kernel a different name if you want to keep it separate from your usual kernel (i.e. you want to build an experimental kernel).
+This makes the controller number static (like the old driver) or else the device numbers are dynamically allocated.
 
     
 
-    maxusers          0
+    # ATA and ATAPI devices
 
-The `maxusers` option sets the size of a number of important system tables. This number is supposed to be roughly equal to the number of simultaneous users you expect to have on your machine.
+    device          ata0        at isa? port IO_WD1 irq 14
 
-(Recommended) The system will auto-tune this setting for you if you explicitly set it to `0`[(1)](#FTN.AEN7414). If you want to manage it yourself you will want to set `maxusers` to at least 4, especially if you are using the X Window System or compiling software. The reason is that the most important table set by `maxusers` is the maximum number of processes, which is set to `20 + 16 * maxusers`, so if you set `maxusers` to 1, then you can only have 36 simultaneous processes, including the 18 or so that the system starts up at boot time, and the 15 or so you will probably create when you start the X Window System. Even a simple task like reading a manual page will start up nine processes to filter, decompress, and view it. Setting `maxusers` to 64 will allow you to have up to 1044 simultaneous processes, which should be enough for nearly all uses. If, however, you see the dreaded proc table full error when trying to start another program, or are running a server with a large number of simultaneous users, you can always increase the number and rebuild.
+    device          ata1        at isa? port IO_WD2 irq 15
 
- **Note:** `maxusers` does ***not*** limit the number of users which can log into your machine. It simply sets various table sizes to reasonable values considering the maximum number of users you will likely have on your system and how many processes each of them will be running. One keyword which ***does*** limit the number of simultaneous ***remote logins and X terminal windows*** is [kernelconfig-config.html#KERNELCONFIG-PTYS `pseudo-device pty 16`].
+Use the above for older, non-PCI systems.
 
     
 
-    # Floating point support - do not disable.
-
-    device          npx0     at nexus? port IO_NPX irq 13
+    # SCSI Controllers
 
-`npx0` is the interface to the floating point math unit in DragonFly, which is either the hardware co-processor or the software math emulator. This is ***not*** optional.
+    device          ahb        # EISA AHA1742 family
 
-    
+    device          ahc        # AHA2940 and onboard AIC7xxx devices
 
-    # Pseudo devices - the number indicates how many units to allocate.
+    device          amd        # AMD 53C974 (Teckram DC-390(T))
 
-    pseudo-device   loop          # Network loopback
+    device          dpt        # DPT Smartcache - See LINT for options!
 
-This is the generic loopback device for TCP/IP. If you telnet or FTP to `localhost` (a.k.a., `127.0.0.1`) it will come back at you through this device. This is ***mandatory***.
+    device          isp        # Qlogic family
 
-Everything that follows is more or less optional. See the notes underneath or next to each option for more information.
+    device          ncr        # NCR/Symbios Logic
 
-    
+    device          sym        # NCR/Symbios Logic (newer chipsets)
 
-    #makeoptions     DEBUG=-g          #Build kernel with gdb(1) debug symbols
+    device          adv0       at isa?
 
-The normal build process of the DragonFly does not include debugging information when building the kernel and strips most symbols after the resulting kernel is linked, to save some space at the install location. If you are going to do tests of kernels in the DEVELOPMENT branch or develop changes of your own for the DragonFly kernel, you might want to uncomment this line. It will enable the use of the `-g` option which enables debugging information when passed to [gcc(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#gcc&section1).
+    device          adw
 
-    
+    device          bt0        at isa?
 
-    options          MATH_EMULATE      #Support for x87 emulation
+    device          aha0       at isa?
 
-This line allows the kernel to simulate a math co-processor if your computer does not have one (386 or 486SX). If you have a 486DX, or a 386 or 486SX (with a separate 387 or 487 chip), or higher (Pentium®, Pentium II, etc.), you can comment this line out.
+    device          aic0       at isa?
 
- **Note:** The normal math co-processor emulation routines that come with DragonFly are ***not*** very accurate. If you do not have a math co-processor, and you need the best accuracy, it is recommended that you change this option to `GPL_MATH_EMULATE` to use the GNU math support, which is not included by default for licensing reasons.
+SCSI controllers. Comment out any you do not have in your system. If you have an IDE only system, you can remove these altogether.
 
     
 
-    options          INET          #InterNETworking
+    # SCSI peripherals
 
-Networking support. Leave this in, even if you do not plan to be connected to a network. Most programs require at least loopback networking (i.e., making network connections within your PC), so this is essentially mandatory.
+    device          scbus      # SCSI bus (required)
 
-    
+    device          da         # Direct Access (disks)
 
-    options          INET6          #IPv6 communications protocols
+    device          sa         # Sequential Access (tape etc)
 
-This enables the IPv6 communication protocols.
+    device          cd         # CD
 
-    
+    device          pass       # Passthrough device (direct SCSI
 
-    options          FFS          #Berkeley Fast Filesystem
+    access)
 
-    options          FFS_ROOT     #FFS usable as root device [keep this!]
+SCSI peripherals. Again, comment out any you do not have, or if you have only IDE hardware, you can remove them completely.
 
-This is the basic hard drive Filesystem. Leave it in if you boot from the hard disk.
+ **Note:** The USB [umass(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#umass&section4) driver (and a few other drivers) use the SCSI subsystem even though they are not real SCSI devices. Therefore make sure not to remove SCSI support, if any such drivers are included in the kernel configuration.
 
     
 
-    options          UFS_DIRHASH  #Improve performance on big directories
+    # RAID controllers
 
-This option includes functionality to speed up disk operations on large directories, at the expense of using additional memory. You would normally keep this for a large server, or interactive workstation, and remove it if you are using DragonFly on a smaller system where memory is at a premium and disk access speed is less important, such as a firewall.
+    device          ida        # Compaq Smart RAID
 
-    
+    device          amr        # AMI MegaRAID
 
-    options          SOFTUPDATES  #Enable FFS Soft Updates support
+    device          mlx        # Mylex DAC960 family
 
-This option enables Soft Updates in the kernel, this will help speed up write access on the disks. Even when this functionality is provided by the kernel, it must be turned on for specific disks. Review the output from [mount(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#mount&section8) to see if Soft Updates is enabled for your system disks. If you do not see the `soft-updates` option then you will need to activate it using the [tunefs(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=tunefs&section=8) (for existing filesystems) or [newfs(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=newfs&section=8) (for new filesystems) commands.
+Supported RAID controllers. If you do not have any of these, you can comment them out or remove them.
 
     
 
-    options          MFS          #Memory Filesystem
+    # atkbdc0 controls both the keyboard and the PS/2 mouse
 
-    options          MD_ROOT      #MD is a potential root device
+    device          atkbdc0    at isa? port IO_KBD
 
-This is the memory-mapped filesystem. This is basically a RAM disk for fast storage of temporary files, useful if you have a lot of swap space that you want to take advantage of. A perfect place to mount an MFS partition is on the `/tmp` directory, since many programs store temporary data here. To mount an MFS RAM disk on `/tmp`, add the following line to `/etc/fstab`:
+The keyboard controller (`atkbdc`) provides I/O services for the AT keyboard and PS/2 style pointing devices. This controller is required by the keyboard driver (`atkbd`) and the PS/2 pointing device driver (`psm`).
 
     
 
-    /dev/ad1s2b     /tmp mfs rw 0 0
+    device          atkbd0     at atkbdc? irq 1
 
-Now you simply need to either reboot, or run the command `mount /tmp`.
+The `atkbd` driver, together with `atkbdc` controller, provides access to the AT 84 keyboard or the AT enhanced keyboard which is connected to the AT keyboard controller.
 
     
 
-    options          NFS          #Network Filesystem
-
-    options          NFS_ROOT     #NFS usable as root device, NFS required
+    device          psm0       at atkbdc? irq 12
 
-The network Filesystem. Unless you plan to mount partitions from a UNIX® file server over TCP/IP, you can comment these out.
+Use this device if your mouse plugs into the PS/2 mouse port.
 
     
 
-    options          MSDOSFS      #MSDOS Filesystem
+    device          vga0        at isa?
 
-The MS-DOS® Filesystem. Unless you plan to mount a DOS formatted hard drive partition at boot time, you can safely comment this out. It will be automatically loaded the first time you mount a DOS partition, as described above. Also, the excellent ***mtools*** software (in pkgsrc®) allows you to access DOS floppies without having to mount and unmount them (and does not require `MSDOSFS` at all).
+The video card driver.
 
     
 
-    options          CD9660       #ISO 9660 Filesystem
+    # splash screen/screen saver
 
-    options          CD9660_ROOT  #CD-ROM usable as root, CD9660 required
+    pseudo-device          splash
 
-The ISO 9660 Filesystem for CDROMs. Comment it out if you do not have a CDROM drive or only mount data CDs occasionally (since it will be dynamically loaded the first time you mount a data CD). Audio CDs do not need this Filesystem.
+Splash screen at start up! Screen savers require this too.
 
     
 
-    options          PROCFS       #Process filesystem
+    # syscons is the default console driver, resembling an SCO console
 
-The process filesystem. This is a ***pretend*** filesystem mounted on `/proc` which allows programs like [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ps&section1) to give you more information on what processes are running. ***
+    device          sc0          at isa?
+
+`sc0` is the default console driver, which resembles a SCO console. Since most full-screen programs access the console through a terminal database library like `termcap`, it should not matter whether you use this or `vt0`, the `VT220` compatible console driver. When you log in, set your `TERM` variable to `scoansi` if full-screen programs have trouble running under this console.
 
     
 
-Compatibility with 4.3BSD. Leave this in; some programs will act strangely if you comment this out.
+    # Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver
 
-    
+    #device          vt0     at isa?
 
-    options          SCSI_DELAY=5000    #Delay (in ms) before probing SCSI
+    #options         XSERVER          # support for X server on a vt console
 
-This causes the kernel to pause for 15 seconds before probing each SCSI device in your system. If you only have IDE hard drives, you can ignore this, otherwise you will probably want to lower this number, perhaps to five seconds (5000 ms), to speed up booting. Of course, if you do this, and DragonFly has trouble recognizing your SCSI devices, you will have to raise it back up.
+    #options         FAT_CURSOR       # start with block cursor
 
-    
+    # If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines
 
-    options          UCONSOLE            #Allow users to grab the console
+    #options         PCVT_SCANSET=2   # IBM keyboards are non-std
 
-Allow users to grab the console, which is useful for X users. For example, you can create a console ***xterm*** by typing `xterm -C`, which will display any [write(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#write&section1), [talk(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=talk&section=1), and any other messages you receive, as well as any console messages sent by the kernel.
+This is a VT220-compatible console driver, backward compatible to VT100/102. It works well on some laptops which have hardware incompatibilities with `sc0`. Also set your `TERM` variable to `vt100` or `vt220` when you log in. This driver might also prove useful when connecting to a large number of different machines over the network, where `termcap` or `terminfo` entries for the `sc0` device are often not available -- `vt100` should be available on virtually any platform.
 
     
 
-    options          USERCONFIG          #boot -c editor
+    # Power management support (see LINT for more options)
 
-This option allows you to boot the configuration editor from the boot menu.
+    device          apm0     at nexus? disable flags 0x20  # Advanced Power Management
+
+Advanced Power Management support. Useful for laptops.
 
     
 
-    options          VISUAL_USERCONFIG   #visual boot -c editor
+    # PCCARD (PCMCIA) support
 
-This option allows you to boot the visual configuration editor from the boot menu.
+    device          card
 
-    
+    device          pcic0    at isa? irq 10 port 0x3e0 iomem 0xd0000
 
-    options          KTRACE              #ktrace(1) support
+    device          pcic1    at isa? irq 11 port 0x3e2 iomem 0xd4000 disable
 
-This enables kernel process tracing, which is useful in debugging.
+PCMCIA support. You want this if you are using a laptop.
 
     
 
-    options          SYSVSHM             #SYSV-style shared memory
-
-This option provides for System V shared memory. The most common use of this is the XSHM extension in X, which many graphics-intensive programs will automatically take advantage of for extra speed. If you use X, you will definitely want to include this.
+    # Serial (COM) ports
 
-    
+    device          sio0     at isa? port IO_COM1 flags 0x10 irq 4
 
-    options          SYSVSEM             #SYSV-style semaphores
+    device          sio1     at isa? port IO_COM2 irq 3
 
-Support for System V semaphores. Less commonly used but only adds a few hundred bytes to the kernel.
+    device          sio2     at isa? disable port IO_COM3 irq 5
 
-    
+    device          sio3     at isa? disable port IO_COM4 irq 9
 
-    options          SYSVMSG             #SYSV-style message queues
+These are the four serial ports referred to as COM1 through COM4 in the MS-DOS/Windows® world.
 
-Support for System V messages. Again, only adds a few hundred bytes to the kernel.
+ **Note:** If you have an internal modem on COM4 and a serial port at COM2, you will have to change the IRQ of the modem to 2 (for obscure technical reasons, IRQ2 # IRQ 9) in order to access it from DragonFly. If you have a multiport serial card, check the manual page for [sio(4)](http://leaf.dragonflybsd.org/cgi/web-man?commandsio&section=4) for more information on the proper values for these lines. Some video cards (notably those based on S3 chips) use IO addresses in the form of `0x*2e8`, and since many cheap serial cards do not fully decode the 16-bit IO address space, they clash with these cards making the COM4 port practically unavailable.
 
- **Note:** The [ipcs(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipcs&section1) command will list any processes using each of these System V facilities.
+Each serial port is required to have a unique IRQ (unless you are using one of the multiport cards where shared interrupts are supported), so the default IRQs for COM3 and COM4 cannot be used.
 
     
 
-    options         P1003_1B                #Posix P1003_1B real-time extensions
+    # Parallel port
 
-    options         _KPOSIX_PRIORITY_SCHEDULING
+    device          ppc0    at isa? irq 7
 
-Real-time extensions added in the 1993 POSIX®. Certain applications in the ports collection use these (such as  **StarOffice™** ).
+This is the ISA-bus parallel port interface.
 
     
 
-    options         ICMP_BANDLIM            #Rate limit bad replies
+    device          ppbus      # Parallel port bus (required)
 
-This option enables ICMP error response bandwidth limiting. You typically want this option as it will help protect the machine from denial of service packet attacks.
+Provides support for the parallel port bus.
 
     
 
-    # To make an SMP kernel, the next two are needed
-
-    #options        SMP                     # Symmetric MultiProcessor Kernel
+    device          lpt        # Printer
 
-    #options        APIC_IO                 # Symmetric (APIC) I/O
+Support for parallel port printers.
 
-The above are both required for SMP support.
+ **Note:** All three of the above are required to enable parallel printer support.
 
     
 
-    device          isa
+    device          plip       # TCP/IP over parallel
 
-All PCs supported by DragonFly have one of these. Do not remove, even if you have no ISA slots. If you have an IBM PS/2 (Micro Channel Architecture), DragonFly provides some limited support at this time. For more information about the MCA support, see `/usr/src/sys/config/LINT`.
+This is the driver for the parallel network interface.
 
     
 
-    device          eisa
+    device          ppi        # Parallel port interface device
 
-Include this if you have an EISA motherboard. This enables auto-detection and configuration support for all devices on the EISA bus.
+The general-purpose I/O (***geek port) + IEEE1284 I/O.
 
     
 
-    device          pci
+    #device         vpo        # Requires scbus and da
 
-Include this if you have a PCI motherboard. This enables auto-detection of PCI cards and gatewaying from the PCI to ISA bus.
+This is for an Iomega Zip drive. It requires `scbus` and `da` support. Best performance is achieved with ports in EPP 1.9 mode.
 
     
 
-    device          agp
-
-Include this if you have an AGP card in the system. This will enable support for AGP, and AGP GART for boards which have these features.
+    # PCI Ethernet NICs.
 
-    
+    device          de         # DEC/Intel DC21x4x (Tulip)
 
-    # Floppy drives
+    device          fxp        # Intel EtherExpress PRO/100B (82557, 82558)
 
-    device          fdc0        at isa? port IO_FD1 irq 6 drq 2
+    device          tx         # SMC 9432TX (83c170 EPIC)
 
-    device          fd0         at fdc0 drive 0
+    device          vx         # 3Com 3c590, 3c595 (Vortex)
 
-    device          fd1         at fdc0 drive 1
+    device          wx         # Intel Gigabit Ethernet Card (Wiseman)
 
-This is the floppy drive controller. `fd0` is the `A:` floppy drive, and `fd1` is the `B:` drive.
+Various PCI network card drivers. Comment out or remove any of these not present in your system.
 
     
 
-    device          ata
+    # PCI Ethernet NICs that use the common MII bus controller code.
 
-This driver supports all ATA and ATAPI devices. You only need one `device ata` line for the kernel to detect all PCI ATA/ATAPI devices on modern machines.
+    device          miibus     # MII bus support
 
-    
+MII bus support is required for some PCI 10/100 Ethernet NICs, namely those which use MII-compliant transceivers or implement transceiver control interfaces that operate like an MII. Adding `device miibus` to the kernel config pulls in support for the generic miibus API and all of the PHY drivers, including a generic one for PHYs that are not specifically handled by an individual driver.
 
-    device          atadisk                 # ATA disk drives
+    
 
-This is needed along with `device ata` for ATA disk drives.
+    device          dc         # DEC/Intel 21143 and various workalikes
 
-    
+    device          rl         # RealTek 8129/8139
 
-    device          atapicd                 # ATAPI CDROM drives
+    device          sf         # Adaptec AIC-6915 (Starfire)
 
-This is needed along with `device ata` for ATAPI CDROM drives.
+    device          sis        # Silicon Integrated Systems SiS 900/SiS 7016
 
-    
+    device          ste        # Sundance ST201 (D-Link DFE-550TX)
 
-    device          atapifd                 # ATAPI floppy drives
+    device          tl         # Texas Instruments ThunderLAN
 
-This is needed along with `device ata` for ATAPI floppy drives.
+    device          vr         # VIA Rhine, Rhine II
 
-    
+    device          wb         # Winbond W89C840F
 
-    device          atapist                 # ATAPI tape drives
+    device          xl         # 3Com 3c90x (Boomerang, Cyclone)
 
-This is needed along with `device ata` for ATAPI tape drives.
+Drivers that use the MII bus controller code.
 
     
 
-    options         ATA_STATIC_ID           #Static device numbering
+    # ISA Ethernet NICs.
 
-This makes the controller number static (like the old driver) or else the device numbers are dynamically allocated.
+    device          ed0    at isa? port 0x280 irq 10 iomem 0xd8000
 
-    
+    device          ex
 
-    # ATA and ATAPI devices
+    device          ep
 
-    device          ata0        at isa? port IO_WD1 irq 14
+    # WaveLAN/IEEE 802.11 wireless NICs. Note: the WaveLAN/IEEE really
 
-    device          ata1        at isa? port IO_WD2 irq 15
+    # exists only as a PCMCIA device, so there is no ISA attachment needed
 
-Use the above for older, non-PCI systems.
+    # and resources will always be dynamically assigned by the pccard code.
 
-    
+    device          wi
 
-    # SCSI Controllers
+    # Aironet 4500/4800 802.11 wireless NICs. Note: the declaration below will
 
-    device          ahb        # EISA AHA1742 family
+    # work for PCMCIA and PCI cards, as well as ISA cards set to ISA PnP
 
-    device          ahc        # AHA2940 and onboard AIC7xxx devices
+    # mode (the factory default). If you set the switches on your ISA
 
-    device          amd        # AMD 53C974 (Teckram DC-390(T))
+    # card for a manually chosen I/O address and IRQ, you must specify
 
-    device          dpt        # DPT Smartcache - See LINT for options!
+    # those parameters here.
 
-    device          isp        # Qlogic family
+    device          an
 
-    device          ncr        # NCR/Symbios Logic
+    # The probe order of these is presently determined by i386/isa/isa_compat.c.
 
-    device          sym        # NCR/Symbios Logic (newer chipsets)
+    device          ie0    at isa? port 0x300 irq 10 iomem 0xd0000
 
-    device          adv0       at isa?
+    device          fe0    at isa? port 0x300
 
-    device          adw
+    device          le0    at isa? port 0x300 irq 5 iomem 0xd0000
 
-    device          bt0        at isa?
+    device          lnc0   at isa? port 0x280 irq 10 drq 0
 
-    device          aha0       at isa?
+    device          cs0    at isa? port 0x300
 
-    device          aic0       at isa?
+    device          sn0    at isa? port 0x300 irq 10
 
-SCSI controllers. Comment out any you do not have in your system. If you have an IDE only system, you can remove these altogether.
+    # requires PCCARD (PCMCIA) support to be activated
 
-    
+    #device         xe0    at isa?
 
-    # SCSI peripherals
+ISA Ethernet drivers. See `/usr/src/sys/config/LINT` for which cards are supported by which driver.
 
-    device          scbus      # SCSI bus (required)
+    
 
-    device          da         # Direct Access (disks)
+    pseudo-device   ether         # Ethernet support
 
-    device          sa         # Sequential Access (tape etc)
+`ether` is only needed if you have an Ethernet card. It includes generic Ethernet protocol code.
 
-    device          cd         # CD
+    
 
-    device          pass       # Passthrough device (direct SCSI
+    pseudo-device   sl      1     # Kernel SLIP
 
-    access)
+`sl` is for SLIP support. This has been almost entirely supplanted by PPP, which is easier to set up, better suited for modem-to-modem connection, and more powerful. The ***number*** after `sl` specifies how many simultaneous SLIP sessions to support.
 
-SCSI peripherals. Again, comment out any you do not have, or if you have only IDE hardware, you can remove them completely.
+    
 
- **Note:** The USB [umass(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#umass&section4) driver (and a few other drivers) use the SCSI subsystem even though they are not real SCSI devices. Therefore make sure not to remove SCSI support, if any such drivers are included in the kernel configuration.
+    pseudo-device   ppp     1     # Kernel PPP
+
+This is for kernel PPP support for dial-up connections. There is also a version of PPP implemented as a userland application that uses `tun` and offers more flexibility and features such as demand dialing. The ***number*** after `ppp` specifies how many simultaneous PPP connections to support. .
 
     
 
-    # RAID controllers
+    device   tun           # Packet tunnel.
 
-    device          ida        # Compaq Smart RAID
+This is used by the userland PPP software. A ***number*** after `tun` specifies the number of simultaneous PPP sessions to support. See the [userppp.html PPP] section of this book for more information.
 
-    device          amr        # AMI MegaRAID
+    
 
-    device          mlx        # Mylex DAC960 family
+    pseudo-device   pty           # Pseudo-ttys (telnet etc)
 
-Supported RAID controllers. If you do not have any of these, you can comment them out or remove them.
+This is a ***pseudo-terminal*** or simulated login port. It is used by incoming `telnet` and `rlogin` sessions, ***xterm***, and some other applications such as ***Emacs***. The ***number*** after `pty` indicates the number of `pty`s to create. If you need more than the default of 16 simultaneous ***xterm*** windows and/or remote logins, be sure to increase this number accordingly, up to a maximum of 256. ***
 
     
 
-    # atkbdc0 controls both the keyboard and the PS/2 mouse
+Memory disk pseudo-devices.
 
-    device          atkbdc0    at isa? port IO_KBD
+    
 
-The keyboard controller (`atkbdc`) provides I/O services for the AT keyboard and PS/2 style pointing devices. This controller is required by the keyboard driver (`atkbd`) and the PS/2 pointing device driver (`psm`).
+    pseudo-device   gif     # IPv6 and IPv4 tunneling
+
+This implements IPv6 over IPv4 tunneling, IPv4 over IPv6 tunneling, IPv4 over IPv4 tunneling, and IPv6 over IPv6 tunneling.
 
     
 
-    device          atkbd0     at atkbdc? irq 1
+    pseudo-device   faith   # IPv6-to-IPv4 relaying (translation)
 
-The `atkbd` driver, together with `atkbdc` controller, provides access to the AT 84 keyboard or the AT enhanced keyboard which is connected to the AT keyboard controller.
+This pseudo-device captures packets that are sent to it and diverts them to the IPv4/IPv6 translation daemon.
 
     
 
-    device          psm0       at atkbdc? irq 12
+    # The `bpf' device enables the Berkeley Packet Filter.
 
-Use this device if your mouse plugs into the PS/2 mouse port.
+    # Be aware of the administrative consequences of enabling this!
 
-    
+    pseudo-device   bpf           # Berkeley packet filter
 
-    device          vga0        at isa?
+This is the Berkeley Packet Filter. This pseudo-device allows network interfaces to be placed in promiscuous mode, capturing every packet on a broadcast network (e.g., an Ethernet). These packets can be captured to disk and or examined with the [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#tcpdump&section1) program.
 
-The video card driver.
+ **Note:** The [bpf(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#bpf&section4) device is also used by [dhclient(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dhclient&section=8) to obtain the IP address of the default router (gateway) and so on. If you use DHCP, leave this uncommented.
 
     
 
-    # splash screen/screen saver
+    # USB support
 
-    pseudo-device          splash
+    #device         uhci          # UHCI PCI-&gt;USB interface
 
-Splash screen at start up! Screen savers require this too.
+    #device         ohci          # OHCI PCI-&gt;USB interface
 
-    
+    #device         usb           # USB Bus (required)
 
-    # syscons is the default console driver, resembling an SCO console
+    #device         ugen          # Generic
 
-    device          sc0          at isa?
+    #device         uhid          # ***Human Interface Devices***
 
-`sc0` is the default console driver, which resembles a SCO console. Since most full-screen programs access the console through a terminal database library like `termcap`, it should not matter whether you use this or `vt0`, the `VT220` compatible console driver. When you log in, set your `TERM` variable to `scoansi` if full-screen programs have trouble running under this console.
+    #device         ukbd          # Keyboard
 
-    
+    #device         ulpt          # Printer
 
-    # Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver
+    #device         umass         # Disks/Mass storage - Requires scbus and da
 
-    #device          vt0     at isa?
+    #device         ums           # Mouse
 
-    #options         XSERVER          # support for X server on a vt console
+    # USB Ethernet, requires mii
 
-    #options         FAT_CURSOR       # start with block cursor
+    #device         aue           # ADMtek USB ethernet
 
-    # If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines
+    #device         cue           # CATC USB ethernet
 
-    #options         PCVT_SCANSET=2   # IBM keyboards are non-std
+    #device         kue           # Kawasaki LSI USB ethernet
 
-This is a VT220-compatible console driver, backward compatible to VT100/102. It works well on some laptops which have hardware incompatibilities with `sc0`. Also set your `TERM` variable to `vt100` or `vt220` when you log in. This driver might also prove useful when connecting to a large number of different machines over the network, where `termcap` or `terminfo` entries for the `sc0` device are often not available -- `vt100` should be available on virtually any platform.
+Support for various USB devices.
 
-    
+For more information and additional devices supported by DragonFly, see `/usr/src/sys/i386/conf/LINT`.
 
-    # Power management support (see LINT for more options)
+#### Notes 
 
-    device          apm0     at nexus? disable flags 0x20  # Advanced Power Management
+[[!table  data="""
+<tablewidth="100%"> [(1)](kernelconfig-config.html#AEN7414) | The auto-tuning algorithm sets `maxuser` equal to the amount of memory in the system, with a minimum of 32, and a maximum of 384. |
+| | 
+"""]]
 
-Advanced Power Management support. Useful for laptops.
+## Device Nodes 
 
-    
+Almost every device in the kernel has a corresponding node entry in the `/dev` directory. These nodes look like regular files, but are actually special entries into the kernel which programs use to access the device. 
 
-    # PCCARD (PCMCIA) support
+These nodes are created automatically once devfs is mounted, which happens manually for the root `/dev` during boot, just after the root mount.
 
-    device          card
+## If Something Goes Wrong 
 
-    device          pcic0    at isa? irq 10 port 0x3e0 iomem 0xd0000
+ **Note:** If you are having trouble building a kernel, make sure to keep a `GENERIC`, or some other kernel that is known to work on hand as a different name that will not get erased on the next build. You cannot rely on `kernel.old` because when installing a new kernel, `kernel.old` is overwritten with the last installed kernel which may be non-functional. Also, as soon as possible, move the working kernel to the proper `kernel` location or commands such as [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ps&section1) will not work properly. The proper command to ***unlock*** the kernel file that `make` installs (in order to move another kernel back permanently) is:
 
-    device          pcic1    at isa? irq 11 port 0x3e2 iomem 0xd4000 disable
+     % chflags noschg /boot/kernel
+     
 
-PCMCIA support. You want this if you are using a laptop.
+If you find you cannot do this, you are probably running at a [securelevel(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#securelevel&section8) greater than zero. Edit `kern_securelevel` in `/etc/rc.conf` and set it to `-1`, then reboot. You can change it back to its previous setting when you are happy with your new kernel.
+
+And, if you want to ***lock*** your new kernel into place, or any file for that matter, so that it cannot be moved or tampered with:
 
     
 
-    # Serial (COM) ports
+    % chflags schg /boot/kernel
+    
 
-    device          sio0     at isa? port IO_COM1 flags 0x10 irq 4
+There are five categories of trouble that can occur when building a custom kernel. They are:
 
-    device          sio1     at isa? port IO_COM2 irq 3
+* `config` fails: If the [config(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#config&section8) command fails when you give it your kernel description, you have probably made a simple error somewhere. Fortunately, [config(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=config&section=8) will print the line number that it had trouble with, so you can quickly skip to it with ***vi***. For example, if you see `config: line 17: syntax error`. You can skip to the problem in ***vi*** by typing `17G` in command mode. Make sure the keyword is typed correctly, by comparing it to the `GENERIC` kernel or another reference.
 
-    device          sio2     at isa? disable port IO_COM3 irq 5
+* `make` fails: If the `make` command fails, it usually signals an error in your kernel description, but not severe enough for [config(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#config&section8) to catch it. Again, look over your configuration, and if you still cannot resolve the problem, send mail to the [DragonFly Bugs mailing list](http://leaf.dragonflybsd.org/mailarchive/) with your kernel configuration, and it should be diagnosed very quickly.
 
-    device          sio3     at isa? disable port IO_COM4 irq 9
+* Installing the new kernel fails: If the kernel compiled fine, but failed to install (the `make install` or `make installkernel` command failed), the first thing to check is if your system is running at securelevel 1 or higher (see [init(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#init&section8)). The kernel installation tries to remove the immutable flag from your kernel and set the immutable flag on the new one. Since securelevel 1 or higher prevents unsetting the immutable flag for any files on the system, the kernel installation needs to be performed at securelevel 0 or lower.
 
-These are the four serial ports referred to as COM1 through COM4 in the MS-DOS/Windows® world.
+* The kernel does not boot: If your new kernel does not boot, or fails to recognize your devices, do not panic! Fortunately, DragonFly has an excellent mechanism for recovering from incompatible kernels. Simply choose the kernel you want to boot from at the DragonFly boot loader. You can access this when the system counts down from 10. Hit any key except for the  **Enter**  key, type `unload` and then type `boot ***kernel.old***`, or the filename of any other kernel that will boot properly. When reconfiguring a kernel, it is always a good idea to keep a kernel that is known to work on hand. After booting with a good kernel you can check over your configuration file and try to build it again. One helpful resource is the `/var/log/messages` file which records, among other things, all of the kernel messages from every successful boot. Also, the [dmesg(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#dmesg&section8) command will print the kernel messages from the current boot.
 
- **Note:** If you have an internal modem on COM4 and a serial port at COM2, you will have to change the IRQ of the modem to 2 (for obscure technical reasons, IRQ2 # IRQ 9) in order to access it from DragonFly. If you have a multiport serial card, check the manual page for [sio(4)](http://leaf.dragonflybsd.org/cgi/web-man?commandsio&section=4) for more information on the proper values for these lines. Some video cards (notably those based on S3 chips) use IO addresses in the form of `0x*2e8`, and since many cheap serial cards do not fully decode the 16-bit IO address space, they clash with these cards making the COM4 port practically unavailable.
+* The kernel works, but [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ps&section1) does not work any more: If you have installed a different version of the kernel from the one that the system utilities have been built with, many system-status commands like [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ps&section=1) and [vmstat(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=vmstat&section=8) will not work any more. You must recompile the `libkvm` library as well as these utilities. This is one reason it is not normally a good idea to use a different version of the kernel from the rest of the operating system.
 
-Each serial port is required to have a unique IRQ (unless you are using one of the multiport cards where shared interrupts are supported), so the default IRQs for COM3 and COM4 cannot be used.
+# Security 
+***Much of this chapter has been taken from the security(7) manual page by Matthew Dillon. ***
 
-    
+[[!toc levels=3]]
 
-    # Parallel port
+## Synopsis 
 
-    device          ppc0    at isa? irq 7
+This chapter will provide a basic introduction to system security concepts, some general good rules of thumb, and some advanced topics under DragonFly. A lot of the topics covered here can be applied to system and Internet security in general as well. The Internet is no longer a ***friendly*** place in which everyone wants to be your kind neighbor. Securing your system is imperative to protect your data, intellectual property, time, and much more from the hands of hackers and the like.
 
-This is the ISA-bus parallel port interface.
+DragonFly provides an array of utilities and mechanisms to ensure the integrity and security of your system and network.
 
-    
+After reading this chapter, you will know:
 
-    device          ppbus      # Parallel port bus (required)
+* Basic system security concepts, in respect to DragonFly.
 
-Provides support for the parallel port bus.
+* About the various crypt mechanisms available in DragonFly, such as DES and MD5.
 
-    
+* How to set up one-time password authentication.
 
-    device          lpt        # Printer
+* How to create firewalls using IPFW.
 
-Support for parallel port printers.
+* How to configure IPsec and create a VPN between DragonFly/Windows® machines.
 
- **Note:** All three of the above are required to enable parallel printer support.
+* How to configure and use  **OpenSSH** , DragonFly's SSH implementation.
 
-    
+Before reading this chapter, you should:
 
-    device          plip       # TCP/IP over parallel
+* Understand basic DragonFly and Internet concepts.
 
-This is the driver for the parallel network interface.
+CategoryHandbook
 
-    
+Category
 
-    device          ppi        # Parallel port interface device
+## Introduction 
 
-The general-purpose I/O (***geek port) + IEEE1284 I/O.
+Security is a function that begins and ends with the system administrator. While all BSD UNIX® multi-user systems have some inherent security, the job of building and maintaining additional security mechanisms to keep those users ***honest*** is probably one of the single largest undertakings of the sysadmin. Machines are only as secure as you make them, and security concerns are ever competing with the human necessity for convenience. UNIX systems, in general, are capable of running a huge number of simultaneous processes and many of these processes operate as servers -- meaning that external entities can connect and talk to them. As yesterday's mini-computers and mainframes become today's desktops, and as computers become networked and internetworked, security becomes an even bigger issue.
 
-    
+Security is best implemented through a layered ***onion*** approach. In a nutshell, what you want to do is to create as many layers of security as are convenient and then carefully monitor the system for intrusions. You do not want to overbuild your security or you will interfere with the detection side, and detection is one of the single most important aspects of any security mechanism. For example, it makes little sense to set the `schg` flags (see [chflags(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#chflags&section1)) on every system binary because while this may temporarily protect the binaries, it prevents an attacker who has broken in from making an easily detectable change that may result in your security mechanisms not detecting the attacker at all.
 
-    #device         vpo        # Requires scbus and da
+System security also pertains to dealing with various forms of attack, including attacks that attempt to crash, or otherwise make a system unusable, but do not attempt to compromise the `root` account (***break root***). Security concerns can be split up into several categories:
 
-This is for an Iomega Zip drive. It requires `scbus` and `da` support. Best performance is achieved with ports in EPP 1.9 mode.
+  1. Denial of service attacks.
 
-    
+  1. User account compromises.
 
-    # PCI Ethernet NICs.
+  1. Root compromise through accessible servers.
 
-    device          de         # DEC/Intel DC21x4x (Tulip)
+  1. Root compromise via user accounts.
 
-    device          fxp        # Intel EtherExpress PRO/100B (82557, 82558)
+  1. Backdoor creation.
 
-    device          tx         # SMC 9432TX (83c170 EPIC)
+A denial of service attack is an action that deprives the machine of needed resources. Typically, DoS attacks are brute-force mechanisms that attempt to crash or otherwise make a machine unusable by overwhelming its servers or network stack. Some DoS attacks try to take advantage of bugs in the networking stack to crash a machine with a single packet. The latter can only be fixed by applying a bug fix to the kernel. Attacks on servers can often be fixed by properly specifying options to limit the load the servers incur on the system under adverse conditions. Brute-force network attacks are harder to deal with. A spoofed-packet attack, for example, is nearly impossible to stop, short of cutting your system off from the Internet. It may not be able to take your machine down, but it can saturate your Internet connection.
 
-    device          vx         # 3Com 3c590, 3c595 (Vortex)
+A user account compromise is even more common than a DoS attack. Many sysadmins still run standard  **telnetd** ,  **rlogind** ,  **rshd** , and  **ftpd**  servers on their machines. These servers, by default, do not operate over encrypted connections. The result is that if you have any moderate-sized user base, one or more of your users logging into your system from a remote location (which is the most common and convenient way to login to a system) will have his or her password sniffed. The attentive system admin will analyze his remote access logs looking for suspicious source addresses even for successful logins.
 
-    device          wx         # Intel Gigabit Ethernet Card (Wiseman)
+One must always assume that once an attacker has access to a user account, the attacker can break `root`. However, the reality is that in a well secured and maintained system, access to a user account does not necessarily give the attacker access to `root`. The distinction is important because without access to `root` the attacker cannot generally hide his tracks and may, at best, be able to do nothing more than mess with the user's files, or crash the machine. User account compromises are very common because users tend not to take the precautions that sysadmins take.
 
-Various PCI network card drivers. Comment out or remove any of these not present in your system.
+System administrators must keep in mind that there are potentially many ways to break `root` on a machine. The attacker may know the `root` password, the attacker may find a bug in a root-run server and be able to break `root` over a network connection to that server, or the attacker may know of a bug in a suid-root program that allows the attacker to break `root` once he has broken into a user's account. If an attacker has found a way to break `root` on a machine, the attacker may not have a need to install a backdoor. Many of the `root` holes found and closed to date involve a considerable amount of work by the attacker to cleanup after himself, so most attackers install backdoors. A backdoor provides the attacker with a way to easily regain `root` access to the system, but it also gives the smart system administrator a convenient way to detect the intrusion. Making it impossible for an attacker to install a backdoor may actually be detrimental to your security, because it will not close off the hole the attacker found to break in the first place.
 
-    
+Security remedies should always be implemented with a multi-layered ***onion peel*** approach and can be categorized as follows:
 
-    # PCI Ethernet NICs that use the common MII bus controller code.
+  1. Securing `root` and staff accounts.
 
-    device          miibus     # MII bus support
+  1. Securing `root` -- root-run servers and suid/sgid binaries.
 
-MII bus support is required for some PCI 10/100 Ethernet NICs, namely those which use MII-compliant transceivers or implement transceiver control interfaces that operate like an MII. Adding `device miibus` to the kernel config pulls in support for the generic miibus API and all of the PHY drivers, including a generic one for PHYs that are not specifically handled by an individual driver.
+  1. Securing user accounts.
 
-    
+  1. Securing the password file.
 
-    device          dc         # DEC/Intel 21143 and various workalikes
+  1. Securing the kernel core, raw devices, and filesystems.
 
-    device          rl         # RealTek 8129/8139
+  1. Quick detection of inappropriate changes made to the system.
 
-    device          sf         # Adaptec AIC-6915 (Starfire)
+  1. Paranoia.
 
-    device          sis        # Silicon Integrated Systems SiS 900/SiS 7016
+The next section of this chapter will cover the above bullet items in greater depth.
 
-    device          ste        # Sundance ST201 (D-Link DFE-550TX)
+CategoryHandbook
 
-    device          tl         # Texas Instruments ThunderLAN
+CategoryHandbook-security
 
-    device          vr         # VIA Rhine, Rhine II
+## Securing DragonFly 
 
-    device          wb         # Winbond W89C840F
+ **Command vs. Protocol:**  Throughout this document, we will use  **bold**  text to refer to a command or application. This is used for instances such as ssh, since it is a protocol as well as command.
 
-    device          xl         # 3Com 3c90x (Boomerang, Cyclone)
+The sections that follow will cover the methods of securing your DragonFly system that were mentioned in the [last section](security-intro.html) of this chapter.
 
-Drivers that use the MII bus controller code.
+### Securing the root Account and Staff Accounts 
 
-    
+First off, do not bother securing staff accounts if you have not secured the `root` account. Most systems have a password assigned to the `root` account. The first thing you do is assume that the password is ***always*** compromised. This does not mean that you should remove the password. The password is almost always necessary for console access to the machine. What it does mean is that you should not make it possible to use the password outside of the console or possibly even with the [su(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#su&section1) command. For example, make sure that your pty's are specified as being insecure in the `/etc/ttys` file so that direct `root` logins via `telnet` or `rlogin` are disallowed. If using other login services such as  **sshd** , make sure that direct `root` logins are disabled there as well. You can do this by editing your `/etc/ssh/sshd_config` file, and making sure that `PermitRootLogin` is set to `NO`. Consider every access method -- services such as FTP often fall through the cracks. Direct `root` logins should only be allowed via the system console.
 
-    # ISA Ethernet NICs.
+Of course, as a sysadmin you have to be able to get to `root`, so we open up a few holes. But we make sure these holes require additional password verification to operate. One way to make `root` accessible is to add appropriate staff accounts to the `wheel` group (in `/etc/group`). The staff members placed in the `wheel` group are allowed to `su` to `root`. You should never give staff members native `wheel` access by putting them in the `wheel` group in their password entry. Staff accounts should be placed in a `staff` group, and then added to the `wheel` group via the `/etc/group` file. Only those staff members who actually need to have `root` access should be placed in the `wheel` group.  While having the `wheel` mechanism is better than having nothing at all, it is not necessarily the safest option.
 
-    device          ed0    at isa? port 0x280 irq 10 iomem 0xd8000
+An indirect way to secure staff accounts, and ultimately `root` access is to use an alternative login access method and do what is known as ***starring*** out the encrypted password for the staff accounts. Using the [vipw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#vipw&section8) command, one can replace each instance of an encrypted password with a single `*` character. This command will update the `/etc/master.passwd` file and user/password database to disable password-authenticated logins.
 
-    device          ex
+A staff account entry such as:
 
-    device          ep
+    
 
-    # WaveLAN/IEEE 802.11 wireless NICs. Note: the WaveLAN/IEEE really
+    foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
 
-    # exists only as a PCMCIA device, so there is no ISA attachment needed
+Should be changed to this:
 
-    # and resources will always be dynamically assigned by the pccard code.
+    
 
-    device          wi
+    foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
 
-    # Aironet 4500/4800 802.11 wireless NICs. Note: the declaration below will
+This change will prevent normal logins from occurring, since the encrypted password will never match `*`. With this done, staff members must use another mechanism to authenticate themselves such as  [ssh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ssh&section=1&manpath=OpenBSD+3.3) using a public/private key pair. When using a public/private key pair with ssh, one must generally secure the machine used to login ***from*** (typically one's workstation). An additional layer of protection can be added to the key pair by password protecting the key pair when creating it with [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ssh-keygen&section=1). Being able to ***star*** out the passwords for staff accounts also guarantees that staff members can only login through secure access methods that you have set up. This forces all staff members to use secure, encrypted connections for all of their sessions, which closes an important hole used by many intruders: sniffing the network from an unrelated, less secure machine.
 
-    # work for PCMCIA and PCI cards, as well as ISA cards set to ISA PnP
+The more indirect security mechanisms also assume that you are logging in from a more restrictive server to a less restrictive server. For example, if your main box is running all sorts of servers, your workstation should not be running any. In order for your workstation to be reasonably secure you should run as few servers as possible, up to and including no servers at all, and you should run a password-protected screen blanker. Of course, given physical access to a workstation an attacker can break any sort of security you put on it. This is definitely a problem that you should consider, but you should also consider the fact that the vast majority of break-ins occur remotely, over a network, from people who do not have physical access to your workstation or servers.
 
-    # mode (the factory default). If you set the switches on your ISA
+### Securing Root-run Servers and SUID/SGID Binaries 
 
-    # card for a manually chosen I/O address and IRQ, you must specify
+The prudent sysadmin only runs the servers he needs to, no more, no less. Be aware that third party servers are often the most bug-prone. For example, running an old version of  **imapd**  or  **popper**  is like giving a universal `root` ticket out to the entire world. Never run a server that you have not checked out carefully. Many servers do not need to be run as `root`. For example, the  **ntalk** ,  **comsat** , and  **finger**  daemons can be run in special user ***sandboxes***. A sandbox is not perfect, unless you go through a large amount of trouble, but the onion approach to security still stands: If someone is able to break in through a server running in a sandbox, they still have to break out of the sandbox. The more layers the attacker must break through, the lower the likelihood of his success. Root holes have historically been found in virtually every server ever run as `root`, including basic system servers. If you are running a machine through which people only login via  **sshd**  and never login via  **telnetd**  or  **rshd**  or  **rlogind** , then turn off those services!
 
-    # those parameters here.
+DragonFly now defaults to running  **ntalkd** ,  **comsat** , and  **finger**  in a sandbox. Another program which may be a candidate for running in a sandbox is [named(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#named&section8). `/etc/defaults/rc.conf` includes the arguments necessary to run  **named**  in a sandbox in a commented-out form. Depending on whether you are installing a new system or upgrading an existing system, the special user accounts used by these sandboxes may not be installed. The prudent sysadmin would research and implement sandboxes for servers whenever possible.
 
-    device          an
+There are a number of other servers that typically do not run in sandboxes:  **sendmail** ,  **popper** ,  **imapd** ,  **ftpd** , and others. There are alternatives to some of these, but installing them may require more work than you are willing to perform (the convenience factor strikes again). You may have to run these servers as `root` and rely on other mechanisms to detect break-ins that might occur through them.
 
-    # The probe order of these is presently determined by i386/isa/isa_compat.c.
+The other big potential `root` holes in a system are the suid-root and sgid binaries installed on the system. Most of these binaries, such as  **rlogin** , reside in `/bin`, `/sbin`, `/usr/bin`, or `/usr/sbin`. While nothing is 100% safe, the system-default suid and sgid binaries can be considered reasonably safe. Still, `root` holes are occasionally found in these binaries. A `root` hole was found in `Xlib` in 1998 that made  **xterm**  (which is typically suid) vulnerable. It is better to be safe than sorry and the prudent sysadmin will restrict suid binaries, that only staff should run, to a special group that only staff can access, and get rid of (`chmod 000`) any suid binaries that nobody uses. A server with no display generally does not need an  **xterm**  binary. Sgid binaries can be almost as dangerous. If an intruder can break an sgid-kmem binary, the intruder might be able to read `/dev/kmem` and thus read the encrypted password file, potentially compromising any passworded account. Alternatively an intruder who breaks group `kmem` can monitor keystrokes sent through pty's, including pty's used by users who login through secure methods. An intruder that breaks the `tty` group can write to almost any user's tty. If a user is running a terminal program or emulator with a keyboard-simulation feature, the intruder can potentially generate a data stream that causes the user's terminal to echo a command, which is then run as that user.
 
-    device          ie0    at isa? port 0x300 irq 10 iomem 0xd0000
+### Securing User Accounts 
 
-    device          fe0    at isa? port 0x300
+User accounts are usually the most difficult to secure. While you can impose Draconian access restrictions on your staff and ***star*** out their passwords, you may not be able to do so with any general user accounts you might have. If you do have sufficient control, then you may win out and be able to secure the user accounts properly. If not, you simply have to be more vigilant in your monitoring of those accounts. Use of ssh for user accounts is more problematic, due to the extra administration and technical support required, but still a very good solution compared to a crypted password file.
 
-    device          le0    at isa? port 0x300 irq 5 iomem 0xd0000
+### Securing the Password File 
 
-    device          lnc0   at isa? port 0x280 irq 10 drq 0
+The only sure fire way is to `*` out as many passwords as you can and use ssh for access to those accounts. Even though the encrypted password file (`/etc/spwd.db`) can only be read by `root`, it may be possible for an intruder to obtain read access to that file even if the attacker cannot obtain root-write access.
 
-    device          cs0    at isa? port 0x300
+Your security scripts should always check for and report changes to the password file (see the [Checking file integrity](securing-freebsd.html#SECURITY-INTEGRITY) section below).
 
-    device          sn0    at isa? port 0x300 irq 10
+### Securing the Kernel Core, Raw Devices, and Filesystems 
 
-    # requires PCCARD (PCMCIA) support to be activated
+If an attacker breaks `root` he can do just about anything, but there are certain conveniences. For example, most modern kernels have a packet sniffing device driver built in. Under DragonFly it is called the `bpf` device. An intruder will commonly attempt to run a packet sniffer on a compromised machine. You do not need to give the intruder the capability and most systems do not have the need for the `bpf` device compiled in.
 
-    #device         xe0    at isa?
+But even if you turn off the `bpf` device, you still have `/dev/mem` and `/dev/kmem` to worry about. For that matter, the intruder can still write to raw disk devices. Also, there is another kernel feature called the module loader, [kldload(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#kldload&section8). An enterprising intruder can use a KLD module to install his own `bpf` device, or other sniffing device, on a running kernel. To avoid these problems you have to run the kernel at a higher secure level, at least securelevel 1. The securelevel can be set with a `sysctl` on the `kern.securelevel` variable. Once you have set the securelevel to 1, write access to raw devices will be denied and special `chflags` flags, such as `schg`, will be enforced. You must also ensure that the `schg` flag is set on critical startup binaries, directories, and script files -- everything that gets run up to the point where the securelevel is set. This might be overdoing it, and upgrading the system is much more difficult when you operate at a higher secure level. You may compromise and run the system at a higher secure level but not set the `schg` flag for every system file and directory under the sun. Another possibility is to simply mount `/` and `/usr` read-only. It should be noted that being too Draconian in what you attempt to protect may prevent the all-important detection of an intrusion.
 
-ISA Ethernet drivers. See `/usr/src/sys/config/LINT` for which cards are supported by which driver.
+### Checking File Integrity: Binaries, Configuration Files, Etc. 
 
-    
+When it comes right down to it, you can only protect your core system configuration and control files so much before the convenience factor rears its ugly head. For example, using `chflags` to set the `schg` bit on most of the files in `/` and `/usr` is probably counterproductive, because while it may protect the files, it also closes a detection window. The last layer of your security onion is perhaps the most important -- detection. The rest of your security is pretty much useless (or, worse, presents you with a false sense of safety) if you cannot detect potential incursions. Half the job of the onion is to slow down the attacker, rather than stop him, in order to give the detection side of the equation a chance to catch him in the act.
 
-    pseudo-device   ether         # Ethernet support
+The best way to detect an incursion is to look for modified, missing, or unexpected files. The best way to look for modified files is from another (often centralized) limited-access system. Writing your security scripts on the extra-secure limited-access system makes them mostly invisible to potential attackers, and this is important. In order to take maximum advantage you generally have to give the limited-access box significant access to the other machines in the business, usually either by doing a read-only NFS export of the other machines to the limited-access box, or by setting up ssh key-pairs to allow the limited-access box to ssh to the other machines. Except for its network traffic, NFS is the least visible method -- allowing you to monitor the filesystems on each client box virtually undetected. If your limited-access server is connected to the client boxes through a switch, the NFS method is often the better choice. If your limited-access server is connected to the client boxes through a hub, or through several layers of routing, the NFS method may be too insecure (network-wise) and using ssh may be the better choice even with the audit-trail tracks that ssh lays.
 
-`ether` is only needed if you have an Ethernet card. It includes generic Ethernet protocol code.
+Once you give a limited-access box, at least read access to the client systems it is supposed to monitor, you must write scripts to do the actual monitoring. Given an NFS mount, you can write scripts out of simple system utilities such as [find(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#find&section1) and [md5(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=md5&section=1). It is best to physically md5 the client-box files at least once a day, and to test control files such as those found in `/etc` and `/usr/local/etc` even more often. When mismatches are found, relative to the base md5 information the limited-access machine knows is valid, it should scream at a sysadmin to go check it out. A good security script will also check for inappropriate suid binaries and for new or deleted files on system partitions such as `/` and `/usr`.
 
-    
+When using ssh rather than NFS, writing the security script is much more difficult. You essentially have to `scp` the scripts to the client box in order to run them, making them visible, and for safety you also need to `scp` the binaries (such as find) that those scripts use. The  **ssh**  client on the client box may already be compromised. All in all, using ssh may be necessary when running over insecure links, but it is also a lot harder to deal with.
 
-    pseudo-device   sl      1     # Kernel SLIP
+A good security script will also check for changes to user and staff members access configuration files: `.rhosts`, `.shosts`, `.ssh/authorized_keys` and so forth... files that might fall outside the purview of the `MD5` check.
 
-`sl` is for SLIP support. This has been almost entirely supplanted by PPP, which is easier to set up, better suited for modem-to-modem connection, and more powerful. The ***number*** after `sl` specifies how many simultaneous SLIP sessions to support.
+If you have a huge amount of user disk space, it may take too long to run through every file on those partitions. In this case, setting mount flags to disallow suid binaries and devices on those partitions is a good idea. The `nodev` and `nosuid` options (see [mount(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#mount&section8)) are what you want to look into. You should probably scan them anyway, at least once a week, since the object of this layer is to detect a break-in whether or not the break-in is effective.
 
-    
+Process accounting (see [accton(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#accton&section8)) is a relatively low-overhead feature of the operating system which might help as a post-break-in evaluation mechanism. It is especially useful in tracking down how an intruder has actually broken into a system, assuming the file is still intact after the break-in occurs.
 
-    pseudo-device   ppp     1     # Kernel PPP
+Finally, security scripts should process the log files, and the logs themselves should be generated in as secure a manner as possible -- remote syslog can be very useful. An intruder tries to cover his tracks, and log files are critical to the sysadmin trying to track down the time and method of the initial break-in. One way to keep a permanent record of the log files is to run the system console to a serial port and collect the information on a continuing basis through a secure machine monitoring the consoles.
 
-This is for kernel PPP support for dial-up connections. There is also a version of PPP implemented as a userland application that uses `tun` and offers more flexibility and features such as demand dialing. The ***number*** after `ppp` specifies how many simultaneous PPP connections to support. .
+### Paranoia 
 
-    
+A little paranoia never hurts. As a rule, a sysadmin can add any number of security features, as long as they do not affect convenience, and can add security features that ***do*** affect convenience with some added thought. Even more importantly, a security administrator should mix it up a bit -- if you use recommendations such as those given by this document verbatim, you give away your methodologies to the prospective attacker who also has access to this document.
 
-    device   tun           # Packet tunnel.
+### Denial of Service Attacks 
 
-This is used by the userland PPP software. A ***number*** after `tun` specifies the number of simultaneous PPP sessions to support. See the [userppp.html PPP] section of this book for more information.
+This section covers Denial of Service attacks. A DoS attack is typically a packet attack. While there is not much you can do about modern spoofed packet attacks that saturate your network, you can generally limit the damage by ensuring that the attacks cannot take down your servers.
 
-    
+  1. Limiting server forks.
 
-    pseudo-device   pty           # Pseudo-ttys (telnet etc)
+  1. Limiting springboard attacks (ICMP response attacks, ping broadcast, etc.).
 
-This is a ***pseudo-terminal*** or simulated login port. It is used by incoming `telnet` and `rlogin` sessions, ***xterm***, and some other applications such as ***Emacs***. The ***number*** after `pty` indicates the number of `pty`s to create. If you need more than the default of 16 simultaneous ***xterm*** windows and/or remote logins, be sure to increase this number accordingly, up to a maximum of 256. ***
+  1. Kernel Route Cache.
 
-    
+A common DoS attack is against a forking server that attempts to cause the server to eat processes, file descriptors, and memory, until the machine dies.  **inetd**  (see [inetd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#inetd&section8)) has several options to limit this sort of attack. It should be noted that while it is possible to prevent a machine from going down, it is not generally possible to prevent a service from being disrupted by the attack. Read the  **inetd**  manual page carefully and pay specific attention to the `-c`, `-C`, and `-R` options. Note that spoofed-IP attacks will circumvent the `-C` option to  **inetd** , so typically a combination of options must be used. Some standalone servers have self-fork-limitation parameters.
 
-Memory disk pseudo-devices.
+ **Sendmail**  has its `-OMaxDaemonChildren` option, which tends to work much better than trying to use sendmail's load limiting options due to the load lag. You should specify a `MaxDaemonChildren` parameter, when you start  **sendmail** , high enough to handle your expected load, but not so high that the computer cannot handle that number of  **sendmails**  without falling on its face. It is also prudent to run sendmail in queued mode (`-ODeliveryMode=queued`) and to run the daemon (`sendmail -bd`) separate from the queue-runs (`sendmail -q15m`). If you still want real-time delivery you can run the queue at a much lower interval, such as `-q1m`, but be sure to specify a reasonable `MaxDaemonChildren` option for ***that*** sendmail to prevent cascade failures.
 
-    
+ **Syslogd**  can be attacked directly and it is strongly recommended that you use the `-s` option whenever possible, and the `-a` option otherwise.
 
-    pseudo-device   gif     # IPv6 and IPv4 tunneling
+You should also be fairly careful with connect-back services such as  **tcpwrapper**  s reverse-identd, which can be attacked directly. You generally do not want to use the reverse-ident feature of  **tcpwrappers**  for this reason.
 
-This implements IPv6 over IPv4 tunneling, IPv4 over IPv6 tunneling, IPv4 over IPv4 tunneling, and IPv6 over IPv6 tunneling.
+It is a very good idea to protect internal services from external access by firewalling them off at your border routers. The idea here is to prevent saturation attacks from outside your LAN, not so much to protect internal services from network-based `root` compromise. Always configure an exclusive firewall, i.e., firewall everything ***except*** ports A, B, C, D, and M-Z. This way you can firewall off all of your low ports except for certain specific services such as  **named**  (if you are primary for a zone),  **ntalkd** ,  **sendmail** , and other Internet-accessible services. If you try to configure the firewall the other way -- as an inclusive or permissive firewall, there is a good chance that you will forget to ***close*** a couple of services, or that you will add a new internal service and forget to update the firewall. You can still open up the high-numbered port range on the firewall, to allow permissive-like operation, without compromising your low ports. Also take note that DragonFly allows you to control the range of port numbers used for dynamic binding, via the various `net.inet.ip.portrange` `sysctl`'s (`sysctl -a | fgrep portrange`), which can also ease the complexity of your firewall's configuration. For example, you might use a normal first/last range of 4000 to 5000, and a hiport range of 49152 to 65535, then block off everything under 4000 in your firewall (except for certain specific Internet-accessible ports, of course).
 
-    
+Another common DoS attack is called a springboard attack -- to attack a server in a manner that causes the server to generate responses which overloads the server, the local network, or some other machine. The most common attack of this nature is the ***ICMP ping broadcast attack***. The attacker spoofs ping packets sent to your LAN's broadcast address with the source IP address set to the actual machine they wish to attack. If your border routers are not configured to stomp on ping's to broadcast addresses, your LAN winds up generating sufficient responses to the spoofed source address to saturate the victim, especially when the attacker uses the same trick on several dozen broadcast addresses over several dozen different networks at once. Broadcast attacks of over a hundred and twenty megabits have been measured. A second common springboard attack is against the ICMP error reporting system. By constructing packets that generate ICMP error responses, an attacker can saturate a server's incoming network and cause the server to saturate its outgoing network with ICMP responses. This type of attack can also crash the server by running it out of mbuf's, especially if the server cannot drain the ICMP responses it generates fast enough. The DragonFly kernel has a new kernel compile option called `ICMP_BANDLIM` which limits the effectiveness of these sorts of attacks. The last major class of springboard attacks is related to certain internal  **inetd**  services such as the udp echo service. An attacker simply spoofs a UDP packet with the source address being server A's echo port, and the destination address being server B's echo port, where server A and B are both on your LAN. The two servers then bounce this one packet back and forth between each other. The attacker can overload both servers and their LANs simply by injecting a few packets in this manner. Similar problems exist with the internal  **chargen**  port. A competent sysadmin will turn off all of these inetd-internal test services.
 
-    pseudo-device   faith   # IPv6-to-IPv4 relaying (translation)
+Spoofed packet attacks may also be used to overload the kernel route cache. Refer to the `net.inet.ip.rtexpire`, `rtminexpire`, and `rtmaxcache` `sysctl` parameters. A spoofed packet attack that uses a random source IP will cause the kernel to generate a temporary cached route in the route table, viewable with `netstat -rna | fgrep W3`. These routes typically timeout in 1600 seconds or so. If the kernel detects that the cached route table has gotten too big it will dynamically reduce the `rtexpire` but will never decrease it to less than `rtminexpire`. There are two problems:
 
-This pseudo-device captures packets that are sent to it and diverts them to the IPv4/IPv6 translation daemon.
+  1. The kernel does not react quickly enough when a lightly loaded server is suddenly attacked.
 
-    
+  1. The `rtminexpire` is not low enough for the kernel to survive a sustained attack.
 
-    # The `bpf' device enables the Berkeley Packet Filter.
+If your servers are connected to the Internet via a T3 or better, it may be prudent to manually override both `rtexpire` and `rtminexpire` via [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#sysctl&section8). Never set either parameter to zero (unless you want to crash the machine). Setting both parameters to two seconds should be sufficient to protect the route table from attack.
 
-    # Be aware of the administrative consequences of enabling this!
+## DES, MD5, and Crypt 
 
-    pseudo-device   bpf           # Berkeley packet filter
+***Parts rewritten and updated by Bill Swingle. ***
 
-This is the Berkeley Packet Filter. This pseudo-device allows network interfaces to be placed in promiscuous mode, capturing every packet on a broadcast network (e.g., an Ethernet). These packets can be captured to disk and or examined with the [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#tcpdump&section1) program.
+Every user on a UNIX® system has a password associated with their account. It seems obvious that these passwords need to be known only to the user and the actual operating system. In order to keep these passwords secret, they are encrypted with what is known as a ***one-way hash***, that is, they can only be easily encrypted but not decrypted. In other words, what we told you a moment ago was obvious is not even true: the operating system itself does not ***really*** know the password. It only knows the ***encrypted*** form of the password. The only way to get the ***plain-text*** password is by a brute force search of the space of possible passwords.
 
- **Note:** The [bpf(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#bpf&section4) device is also used by [dhclient(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dhclient&section=8) to obtain the IP address of the default router (gateway) and so on. If you use DHCP, leave this uncommented.
+Unfortunately the only secure way to encrypt passwords when UNIX came into being was based on DES, the Data Encryption Standard. This was not such a problem for users resident in the US, but since the source code for DES could not be exported outside the US, DragonFly had to find a way to both comply with US law and retain compatibility with all the other UNIX variants that still used DES.
 
-    
+The solution was to divide up the encryption libraries so that US users could install the DES libraries and use DES but international users still had an encryption method that could be exported abroad. This is how DragonFly came to use MD5 as its default encryption method. MD5 is believed to be more secure than DES, so installing DES is offered primarily for compatibility reasons.
 
-    # USB support
+### Recognizing Your Crypt Mechanism 
 
-    #device         uhci          # UHCI PCI-&gt;USB interface
+`libcrypt.a` provides a configurable password authentication hash library. Currently the library supports DES, MD5, Blowfish, SHA256, and SHA512 hash functions. By default DragonFly uses SHA256 to encrypt passwords.
 
-    #device         ohci          # OHCI PCI-&gt;USB interface
+It is pretty easy to identify which encryption method DragonFly is set up to use. Examining the encrypted passwords in the `/etc/master.passwd` file is one way. Passwords encrypted with the MD5 hash are longer than those encrypted with the DES hash and also begin with the characters `$1$`. Passwords starting with `$2a$` are encrypted with the Blowfish hash function. DES password strings do not have any particular identifying characteristics, but they are shorter than MD5 passwords, and are coded in a 64-character alphabet which does not include the `$` character, so a relatively short string which does not begin with a dollar sign is very likely a DES password.
 
-    #device         usb           # USB Bus (required)
+The password format used for new passwords is controlled by the `passwd_format` login capability in `/etc/login.conf`, which takes values of `des`, `md5` or `blf`. See the [login.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#login.conf&amp;section5) manual page for more information about login capabilities.
 
-    #device         ugen          # Generic
+## One-time Passwords 
 
-    #device         uhid          # ***Human Interface Devices***
+S/Key is a one-time password scheme based on a one-way hash function. DragonFly uses the MD4 hash for compatibility but other systems have used MD5 and DES-MAC. S/Key ia part of the FreeBSD base system, and is also used on a growing number of other operating systems. S/Key is a registered trademark of Bell Communications Research, Inc.
 
-    #device         ukbd          # Keyboard
+There are three different sorts of passwords which we will discuss below. The first is your usual UNIX® style password; we will call this a ***UNIX password***. The second sort is the one-time password which is generated by the S/Key `key` program or the OPIE [opiekey(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#opiekey&section1) program and accepted by the `keyinit` or [opiepasswd(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=opiepasswd&section=1) programs and the login prompt; we will call this a ***one-time password***. The final sort of password is the secret password which you give to the `key`/`opiekey` programs (and sometimes the `keyinit`/`opiepasswd` programs) which it uses to generate one-time passwords; we will call it a ***secret password*** or just unqualified ***password***.
 
-    #device         ulpt          # Printer
+The secret password does not have anything to do with your UNIX password; they can be the same but this is not recommended. S/Key and OPIE secret passwords are not limited to eight characters like old UNIX passwords[(1)](#FTN.AEN8429), they can be as long as you like. Passwords of six or seven word long phrases are fairly common. For the most part, the S/Key or OPIE system operates completely independently of the UNIX password system.
 
-    #device         umass         # Disks/Mass storage - Requires scbus and da
+Besides the password, there are two other pieces of data that are important to S/Key and OPIE. One is what is known as the ***seed*** or ***key***, consisting of two letters and five digits. The other is what is called the ***iteration count***, a number between 1 and 100. S/Key creates the one-time password by concatenating the seed and the secret password, then applying the MD4/MD5 hash as many times as specified by the iteration count and turning the result into six short English words. These six English words are your one-time password. The authentication system (primarily PAM) keeps track of the last one-time password used, and the user is authenticated if the hash of the user-provided password is equal to the previous password. Because a one-way hash is used it is impossible to generate future one-time passwords if a successfully used password is captured; the iteration count is decremented after each successful login to keep the user and the login program in sync. When the iteration count gets down to 1, S/Key and OPIE must be reinitialized.
 
-    #device         ums           # Mouse
+There are three programs involved in each system which we will discuss below. The `key` and `opiekey` programs accept an iteration count, a seed, and a secret password, and generate a one-time password or a consecutive list of one-time passwords. The `keyinit` and `opiepasswd` programs are used to initialize S/Key and OPIE respectively, and to change passwords, iteration counts, or seeds; they take either a secret passphrase, or an iteration count, seed, and one-time password. The `keyinfo` and `opieinfo` programs examine the relevant credentials files (`/etc/skeykeys` or `/etc/opiekeys`) and print out the invoking user's current iteration count and seed.
 
-    # USB Ethernet, requires mii
+There are four different sorts of operations we will cover. The first is using `keyinit` or `opiepasswd` over a secure connection to set up one-time-passwords for the first time, or to change your password or seed. The second operation is using `keyinit` or `opiepasswd` over an insecure connection, in conjunction with `key` or `opiekey` over a secure connection, to do the same. The third is using `key`/`opiekey` to log in over an insecure connection. The fourth is using `key` or `opiekey` to generate a number of keys which can be written down or printed out to carry with you when going to some location without secure connections to anywhere.
 
-    #device         aue           # ADMtek USB ethernet
+### Secure Connection Initialization 
 
-    #device         cue           # CATC USB ethernet
+To initialize S/Key for the first time, change your password, or change your seed while logged in over a secure connection (e.g., on the console of a machine or via  **ssh** ), use the `keyinit` command without any parameters while logged in as yourself:
 
-    #device         kue           # Kawasaki LSI USB ethernet
+    
 
-Support for various USB devices.
+    % keyinit
 
-For more information and additional devices supported by DragonFly, see `/usr/src/sys/i386/conf/LINT`.
+    Adding unfurl:
 
-#### Notes 
+    Reminder - Only use this method if you are directly connected.
 
-[[!table  data="""
-<tablewidth="100%"> [(1)](kernelconfig-config.html#AEN7414) | The auto-tuning algorithm sets `maxuser` equal to the amount of memory in the system, with a minimum of 32, and a maximum of 384. |
-| | 
-"""]]
+    If you are using telnet or rlogin exit with no password and use keyinit -s.
 
-## Device Nodes 
+    Enter secret password:
 
-Almost every device in the kernel has a corresponding node entry in the `/dev` directory. These nodes look like regular files, but are actually special entries into the kernel which programs use to access the device. 
+    Again secret password:
 
-These nodes are created automatically once devfs is mounted, which happens manually for the root `/dev` during boot, just after the root mount.
+    
 
-## If Something Goes Wrong 
+    ID unfurl s/key is 99 to17757
 
- **Note:** If you are having trouble building a kernel, make sure to keep a `GENERIC`, or some other kernel that is known to work on hand as a different name that will not get erased on the next build. You cannot rely on `kernel.old` because when installing a new kernel, `kernel.old` is overwritten with the last installed kernel which may be non-functional. Also, as soon as possible, move the working kernel to the proper `kernel` location or commands such as [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ps&section1) will not work properly. The proper command to ***unlock*** the kernel file that `make` installs (in order to move another kernel back permanently) is:
+    DEFY CLUB PRO NASH LACE SOFT
+
+For OPIE, `opiepasswd` is used instead:
+
+    
+
+    % opiepasswd -c
+
+    [grimreaper] ~ $ opiepasswd -f -c
+
+    Adding unfurl:
+
+    Only use this method from the console; NEVER from remote. If you are using
+
+    telnet, xterm, or a dial-in, type ^C now or exit with no password.
+
+    Then run opiepasswd without the -c parameter.
+
+    Using MD5 to compute responses.
+
+    Enter new secret pass phrase:
+
+    Again new secret pass phrase:
+
+    ID unfurl OTP key is 499 to4268
+
+    MOS MALL GOAT ARM AVID COED
+
+At the Enter new secret pass phrase: or Enter secret password: prompts, you should enter a password or phrase. Remember, this is not the password that you will use to login with, this is used to generate your one-time login keys. The ***ID*** line gives the parameters of your particular instance: your login name, the iteration count, and seed. When logging in the system will remember these parameters and present them back to you so you do not have to remember them. The last line gives the particular one-time password which corresponds to those parameters and your secret password; if you were to re-login immediately, this one-time password is the one you would use.
+
+### Insecure Connection Initialization 
+
+To initialize or change your secret password over an insecure connection, you will need to already have a secure connection to some place where you can run `key` or `opiekey`; this might be in the form of a desk accessory on a Macintosh®, or a shell prompt on a machine you trust. You will also need to make up an iteration count (100 is probably a good value), and you may make up your own seed or use a randomly-generated one. Over on the insecure connection (to the machine you are initializing), use the `keyinit -s` command:
+
+    
+
+    % keyinit -s
+
+    Updating unfurl:
+
+    Old key: to17758
+
+    Reminder you need the 6 English words from the key command.
+
+    Enter sequence count from 1 to 9999: 100
+
+    Enter new key [default to17759]:
+
+    s/key 100 to 17759
+
+    s/key access password:
+
+    s/key access password:CURE MIKE BANE HIM RACY GORE
+
+For OPIE, you need to use `opiepasswd`:
+
+    
+
+    % opiepasswd
+
+    
+
+    Updating unfurl:
+
+    You need the response from an OTP generator.
+
+    Old secret pass phrase:
+
+            otp-md5 498 to4268 ext
+
+            Response: GAME GAG WELT OUT DOWN CHAT
+
+    New secret pass phrase:
+
+            otp-md5 499 to4269
+
+            Response: LINE PAP MILK NELL BUOY TROY
+
+    
+
+    ID mark OTP key is 499 gr4269
+
+    LINE PAP MILK NELL BUOY TROY
+
+To accept the default seed (which the `keyinit` program confusingly calls a `key`), press  **Return** . Then before entering an access password, move over to your secure connection or S/Key desk accessory, and give it the same parameters:
+
+    
+
+    % key 100 to17759
+
+    Reminder - Do not use this program while logged in via telnet or rlogin.
+
+    Enter secret password: &lt;secret password&gt;
+
+    CURE MIKE BANE HIM RACY GORE
+
+Or for OPIE:
+
+    
+
+    % opiekey 498 to4268
+
+    Using the MD5 algorithm to compute response.
+
+    Reminder: Don't use opiekey from telnet or dial-in sessions.
+
+    Enter secret pass phrase:
+
+    GAME GAG WELT OUT DOWN CHAT
+
+Now switch back over to the insecure connection, and copy the one-time password generated over to the relevant program.
+
+### Generating a Single One-time Password 
+
+Once you have initialized S/Key, when you login you will be presented with a prompt like this:
+
+    
+
+    % telnet example.com
+
+    Trying 10.0.0.1...
+
+    Connected to example.com
+
+    Escape character is '^]'.
+
+    
+
+    DragonFly/i386 (example.com) (ttypa)
+
+    
+
+    login: &lt;username&gt;
+
+    s/key 97 fw13894
+
+    Password:
+
+Or for OPIE:
+
+    
+
+    % telnet example.com
+
+    Trying 10.0.0.1...
+
+    Connected to example.com
+
+    Escape character is '^]'.
+
+    
+
+    DragonFly/i386 (example.com) (ttypa)
+
+    
+
+    login: &lt;username&gt;
+
+    otp-md5 498 gr4269 ext
+
+    Password:
+
+As a side note, the S/Key and OPIE prompts have a useful feature (not shown here): if you press  **Return**  at the password prompt, the prompter will turn echo on, so you can see what you are typing. This can be extremely useful if you are attempting to type in a password by hand, such as from a printout.
+
+At this point you need to generate your one-time password to answer this login prompt. This must be done on a trusted system that you can run `key` or `opiekey` on. (There are versions of these for DOS, Windows® and Mac OS® as well.) They need both the iteration count and the seed as command line options. You can cut-and-paste these right from the login prompt on the machine that you are logging in to.
+
+On the trusted system:
+
+    
+
+    % key 97 fw13894
+
+    Reminder - Do not use this program while logged in via telnet or rlogin.
+
+    Enter secret password:
+
+    WELD LIP ACTS ENDS ME HAAG
+
+For OPIE:
+
+    
+
+    % opiekey 498 to4268
+
+    Using the MD5 algorithm to compute response.
+
+    Reminder: Don't use opiekey from telnet or dial-in sessions.
+
+    Enter secret pass phrase:
+
+    GAME GAG WELT OUT DOWN CHAT
+
+Now that you have your one-time password you can continue logging in:
+
+    
+
+    login: &lt;username&gt;
+
+    s/key 97 fw13894
+
+    Password: &lt;return to enable echo&gt;
+
+    s/key 97 fw13894
+
+    Password [echo on]: WELD LIP ACTS ENDS ME HAAG
+
+    Last login: Tue Mar 21 11:56:41 from 10.0.0.2 ...
+
+### Generating Multiple One-time Passwords 
+
+Sometimes you have to go places where you do not have access to a trusted machine or secure connection. In this case, it is possible to use the `key` and `opiekey` commands to generate a number of one-time passwords beforehand to be printed out and taken with you. For example:
+
+    
+
+    % key -n 5 30 zz99999
+
+    Reminder - Do not use this program while logged in via telnet or rlogin.
+
+    Enter secret password: &lt;secret password&gt;
+
+    26: SODA RUDE LEA LIND BUDD SILT
+
+    27: JILT SPY DUTY GLOW COWL ROT
+
+    28: THEM OW COLA RUNT BONG SCOT
+
+    29: COT MASH BARR BRIM NAN FLAG
+
+    30: CAN KNEE CAST NAME FOLK BILK
+
+Or for OPIE:
+
+    
+
+    % opiekey -n 5 30 zz99999
+
+    Using the MD5 algorithm to compute response.
+
+    Reminder: Don't use opiekey from telnet or dial-in sessions.
+
+    Enter secret pass phrase: &lt;secret password&gt;
+
+    26: JOAN BORE FOSS DES NAY QUIT
+
+    27: LATE BIAS SLAY FOLK MUCH TRIG
+
+    28: SALT TIN ANTI LOON NEAL USE
+
+    29: RIO ODIN GO BYE FURY TIC
+
+    30: GREW JIVE SAN GIRD BOIL PHI
+
+The `-n 5` requests five keys in sequence, the `30` specifies what the last iteration number should be. Note that these are printed out in ***reverse*** order of eventual use. If you are really paranoid, you might want to write the results down by hand; otherwise you can cut-and-paste into `lpr`. Note that each line shows both the iteration count and the one-time password; you may still find it handy to scratch off passwords as you use them.
+
+### Restricting Use of UNIX® Passwords 
+
+S/Key can place restrictions on the use of UNIX passwords based on the host name, user name, terminal port, or IP address of a login session. These restrictions can be found in the configuration file `/etc/skey.access`. The [skey.access(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#skey.access&section5) manual page has more information on the complete format of the file and also details some security cautions to be aware of before depending on this file for security.
+
+If there is no `/etc/skey.access` file (this is the default), then all users will be allowed to use UNIX passwords. If the file exists, however, then all users will be required to use S/Key unless explicitly permitted to do otherwise by configuration statements in the `skey.access` file. In all cases, UNIX passwords are permitted on the console.
+
+Here is a sample `skey.access` configuration file which illustrates the three most common sorts of configuration statements:
+
+    
+
+    permit internet 192.168.0.0 255.255.0.0
+
+    permit user fnord
+
+    permit port ttyd0
+
+The first line (`permit internet`) allows users whose IP source address (which is vulnerable to spoofing) matches the specified value and mask, to use UNIX passwords. This should not be considered a security mechanism, but rather, a means to remind authorized users that they are using an insecure network and need to use S/Key for authentication.
+
+The second line (`permit user`) allows the specified username, in this case `fnord`, to use UNIX passwords at any time. Generally speaking, this should only be used for people who are either unable to use the `key` program, like those with dumb terminals, or those who are uneducable.
+
+The third line (`permit port`) allows all users logging in on the specified terminal line to use UNIX passwords; this would be used for dial-ups.
+
+Here is a sample `opieaccess` file:
+
+    
+
+    permit 192.168.0.0 255.255.0.0
+
+This line allows users whose IP source address (which is vulnerable to spoofing) matches the specified value and mask, to use UNIX passwords at any time.
+
+If no rules in `opieaccess` are matched, the default is to deny non-OPIE logins.
+
+#### Notes 
+
+[[!table  data="""
+|<tablestyle="width:100%"> [one-time-passwords.html#AEN8429 (1)] | Under DragonFly the standard login password may be up to 128 characters in length. |
+
+"""]]
+
+CategoryHandbook
+
+CategoryHandbook-security
+
+## Firewalls 
+
+***Contributed by Gary Palmer and Alex Nash. ***
+
+Firewalls are an area of increasing interest for people who are connected to the Internet, and are even finding applications on private networks to provide enhanced security. This section will hopefully explain what firewalls are, how to use them, and how to use the facilities provided in the DragonFly kernel to implement them.
+
+ **Note:** People often think that having a firewall between your internal network and the ***Big Bad Internet*** will solve all your security problems. It may help, but a poorly set up firewall system is more of a security risk than not having one at all. A firewall can add another layer of security to your systems, but it cannot stop a really determined cracker from penetrating your internal network. If you let internal security lapse because you believe your firewall to be impenetrable, you have just made the crackers job that much easier.
+
+### What Is a Firewall? 
+
+There are currently two distinct types of firewalls in common use on the Internet today. The first type is more properly called a ***packet filtering router***. This type of firewall utilizes a multi-homed machine and a set of rules to determine whether to forward or block individual packets. A multi-homed machine is simply a device with multiple network interfaces. The second type, known as a ***proxy server***, relies on daemons to provide authentication and to forward packets, possibly on a multi-homed machine which has kernel packet forwarding disabled.
+
+Sometimes sites combine the two types of firewalls, so that only a certain machine (known as a ***bastion host***) is allowed to send packets through a packet filtering router onto an internal network. Proxy services are run on the bastion host, which are generally more secure than normal authentication mechanisms.
+
+DragonFly comes with a kernel packet filter (known as IPFW), which is what the rest of this section will concentrate on. Proxy servers can be built on DragonFly from third party software, but there is such a variety of proxy servers available that it would be impossible to cover them in this section.
+
+#### Packet Filtering Routers 
+
+A router is a machine which forwards packets between two or more networks. A packet filtering router is programmed to compare each packet to a list of rules before deciding if it should be forwarded or not. Most modern IP routing software includes packet filtering functionality that defaults to forwarding all packets. To enable the filters, you need to define a set of rules.
+
+To decide whether a packet should be passed on, the firewall looks through its set of rules for a rule which matches the contents of the packet's headers. Once a match is found, the rule action is obeyed. The rule action could be to drop the packet, to forward the packet, or even to send an ICMP message back to the originator. Only the first match counts, as the rules are searched in order. Hence, the list of rules can be referred to as a ***rule chain***.
+
+The packet-matching criteria varies depending on the software used, but typically you can specify rules which depend on the source IP address of the packet, the destination IP address, the source port number, the destination port number (for protocols which support ports), or even the packet type (UDP, TCP, ICMP, etc).
+
+#### Proxy Servers 
+
+Proxy servers are machines which have had the normal system daemons ( **telnetd** ,  **ftpd** , etc) replaced with special servers. These servers are called ***proxy servers***, as they normally only allow onward connections to be made. This enables you to run (for example) a proxy  **telnet**  server on your firewall host, and people can  **telnet**  in to your firewall from the outside, go through some authentication mechanism, and then gain access to the internal network (alternatively, proxy servers can be used for signals coming from the internal network and heading out).
+
+Proxy servers are normally more secure than normal servers, and often have a wider variety of authentication mechanisms available, including ***one-shot*** password systems so that even if someone manages to discover what password you used, they will not be able to use it to gain access to your systems as the password expires immediately after the first use. As they do not actually give users access to the host machine, it becomes a lot more difficult for someone to install backdoors around your security system.
+
+Proxy servers often have ways of restricting access further, so that only certain hosts can gain access to the servers. Most will also allow the administrator to specify which users can talk to which destination machines. Again, what facilities are available depends largely on what proxy software you choose.
+
+### Firewall options in DragonFlyBSD
+
+DragonFlyBSD inherited the IPFW firewall (versions 1 and 2) when it forked from FreeBSD. Pretty soon after though, we imported the new pf packet filter that the OpenBSD developers created from scratch. It is a cleaner code base and is now the recommended solution for firewalling DragonFly. Keep in mind that the PF version in DragonFly is not in sync with OpenBSD's PF code. We have not yet incorporated the improvements made in PF over the last few years, but we have some improvements of our own. IPFW is still and will remain supported for the forseeable future; it has some features not yet available in PF.
+
+A copy of the OpenBSD PF user's guide corresponding to the version of PF in DragonFly can be found in [[PFUsersGuide]].
+
+#### What Does IPFW Allow Me to Do? 
+
+IPFW, the software supplied with DragonFly, is a packet filtering and accounting system which resides in the kernel, and has a user-land control utility, [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8). Together, they allow you to define and query the rules used by the kernel in its routing decisions.
+
+There are two related parts to IPFW. The firewall section performs packet filtering. There is also an IP accounting section which tracks usage of the router, based on rules similar to those used in the firewall section. This allows the administrator to monitor how much traffic the router is getting from a certain machine, or how much WWW traffic it is forwarding, for example.
+
+As a result of the way that IPFW is designed, you can use IPFW on non-router machines to perform packet filtering on incoming and outgoing connections. This is a special case of the more general use of IPFW, and the same commands and techniques should be used in this situation.
+
+#### Enabling IPFW on DragonFly 
+
+As the main part of the IPFW system lives in the kernel, you will need to add one or more options to your kernel configuration file, depending on what facilities you want, and recompile your kernel. See "Reconfiguring your Kernel" ([kernelconfig.html Chapter 9]) for more details on how to recompile your kernel.
+
+ **Warning:** IPFW defaults to a policy of `deny ip from any to any`. If you do not add other rules during startup to allow access, ***you will lock yourself out*** of the server upon rebooting into a firewall-enabled kernel. We suggest that you set `firewall_type=open` in your `/etc/rc.conf` file when first enabling this feature, then refining the firewall rules in `/etc/rc.firewall` after you have tested that the new kernel feature works properly. To be on the safe side, you may wish to consider performing the initial firewall configuration from the local console rather than via  **ssh** . Another option is to build a kernel using both the `IPFIREWALL` and `IPFIREWALL_DEFAULT_TO_ACCEPT` options. This will change the default rule of IPFW to `allow ip from any to any` and avoid the possibility of a lockout.
+
+There are currently four kernel configuration options relevant to IPFW:
+
+`options IPFIREWALL`:: Compiles into the kernel the code for packet filtering.`options IPFIREWALL_VERBOSE`:: Enables code to allow logging of packets through [syslogd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#syslogd&section8). Without this option, even if you specify that packets should be logged in the filter rules, nothing will happen.`options IPFIREWALL_VERBOSE_LIMIT=10`:: Limits the number of packets logged through [syslogd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=syslogd&section=8) on a per entry basis. You may wish to use this option in hostile environments in which you want to log firewall activity, but do not want to be open to a denial of service attack via syslog flooding.
+
+When a chain entry reaches the packet limit specified, logging is turned off for that particular entry. To resume logging, you will need to reset the associated counter using the [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8) utility:
+
+    
+
+    # ipfw zero 4500
+
+Where 4500 is the chain entry you wish to continue logging.`options IPFIREWALL_DEFAULT_TO_ACCEPT`:: This changes the default rule action from ***deny*** to ***allow***. This avoids the possibility of locking yourself out if you happen to boot a kernel with `IPFIREWALL` support but have not configured your firewall yet. It is also very useful if you often use [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8) as a filter for specific problems as they arise. Use with care though, as this opens up the firewall and changes the way it works.
+
+#### Configuring IPFW 
+
+The configuration of the IPFW software is done through the [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8) utility. The syntax for this command looks quite complicated, but it is relatively simple once you understand its structure.
+
+There are currently four different command categories used by the utility: addition/deletion, listing, flushing, and clearing. Addition/deletion is used to build the rules that control how packets are accepted, rejected, and logged. Listing is used to examine the contents of your rule set (otherwise known as the chain) and packet counters (accounting). Flushing is used to remove all entries from the chain. Clearing is used to zero out one or more accounting entries.
+
+##### Altering the IPFW Rules 
+
+The syntax for this form of the command is:
+
+`ipfw` [-N] command [index] action [log] protocol addresses [options]
+
+There is one valid flag when using this form of the command:
+
+-N:: Resolve addresses and service names in output.
+
+The ***command*** given can be shortened to the shortest unique form. The valid ***commands*** are:
+
+add:: Add an entry to the firewall/accounting rule listdelete:: Delete an entry from the firewall/accounting rule list
+
+Previous versions of IPFW used separate firewall and accounting entries. The present version provides packet accounting with each firewall entry.
+
+If an ***index*** value is supplied, it is used to place the entry at a specific point in the chain. Otherwise, the entry is placed at the end of the chain at an index 100 greater than the last chain entry (this does not include the default policy, rule 65535, deny).
+
+The `log` option causes matching rules to be output to the system console if the kernel was compiled with `IPFIREWALL_VERBOSE`.
+
+Valid ***actions*** are:
+
+reject:: Drop the packet, and send an ICMP host or port unreachable (as appropriate) packet to the source.allow:: Pass the packet on as normal. (aliases: `pass`, `permit`, and `accept`)deny:: Drop the packet. The source is not notified via an ICMP message (thus it appears that the packet never arrived at the destination).count:: Update packet counters but do not allow/deny the packet based on this rule. The search continues with the next chain entry.
+
+Each ***action*** will be recognized by the shortest unambiguous prefix.
+
+The ***protocols*** which can be specified are:
+
+all:: Matches any IP packeticmp:: Matches ICMP packetstcp:: Matches TCP packetsudp:: Matches UDP packets
+
+The ***address*** specification is:
+
+from `***address/mask***` [`***port***`] to `***address/mask***` [`***port***`] [via `***interface***`]
+
+You can only specify `***port***` in conjunction with ***protocols*** which support ports (UDP and TCP).
+
+The `via` is optional and may specify the IP address or domain name of a local IP interface, or an interface name (e.g. `ed0`) to match only packets coming through this interface. Interface unit numbers can be specified with an optional wildcard. For example, `ppp*` would match all kernel PPP interfaces.
+
+The syntax used to specify an `***address/mask***` is:
+
+    
+
+    `***address***`
+
+ or
+
+    
+
+    `***address***`/`***mask-bits***`
+
+ or
+
+    
+
+    `***address***`:`***mask-pattern***`
+
+A valid hostname may be specified in place of the IP address. ' **mask-bits** ' is a decimal number representing how many bits in the address mask should be set. e.g. specifying `192.216.222.1/24` will create a mask which will allow any address in a class C subnet (in this case, `192.216.222`) to be matched. ' **mask-pattern** ' is an IP address which will be logically AND'ed with the address given. The keyword `any` may be used to specify ***any IP address***.
+
+The port numbers to be blocked are specified as:
+
+`***port***` [,`***port***` [,`***port***` [...]]]
+
+ to specify either a single port or a list of ports, or
+
+`***port***`-`***port***`
+
+ to specify a range of ports. You may also combine a single range with a list, but the range must always be specified first.
+
+The ***options*** available are:
+
+frag:: Matches if the packet is not the first fragment of the datagram.in:: Matches if the packet is on the way in.out:: Matches if the packet is on the way out.ipoptions `***spec***`:: Matches if the IP header contains the comma separated list of options specified in `***spec***`. The supported IP options are: `ssrr` (strict source route), `lsrr` (loose source route), `rr` (record packet route), and `ts` (time stamp). The absence of a particular option may be specified with a leading `!`.established:: Matches if the packet is part of an already established TCP connection (i.e. it has the RST or ACK bits set). You can optimize the performance of the firewall by placing ***established*** rules early in the chain.setup:: Matches if the packet is an attempt to establish a TCP connection (the SYN bit is set but the ACK bit is not).tcpflags `***flags***`:: Matches if the TCP header contains the comma separated list of `***flags***`. The supported flags are `fin`, `syn`, `rst`, `psh`, `ack`, and `urg`. The absence of a particular flag may be indicated by a leading `!`.icmptypes `***types***`:: Matches if the ICMP type is present in the list `***types***`. The list may be specified as any combination of ranges and/or individual types separated by commas. Commonly used ICMP types are: `0` echo reply (ping reply), `3` destination unreachable, `5` redirect, `8` echo request (ping request), and `11` time exceeded (used to indicate TTL expiration as with [traceroute(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#traceroute&section8)).
+
+##### Listing the IPFW Rules 
+
+The syntax for this form of the command is:
+
+`ipfw` [-a] [-c] [-d] [-e] [-t] [-N] [-S] list
+
+There are seven valid flags when using this form of the command:
+
+-a:: While listing, show counter values. This option is the only way to see accounting counters.-c:: List rules in compact form.-d:: Show dynamic rules in addition to static rules.-e:: If `-d` was specified, also show expired dynamic rules.-t:: Display the last match times for each chain entry. The time listing is incompatible with the input syntax used by the [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8) utility.-N:: Attempt to resolve given addresses and service names.-S:: Show the set each rule belongs to. If this flag is not specified, disabled rules will not be listed.
+
+##### Flushing the IPFW Rules 
+
+The syntax for flushing the chain is:
+
+`ipfw` flush
+
+This causes all entries in the firewall chain to be removed except the fixed default policy enforced by the kernel (index 65535). Use caution when flushing rules; the default deny policy will leave your system cut off from the network until allow entries are added to the chain.
+
+##### Clearing the IPFW Packet Counters 
+
+The syntax for clearing one or more packet counters is:
+
+`ipfw` zero [`***index***`]
+
+When used without an `***index***` argument, all packet counters are cleared. If an `***index***` is supplied, the clearing operation only affects a specific chain entry.
+
+#### Example Commands for  **ipfw**  
+
+This command will deny all packets from the host `evil.crackers.org` to the telnet port of the host `nice.people.org`:
+
+    
+
+    # ipfw add deny tcp from evil.crackers.org to nice.people.org 23
+
+The next example denies and logs any TCP traffic from the entire `crackers.org` network (a class C) to the `nice.people.org` machine (any port).
+
+    
+
+    # ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org
+
+If you do not want people sending X sessions to your internal network (a subnet of a class C), the following command will do the necessary filtering:
+
+    
+
+    # ipfw add deny tcp from any to my.org/28 6000 setup
+
+To see the accounting records:
+
+    
+
+    # ipfw -a list
+
+ or in the short form
+
+    
+
+    # ipfw -a l
+
+You can also see the last time a chain entry was matched with:
+
+    
+
+    # ipfw -at l
+
+#### Building a Packet Filtering Firewall 
+
+ **Note:** The following suggestions are just that: suggestions. The requirements of each firewall are different and we cannot tell you how to build a firewall to meet your particular requirements.
+
+When initially setting up your firewall, unless you have a test bench setup where you can configure your firewall host in a controlled environment, it is strongly recommend you use the logging version of the commands and enable logging in the kernel. This will allow you to quickly identify problem areas and cure them without too much disruption. Even after the initial setup phase is complete, I recommend using the logging for `deny' as it allows tracing of possible attacks and also modification of the firewall rules if your requirements alter.
+
+ **Note:** If you use the logging versions of the `accept` command, be aware that it can generate ***large*** amounts of log data. One log entry will be generated for every packet that passes through the firewall, so large FTP/http transfers, etc, will really slow the system down. It also increases the latencies on those packets as it requires more work to be done by the kernel before the packet can be passed on.  **syslogd**  will also start using up a lot more processor time as it logs all the extra data to disk, and it could quite easily fill the partition `/var/log` is located on.
+
+You should enable your firewall from `/etc/rc.conf.local` or `/etc/rc.conf`. The associated manual page explains which knobs to fiddle and lists some preset firewall configurations. If you do not use a preset configuration, `ipfw list` will output the current ruleset into a file that you can pass to `rc.conf`. If you do not use `/etc/rc.conf.local` or `/etc/rc.conf` to enable your firewall, it is important to make sure your firewall is enabled before any IP interfaces are configured.
+
+The next problem is what your firewall should actually ***do***! This is largely dependent on what access to your network you want to allow from the outside, and how much access to the outside world you want to allow from the inside. Some general rules are:
+
+* Block all incoming access to ports below 1024 for TCP. This is where most of the security sensitive services are, like finger, SMTP (mail) and telnet.
+
+* Block ***all*** incoming UDP traffic. There are very few useful services that travel over UDP, and what useful traffic there is, is normally a security threat (e.g. Suns RPC and NFS protocols). This has its disadvantages also, since UDP is a connectionless protocol, denying incoming UDP traffic also blocks the replies to outgoing UDP traffic. This can cause a problem for people (on the inside) using external archie (prospero) servers. If you want to allow access to archie, you will have to allow packets coming from ports 191 and 1525 to any internal UDP port through the firewall.  **ntp**  is another service you may consider allowing through, which comes from port 123.
+
+* Block traffic to port 6000 from the outside. Port 6000 is the port used for access to X11 servers, and can be a security threat (especially if people are in the habit of doing `xhost +` on their workstations). X11 can actually use a range of ports starting at 6000, the upper limit being how many X displays you can run on the machine. The upper limit as defined by RFC 1700 (Assigned Numbers) is 6063.
+
+* Check what ports any internal servers use (e.g. SQL servers, etc). It is probably a good idea to block those as well, as they normally fall outside the 1-1024 range specified above.
+
+Another checklist for firewall configuration is available from CERT at http://www.cert.org/tech_tips/packet_filtering.html
+
+As stated above, these are only ***guidelines***. You will have to decide what filter rules you want to use on your firewall yourself. We cannot accept ANY responsibility if someone breaks into your network, even if you follow the advice given above.
+
+#### IPFW Overhead and Optimization 
+
+Many people want to know how much overhead IPFW adds to a system. The answer to this depends mostly on your rule set and processor speed. For most applications dealing with Ethernet and small rule sets, the answer is ***negligible***. For those of you that need actual measurements to satisfy your curiosity, read on.
+
+The following measurements were made using FreeBSD 2.2.5-STABLE on a 486-66. (While IPFW has changed slightly in later releases of DragonFly, it still performs with similar speed.) IPFW was modified to measure the time spent within the `ip_fw_chk` routine, displaying the results to the console every 1000 packets.
+
+Two rule sets, each with 1000 rules, were tested. The first set was designed to demonstrate a worst case scenario by repeating the rule:
+
+    
+
+    # ipfw add deny tcp from any to any 55555
+
+This demonstrates a worst case scenario by causing most of IPFW's packet check routine to be executed before finally deciding that the packet does not match the rule (by virtue of the port number). Following the 999th iteration of this rule was an `allow ip from any to any`.
+
+The second set of rules were designed to abort the rule check quickly:
+
+    
+
+    # ipfw add deny ip from 1.2.3.4 to 1.2.3.4
+
+The non-matching source IP address for the above rule causes these rules to be skipped very quickly. As before, the 1000th rule was an `allow ip from any to any`.
+
+The per-packet processing overhead in the former case was approximately 2.703 ms/packet, or roughly 2.7 microseconds per rule. Thus the theoretical packet processing limit with these rules is around 370 packets per second. Assuming 10 Mbps Ethernet and a ~1500 byte packet size, we would only be able to achieve 55.5% bandwidth utilization.
+
+For the latter case each packet was processed in approximately 1.172 ms, or roughly 1.2 microseconds per rule. The theoretical packet processing limit here would be about 853 packets per second, which could consume 10 Mbps Ethernet bandwidth.
+
+The excessive number of rules tested and the nature of those rules do not provide a real-world scenario -- they were used only to generate the timing information presented here. Here are a few things to keep in mind when building an efficient rule set:
+
+* Place an `established` rule early on to handle the majority of TCP traffic. Do not put any `allow tcp` statements before this rule.
+
+* Place heavily triggered rules earlier in the rule set than those rarely used (***without changing the permissiveness of the firewall***, of course). You can see which rules are used most often by examining the packet counting statistics with `ipfw -a l`.
+
+CategoryHandbook
+
+CategoryHandbook-security
+
+## OpenSSL 
+
+[OpenSSL](http://www.openssl.org/) provides a general-purpose cryptography library, as well as the Secure Sockets Layer v2/v3 (SSLv2/SSLv3) and Transport Layer Security v1 (TLSv1) network security protocols.
+
+However, one of the algorithms (specifically IDEA) included in OpenSSL is protected by patents in the USA and elsewhere, and is not available for unrestricted use. IDEA is included in the OpenSSL sources in DragonFly, but it is not built by default. If you wish to use it, and you comply with the license terms, enable the `MAKE_IDEA` switch in `/etc/make.conf` and rebuild your sources using `make world`.
+
+Today, the RSA algorithm is free for use in USA and other countries. In the past it was protected by a patent.
+
+## VPN over IPsec 
+
+<!-- XXX: someone revise this and add words about pf. I've no clue about this stuff -->
+
+***Written by Nik Clayton. ***
+
+Creating a VPN between two networks, separated by the Internet, using DragonFly gateways.
+
+### Understanding IPsec 
+
+***Written by Hiten M. Pandya. ***
+
+This section will guide you through the process of setting up IPsec, and to use it in an environment which consists of DragonFly and  **Microsoft® Windows® 2000/XP**  machines, to make them communicate securely. In order to set up IPsec, it is necessary that you are familiar with the concepts of building a custom kernel (see [kernelconfig.html Chapter 9]).
+
+***IPsec*** is a protocol which sits on top of the Internet Protocol (IP) layer. It allows two or more hosts to communicate in a secure manner (hence the name). The DragonFly IPsec ***network stack*** is based on the [KAME](http://www.kame.net/) implementation, which has support for both protocol families, IPv4 and IPv6.
+
+IPsec consists of two sub-protocols:
+
+* ***Encapsulated Security Payload (ESP)***, protects the IP packet data from third party interference, by encrypting the contents using symmetric cryptography algorithms (like Blowfish, 3DES).
+
+* ***Authentication Header (AH)***, protects the IP packet header from third party interference and spoofing, by computing a cryptographic checksum and hashing the IP packet header fields with a secure hashing function. This is then followed by an additional header that contains the hash, to allow the information in the packet to be authenticated.
+
+ESP and AH can either be used together or separately, depending on the environment.
+
+IPsec can either be used to directly encrypt the traffic between two hosts (known as ***Transport Mode***); or to build ***virtual tunnels*** between two subnets, which could be used for secure communication between two corporate networks (known as ***Tunnel Mode***). The latter is more commonly known as a ***Virtual Private Network (VPN)***. The [ipsec(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipsec&section4) manual page should be consulted for detailed information on the IPsec subsystem in DragonFly.
+
+To add IPsec support to your kernel, add the following options to your kernel configuration file:
+
+    
+
+    options   IPSEC        #IP security
+
+    options   IPSEC_ESP    #IP security (crypto; define w/ IPSEC)
+
+    
+
+If IPsec debugging support is desired, the following kernel option should also be added:
+
+    
+
+    options   IPSEC_DEBUG  #debug for IP security
+
+    
+
+### The Problem 
+
+There's no standard for what constitutes a VPN. VPNs can be implemented using a number of different technologies, each of which have their own strengths and weaknesses. This article presents a number of scenarios, and strategies for implementing a VPN for each scenario.
+
+### Scenario #1: Two networks, connected to the Internet, to behave as one 
+
+This is the scenario that caused me to first investigating VPNs. The premise is as follows:
+
+* You have at least two sites
+
+* Both sites are using IP internally
+
+* Both sites are connected to the Internet, through a gateway that is running DragonFly.
+
+* The gateway on each network has at least one public IP address.
+
+* The internal addresses of the two networks can be public or private IP addresses, it doesn't matter. You can be running NAT on the gateway machine if necessary.
+
+* The internal IP addresses of the two networks ***do not collide***. While I expect it is theoretically possible to use a combination of VPN technology and NAT to get this to work, I expect it to be a configuration nightmare.
+
+If you find that you are trying to connect two networks, both of which, internally, use the same private IP address range (e.g., both of them use `192.168.1.x`), then one of the networks will have to be renumbered.
+
+The network topology might look something like this:
+
+security/ipsec-network.png
+
+Notice the two public IP addresses. I'll use the letters to refer to them in the rest of this article. Anywhere you see those letters in this article, replace them with your own public IP addresses. Note also that internally, the two gateway machines have .1 IP addresses, and that the two networks have different private IP addresses (`192.168.1.x` and `192.168.2.x` respectively). All the machines on the private networks have been configured to use the `.1` machine as their default gateway.
+
+The intention is that, from a network point of view, each network should view the machines on the other network as though they were directly attached the same router -- albeit a slightly slow router with an occasional tendency to drop packets.
+
+This means that (for example), machine `192.168.1.20` should be able to run
+
+    
+
+    ping 192.168.2.34
+
+and have it work, transparently. Windows machines should be able to see the machines on the other network, browse file shares, and so on, in exactly the same way that they can browse machines on the local network.
+
+And the whole thing has to be secure. This means that traffic between the two networks has to be encrypted.
+
+Creating a VPN between these two networks is a multi-step process. The stages are as follows:
+
+  1. Create a ***virtual*** network link between the two networks, across the Internet. Test it, using tools like [ping(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ping&section8), to make sure it works.
+
+  1. Apply security policies to ensure that traffic between the two networks is transparently encrypted and decrypted as necessary. Test this, using tools like [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#tcpdump&section1), to ensure that traffic is encrypted.
+
+  1. Configure additional software on the DragonFly gateways, to allow Windows machines to see one another across the VPN.
+
+#### Step 1: Creating and testing a ***virtual*** network link 
+
+Suppose that you were logged in to the gateway machine on network #1 (with public IP address `A.B.C.D`, private IP address `192.168.1.1`), and you ran `ping 192.168.2.1`, which is the private address of the machine with IP address `W.X.Y.Z`. What needs to happen in order for this to work?
+
+  1. The gateway machine needs to know how to reach `192.168.2.1`. In other words, it needs to have a route to `192.168.2.1`.
+
+  1. Private IP addresses, such as those in the `192.168.x` range are not supposed to appear on the Internet at large. Instead, each packet you send to `192.168.2.1` will need to be wrapped up inside another packet. This packet will need to appear to be from `A.B.C.D`, and it will have to be sent to `W.X.Y.Z`. This process is called ***encapsulation***.
+
+  1. Once this packet arrives at `W.X.Y.Z` it will need to ***unencapsulated***, and delivered to `192.168.2.1`.
+
+You can think of this as requiring a ***tunnel*** between the two networks. The two ***tunnel mouths*** are the IP addresses `A.B.C.D` and `W.X.Y.Z`, and the tunnel must be told the addresses of the private IP addresses that will be allowed to pass through it. The tunnel is used to transfer traffic with private IP addresses across the public Internet.
+
+This tunnel is created by using the generic interface, or `gif` devices on DragonFly. As you can imagine, the `gif` interface on each gateway host must be configured with four IP addresses; two for the public IP addresses, and two for the private IP addresses.
+
+Support for the gif device must be compiled in to the DragonFly kernel on both machines. You can do this by adding the line:
+
+    
+
+    pseudo-device gif
+
+to the kernel configuration files on both machines, and then compile, install, and reboot as normal.
+
+Configuring the tunnel is a two step process. First the tunnel must be told what the outside (or public) IP addresses are, using [gifconfig(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#gifconfig&section8). Then the private IP addresses must be configured using [ifconfig(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=ifconfig&section=8).
+
+On the gateway machine on network #1 you would run the following two commands to configure the tunnel.
+
+    
+
+    gifconfig gif0 A.B.C.D W.X.Y.Z
+
+    ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff
+
+    
+
+On the other gateway machine you run the same commands, but with the order of the IP addresses reversed.
+
+    
+
+    gifconfig gif0 W.X.Y.Z A.B.C.D
+
+    ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff
+
+    
+
+You can then run:
+
+    
+
+    gifconfig gif0
+
+to see the configuration. For example, on the network #1 gateway, you would see this:
+
+    
+
+    # gifconfig gif0
+
+    gif0: flags=8011&lt;UP,POINTTOPOINT,MULTICAST&gt; mtu 1280
+
+    inet 192.168.1.1 --&gt; 192.168.2.1 netmask 0xffffffff
+
+    physical address inet A.B.C.D --&gt; W.X.Y.Z
+
+    
+
+As you can see, a tunnel has been created between the physical addresses `A.B.C.D` and `W.X.Y.Z`, and the traffic allowed through the tunnel is that between `192.168.1.1` and `192.168.2.1`.
+
+This will also have added an entry to the routing table on both machines, which you can examine with the command `netstat -rn`. This output is from the gateway host on network #1.
+
+    
+
+    # netstat -rn
+
+    Routing tables
+
+    
+
+    Internet:
+
+    Destination      Gateway       Flags    Refs    Use    Netif  Expire
+
+    ...
+
+    192.168.2.1      192.168.1.1   UH        0        0    gif0
+
+    ...
+
+    
+
+As the ***Flags*** value indicates, this is a host route, which means that each gateway knows how to reach the other gateway, but they do not know how to reach the rest of their respective networks. That problem will be fixed shortly.
+
+It is likely that you are running a firewall on both machines. This will need to be circumvented for your VPN traffic. You might want to allow all traffic between both networks, or you might want to include firewall rules that protect both ends of the VPN from one another.
+
+It greatly simplifies testing if you configure the firewall to allow all traffic through the VPN. You can always tighten things up later. If you are using [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8) on the gateway machines then a command like
+
+    
+
+    ipfw add 1 allow ip from any to any via gif0
+
+will allow all traffic between the two end points of the VPN, without affecting your other firewall rules. Obviously you will need to run this command on both gateway hosts.
+
+This is sufficient to allow each gateway machine to ping the other. On `192.168.1.1`, you should be able to run
+
+    
+
+    ping 192.168.2.1
+
+and get a response, and you should be able to do the same thing on the other gateway machine.
+
+However, you will not be able to reach internal machines on either network yet. This is because of the routing -- although the gateway machines know how to reach one another, they do not know how to reach the network behind each one.
+
+To solve this problem you must add a static route on each gateway machine. The command to do this on the first gateway would be:
+
+    
+
+    route add 192.168.2.0 192.168.2.1 netmask 0xffffff00
+
+    
+
+This says ***In order to reach the hosts on the network `192.168.2.0`, send the packets to the host `192.168.2.1`***. You will need to run a similar command on the other gateway, but with the `192.168.1.x` addresses instead.
+
+IP traffic from hosts on one network will now be able to reach hosts on the other network.
+
+That has now created two thirds of a VPN between the two networks, in as much as it is ***virtual*** and it is a ***network***. It is not private yet. You can test this using [ping(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ping&section8) and [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=tcpdump&section=1). Log in to the gateway host and run
+
+    
+
+    tcpdump dst host 192.168.2.1
+
+In another log in session on the same host run
+
+    
+
+    ping 192.168.2.1
+
+You will see output that looks something like this:
+
+    
+
+    16:10:24.018080 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
+
+    16:10:24.018109 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
+
+    16:10:25.018814 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
+
+    16:10:25.018847 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
+
+    16:10:26.028896 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
+
+    16:10:26.029112 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
+
+    
+
+As you can see, the ICMP messages are going back and forth unencrypted. If you had used the `-s` parameter to [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#tcpdump&section1) to grab more bytes of data from the packets you would see more information.
+
+Obviously this is unacceptable. The next section will discuss securing the link between the two networks so that it all traffic is automatically encrypted.
+
+ **Summary:** 
+
+* Configure both kernels with ***pseudo-device gif***.
+
+* Edit `/etc/rc.conf` on gateway host #1 and add the following lines (replacing IP addresses as necessary).
+
+      
+
+      gifconfig_gif0="A.B.C.D W.X.Y.Z"
+
+      ifconfig_gif0="inet 192.168.1.1 192.168.2.1 netmask 0xffffffff"
+
+      static_routes="vpn"
+
+      route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00"
+
+  
+
+* Edit your firewall script (`/etc/rc.firewall`, or similar) on both hosts, and add
+
+      
+
+      ipfw add 1 allow ip from any to any via gif0
+
+  
+
+* Make similar changes to `/etc/rc.conf` on gateway host #2, reversing the order of IP addresses.
+
+#### Step 2: Securing the link 
+
+To secure the link we will be using IPsec. IPsec provides a mechanism for two hosts to agree on an encryption key, and to then use this key in order to encrypt data between the two hosts.
+
+The are two areas of configuration to be considered here.
+
+  1. There must be a mechanism for two hosts to agree on the encryption mechanism to use. Once two hosts have agreed on this mechanism there is said to be a ***security association*** between them.
+
+  1. There must be a mechanism for specifying which traffic should be encrypted. Obviously, you don't want to encrypt all your outgoing traffic -- you only want to encrypt the traffic that is part of the VPN. The rules that you put in place to determine what traffic will be encrypted are called ***security policies***.
+
+Security associations and security policies are both maintained by the kernel, and can be modified by userland programs. However, before you can do this you must configure the kernel to support IPsec and the Encapsulated Security Payload (ESP) protocol. This is done by configuring a kernel with:
+
+    
+
+    options IPSEC
+
+    options IPSEC_ESP
+
+    
+
+and recompiling, reinstalling, and rebooting. As before you will need to do this to the kernels on both of the gateway hosts.
+
+You have two choices when it comes to setting up security associations. You can configure them by hand between two hosts, which entails choosing the encryption algorithm, encryption keys, and so forth, or you can use daemons that implement the Internet Key Exchange protocol (IKE) to do this for you.
+
+I recommend the latter. Apart from anything else, it is easier to set up.
+
+Editing and displaying security policies is carried out using [setkey(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#setkey&section8). By analogy, `setkey` is to the kernel's security policy tables as [route(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=route&section=8) is to the kernel's routing tables. `setkey` can also display the current security associations, and to continue the analogy further, is akin to `netstat -r` in that respect.
+
+There are a number of choices for daemons to manage security associations with DragonFly. This article will describe how to use one of these, racoon. racoon is in the FreeBSD ports collection, in the security/ category, and is installed in the usual way.
+
+racoon must be run on both gateway hosts. On each host it is configured with the IP address of the other end of the VPN, and a secret key (which you choose, and must be the same on both gateways).
+
+The two daemons then contact one another, confirm that they are who they say they are (by using the secret key that you configured). The daemons then generate a new secret key, and use this to encrypt the traffic over the VPN. They periodically change this secret, so that even if an attacker were to crack one of the keys (which is as theoretically close to unfeasible as it gets) it won't do them much good -- by the time they've cracked the key the two daemons have chosen another one.
+
+racoon's configuration is stored in `${PREFIX}/etc/racoon`. You should find a configuration file there, which should not need to be changed too much. The other component of racoon's configuration, which you will need to change, is the ***pre-shared key***.
+
+The default racoon configuration expects to find this in the file `${PREFIX}/etc/racoon/psk.txt`. It is important to note that the pre-shared key is ***not*** the key that will be used to encrypt your traffic across the VPN link, it is simply a token that allows the key management daemons to trust one another.
+
+`psk.txt` contains a line for each remote site you are dealing with. In this example, where there are two sites, each `psk.txt` file will contain one line (because each end of the VPN is only dealing with one other end).
+
+On gateway host #1 this line should look like this:
+
+    
+
+    W.X.Y.Z            secret
+
+That is, the ***public*** IP address of the remote end, whitespace, and a text string that provides the secret. Obviously, you shouldn't use ***secret*** as your key -- the normal rules for choosing a password apply.
+
+On gateway host #2 the line would look like this
+
+    
+
+    A.B.C.D            secret
+
+That is, the public IP address of the remote end, and the same secret key. `psk.txt` must be mode `0600` (i.e., only read/write to `root`) before racoon will run.
+
+You must run racoon on both gateway machines. You will also need to add some firewall rules to allow the IKE traffic, which is carried over UDP to the ISAKMP (Internet Security Association Key Management Protocol) port. Again, this should be fairly early in your firewall ruleset.
+
+    
+
+    ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
+
+    ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
+
+    
+
+Once racoon is running you can try pinging one gateway host from the other. The connection is still not encrypted, but racoon will then set up the security associations between the two hosts -- this might take a moment, and you may see this as a short delay before the ping commands start responding.
+
+Once the security association has been set up you can view it using [setkey(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#setkey&section8). Run
+
+    
+
+    setkey -D
+
+on either host to view the security association information.
+
+That's one half of the problem. They other half is setting your security policies.
+
+To create a sensible security policy, let's review what's been set up so far. This discussions hold for both ends of the link.
+
+Each IP packet that you send out has a header that contains data about the packet. The header includes the IP addresses of both the source and destination. As we already know, private IP addresses, such as the `192.168.x.y` range are not supposed to appear on the public Internet. Instead, they must first be encapsulated inside another packet. This packet must have the public source and destination IP addresses substituted for the private addresses.
+
+So if your outgoing packet started looking like this:
+
+security/ipsec-out-pkt.png
+
+Then it will be encapsulated inside another packet, looking something like this:
+
+security/ipsec-encap-pkt.png
+
+This encapsulation is carried out by the `gif` device. As you can see, the packet now has real IP addresses on the outside, and our original packet has been wrapped up as data inside the packet that will be put out on the Internet.
+
+Obviously, we want all traffic between the VPNs to be encrypted. You might try putting this in to words, as:
+
+***If a packet leaves from `A.B.C.D`, and it is destined for `W.X.Y.Z`, then encrypt it, using the necessary security associations.***
+
+***If a packet arrives from `W.X.Y.Z`, and it is destined for `A.B.C.D`, then decrypt it, using the necessary security associations.***
+
+That's close, but not quite right. If you did this, all traffic to and from `W.X.Y.Z`, even traffic that was not part of the VPN, would be encrypted. That's not quite what you want. The correct policy is as follows
+
+***If a packet leaves from `A.B.C.D`, and that packet is encapsulating another packet, and it is destined for `W.X.Y.Z`, then encrypt it, using the necessary security associations.***
+
+***If a packet arrives from `W.X.Y.Z`, and that packet is encapsulating another packet, and it is destined for `A.B.C.D`, then encrypt it, using the necessary security associations.***
+
+A subtle change, but a necessary one.
+
+Security policies are also set using [setkey(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#setkey&section8). [setkey(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=setkey&section=8) features a configuration language for defining the policy. You can either enter configuration instructions via stdin, or you can use the `-f` option to specify a filename that contains configuration instructions.
+
+The configuration on gateway host #1 (which has the public IP address `A.B.C.D`) to force all outbound traffic to `W.X.Y.Z` to be encrypted is:
+
+    
+
+    spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;
+
+    
+
+Put these commands in a file (e.g., `/etc/ipsec.conf`) and then run
+
+    
+
+    # setkey -f /etc/ipsec.conf
+
+`spdadd` tells [setkey(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#setkey&section8) that we want to add a rule to the secure policy database. The rest of this line specifies which packets will match this policy. `A.B.C.D/32` and `W.X.Y.Z/32` are the IP addresses and netmasks that identify the network or hosts that this policy will apply to. In this case, we want it to apply to traffic between these two hosts. `ipencap` tells the kernel that this policy should only apply to packets that encapsulate other packets. `-P out` says that this policy applies to outgoing packets, and `ipsec` says that the packet will be secured.
+
+The second line specifies how this packet will be encrypted. `esp` is the protocol that will be used, while `tunnel` indicates that the packet will be further encapsulated in an IPsec packet. The repeated use of `A.B.C.D` and `W.X.Y.Z` is used to select the security association to use, and the final `require` mandates that packets must be encrypted if they match this rule.
+
+This rule only matches outgoing packets. You will need a similar rule to match incoming packets.
+
+    
+
+    spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;
+
+Note the `in` instead of `out` in this case, and the necessary reversal of the IP addresses.
+
+The other gateway host (which has the public IP address `W.X.Y.Z`) will need similar rules.
+
+    
+
+    spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;
+
+           spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;
+
+Finally, you need to add firewall rules to allow ESP and IPENCAP packets back and forth. These rules will need to be added to both hosts.
+
+    
+
+    ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
+
+    ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
+
+    ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
+
+    ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
+
+    
+
+Because the rules are symmetric you can use the same rules on each gateway host.
+
+Outgoing packets will now look something like this:
+
+security/ipsec-crypt-pkt.png
+
+When they are received by the far end of the VPN they will first be decrypted (using the security associations that have been negotiated by racoon). Then they will enter the `gif` interface, which will unwrap the second layer, until you are left with the innermost packet, which can then travel in to the inner network.
+
+You can check the security using the same [ping(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ping&section8) test from earlier. First, log in to the `A.B.C.D` gateway machine, and run:
+
+    
+
+    tcpdump dst host 192.168.2.1
+
+In another log in session on the same host run
+
+    
+
+    ping 192.168.2.1
+
+This time you should see output like the following:
+
+    
+
+    XXX tcpdump output
+
+Now, as you can see, [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#tcpdump&section1) shows the ESP packets. If you try to examine them with the `-s` option you will see (apparently) gibberish, because of the encryption.
+
+Congratulations. You have just set up a VPN between two remote sites.
+
+ **Summary** 
+
+* Configure both kernels with:
+
+      
+
+      options IPSEC
+
+      options IPSEC_ESP
+
+  
+
+* Install [`security/racoon`](http://pkgsrc.se/security/racoon). Edit `${PREFIX}/etc/racoon/psk.txt` on both gateway hosts, adding an entry for the remote host's IP address and a secret key that they both know. Make sure this file is mode 0600.
+
+* Add the following lines to `/etc/rc.conf` on each host:
+
+      
+
+      ipsec_enable="YES"
+
+      ipsec_file="/etc/ipsec.conf"
+
+  
+
+* Create an `/etc/ipsec.conf` on each host that contains the necessary spdadd lines. On gateway host #1 this would be:
+
+      
+
+      spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec
+
+        esp/tunnel/A.B.C.D-W.X.Y.Z/require;
+
+      spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec
+
+        esp/tunnel/W.X.Y.Z-A.B.C.D/require;
+
+  
+
+  On gateway host #2 this would be:
+
+      
+
+      spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec
+
+        esp/tunnel/W.X.Y.Z-A.B.C.D/require;
+
+      spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec
+
+        esp/tunnel/A.B.C.D-W.X.Y.Z/require;
+
+  
+
+* Add firewall rules to allow IKE, ESP, and IPENCAP traffic to both hosts:
+
+      
+
+      ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
+
+      ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
+
+      ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
+
+      ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
+
+      ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
+
+      ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
+
+  
+
+The previous two steps should suffice to get the VPN up and running. Machines on each network will be able to refer to one another using IP addresses, and all traffic across the link will be automatically and securely encrypted.
+
+----
+
+## OpenSSH 
+
+***Contributed by Chern Lee. ***
+
+ **OpenSSH**  is a set of network connectivity tools used to access remote machines securely. It can be used as a direct replacement for `rlogin`, `rsh`, `rcp`, and `telnet`. Additionally, any other TCP/IP connections can be tunneled/forwarded securely through SSH.  **OpenSSH**  encrypts all traffic to effectively eliminate eavesdropping, connection hijacking, and other network-level attacks.
+
+ **OpenSSH**  is maintained by the OpenBSD project, and is based upon SSH v1.2.12 with all the recent bug fixes and updates. It is compatible with both SSH protocols 1 and 2.
+
+### Advantages of Using OpenSSH 
+
+Normally, when using [telnet(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#telnet&section1) or [rlogin(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=rlogin&section=1), data is sent over the network in an clear, un-encrypted form. Network sniffers anywhere in between the client and server can steal your user/password information or data transferred in your session.  **OpenSSH**  offers a variety of authentication and encryption methods to prevent this from happening.
+
+### Enabling sshd 
+
+Be sure to make the following addition to your `rc.conf` file:
+
+    
+
+    sshd_enable="YES"
+
+This will load [sshd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#sshd&section8&manpath=OpenBSD+3.3), the daemon program for  **OpenSSH** , the next time your system initializes. Alternatively, you can simply run directly the  **sshd**  daemon by typing `rcstart sshd` on the command line.
+
+### SSH Client 
+
+The [ssh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh&section1&manpath=OpenBSD+3.3) utility works similarly to [rlogin(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=rlogin&section=1).
+
+    
+
+    # ssh user@example.com
+
+    Host key not found from the list of known hosts.
+
+    Are you sure you want to continue connecting (yes/no)? yes
+
+    Host 'example.com' added to the list of known hosts.
+
+    user@example.com's password: *******
+
+The login will continue just as it would have if a session was created using `rlogin` or `telnet`. SSH utilizes a key fingerprint system for verifying the authenticity of the server when the client connects. The user is prompted to enter `yes` only when connecting for the first time. Future attempts to login are all verified against the saved fingerprint key. The SSH client will alert you if the saved fingerprint differs from the received fingerprint on future login attempts. The fingerprints are saved in `~/.ssh/known_hosts`, or `~/.ssh/known_hosts2` for SSH v2 fingerprints.
+
+By default,  **OpenSSH**  servers are configured to accept both SSH v1 and SSH v2 connections. The client, however, can choose between the two. Version 2 is known to be more robust and secure than its predecessor.
+
+The [ssh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh&section1&manpath=OpenBSD+3.3) command can be forced to use either protocol by passing it the `-1` or `-2` argument for v1 and v2, respectively.
+
+### Secure Copy 
+
+The [scp(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#scp&section1&manpath=OpenBSD+3.3) command works similarly to [rcp(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=rcp&section=1); it copies a file to or from a remote machine, except in a secure fashion.
+
+    
+
+    #  scp user@example.com:/COPYRIGHT COPYRIGHT
+
+    user@example.com's password: *******
+
+    COPYRIGHT            100% |*****************************|  4735
+
+    00:00
+
+    #
+
+Since the fingerprint was already saved for this host in the previous example, it is verified when using [scp(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#scp&section1&manpath=OpenBSD+3.3) here.
+
+The arguments passed to [scp(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#scp&section1&manpath=OpenBSD+3.3) are similar to [cp(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=cp&section=1), with the file or files in the first argument, and the destination in the second. Since the file is fetched over the network, through SSH, one or more of the file arguments takes on the form `user@host:<path_to_remote_file>`. The `user@` part is optional. If omitted, it will default to the same username as you are currently logged in as, unless configured otherwise.
+
+### Configuration 
+
+The system-wide configuration files for both the  **OpenSSH**  daemon and client reside within the `/etc/ssh` directory.
+
+`ssh_config` configures the client settings, while `sshd_config` configures the daemon.
+
+Additionally, the `sshd_program` (`/usr/sbin/sshd` by default), and `sshd_flags` `rc.conf` options can provide more levels of configuration.
+
+Each user can have a personal configuration file in `~/.ssh/config`. The file can configure various client options, and can include host-specific options. With the following configuration file, a user could type `ssh shell` which would be equivalent to `ssh -X user@shell.example.com`.
+
+    
+
+    Host shell
+
+     Hostname shell.example.com
+
+     Username user
+
+     Protocol 2
+
+     ForwardX11 yes
+
+### ssh-keygen 
+
+Instead of using passwords, [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-keygen&section1&manpath=OpenBSD+3.3) can be used to generate RSA keys to authenticate a user:
+
+    
+
+    % ssh-keygen -t rsa1
+
+    Initializing random number generator...
+
+    Generating p:  .++ (distance 66)
+
+    Generating q:  ..............................++ (distance 498)
+
+    Computing the keys...
+
+    Key generation complete.
+
+    Enter file in which to save the key (/home/user/.ssh/identity):
+
+    Enter passphrase:
+
+    Enter the same passphrase again:
+
+    Your identification has been saved in /home/user/.ssh/identity.
+
+    ...
+
+[ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-keygen&section1&manpath=OpenBSD+3.3) will create a public and private key pair for use in authentication. The private key is stored in `~/.ssh/identity`, whereas the public key is stored in `~/.ssh/identity.pub`. The public key must be placed in `~/.ssh/authorized_keys` of the remote machine in order for the setup to work.
+
+This will allow connection to the remote machine based upon RSA authentication instead of passwords.
+
+ **Note:** The `-t rsa1` option will create RSA keys for use by SSH protocol version 1. If you want to use RSA keys with the SSH protocol version 2, you have to use the command `ssh-keygen -t rsa`.
+
+If a passphrase is used in [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-keygen&section1&manpath=OpenBSD+3.3), the user will be prompted for a password each time in order to use the private key.
+
+A SSH protocol version 2 DSA key can be created for the same purpose by using the `ssh-keygen -t dsa` command. This will create a public/private DSA key for use in SSH protocol version 2 sessions only. The public key is stored in `~/.ssh/id_dsa.pub`, while the private key is in `~/.ssh/id_dsa`.
+
+DSA public keys are also placed in `~/.ssh/authorized_keys` on the remote machine.
+
+[ssh-agent(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-agent&section1&manpath=OpenBSD+3.3) and [ssh-add(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ssh-add&section=1&manpath=OpenBSD+3.3) are utilities used in managing multiple passworded private keys.
+
+ **Warning:** The various options and files can be different according to the  **OpenSSH**  version you have on your system, to avoid problems you should consult the [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-keygen&section1&manpath=OpenBSD+3.3) manual page.
+
+### SSH Tunneling 
+
+ **OpenSSH**  has the ability to create a tunnel to encapsulate another protocol in an encrypted session.
+
+The following command tells [ssh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh&section1&manpath=OpenBSD+3.3) to create a tunnel for  **telnet** :
+
+    
+
+    % ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com
+
+    %
+
+The `ssh` command is used with the following options:
+
+`-2`
+
+ :: Forces `ssh` to use version 2 of the protocol. (Do not use if you are working with older SSH servers)
+
+`-N`
+
+ :: Indicates no command, or tunnel only. If omitted, `ssh` would initiate a normal session.
+
+`-f`
+
+ :: Forces `ssh` to run in the background.
+
+`-L`
+
+ :: Indicates a local tunnel in `***localport:remotehost:remoteport***` fashion.
+
+`user@foo.example.com`
+
+ :: The remote SSH server.
+
+An SSH tunnel works by creating a listen socket on `localhost` on the specified port. It then forwards any connection received on the local host/port via the SSH connection to the specified remote host and port.
+
+In the example, port `***5023***` on `localhost` is being forwarded to port `***23***` on `localhost` of the remote machine. Since `***23***` is  **telnet** , this would create a secure  **telnet**  session through an SSH tunnel.
+
+This can be used to wrap any number of insecure TCP protocols such as SMTP, POP3, FTP, etc.
+
+ **Example 10-1. Using SSH to Create a Secure Tunnel for SMTP** 
+
+    
+
+    % ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com
+
+    user@mailserver.example.com's password: *****
+
+    % telnet localhost 5025
+
+    Trying 127.0.0.1...
+
+    Connected to localhost.
+
+    Escape character is '^]'.
+
+    220 mailserver.example.com ESMTP
+
+This can be used in conjunction with an [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-keygen&section1&manpath=OpenBSD+3.3) and additional user accounts to create a more seamless/hassle-free SSH tunneling environment. Keys can be used in place of typing a password, and the tunnels can be run as a separate user.
+
+#### Practical SSH Tunneling Examples 
+
+##### Secure Access of a POP3 Server 
+
+At work, there is an SSH server that accepts connections from the outside. On the same office network resides a mail server running a POP3 server. The network, or network path between your home and office may or may not be completely trustable. Because of this, you need to check your e-mail in a secure manner. The solution is to create an SSH connection to your office's SSH server, and tunnel through to the mail server.
+
+    
+
+    % ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com
+
+    user@ssh-server.example.com's password: ******
+
+When the tunnel is up and running, you can point your mail client to send POP3 requests to `localhost` port 2110. A connection here will be forwarded securely across the tunnel to `mail.example.com`.
+
+##### Bypassing a Draconian Firewall 
+
+Some network administrators impose extremely draconian firewall rules, filtering not only incoming connections, but outgoing connections. You may be only given access to contact remote machines on ports 22 and 80 for SSH and web surfing.
+
+You may wish to access another (perhaps non-work related) service, such as an Ogg Vorbis server to stream music. If this Ogg Vorbis server is streaming on some other port than 22 or 80, you will not be able to access it.
+
+The solution is to create an SSH connection to a machine outside of your network's firewall, and use it to tunnel to the Ogg Vorbis server.
+
+    
+
+    % ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org
+
+    user@unfirewalled-system.example.org's password: *******
+
+Your streaming client can now be pointed to `localhost` port 8888, which will be forwarded over to `music.example.com` port 8000, successfully evading the firewall.
+
+ ***Contributed by Matteo Riondato. Updated for DragonFly by Dario Banno.***
+
+ [[!toc levels=3]]
+
+## Synopsis 
+
+ This chapter will provide an explanation of what DragonFly jails are and how to use them. Jails, sometimes referred to as an enhanced replacement of chroot environments, are a very powerful tool for system administrators, but their basic usage can also be useful for advanced users.
+
+ After reading this chapter, you will know:
+
+* What a jail is, and what purpose it may serve in DragonFly installations.
+
+* How to build, start, and stop a jail.
+
+* The basics of jail administration, both from inside and outside the jail.
+***
+
+ Other sources of useful information about jails are:
+
+* The [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) manual page. This is the full reference of the jail utility -- the administrative tool which can be used in DragonFly to start, stop, and control DragonFly jails.
+
+* The mailing lists and their archives. The archives of the DragonFly general questions mailing list and other mailing lists hosted by the DragonFly list server already contain a wealth of material for jails. It should always be engaging to search the archives, or post a new question to the [users mailing list](mailto:users@lists.dragonflybsd.org).
+***
+  ***
+
+For information on how to setup a jail, see: [Setting up a jail](http://www.youtube.com/watch?v=s4_dJjfwtR4)
+
+----
+
+## Terms Related to Jails 
+
+ To facilitate better understanding of parts of the DragonFly system related to jails, their internals and the way they interact with the rest of DragonFly, the following terms are used further in this chapter:
+
+ ***[chroot(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=8) (command)***
+
+  A system call of DragonFly, which changes the root directory of a process and all its descendants.
+
+***
+
+ ***[chroot(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=2) (environment)***
+
+  The environment of processes running in a “chroot”. This includes resources such as the part of the file system which is visible, user and group IDs which are available, network interfaces and other IPC mechanisms, etc.
+
+***
+
+*** [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) (command)***
+
+  The system administration utility which allows launching of processes within a jail environment.
+
+***
+
+ ***host (system, process, user, etc.)***
+
+  The controlling system of a jail environment. The host system has access to all the hardware resources available, and can control processes both outside of and inside a jail environment. One of the important differences of the host system from a jail is that the limitations which apply to superuser processes inside a jail are not enforced for processes of the host system.
+
+***
+
+ ***hosted (system, process, user, etc.)***
+
+  A process, user or other entity, whose access to resources is restricted by a DragonFly jail.
+
+----
+
+## Introduction 
+
+ Since system administration is a difficult and perplexing task, many powerful tools were developed to make life easier for the administrator. These tools mostly provide enhancements of some sort to the way systems are installed, configured and maintained. Part of the tasks which an administrator is expected to do is to properly configure the security of a system, so that it can continue serving its real purpose, without allowing security violations.
+***
+
+ One of the tools which can be used to enhance the security of a DragonFly system are jails. The jail feature was written by Poul-Henning Kamp <phk@freebsd.org> for R&D Associates [[http://www.rndassociates.com/]] who contributed it to FreeBSD 4.X. Support for multiple IPs and IPv6 were introduced in DragonFly 1.7. Their development still goes on, enhancing their usefulness, performance, reliability, and security.
+
+## What is a Jail 
+
+ BSD-like operating systems have had [chroot(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=2) since the time of 4.2BSD. The [chroot(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=8) utility can be used to change the root directory of a set of processes, creating a safe environment, separate from the rest of the system. Processes created in the chrooted environment can not access files or resources outside of it. For that reason, compromising a service running in a chrooted environment should not allow the attacker to compromise the entire system. The chroot(8) utility is good for easy tasks, which do not require a lot of flexibility or complex and advanced features. Since the inception of the chroot concept, however, many ways have been found to escape from a chrooted environment and, although they have been fixed in modern versions of the DragonFly kernel, it was clear that chroot(2) was not the ideal solution for securing services. A new subsystem had to be implemented.
+
+ This is one of the main reasons why ***jails*** were developed.
+
+ Jails improve on the concept of the traditional [chroot(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=2) environment, in several ways. In a traditional [chroot(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=2) environment, processes are only limited in the part of the file system they can access. The rest of the system resources (like the set of system users, the running processes, or the networking subsystem) are shared by the chrooted processes and the processes of the host system. Jails expand this model by virtualizing not only access to the file system, but also the set of users, the networking subsystem of the DragonFly kernel and a few other things. A more complete set of fine-grained controls available for tuning the access of a jailed environment is described in Section 12.5.
+***
+
+ A jail is characterized by four elements:
+
+* A directory subtree -- the starting point from which a jail is entered. Once inside the jail, a process is not permitted to escape outside of this subtree. Traditional security issues which plagued the original chroot(2) design will not affect DragonFly jails.
+
+* A hostname -- the hostname which will be used within the jail. Jails are mainly used for hosting network services, therefore having a descriptive hostname for each jail can really help the system administrator.
+
+* An IP address -- this will be assigned to the jail and cannot be changed in any way during the jail's life span. The IP address of a jail is usually an alias address for an existing network interface, but this is not strictly necessary.
+
+* A command -- the path name of an executable to run inside the jail. This is relative to the root directory of the jail environment, and may vary a lot, depending on the type of the specific jail environment.
+***
+
+ Apart from these, jails can have their own set of users and their own root user. Naturally, the powers of the root user are limited within the jail environment and, from the point of view of the host system, the jail root user is not an omnipotent user. In addition, the root user of a jail is not allowed to perform critical operations to the system outside of the associated jail(8) environment. More information about capabilities and restrictions of the root user will be discussed in Section 12.5 below.
+
+----
+
+## Creating and Controlling Jails 
+
+ Some administrators divide jails into the following two types: ***complete*** jails, which resemble a real DragonFly system, and ***service*** jails, dedicated to one application or service, possibly running with privileges. This is only a conceptual division and the process of building a jail is not affected by it. The [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) manual page is quite clear about the procedure for building a jail:
+
+     
+
+    # setenv D /here/is/the/jail
+    # mkdir -p $D                                     (1)
+    # cd /usr/src
+    # make installworld DESTDIR=$D                    (2)
+    # cd etc 
+    # make distribution DESTDIR=$D -DNO_MAKEDEV_RUN   (3)
+    # cd $D
+    # ln -sf dev/null kernel
+    # mount_devfs -o jail $D/dev
+    #
+
+  **(1)** 
+
+  Selecting a location for a jail is the best starting point. This is where the jail will physically reside within the file system of the jail's host. A good choice can be ***/usr/jail/jailname***, where jailname is the hostname identifying the jail. The ***/usr/*** file system usually has enough space for the jail file system, which for ***complete*** jails is, essentially, a replication of every file present in a default installation of the DragonFly base system.
+***
+
+  **(2)** 
+
+  This command will populate the directory subtree chosen as jail's physical location on the file system with the necessary binaries, libraries, manual pages and so on. Everything is done in the typical DragonFly style -- first everything is built/compiled, then installed to the destination path.
+***
+
+ **(3)**
+
+  The distribution target for make installs every needed configuration file. In simple words, it installs every installable file of ***/usr/src/etc/*** to the ***/etc*** directory of the jail environment: ***$D/etc/***.
+
+***
+
+ Once a jail is installed, it can be started by using the [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) utility. The [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) utility takes four mandatory arguments which are described in the Section 12.3.1. Other arguments may be specified too, e.g., to run the jailed process with the credentials of a specific user. The command argument depends on the type of the jail; for a virtual system, ***/etc/rc*** is a good choice, since it will replicate the startup sequence of a real DragonFly system. For a service jail, it depends on the service or application that will run within the jail.
+
+ Jails are often started at boot time and the DragonFly rc mechanism provides an easy way to do this.
+
+***
+ A list of the jails which are enabled to start at boot time should be added to the [rc.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.conf&section=5) file:
+
+     
+
+    jail_enable="YES"   # Set to NO to disable starting of any jails
+    jail_list="www"     # Space separated list of names of jails
+    #
+
+***
+
+ For each jail listed in ***jail_list***, a group of [rc.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.conf&section=5) settings, which describe the particular jail, should be added:
+
+     
+
+    jail_www_rootdir="/usr/jail/www"     # jail's root directory
+    jail_www_hostname="www.example.org"  # jail's hostname
+    jail_www_ip="192.168.0.10"           # jail's IP address
+    #
+
+ The default startup of jails configured in [rc.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.conf&section=5), will run the ***/etc/rc*** script of the jail, which assumes the jail is a complete virtual system. For service jails, the default startup command of the jail should be changed, by setting the ***jail_jailname_exec_start*** option appropriately.
+
+   **Note:**  For a full list of available options, please see the [rc.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.conf&section=5) manual page.
+
+ The ***/etc/rc.d/jail*** script can be used to start or stop a jail by hand, if an entry for it exists in ***rc.conf***:
+
+    # /etc/rc.d/jail start www
+    # /etc/rc.d/jail stop www
+
+***
+
+ A clean way to shut down a [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) is not available at the moment. This is because commands normally used to accomplish a clean system shutdown cannot be used inside a jail. The best way to shut down a jail is to run the following command from within the jail itself or using the [jexec(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jexec&section=8) utility from outside the jail:
+
+     
+
+    # sh /etc/rc.shutdown
+
+ More information about this can be found in the [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) manual page.
+
+----
+
+## Fine Tuning and Administration 
+
+ There are several options which can be set for any jail, and various ways of combining a host DragonFly system with jails, to produce higher level applications. This section presents some of the options available for tuning the behavior and security restrictions implemented by a jail installation.
+
+## System tools for jail tuning in DragonFly 
+
+ Fine tuning of a jail's configuration is mostly done by setting [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8) variables. A special subtree of sysctl exists as a basis for organizing all the relevant options: the ***securityjail**** hierarchy of DragonFly kernel options. Here is a list of the main jail-related sysctls, complete with their default value. Names should be self-explanatory, but for more information about them, please refer to the [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) and [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8) manual pages.
+
+* jail.set_hostname_allowed: 1
+
+* jail.socket_unixiproute_only: 1
+
+* jail.sysvipc_allowed: 0
+
+* jail.enforce_statfs: 2
+
+* jail.allow_raw_sockets: 0
+
+* jail.chflags_allowed: 0
+
+* jail.jailed: 0
+
+These variables can be used by the system administrator of the host system to add or remove some of the limitations imposed by default on the root user. Note that there are some limitations which cannot be removed. The root user is not allowed to mount or unmount file systems from within a [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8). The root inside a jail may not set firewall rules or do many other administrative tasks which require modifications of in-kernel data, such as setting the securelevel of the kernel.
+
+***
+
+ The base system of DragonFly contains a basic set of tools for viewing information about the active jails, and attaching to a jail to run administrative commands. The [jls(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jls&section=8) and [jexec(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jexec&section=8) commands are part of the base DragonFly system, and can be used to perform the following simple tasks:
+
+ * Print a list of active jails and their corresponding jail identifier (JID), IP address, hostname and path.
+
+ * Attach to a running jail, from its host system, and run a command inside the jail or perform administrative tasks inside the jail itself. This is especially useful when the root user wants to cleanly shut down a jail. The [jexec(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jexec&section=8) utility can also be used to start a shell in a jail to do administration in it; for example:
+
+       
+
+          # jexec 1 tcsh
+
+***This Page is under constructions. New software are being added regularly.***
+**Follow the links below to see how to make corresponding software work on DragonFly**
+
+[[!toc levels=3 ]]
+
+## Servers
+[[SSHserver]]
+
+[FTP Server](http://www.dragonflybsd.org/docs/newhandbook/FTP/)
+
+## Installing flash player on firefox.
+
+The Flash plugin is distributed by Adobe in **binary form only**. Adobe does not provide a native DragonFlyBSD plugin, but there is a Linux plugin which you can use under Linux emulation. Linux emulation software is installed from **pkgsrc** and is tested to be working fine on x86 Platform. The steps are
+
+### Configure Linux Support
+
+    # echo "linux_load=yes" >> /boot/loader.conf
+    # echo "linux_enable=yes" >> /etc/rc.conf
+    # echo "proc  /compat/linux/proc  linprocfs  rw  0  0" >> /etc/fstab
+
+**Reboot DragonFly** ( not necessarry but easier for new users )  so that Linux Emulation is loaded to the kernel and configured correctly.
+
+### Install multimedia/libflashsupport from pkgsrc. 
+
+    # cd /usr/pkgsrc/multimedia/libflashsupport
+    # bmake package
+
+This will get you all packages needed for Linux Emulation. Currently the Linux Emulation package installs software from [Suse 10]( http://ftp.hosteurope.de/mirror/ftp.opensuse.org/discontinued/10.0/suse/i586/) distribution. You could see the list of packages installed using pkg_info.
+
+    # pkg_info |grep suse
+    suse_openssl-10.0nb5 Linux compatibility package for OpenSSL
+    suse_gtk2-10.0nb4   Linux compatibility package for GTK+-2.x
+    suse_gtk-10.0nb2    Linux compatibility package for GTK+-1.x
+    suse_libjpeg-10.0nb2 Linux compatibility package for JPEG
+    suse_base-10.0nb5   Linux compatibility package
+    suse_slang-10.0nb3  Linux compatibility package for S-Lang
+    suse_locale-10.0nb2 Linux compatibility package with locale files
+    suse_fontconfig-10.0nb6 Linux compatibility package for fontconfig
+    suse_libtiff-10.0nb4 Linux compatibility package for TIFF
+    suse_openmotif-10.0nb2 Linux compatibility package for OpenMotif
+    suse_libpng-10.0nb4 Linux compatibility package for PNG
+    suse_libcups-10.0nb4 Linux compatibility package for CUPS
+    suse_gdk-pixbuf-10.0nb3 Linux compatibility package for gdk-pixbuf
+    suse_expat-10.0nb2  Linux compatibility package for expat
+    suse_vmware-10.0nb2 Linux compatibility package to help run VMware
+    suse_libxml2-10.0nb2 Linux compatibility package for libxml2
+    suse_compat-10.0nb3 Linux compatibility package with old shared libraries
+    suse_x11-10.0nb4    Linux compatibility package for X11
+    suse_glx-10.0nb4    Linux compatibility package for OpenGL/Mesa
+    suse_freetype2-10.0nb5 Linux compatibility package for freetype-2.x
+    suse_aspell-10.0nb2 Linux compatibility package for aspell
+    suse-10.0nb4        SUSE-based Linux binary emulation environment
+
+### Install www/nspluginwrapper 
+
+This will allow DragonFly to use the Linux Binary Flash Plugin
+
+    # cd /usr/pkgsrc/www/nspluginwrapper
+    # bmake package
+
+### Install multimedia/ns-flash
+
+This is the Linux Flash Plugin itself.
+
+    # cd /usr/pkgsrc/multimedia/ns-flash
+    # bmake NO_CHECKSUM=yes package
+
+You can check if the Flash plugin is installed right by.
+
+    # /usr/pkg/bin/nspluginwrapper --list
+    /usr/pkg/lib/netscape/plugins/npwrapper.libflashplayer.so
+      Original plugin: /usr/pkg/lib/netscape/plugins/libflashplayer.so
+      Wrapper version string: 1.2.2
+    /usr/pkg/lib/netscape/plugins/npwrapper.libflashplayer.so
+      Original plugin: /usr/pkg/lib/netscape/plugins/libflashplayer.so
+      Wrapper version string: 1.2.2
+
+Don't worry if it is listed twice as above.
+
+Now Start Firefox and type "**about:plugins**" in the address bar and you should find the flash plugins listed as [shown in this Picture](http://leaf.dragonflybsd.org/~sgeorge/PICs/flash-plugin-in-firefox.png).
+
+You can watch Streaming Flash now.
+
+## Chapter 18 Serial Communications 
+[[!toc  levels=3]]
+
+***Reorganized, and parts rewritten by Ivailo Mladenov. ***
+
+## Synopsis 
+
+UNIX® has always had support for serial communications. In fact, the very first UNIX machines relied on serial lines for user input and output. Things have changed a lot from the days when the average ***terminal*** consisted of a 10-character-per-second serial printer and a keyboard. This chapter will cover some of the ways in which DragonFly uses serial communications.
+
+After reading this chapter, you will know:
+
+* How to connect terminals to your DragonFly system.
+
+* How to use a modem to dial out to remote hosts.
+
+* How to allow remote users to login to your system with a modem.
+
+* How to boot your system from a serial console.
+
+Before reading this chapter, you should:
+
+* Know how to configure and install a new kernel ([kernelconfig.html Chapter 10]).
+
+* Understand UNIX permissions and processes ([basics.html Chapter 3]).
+
+* Have access to the technical manual for the serial hardware (modem or multi-port card) that you would like to use with DragonFly.
+
+***
+
+## 18.1 Introduction 
+
+### 18.1.1 Terminology 
+
+bps:: Bits per Second -- the rate at which data is transmitted;
+
+DTE:: Data Terminal Equipment -- for example, your computer;
+
+DCE:: Data Communications Equipment -- your modem;
+
+RS-232:: EIA standard for hardware serial communications.
+
+When talking about communications data rates, this section does not use the term ***baud***. Baud refers to the number of electrical state transitions that may be made in a period of time, while ***bps*** (bits per second) is the ***correct*** term to use (at least it does not seem to bother the curmudgeons quite as much).
+
+### 18.1.2 Cables and Ports 
+
+To connect a modem or terminal to your DragonFly system, you will need a serial port on your computer and the proper cable to connect to your serial device. If you are already familiar with your hardware and the cable it requires, you can safely skip this section.
+
+#### 18.1.2.1 Cables 
+
+There are several different kinds of serial cables. The two most common types for our purposes are null-modem cables and standard (***straight***) RS-232 cables. The documentation for your hardware should describe the type of cable required.
+
+##### 18.1.2.1.1 Null-modem Cables 
+
+A null-modem cable passes some signals, such as ***signal ground***, straight through, but switches other signals. For example, the ***send data*** pin on one end goes to the ***receive data*** pin on the other end.
+
+If you like making your own cables, you can construct a null-modem cable for use with terminals. This table shows the RS-232C signal names and the pin numbers on a DB-25 connector.
+
+[[!table  data="""
+| Signal | Pin # |  | Pin # | Signal 
+ SG | 7 | connects to | 7 | SG 
+ TxD | 2 | connects to | 3 | RxD 
+ RxD | 3 | connects to | 2 | TxD 
+ RTS | 4 | connects to | 5 | CTS 
+ CTS | 5 | connects to | 4 | RTS 
+ DTR | 20 | connects to | 6 | DSR 
+ DCD | 8 |  | 6 | DSR 
+ DSR | 6 | connects to | 20 | DTR |
+
+"""]]
+
+ **Note:** Connect ***Data Set Ready*** (DSR) and ***Data Carrier Detect*** (DCD) internally in the connector hood, and then to ***Data Terminal Ready*** (DTR) in the remote hood.
+
+##### 18.1.2.1.2 Standard RS-232C Cables 
+
+A standard serial cable passes all the RS-232C signals straight-through. That is, the ***send data*** pin on one end of the cable goes to the ***send data*** pin on the other end. This is the type of cable to use to connect a modem to your DragonFly system, and is also appropriate for some terminals.
+
+#### 18.1.2.2 Ports 
+
+Serial ports are the devices through which data is transferred between the DragonFly host computer and the terminal. This section describes the kinds of ports that exist and how they are addressed in DragonFly.
+
+##### 18.1.2.2.1 Kinds of Ports 
+
+Several kinds of serial ports exist. Before you purchase or construct a cable, you need to make sure it will fit the ports on your terminal and on the DragonFly system.
+
+Most terminals will have DB25 ports. Personal computers, including PCs running DragonFly, will have DB25 or DB9 ports. If you have a multiport serial card for your PC, you may have RJ-12 or RJ-45 ports.
+
+See the documentation that accompanied the hardware for specifications on the kind of port in use. A visual inspection of the port often works too.
+
+##### 18.1.2.2.2 Port Names 
+
+In DragonFly, you access each serial port through an entry in the `/dev` directory. There are two different kinds of entries:
+
+* Call-in ports are named `/dev/ttyd`***N****** where `***N***` is the port number, starting from zero. Generally, you use the call-in port for terminals. Call-in ports require that the serial line assert the data carrier detect (DCD) signal to work correctly.
+
+* Call-out ports are named `/dev/cuaa`***N******. You usually do not use the call-out port for terminals, just for modems. You may use the call-out port if the serial cable or the terminal does not support the carrier detect signal.
+
+If you have connected a terminal to the first serial port (`COM1` in MS-DOS®), then you will use `/dev/ttyd0` to refer to the terminal. If the terminal is on the second serial port (also known as `COM2`), use `/dev/ttyd1`, and so forth.
+
+### 18.1.3 Kernel Configuration 
+
+DragonFly supports four serial ports by default. In the MS-DOS world, these are known as `COM1`, `COM2`, `COM3`, and `COM4`. DragonFly currently supports ***dumb*** multiport serial interface cards, such as the BocaBoard 1008 and 2016, as well as more intelligent multi-port cards such as those made by Digiboard and Stallion Technologies. However, the default kernel only looks for the standard COM ports.
+
+To see if your kernel recognizes any of your serial ports, watch for messages while the kernel is booting, or use the `/sbin/dmesg` command to replay the kernel's boot messages. In particular, look for messages that start with the characters `sio`.
+
+ **Tip:** To view just the messages that have the word `sio`, use the command:
+
+    
+
+    # /sbin/dmesg | grep 'sio'
+
+For example, on a system with four serial ports, these are the serial-port specific kernel boot messages:
+
+    
+
+    sio0 at 0x3f8-0x3ff irq 4 on isa
+
+    sio0: type 16550A
+
+    sio1 at 0x2f8-0x2ff irq 3 on isa
+
+    sio1: type 16550A
+
+    sio2 at 0x3e8-0x3ef irq 5 on isa
+
+    sio2: type 16550A
+
+    sio3 at 0x2e8-0x2ef irq 9 on isa
+
+    sio3: type 16550A
+
+If your kernel does not recognize all of your serial ports, you will probably need to configure a custom DragonFly kernel for your system. For detailed information on configuring your kernel, please see [kernelconfig.html Chapter 12].
+
+The relevant device lines for your kernel configuration file would look like this:
+
+    
+
+    device             sio0    at isa? port IO_COM1 irq 4
+
+    device             sio1    at isa? port IO_COM2 irq 3
+
+    device             sio2    at isa? port IO_COM3 irq 5
+
+    device             sio3    at isa? port IO_COM4 irq 9
+
+ **Note:** `port IO_COM1` is a substitution for `port 0x3f8`, `IO_COM2` is `0x2f8`, `IO_COM3` is `0x3e8`, and `IO_COM4` is `0x2e8`, which are fairly common port addresses for their respective serial ports; interrupts 4, 3, 5, and 9 are fairly common interrupt request lines. Also note that regular serial ports ***cannot*** share interrupts on ISA-bus PCs (multiport boards have on-board electronics that allow all the 16550A's on the board to share one or two interrupt request lines).
+
+### 18.1.4 Device Special Files 
+
+Most devices in the kernel are accessed through ***device special files***, which are located in the `/dev` directory. The `sio` devices are accessed through the `/dev/ttyd`***N****** (dial-in) and `/dev/cuaa`***N****** (call-out) devices. DragonFly also provides initialization devices (`/dev/ttyid`***N****** and `/dev/cuaia`***N******) and locking devices (`/dev/ttyld`***N****** and `/dev/cuala`***N******). The initialization devices are used to initialize communications port parameters each time a port is opened, such as `crtscts` for modems which use `RTS/CTS` signaling for flow control. The locking devices are used to lock flags on ports to prevent users or programs changing certain parameters; see the manual pages [termios(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#termios&section4), [sio(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=sio&section=4), and [stty(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=stty&section=1) for information on the terminal settings, locking and initializing devices, and setting terminal options, respectively.
+
+### 18.1.5 Serial Port Configuration 
+
+The `ttyd`***N****** (or `cuaa`***N******) 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 bit communication, and `XON/XOFF` flow control by default for `ttyd5`, type:
+
+    
+
+    # stty -f /dev/ttyid5 clocal cs8 ixon ixoff
+
+System-wide initialization of the serial devices is controlled in `/etc/rc.serial`. This file affects the default settings of serial devices.
+
+To prevent certain settings from being changed by an application, make adjustments to the ***lock state*** device. For example, to lock the speed of `ttyd5` to 57600 bps, type:
+
+    
+
+    # stty -f /dev/ttyld5 57600
+
+Now, an application that opens `ttyd5` and tries to change the speed of the port will be stuck with 57600 bps.
+
+Naturally, you should make the initial state and lock state devices writable only by the `root` account.
+
+***
+
+## 18.2 Terminals 
+
+Terminals provide a convenient and low-cost way to access your DragonFly system when you are not at the computer's console or on a connected network. This section describes how to use terminals with DragonFly.
+
+### 18.2.1 Uses and Types of Terminals 
+
+The original UNIX® systems did not have consoles. Instead, people logged in and ran programs through terminals that were connected to the computer's serial ports. It is quite similar to using a modem and terminal software to dial into a remote system to do text-only work.
+
+Today's PCs have consoles capable of high quality graphics, but the ability to establish a login session on a serial port still exists in nearly every UNIX style operating system today; DragonFly is no exception. By using a terminal attached to an unused serial port, you can log in and run any text program that you would normally run on the console or in an `xterm` window in the X Window System.
+
+For the business user, you can attach many terminals to a DragonFly system and place them on your employees' desktops. For a home user, a spare computer such as an older IBM PC or a Macintosh® can be a terminal wired into a more powerful computer running DragonFly. You can turn what might otherwise be a single-user computer into a powerful multiple user system.
+
+For DragonFly, there are three kinds of terminals:
+
+* [ Dumb terminals](term.html#TERM-DUMB)
+
+* [ PCs acting as terminals](term.html#TERM-PCS)
+
+* [ X terminals](term.html#TERM-X)
+
+#### 18.2.1.1 Dumb Terminals 
+
+Dumb terminals are specialized pieces of hardware that let you connect to computers over serial lines. They are called ***dumb*** because they have only enough computational power to display, send, and receive text. You cannot run any programs on them. It is the computer to which you connect them that has all the power to run text editors, compilers, email, games, and so forth.
+
+There are hundreds of kinds of dumb terminals made by many manufacturers, including Digital Equipment Corporation's VT-100 and Wyse's WY-75. Just about any kind will work with DragonFly. Some high-end terminals can even display graphics, but only certain software packages can take advantage of these advanced features.
+
+Dumb terminals are popular in work environments where workers do not need access to graphical applications such as those provided by the X Window System.
+
+#### 18.2.1.2 PCs Acting as Terminals 
+
+If a [ dumb terminal](term.html#TERM-DUMB) has just enough ability to display, send, and receive text, then certainly any spare personal computer can be a dumb terminal. All you need is the proper cable and some ***terminal emulation*** software to run on the computer.
+
+Such a configuration is popular in homes. For example, if your spouse is busy working on your DragonFly system's console, you can do some text-only work at the same time from a less powerful personal computer hooked up as a terminal to the DragonFly system.
+
+#### 18.2.1.3 X Terminals 
+
+X terminals are the most sophisticated kind of terminal available. Instead of connecting to a serial port, they usually connect to a network like Ethernet. Instead of being relegated to text-only applications, they can display any X application.
+
+We introduce X terminals just for the sake of completeness. However, this chapter does ***not*** cover setup, configuration, or use of X terminals.
+
+### 18.2.2 Configuration 
+
+This section describes what you need to configure on your DragonFly system to enable a login session on a terminal. It assumes you have already configured your kernel to support the serial port to which the terminal is connected--and that you have connected it.
+
+Recall from [boot.html Chapter 10] that the `init` process is responsible for all process control and initialization at system startup. One of the tasks performed by `init` is to read the `/etc/ttys` file and start a `getty` process on the available terminals. The `getty` process is responsible for reading a login name and starting the `login` program.
+
+Thus, to configure terminals for your DragonFly system the following steps should be taken as `root`:
+
+  1. Add a line to `/etc/ttys` for the entry in the `/dev` directory for the serial port if it is not already there.
+
+  1. Specify that `/usr/libexec/getty` be run on the port, and specify the appropriate `***getty***` type from the `/etc/gettytab` file.
+
+  1. Specify the default terminal type.
+
+  1. Set the port to ***on.***
+
+  1. Specify whether the port should be ***secure.***
+
+  1. Force `init` to reread the `/etc/ttys` file.
+
+As an optional step, you may wish to create a custom `***getty***` type for use in step 2 by making an entry in `/etc/gettytab`. This chapter does not explain how to do so; you are encouraged to see the [gettytab(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#gettytab&amp;section5) and the [getty(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=getty&amp;section=8) manual pages for more information.
+
+#### 18.2.2.1 Adding an Entry to `/etc/ttys` 
+
+The `/etc/ttys` file lists all of the ports on your DragonFly system where you want to allow logins. For example, the first virtual console `ttyv0` has an entry in this file. You can log in on the console using this entry. This file also contains entries for the other virtual consoles, serial ports, and pseudo-ttys. For a hardwired terminal, just list the serial port's `/dev` entry without the `/dev` part (for example, `/dev/ttyv0` would be listed as `ttyv0`).
+
+A default DragonFly install includes an `/etc/ttys` file with support for the first four serial ports: `ttyd0` through `ttyd3`. If you are attaching a terminal to one of those ports, you do not need to add another entry.
+
+ **Example 17-1. Adding Terminal Entries to `/etc/ttys`** 
+
+Suppose we would like to connect two terminals to the system: a Wyse-50 and an old 286 IBM PC running  **Procomm**  terminal software emulating a VT-100 terminal. We connect the Wyse to the second serial port and the 286 to the sixth serial port (a port on a multiport serial card). The corresponding entries in the `/etc/ttys` file would look like this:
+
+    
+
+    ttyd1./imagelib/callouts/1.png  "/usr/libexec/getty std.38400"./imagelib/callouts/2.png  wy50./imagelib/callouts/3.png  on./imagelib/callouts/4.png  insecure./imagelib/callouts/5.png
+
+    ttyd5   "/usr/libexec/getty std.19200"  vt100  on  insecure
+
+    
+
+[ ./imagelib/callouts/1.png](term.html#CO-TTYS-LINE1COL1):: The first field normally specifies the name of the terminal special file as it is found in `/dev`.[ ./imagelib/callouts/2.png](term.html#CO-TTYS-LINE1COL2):: The second field is the command to execute for this line, which is usually [getty(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#getty&amp;section8). `getty` initializes and opens the line, sets the speed, prompts for a user name and then executes the [login(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=login&amp;section=1) program.The `getty` program accepts one (optional) parameter on its command line, the `***getty***` type. A `***getty***` type configures characteristics on the terminal line, like bps rate and parity. The `getty` program reads these characteristics from the file `/etc/gettytab`.The file `/etc/gettytab` contains lots of entries for terminal lines both old and new. In almost all cases, the entries that start with the text `std` will work for hardwired terminals. These entries ignore parity. There is a `std` entry for each bps rate from 110 to 115200. Of course, you can add your own entries to this file. The [gettytab(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=gettytab&amp;section=5) manual page provides more information.When setting the `***getty***` type in the `/etc/ttys` file, make sure that the communications settings on the terminal match.For our example, the Wyse-50 uses no parity and connects at 38400 bps. The 286 PC uses no parity and connects at 19200 bps.[ ./imagelib/callouts/3.png](term.html#CO-TTYS-LINE1COL3):: The third field is the type of terminal usually connected to that tty line. For dial-up ports, `unknown` or `dialup` is typically used in this field since users may dial up with practically any type of terminal or software. For hardwired terminals, the terminal type does not change, so you can put a real terminal type from the [termcap(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=termcap&amp;section=5) database file in this field.For our example, the Wyse-50 uses the real terminal type while the 286 PC running  **Procomm**  will be set to emulate at VT-100.[ ./imagelib/callouts/4.png](term.html#CO-TTYS-LINE1COL4):: The fourth field specifies if the port should be enabled. Putting `on` here will have the `init` process start the program in the second field, `getty`. If you put `off` in this field, there will be no `getty`, and hence no logins on the port.[ ./imagelib/callouts/5.png](term.html#CO-TTYS-LINE1COL5):: The final field is used to specify whether the port is secure. Marking a port as secure means that you trust it enough to allow the `root` account (or any account with a user ID of 0) to login from that port. Insecure ports do not allow `root` logins. On an insecure port, users must login from unprivileged accounts and then use [su(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=su&amp;section=1) or a similar mechanism to gain superuser privileges.It is highly recommended that you use ***insecure*** even for terminals that are behind locked doors. It is quite easy to login and use `su` if you need superuser privileges.
+
+#### 18.2.2.2 Force `init` to Reread `/etc/ttys` 
+
+After making the necessary changes to the `/etc/ttys` file you should send a SIGHUP (hangup) signal to the `init` process to force it to re-read its configuration file. For example:
+
+    
+
+    # kill -HUP 1
+
+ **Note:** `init` is always the first process run on a system, therefore it will always have PID 1.
+
+If everything is set up correctly, all cables are in place, and the terminals are powered up, then a `getty` process should be running on each terminal and you should see login prompts on your terminals at this point.
+
+### 18.2.3 Troubleshooting Your Connection 
+
+Even with the most meticulous attention to detail, something could still go wrong while setting up a terminal. Here is a list of symptoms and some suggested fixes.
+
+#### 18.2.3.1 No Login Prompt Appears 
+
+Make sure the terminal is plugged in and powered up. If it is a personal computer acting as a terminal, make sure it is running terminal emulation software on the correct serial port.
+
+Make sure the cable is connected firmly to both the terminal and the DragonFly computer. Make sure it is the right kind of cable.
+
+Make sure the terminal and DragonFly agree on the bps rate and parity settings. If you have a video display terminal, make sure the contrast and brightness controls are turned up. If it is a printing terminal, make sure paper and ink are in good supply.
+
+Make sure that a `getty` process is running and serving the terminal. For example, to get a list of running `getty` processes with `ps`, type:
+
+    
+
+    # ps -axww|grep getty
+
+You should see an entry for the terminal. For example, the following display shows that a `getty` is running on the second serial port `ttyd1` and is using the `std.38400` entry in `/etc/gettytab`:
+
+    
+
+    22189  d1  Is+    0:00.03 /usr/libexec/getty std.38400 ttyd1
+
+If no `getty` process is running, make sure you have enabled the port in `/etc/ttys`. Also remember to run `kill -HUP 1` after modifying the `ttys` file.
+
+If the `getty` process is running but the terminal still does not display a login prompt, or if it displays a prompt but will not allow you to type, your terminal or cable may not support hardware handshaking. Try changing the entry in `/etc/ttys` from `std.38400` to `3wire.38400` remember to run `kill -HUP 1` after modifying `/etc/ttys`). The `3wire` entry is similar to `std`, but ignores hardware handshaking. You may need to reduce the baud rate or enable software flow control when using `3wire` to prevent buffer overflows.
+
+#### 18.2.3.2 If Garbage Appears Instead of a Login Prompt 
+
+Make sure the terminal and DragonFly agree on the bps rate and parity settings. Check the `getty` processes to make sure the correct `***getty***` type is in use. If not, edit `/etc/ttys` and run `kill -HUP 1`.
+
+#### 18.2.3.3 Characters Appear Doubled, the Password Appears When Typed 
+
+Switch the terminal (or the terminal emulation software) from ***half duplex*** or ***local echo*** to ***full duplex.***
+
+***
+
+## 18.3 Dial-in Service 
+
+Configuring your DragonFly system for dial-in service is very similar to connecting terminals except that you are dealing with modems instead of terminals.
+
+### 18.3.1 External vs. Internal Modems 
+
+External modems seem to be more convenient for dial-up, because external modems often can be semi-permanently configured via parameters stored in non-volatile RAM and they usually provide lighted indicators that display the state of important RS-232 signals. Blinking lights impress visitors, but lights are also very useful to see whether a modem is operating properly.
+
+Internal modems usually lack non-volatile RAM, so their configuration may be limited only to setting DIP switches. If your internal modem has any signal indicator lights, it is probably difficult to view the lights when the system's cover is in place.
+
+#### 18.3.1.1 Modems and Cables 
+
+If you are using an external modem, then you will of course need the proper cable. A standard RS-232C serial cable should suffice as long as all of the normal signals are wired:
+
+* Transmitted Data (SD)
+
+* Received Data (RD)
+
+* Request to Send (RTS)
+
+* Clear to Send (CTS)
+
+* Data Set Ready (DSR)
+
+* Data Terminal Ready (DTR)
+
+* Carrier Detect (CD)
+
+* Signal Ground (SG)
+
+DragonFly needs the RTS and CTS signals for flow-control at speeds above 2400 bps, the CD signal to detect when a call has been answered or the line has been hung up, and the DTR signal to reset the modem after a session is complete. Some cables are wired without all of the needed signals, so if you have problems, such as a login session not going away when the line hangs up, you may have a problem with your cable.
+
+Like other UNIX® like operating systems, DragonFly uses the hardware signals to find out when a call has been answered or a line has been hung up and to hangup and reset the modem after a call. DragonFly avoids sending commands to the modem or watching for status reports from the modem. If you are familiar with connecting modems to PC-based bulletin board systems, this may seem awkward.
+
+### 18.3.2 Serial Interface Considerations 
+
+DragonFly supports NS8250-, NS16450-, NS16550-, and NS16550A-based EIA RS-232C (CCITT V.24) communications interfaces. The 8250 and 16450 devices have single-character buffers. The 16550 device provides a 16-character buffer, which allows for better system performance. (Bugs in plain 16550's prevent the use of the 16-character buffer, so use 16550A's if possible). Because single-character-buffer devices require more work by the operating system than the 16-character-buffer devices, 16550A-based serial interface cards are much preferred. If the system has many active serial ports or will have a heavy load, 16550A-based cards are better for low-error-rate communications.
+
+### 18.3.3 Quick Overview 
+
+As with terminals, `init` spawns a `getty` process for each configured serial port for dial-in connections. For example, if a modem is attached to `/dev/ttyd0`, the command `ps ax` might show this:
+
+    
+
+     4850 ??  I      0:00.09 /usr/libexec/getty V19200 ttyd0
+
+When a user dials the modem's line and the modems connect, the CD (Carrier Detect) line is reported by the modem. The kernel notices that carrier has been detected and completes `getty`'s open of the port. `getty` sends a login: prompt at the specified initial line speed. `getty` watches to see if legitimate characters are received, and, in a typical configuration, if it finds junk (probably due to the modem's connection speed being different than `getty`'s speed), `getty` tries adjusting the line speeds until it receives reasonable characters.
+
+After the user enters his/her login name, `getty` executes `/usr/bin/login`, which completes the login by asking for the user's password and then starting the user's shell.
+
+### 18.3.4 Configuration Files 
+
+There are three system configuration files in the `/etc` directory that you will probably need to edit to allow dial-up access to your DragonFly system. The first, `/etc/gettytab`, contains configuration information for the `/usr/libexec/getty` daemon. Second, `/etc/ttys` holds information that tells `/sbin/init` what `tty` devices should have `getty` processes running on them. Lastly, you can place port initialization commands in the `/etc/rc.serial` script.
+
+There are two schools of thought regarding dial-up modems on UNIX. One group likes to configure their modems and systems so that no matter at what speed a remote user dials in, the local computer-to-modem RS-232 interface runs at a locked speed. The benefit of this configuration is that the remote user always sees a system login prompt immediately. The downside is that the system does not know what a user's true data rate is, so full-screen programs like Emacs will not adjust their screen-painting methods to make their response better for slower connections.
+
+The other school configures their modems' RS-232 interface to vary its speed based on the remote user's connection speed. For example, V.32bis (14.4 Kbps) connections to the modem might make the modem run its RS-232 interface at 19.2 Kbps, while 2400 bps connections make the modem's RS-232 interface run at 2400 bps. Because `getty` does not understand any particular modem's connection speed reporting, `getty` gives a login: message at an initial speed and watches the characters that come back in response. If the user sees junk, it is assumed that they know they should press the Enter key until they see a recognizable prompt. If the data rates do not match, `getty` sees anything the user types as ***junk***, tries going to the next speed and gives the login: prompt again. This procedure can continue ad nauseam, but normally only takes a keystroke or two before the user sees a good prompt. Obviously, this login sequence does not look as clean as the former ***locked-speed*** method, but a user on a low-speed connection should receive better interactive response from full-screen programs.
+
+This section will try to give balanced configuration information, but is biased towards having the modem's data rate follow the connection rate.
+
+#### 18.3.4.1 `/etc/gettytab` 
+
+`/etc/gettytab` is a [termcap(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#termcap&section5)-style file of configuration information for [getty(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=getty&section=8). Please see the [gettytab(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=gettytab&section=5) manual page for complete information on the format of the file and the list of capabilities.
+
+##### 18.3.4.1.1 Locked-speed Config 
+
+If you are locking your modem's data communications rate at a particular speed, you probably will not need to make any changes to `/etc/gettytab`.
+
+##### 18.3.4.1.2 Matching-speed Config 
+
+You will need to set up an entry in `/etc/gettytab` to give `getty` information about the speeds you wish to use for your modem. If you have a 2400 bps modem, you can probably use the existing `D2400` entry.
+
+    
+
+    #
+
+    # Fast dialup terminals, 2400/1200/300 rotary (can start either way)
+
+    #
+
+    D2400|d2400|Fast-Dial-2400:\
+
+            :nx#D1200:tc2400-baud:
+
+    3|D1200|Fast-Dial-1200:\
+
+            :nx#D300:tc1200-baud:
+
+    5|D300|Fast-Dial-300:\
+
+            :nx#D2400:tc300-baud:
+
+If you have a higher speed modem, you will probably need to add an entry in `/etc/gettytab`; here is an entry you could use for a 14.4 Kbps modem with a top interface speed of 19.2 Kbps:
+
+    
+
+    #
+
+    # Additions for a V.32bis Modem
+
+    #
+
+    um|V300|High Speed Modem at 300,8-bit:\
+
+            :nx#V19200:tcstd.300:
+
+    un|V1200|High Speed Modem at 1200,8-bit:\
+
+            :nx#V300:tcstd.1200:
+
+    uo|V2400|High Speed Modem at 2400,8-bit:\
+
+            :nx#V1200:tcstd.2400:
+
+    up|V9600|High Speed Modem at 9600,8-bit:\
+
+            :nx#V2400:tcstd.9600:
+
+    uq|V19200|High Speed Modem at 19200,8-bit:\
+
+            :nx#V9600:tcstd.19200:
+
+This will result in 8-bit, no parity connections.
+
+The example above starts the communications rate at 19.2 Kbps (for a V.32bis connection), then cycles through 9600 bps (for V.32), 2400 bps, 1200 bps, 300 bps, and back to 19.2 Kbps. Communications rate cycling is implemented with the `nx#` (***next table***) capability. Each of the lines uses a `tc` (***table continuation***) entry to pick up the rest of the ***standard*** settings for a particular data rate.
+
+If you have a 28.8 Kbps modem and/or you want to take advantage of compression on a 14.4 Kbps modem, you need to use a higher communications rate than 19.2 Kbps. Here is an example of a `gettytab` entry starting a 57.6 Kbps:
+
+    
+
+    #
+
+    # Additions for a V.32bis or V.34 Modem
+
+    # Starting at 57.6 Kbps
+
+    #
+
+    vm|VH300|Very High Speed Modem at 300,8-bit:\
+
+            :nx#VH57600:tcstd.300:
+
+    vn|VH1200|Very High Speed Modem at 1200,8-bit:\
+
+            :nx#VH300:tcstd.1200:
+
+    vo|VH2400|Very High Speed Modem at 2400,8-bit:\
+
+            :nx#VH1200:tcstd.2400:
+
+    vp|VH9600|Very High Speed Modem at 9600,8-bit:\
+
+            :nx#VH2400:tcstd.9600:
+
+    vq|VH57600|Very High Speed Modem at 57600,8-bit:\
+
+            :nx#VH9600:tcstd.57600:
+
+If you have a slow CPU or a heavily loaded system and do not have 16550A-based serial ports, you may receive ***`sio`*** ***silo*** errors at 57.6 Kbps.
+
+#### 18.3.4.2 `/etc/ttys` 
+
+Configuration of the `/etc/ttys` file was covered in [ Example 17-1](term.html#EX-ETC-TTYS). Configuration for modems is similar but we must pass a different argument to `getty` and specify a different terminal type. The general format for both locked-speed and matching-speed configurations is:
+
+    
+
+    ttyd0   "/usr/libexec/getty `***xxx***`"   dialup on
+
+The first item in the above line is the device special file for this entry -- `ttyd0` means `/dev/ttyd0` is the file that this `getty` will be watching. The second item, `"/usr/libexec/getty `***xxx***`"` (`***xxx***` will be replaced by the initial `gettytab` capability) is the process `init` will run on the device. The third item, `dialup`, is the default terminal type. The fourth parameter, `on`, indicates to `init` that the line is operational. There can be a fifth parameter, `secure`, but it should only be used for terminals which are physically secure (such as the system console).
+
+The default terminal type (`dialup` in the example above) may depend on local preferences. `dialup` is the traditional default terminal type on dial-up lines so that users may customize their login scripts to notice when the terminal is `dialup` and automatically adjust their terminal type. However, the author finds it easier at his site to specify `vt102` as the default terminal type, since the users just use VT102 emulation on their remote systems.
+
+After you have made changes to `/etc/ttys`, you may send the `init` process a HUP signal to re-read the file. You can use the command
+
+    
+
+    # kill -HUP 1
+
+ to send the signal. If this is your first time setting up the system, you may want to wait until your modem(s) are properly configured and connected before signaling `init`.
+
+##### 18.3.4.2.1 Locked-speed Config 
+
+For a locked-speed configuration, your `ttys` entry needs to have a fixed-speed entry provided to `getty`. For a modem whose port speed is locked at 19.2 Kbps, the `ttys` entry might look like this:
+
+    
+
+    ttyd0   "/usr/libexec/getty std.19200"   dialup on
+
+If your modem is locked at a different data rate, substitute the appropriate value for `std.`***speed****** instead of `std.19200`. Make sure that you use a valid type listed in `/etc/gettytab`.
+
+##### 18.3.4.2.2 Matching-speed Config 
+
+In a matching-speed configuration, your `ttys` entry needs to reference the appropriate beginning ***auto-baud*** (sic) entry in `/etc/gettytab`. For example, if you added the above suggested entry for a matching-speed modem that starts at 19.2 Kbps (the `gettytab` entry containing the `V19200` starting point), your `ttys` entry might look like this:
+
+    
+
+    ttyd0   "/usr/libexec/getty V19200"   dialup on
+
+#### 18.3.4.3 `/etc/rc.serial` 
+
+High-speed modems, like V.32, V.32bis, and V.34 modems, need to use hardware (`RTS/CTS`) flow control. You can add `stty` commands to `/etc/rc.serial` to set the hardware flow control flag in the DragonFly kernel for the modem ports.
+
+For example to set the `termios` flag `crtscts` on serial port #1's (`COM2`) dial-in and dial-out initialization devices, the following lines could be added to `/etc/rc.serial`:
+
+    
+
+    # Serial port initial configuration
+
+    stty -f /dev/ttyid1 crtscts
+
+    stty -f /dev/cuaia1 crtscts
+
+### 18.3.5 Modem Settings 
+
+If you have a modem whose parameters may be permanently set in non-volatile RAM, you will need to use a terminal program (such as Telix under MS-DOS® or `tip` under DragonFly) to set the parameters. Connect to the modem using the same communications speed as the initial speed `getty` will use and configure the modem's non-volatile RAM to match these requirements:
+
+* CD asserted when connected
+
+* DTR asserted for operation; dropping DTR hangs up line and resets modem
+
+* CTS transmitted data flow control
+
+* Disable XON/XOFF flow control
+
+* RTS received data flow control
+
+* Quiet mode (no result codes)
+
+* No command echo
+
+Please read the documentation for your modem to find out what commands and/or DIP switch settings you need to give it.
+
+For example, to set the above parameters on a U.S. Robotics® Sportster® 14,400 external modem, one could give these commands to the modem:
+
+    
+
+    ATZ
+
+    AT&amp;C1&amp;D2&amp;H1&amp;I0&amp;R2&amp;W
+
+You might also want to take this opportunity to adjust other settings in the modem, such as whether it will use V.42bis and/or MNP5 compression.
+
+The U.S. Robotics Sportster 14,400 external modem also has some DIP switches that need to be set; for other modems, perhaps you can use these settings as an example:
+
+* Switch 1: UP -- DTR Normal
+
+* Switch 2: N/A (Verbal Result Codes/Numeric Result Codes)
+
+* Switch 3: UP -- Suppress Result Codes
+
+* Switch 4: DOWN -- No echo, offline commands
+
+* Switch 5: UP -- Auto Answer
+
+* Switch 6: UP -- Carrier Detect Normal
+
+* Switch 7: UP -- Load NVRAM Defaults
+
+* Switch 8: N/A (Smart Mode/Dumb Mode)
+
+Result codes should be disabled/suppressed for dial-up modems to avoid problems that can occur if `getty` mistakenly gives a login: prompt to a modem that is in command mode and the modem echoes the command or returns a result code. This sequence can result in a extended, silly conversation between `getty` and the modem.
+
+#### 18.3.5.1 Locked-speed Config 
+
+For a locked-speed configuration, you will need to configure the modem to maintain a constant modem-to-computer data rate independent of the communications rate. On a U.S. Robotics Sportster 14,400 external modem, these commands will lock the modem-to-computer data rate at the speed used to issue the commands:
+
+    
+
+    ATZ
+
+    AT&amp;B1&amp;W
+
+#### 18.3.5.2 Matching-speed Config 
+
+For a variable-speed configuration, you will need to configure your modem to adjust its serial port data rate to match the incoming call rate. On a U.S. Robotics Sportster 14,400 external modem, these commands will lock the modem's error-corrected data rate to the speed used to issue the commands, but allow the serial port rate to vary for non-error-corrected connections:
+    
+
+    ATZ
+
+    AT&amp;B2&amp;W
+
+#### 18.3.5.3 Checking the Modem's Configuration 
+
+Most high-speed modems provide commands to view the modem's current operating parameters in a somewhat human-readable fashion. On the U.S. Robotics Sportster 14,400 external modems, the command `ATI5` displays the settings that are stored in the non-volatile RAM. To see the true operating parameters of the modem (as influenced by the modem's DIP switch settings), use the commands `ATZ` and then `ATI4`.
+
+If you have a different brand of modem, check your modem's manual to see how to double-check your modem's configuration parameters.
+
+### 18.3.6 Troubleshooting 
+
+Here are a few steps you can follow to check out the dial-up modem on your system.
+
+#### 18.3.6.1 Checking Out the DragonFly System 
+
+Hook up your modem to your DragonFly system, boot the system, and, if your modem has status indication lights, watch to see whether the modem's DTR indicator lights when the login: prompt appears on the system's console -- if it lights up, that should mean that DragonFly has started a `getty` process on the appropriate communications port and is waiting for the modem to accept a call.
+
+If the DTR indicator does not light, login to the DragonFly system through the console and issue a `ps ax` to see if DragonFly is trying to run a `getty` process on the correct port. You should see lines like these among the processes displayed:
+
+    
+
+      114 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd0
+
+      115 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd1
+
+If you see something different, like this:
+
+    
+
+      114 d0  I      0:00.10 /usr/libexec/getty V19200 ttyd0
+
+and the modem has not accepted a call yet, this means that `getty` has completed its open on the communications port. This could indicate a problem with the cabling or a mis-configured modem, because `getty` should not be able to open the communications port until CD (carrier detect) has been asserted by the modem.
+
+If you do not see any `getty` processes waiting to open the desired `ttyd`***N****** port, double-check your entries in `/etc/ttys` to see if there are any mistakes there. Also, check the log file `/var/log/messages` to see if there are any log messages from `init` or `getty` regarding any problems. If there are any messages, triple-check the configuration files `/etc/ttys` and `/etc/gettytab`, as well as the appropriate device special files `/dev/ttydN`, for any mistakes, missing entries, or missing device special files.
+
+#### 18.3.6.2 Try Dialing In 
+
+Try dialing into the system; be sure to use 8 bits, no parity, and 1 stop bit on the remote system. If you do not get a prompt right away, or get garbage, try pressing Enter about once per second. If you still do not see a login: prompt after a while, try sending a `BREAK`. If you are using a high-speed modem to do the dialing, try dialing again after locking the dialing modem's interface speed (via `AT&amp;B1` on a U.S. Robotics Sportster modem, for example).
+
+If you dial but the modem on the DragonFly system will not answer, make sure that the modem is configured to answer the phone when DTR is asserted. If the modem seems to be configured correctly, verify that the DTR line is asserted by checking the modem's indicator lights (if it has any).
+
+If you have gone over everything several times and it still does not work, take a break and come back to it later. If it still does not work, perhaps you can send an electronic mail message to the [DragonFly User related mailing list](http://leaf.dragonflybsd.org/mailarchive/) describing your modem and your problem, and the good folks on the list will try to help.
+
+***
+## 18.4 Dial-out Service 
+
+The following are tips for getting your host to be able to connect over the modem to another computer. This is appropriate for establishing a terminal session with a remote host.
+
+This is useful to log onto a BBS.
+
+This kind of connection can be extremely helpful to get a file on the Internet if you have problems with PPP. If you need to FTP something and PPP is broken, use the terminal session to FTP it. Then use zmodem to transfer it to your machine.
+
+### 18.4.1 My Stock Hayes Modem Is Not Supported, What Can I Do? 
+
+Actually, the manual page for `tip` is out of date. There is a generic Hayes dialer already built in. Just use `at=hayes` in your `/etc/remote` 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` (using `ATX0&amp;W`).
+
+Also, the dial timeout for `tip` is 60 seconds. Your modem should use something less, or else tip will think there is a communication problem. Try `ATS7=45&amp;W`.
+
+ **Note:** As shipped, `tip` does not yet support Hayes modems 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.
+
+### 18.4.2 How Am I Expected to Enter These AT Commands? 
+
+Make what is called a ***direct*** entry in your `/etc/remote` file. 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:panone
+
+Use the highest bps rate your modem supports in the br capability. Then, type `tip cuaa0` and you will be connected to your modem.
+
+Or use `cu` as `root` with the following command:
+
+    
+
+    # cu -l`***line***` -s`***speed***`
+
+`***line***` is the serial port (e.g.`/dev/cuaa0`) and `***speed***` is the speed (e.g.`57600`). When you are done entering the AT commands hit  **~.**  to exit.
+
+### 18.4.3 The `@` Sign for the pn Capability Does 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=\@
+
+### 18.4.4 How Can I Dial a Phone Number on the Command Line? 
+
+Put what is called a ***generic*** entry in your `/etc/remote` file. For example:
+
+    
+
+    tip115200|Dial any phone number at 115200 bps:\
+
+            :dv#/dev/cuaa0:br#115200:athayes:pa=none:du:
+
+    tip57600|Dial any phone number at 57600 bps:\
+
+            :dv#/dev/cuaa0:br#57600:athayes:pa=none:du:
+
+Then you can do things like:
+
+    
+
+    # tip -115200 5551234
+
+If you prefer `cu` over `tip`, use a generic `cu` entry:
+
+    
+
+    cu115200|Use cu to dial any number at 115200bps:\
+
+            :dv#/dev/cuaa1:br#57600:athayes:pa=none:du:
+
+and type:
+
+    
+
+    # cu 5551234 -s 115200
+
+### 18.4.5 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` 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.
+
+### 18.4.6 I Access a Number of Hosts Through a Terminal Server 
+
+Rather than waiting until you are connected and typing `CONNECT &lt;host&gt;` each time, use tip's `cm` capability. For example, these entries in `/etc/remote`:
+
+    
+
+    pain|pain.deep13.com|Forrester's machine:\
+
+            :cm#CONNECT pain\n:tcdeep13:
+
+    muffin|muffin.deep13.com|Frank's machine:\
+
+            :cm#CONNECT muffin\n:tcdeep13:
+
+    deep13:Gizmonics Institute terminal server:\
+
+            :dv#/dev/cuaa2:br#38400:athayes: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.
+
+### 18.4.7 Can Tip Try More Than One Line for Each Site? 
+
+This is often a problem where a university has several modem lines and several thousand students trying to use them.
+
+Make an entry for your university in `/etc/remote` and use `@` for the `pn` capability:
+
+    
+
+    big-university:\
+
+            :pn#\@:tcdialout
+
+    dialout:\
+
+            :dv#/dev/cuaa3:br#9600:atcourier:du:pa=none:
+
+Then, list the phone numbers for the university in `/etc/phones`:
+
+    
+
+    big-university 5551111
+
+    big-university 5551112
+
+    big-university 5551113
+
+    big-university 5551114
+
+`tip` will try each one in the listed order, then give up. If you want to keep retrying, run `tip` in a while loop.
+
+### 18.4.8 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` 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 is 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=&lt;single-char&gt;
+
+### 18.4.9 Suddenly Everything I Type Is in Upper Case?? 
+
+You must have pressed  **Ctrl** + **A** , `tip`'s ***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** .
+
+### 18.4.10 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` and `echo` 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.
+
+### 18.4.11 How Can I Run zmodem with `tip`? 
+
+To receive files, start the sending program on the remote end. Then, type `~C rz` to begin receiving them locally.
+
+To send files, start the receiving program on the remote end. Then, type `~C sz `***files****** to send them to the remote system.
+
+***
+
+## 18.5 Setting Up the Serial Console 
+
+### 18.5.1 Introduction 
+
+DragonFly has the ability to boot on a system with only a dumb terminal on a serial port as a console. Such a configuration should be useful for two classes of people: system administrators who wish to install DragonFly on machines that have no keyboard or monitor attached, and developers who want to debug the kernel or device drivers.
+
+As described in [boot.html Chapter 10], DragonFly employs a three stage bootstrap. The first two stages are in the boot block code which is stored at the beginning of the DragonFly slice on the boot disk. The boot block will then load and run the boot loader (`/boot/loader`) as the third stage code.
+
+In order to set up the serial console you must configure the boot block code, the boot loader code and the kernel.
+
+### 18.5.2 Serial Console Configuration, Terse Version 
+
+This section assumes that you are using the default setup, know how to connect serial ports and just want a fast overview of a serial console. If you encounter difficulty with these steps, please see the more extensive explaination of all the options and advanced settings in [serialconsole-setup.html#SERIALCONSOLE-HOWTO Section 18.5.3].
+
+  1. Connect the serial port. The serial console will be on COM1.
+
+  1. `echo -h &gt; /boot.config` to enable the serial console for the boot loader and kernel.
+
+  1. Edit `/etc/ttys` and change `off` to `on` for the `ttyd0` entry. This enables a login prompt on the serial console, which mirrors how video consoles are typically setup.
+
+  1. `shutdown -r now` will reboot the system with the serial console.
+
+### 18.5.3 Serial Console Configuration 
+
+  1. Prepare a serial cable.
+
+  You will need either a null-modem cable or a standard serial cable and a null-modem adapter. See [ Section 18.1.2](serial.html#SERIAL-CABLES-PORTS) for a discussion on serial cables.
+
+  1. Unplug your keyboard.
+
+  Most PC systems probe for the keyboard during the Power-On Self-Test (POST) and will generate an error if the keyboard is not detected. Some machines complain loudly about the lack of a keyboard and will not continue to boot until it is plugged in.
+
+  If your computer complains about the error, but boots anyway, then you do not have to do anything special. (Some machines with Phoenix BIOS installed merely say ***`Keyboard failed`*** and continue to boot normally.)
+
+  If your computer refuses to boot without a keyboard attached then you will have to configure the BIOS so that it ignores this error (if it can). Consult your motherboard's manual for details on how to do this.
+
+   **Tip:** Setting the keyboard to ***Not installed*** in the BIOS setup does ***not*** mean that you will not be able to use your keyboard. All this does is tell the BIOS not to probe for a keyboard at power-on, so it will not complain if the keyboard is not plugged in. You can leave the keyboard plugged in even with this flag set to ***Not installed*** and the keyboard will still work.
+
+   **Note:** If your system has a PS/2® mouse, chances are very good that you may have to unplug your mouse as well as your keyboard. This is because PS/2 mice share some hardware with the keyboard and leaving the mouse plugged in can fool the keyboard probe into thinking the keyboard is still there. In general, this is not a problem since the mouse is not much good without the keyboard anyway.
+
+  1. Plug a dumb terminal into `COM1` (`sio0`).
+
+  If you do not have a dumb terminal, you can use an old PC/XT with a modem program, or the serial port on another UNIX® box. If you do not have a `COM1` (`sio0`), get one. At this time, there is no way to select a port other than `COM1` for the boot blocks without recompiling the boot blocks. If you are already using `COM1` for another device, you will have to temporarily remove that device and install a new boot block and kernel once you get DragonFly up and running. (It is assumed that `COM1` will be available on a file/compute/terminal server anyway; if you really need `COM1` for something else (and you cannot switch that something else to `COM2` (`sio1`)), then you probably should not even be bothering with all this in the first place.)
+
+  1. Make sure the configuration file of your kernel has appropriate flags set for `COM1` (`sio0`).
+
+  Relevant flags are:
+
+  `0x10`:: Enables console support for this unit. The other console flags are ignored unless this is set. Currently, at most one unit can have console support; the first one (in config file order) with this flag set is preferred. This option alone will not make the serial port the console. Set the following flag or use the `-h` option described below, together with this flag.`0x20`:: Forces this unit to be the console (unless there is another higher priority console), regardless of the `-h` option discussed below. This flag replaces the `COMCONSOLE` option in DragonFly versions 2.`***X***`. The flag `0x20` must be used together with the `0x10` flag.`0x40`:: Reserves this unit (in conjunction with `0x10`) and makes the unit unavailable for normal access. You should not set this flag to the serial port unit which you want to use as the serial console. This reserves this port for "low-level IO", i.e. kernel debugging.`0x80`:: This port will be used for remote kernel debugging.
+
+  Example:
+
+      
+
+      device sio0 at isa? port IO_COM1 flags 0x10 irq 4
+
+  
+
+  See the [sio(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#sio&section4) manual page for more details.
+
+  If the flags were not set, you need to run UserConfig (on a different console) or recompile the kernel.
+
+  1. Create `boot.config` in the root directory of the `a` partition on the boot drive.
+
+  This file will instruct the boot block code how you would like to boot the system. In order to activate the serial console, you need one or more of the following options--if you want multiple options, include them all on the same line:
+
+  `-h`:: Toggles internal and serial consoles. You can use this to switch console devices. For instance, if you boot from the internal (video) console, you can use `-h` to direct the boot loader and the kernel to use the serial port as its console device. Alternatively, if you boot from the serial port, you can use the `-h` to tell the boot loader and the kernel to use the video display as the console instead.`-D`:: Toggles single and dual console configurations. In the single configuration the console will be either the internal console (video display) or the serial port, depending on the state of the `-h` option above. In the dual console configuration, both the video display and the serial port will become the console at the same time, regardless of the state of the `-h` option. However, note that the dual console configuration takes effect only during the boot block is running. Once the boot loader gets control, the console specified by the `-h` option becomes the only console.`-P`:: Makes the boot block probe the keyboard. If no keyboard is found, the `-D` and `-h` options are automatically set.
+
+   **Note:** Due to space constraints in the current version of the boot blocks, the `-P` option is capable of detecting extended keyboards only. Keyboards with less than 101 keys (and without F11 and F12 keys) may not be detected. Keyboards on some laptop computers may not be properly found because of this limitation. If this is the case with your system, you have to abandon using the `-P` option. Unfortunately there is no workaround for this problem.
+
+  Use either the `-P` option to select the console automatically, or the `-h` option to activate the serial console.
+
+  You may include other options described in [boot(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#boot&section8) as well.
+
+  The options, except for `-P`, will be passed to the boot loader (`/boot/loader`). The boot loader will determine which of the internal video or the serial port should become the console by examining the state of the `-h` option alone. This means that if you specify the `-D` option but not the `-h` option in `/boot.config`, you can use the serial port as the console only during the boot block; the boot loader will use the internal video display as the console.
+
+  1. Boot the machine.
+
+  When you start your DragonFly box, the boot blocks will echo the contents of `/boot.config` to the console. For example:
+
+      
+
+      /boot.config: -P
+
+      Keyboard: no
+
+  
+
+  The second line appears only if you put `-P` in `/boot.config` and indicates presence/absence of the keyboard. These messages go to either serial or internal console, or both, depending on the option in `/boot.config`.
+
+  || Options || Message goes to ||
+
+  || none || internal console ||
+
+  || `-h` || serial console ||
+
+  || `-D` || serial and internal consoles ||
+
+  || `-Dh` || serial and internal consoles ||
+
+  || `-P`, keyboard present || internal console ||
+
+  || `-P`, keyboard absent || serial console ||
+
+  After the above messages, there will be a small pause before the boot blocks continue loading the boot loader and before any further messages printed to the console. Under normal circumstances, you do not need to interrupt the boot blocks, but you may want to do so in order to make sure things are set up correctly.
+
+  Hit any key, other than Enter, at the console to interrupt the boot process. The boot blocks will then prompt you for further action. You should now see something like:
+
+      
+
+      &gt;&gt; DragonFly/i386 BOOT
+
+      Default: 0:ad(0,a)/boot/loader
+
+      boot:
+
+  
+
+  Verify the above message appears on either the serial or internal console or both, according to the options you put in `/boot.config`. If the message appears in the correct console, hit Enter to continue the boot process.
+
+  If you want the serial console but you do not see the prompt on the serial terminal, something is wrong with your settings. In the meantime, you enter `-h` and hit Enter/Return (if possible) to tell the boot block (and then the boot loader and the kernel) to choose the serial port for the console. Once the system is up, go back and check what went wrong.
+
+After the boot loader is loaded and you are in the third stage of the boot process you can still switch between the internal console and the serial console by setting appropriate environment variables in the boot loader. See [serialconsole-setup.html#SERIALCONSOLE-LOADER Section 18.5.6].
+
+### 18.5.4 Summary 
+
+Here is the summary of various settings discussed in this section and the console eventually selected.
+
+#### 18.5.4.1 Case 1: You Set the Flags to 0x10 for `sio0` 
+
+    
+
+    device sio0 at isa? port IO_COM1 flags 0x10 irq 4
+
+[[!table  data="""
+| Options in /boot.config | Console during boot blocks | Console during boot loader | Console in kernel 
+ nothing | internal | internal | internal 
+ `-h` | serial | serial | serial 
+ `-D` | serial and internal | internal | internal 
+ `-Dh` | serial and internal | serial | serial 
+ `-P`, keyboard present | internal | internal | internal 
+ `-P`, keyboard absent | serial and internal | serial | serial |
+
+"""]]
+
+#### 18.5.4.2 Case 2: You Set the Flags to 0x30 for sio0 
+
+    
+
+    device sio0 at isa? port IO_COM1 flags 0x30 irq 4
+
+[[!table  data="""
+| Options in /boot.config | Console during boot blocks | Console during boot loader | Console in kernel 
+ nothing | internal | internal | serial 
+ `-h` | serial | serial | serial 
+ `-D` | serial and internal | internal | serial 
+ `-Dh` | serial and internal | serial | serial 
+ `-P`, keyboard present | internal | internal | serial 
+ `-P`, keyboard absent | serial and internal | serial | serial |
+
+"""]]
+
+### 18.5.5 Tips for the Serial Console 
+
+#### 18.5.5.1 Setting a Faster Serial Port Speed 
+
+By default, the serial port settings are: 9600 baud, 8 bits, no parity, and 1 stop bit. If you wish to change the speed, you need to recompile at least the boot blocks. Add the following line to `/etc/make.conf` and compile new boot blocks:
+
+    
+
+    BOOT_COMCONSOLE_SPEED=19200
+
+If the serial console is configured in some other way than by booting with `-h`, or if the serial console used by the kernel is different from the one used by the boot blocks, then you must also add the following option to the kernel configuration file and compile a new kernel:
+
+    
+
+    options CONSPEED=19200
+
+#### 18.5.5.2 Using Serial Port Other Than `sio0` for the Console 
+
+Using a port other than `sio0` as the console requires some recompiling. If you want to use another serial port for whatever reasons, recompile the boot blocks, the boot loader and the kernel as follows.
+
+  1. Get the kernel source.
+
+  1. Edit `/etc/make.conf` and set `BOOT_COMCONSOLE_PORT` to the address of the port you want to use (0x3F8, 0x2F8, 0x3E8 or 0x2E8). Only `sio0` through `sio3` (`COM1` through `COM4`) can be used; multiport serial cards will not work. No interrupt setting is needed.
+
+  1. Create a custom kernel configuration file and add appropriate flags for the serial port you want to use. For example, if you want to make `sio1` (`COM2`) the console:
+
+      
+
+      device sio1 at isa? port IO_COM2 flags 0x10 irq 3
+
+  
+
+  or
+
+      
+
+      device sio1 at isa? port IO_COM2 flags 0x30 irq 3
+
+  
+
+  The console flags for the other serial ports should not be set.
+
+  1. Recompile and install the boot blocks and the boot loader:
+
+      
+
+      # cd /sys/boot
+
+      # make
+
+      # make install
+
+  
+
+  1. Rebuild and install the kernel.
+
+  1. Write the boot blocks to the boot disk with [disklabel(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#disklabel&section8) and boot from the new kernel.
+
+#### 18.5.5.3 Entering the DDB Debugger from the Serial Line 
+
+If you wish to drop into the kernel debugger from the serial console (useful for remote diagnostics, but also dangerous if you generate a spurious BREAK on the serial port!) then you should compile your kernel with the following options:
+
+    
+
+    options BREAK_TO_DEBUGGER
+
+    options DDB
+
+#### 18.5.5.4 Getting a Login Prompt on the Serial Console 
+
+While this is not required, you may wish to get a ***login*** prompt over the serial line, now that you can see boot messages and can enter the kernel debugging session through the serial console. Here is how to do it.
+
+Open the file `/etc/ttys` with an editor and locate the lines:
+
+    
+
+    ttyd0 "/usr/libexec/getty std.9600" unknown off secure
+
+    ttyd1 "/usr/libexec/getty std.9600" unknown off secure
+
+    ttyd2 "/usr/libexec/getty std.9600" unknown off secure
+
+    ttyd3 "/usr/libexec/getty std.9600" unknown off secure
+
+`ttyd0` through `ttyd3` corresponds to `COM1` through `COM4`. Change `off` to `on` for the desired port. If you have changed the speed of the serial port, you need to change `std.9600` to match the current setting, e.g. `std.19200`.
+
+You may also want to change the terminal type from `unknown` to the actual type of your serial terminal.
+
+After editing the file, you must `kill -HUP 1` to make this change take effect.
+
+### 18.5.6 Changing Console from the Boot Loader 
+
+Previous sections described how to set up the serial console by tweaking the boot block. This section shows that you can specify the console by entering some commands and environment variables in the boot loader. As the boot loader is invoked at the third stage of the boot process, after the boot block, the settings in the boot loader will override the settings in the boot block.
+
+#### 18.5.6.1 Setting Up the Serial Console 
+
+You can easily specify the boot loader and the kernel to use the serial console by writing just one line in `/boot/loader.rc`:
+
+    
+
+    set console=comconsole
+
+This will take effect regardless of the settings in the boot block discussed in the previous section.
+
+You had better put the above line as the first line of `/boot/loader.rc` so as to see boot messages on the serial console as early as possible.
+
+Likewise, you can specify the internal console as:
+
+    
+
+    set console=vidconsole
+
+If you do not set the boot loader environment variable `console`, the boot loader, and subsequently the kernel, will use whichever console indicated by the `-h` option in the boot block.
+
+In versions 3.2 or later, you may specify the console in `/boot/loader.conf.local` or `/boot/loader.conf`, rather than in `/boot/loader.rc`. In this method your `/boot/loader.rc` should look like:
+
+    
+
+    include /boot/loader.4th
+
+    start
+
+Then, create `/boot/loader.conf.local` and put the following line there.
+
+    
+
+    console=comconsole
+
+or
+
+    
+
+    console=vidconsole
+
+ **Note:** At the moment, the boot loader has no option equivalent to the `-P` option in the boot block, and there is no provision to automatically select the internal console and the serial console based on the presence of the keyboard.
+
+#### 18.5.6.2 Using a Serial Port Other Than `sio0` for the Console 
+
+You need to recompile the boot loader to use a serial port other than `sio0` for the serial console. Follow the procedure described in [serialconsole-setup.html#SERIALCONSOLE-COM2 Section 18.5.5.2].
+
+### 18.5.7 Caveats 
+
+The idea here is to allow people to set up dedicated servers that require no graphics hardware or attached keyboards. Unfortunately, while most systems will let you boot without a keyboard, there are quite a few that will not let you boot without a graphics adapter. Machines with AMI BIOSes can be configured to boot with no graphics adapter installed simply by changing the ***graphics adapter*** setting in the CMOS configuration to ***Not installed.***
+
+# Chapter 1 Introduction 
+
+***Restructured, reorganized, and parts rewritten by Jim Mock. ***
+
+## Synopsis 
+
+Thank you for your interest in DragonFly! The following chapter covers various aspects of the DragonFly Project, such as its history, goals, development model, and so on.
+
+After reading this chapter, you will know:
+
+* How DragonFly relates to other computer operating systems.
+
+* The history of the DragonFly Project.
+
+* The goals of the DragonFly Project.
+
+* The basics of the DragonFly open-source development model.
+
+* And of course: where the name ***DragonFly*** comes from.
+
+----
+
+## Welcome to DragonFly! 
+
+ DragonFly is a [[4.4BSD-Lite|http://en.wikipedia.org/wiki/Berkeley_Software_Distribution]] unix operating system for Intel (x86) and amd64 (x86_64) architectures.
+
+### What Can DragonFly Do? 
+
+<!-- Cutout of "features". This is outdated bullshit -->
+
+Work on BSD-flavor Unix systems running on PC compatible hardware started as a fork of the 4.4BSD-Lite release from Computer Systems Research Group (CSRG) at the University of California at Berkeley.  One of the variants that became quite popular became known later as FreeBSD.  Firefly BSD started out as a fork, and continuation of FreeBSD 4.8. 
+
+Like all other modern PC compatible BSD variants, it carries on the distinguished tradition of BSD systems development. In addition to the fine work provided by CSRG, the DragonFly Project has put in many thousands of hours in fine tuning the system for maximum performance and reliability in real-life load situations. 
+
+As many of the commercial giants struggle to field PC operating systems with such features, performance and reliability, DragonFly can offer them ***now***!
+For example the `Hammer` filesystem, which is the default filesystem in DragonFly BSD, is the most powerful and reliable filesystem available on any operating system.
+
+ The applications to which DragonFly can be put are truly limited only by your own imagination. From software development to factory automation, inventory control to azimuth correction of remote satellite antennae; if it can be done with a commercial UNIX product then it is more than likely that you can do it with DragonFly too! DragonFly also benefits significantly from literally thousands of high quality applications developed by research centers and universities around the world, often available at little to no cost. Commercial applications are also available and appearing in greater numbers every day.
+
+ Because the source code for DragonFly itself is generally available, the system can also be customized to an almost unheard of degree for special applications or projects, and in ways not generally possible with operating systems from most major commercial vendors. Here is just a sampling of some of the applications in which people are currently using DragonFly:
+
+The robust TCP/IP networking built into DragonFly makes it an ideal platform for a variety of Internet services such as:
+
+* FTP servers
+* World Wide Web servers (standard or secure [SSL])
+* Firewalls and NAT (***IP masquerading***) gateways
+* Electronic Mail servers
+* USENET News or Bulletin Board Systems
+* And more...
+
+With DragonFly, you can install on almost any PC, from older 32 bit computers running 386 or Pentium chips, to modern 64 bit Intel Core or AMD X64 desktop CPUs, and even up to and including high end Xeon CPUs.  All of these CPUs share a common ancestry, and instruction set, going back to the original Intel 80386 CPU which was the first fully 32-bit desktop CPU for "IBM PC compatible" computers.
+
+Here are some of the fields where people are using Dragonfly BSD, and the reasons that they find DragonFly BSD fits their needs:
+
+* ***Education:*** Are you a student of computer science or a related engineering field? There is no better way of learning about operating systems, computer architecture and networking than the hands on, under the hood experience that DragonFly can provide. A number of freely available CAD, mathematical and graphic design packages also make it highly useful to those whose primary interest in a computer is to get ***other*** work done!
+
+* ***Research:*** With source code for the entire system available, DragonFly is an excellent platform for research in operating systems as well as other branches of computer science. DragonFly's freely available nature also makes it possible for remote groups to collaborate on ideas or shared development without having to worry about special licensing agreements or limitations on what may be discussed in open forums.
+
+* ***Networking:*** Need a new router? A name server (DNS)? A firewall to keep people out of your internal network? DragonFly can easily turn that unused older PC sitting in the corner into an advanced router with sophisticated packet-filtering capabilities.
+
+* ***X Window workstation:*** DragonFly is a fine choice for an inexpensive X terminal solution, using the freely available X.org server. Unlike an X terminal, DragonFly allows many applications to be run locally if desired, thus relieving the burden on a central server. DragonFly can even boot ***diskless***, making individual workstations even cheaper and easier to administer.
+
+* ***Software Development:*** The basic DragonFly system comes with a full complement of development tools including the renowned GNU C/C++ compiler and debugger.
+
+ DragonFly is available via anonymous FTP or GIT. Please see [Appendix A](mirrors.html) for more information about obtaining DragonFly.
+
+For more help on installing, see the appropriate sections of this handbook.
+
+----
+
+## About the DragonFly Project 
+
+ The following section provides some background information on the project, including a brief history, project goals, and the development model of the project.
+
+### A Brief History of DragonFly 
+
+Matthew Dillon, one of the developers for FreeBSD, was growing increasingly frustrated with the FreeBSD Project's direction for release 5. The FreeBSD 5 release had been delayed multiple times, and had performance problems compared to earlier releases of FreeBSD.  DragonFly was announced in June of 2003. The code base was taken from the 4.8 release of FreeBSD, which offered better performance and more complete features. Development has proceeded at a very quick rate since then, with Matt Dillon and a group of developers fixing longstanding BSD bugs and modernizing the new DragonFly system.
+
+### DragonFly Project Goals 
+
+DragonFly is an effort to maintain the traditional BSD format -- lean, stable code -- along with modern features such as lightweight threads, a workable packaging system, and a revised VFS. Underpinning all this work is efficient support for multiple processors, something rare among open source systems. Because DragonFly is built on an existing very stable code base, it is possible to make these radical changes as part of an incremental process.
+
+### The DragonFly Development Model 
+
+***Written by Justin Sherrill. ***
+
+DragonFly is developed by many people around the world. There is no qualification process; anyone may submit his or her code, documentation, or designs, for use in the Project. Here is a general description of the Project's organizational structure.
+
+Source for DragonFly is kept in [git](http://www.git.org/) which is available with each DragonFly install. The primary [git repository](http://gitweb.dragonflybsd.org/?p=dragonfly.git;a=summary) resides on a machine in California, USA. Documentation on obtaining the DragonFly source is available elsewhere in this book. The best way of getting changes made to the DragonFly source is to mail the [submit](http://www.dragonflybsd.org/mailinglists/) mailing list. Including desired source code changes (unified diff format is best) is the most useful format. A certain number of developers have access to commit changes to the DragonFly source, and can do so after review on that list. The DragonFly development model is loose; changes to the code are generally peer-reviewed and added when any objections have been corrected. There is no formal entry/rejection process, though final say on all code submissions goes to Matt Dillon, as originator of this project.
+
+### The Current DragonFly Release 
+
+DragonFly is a freely available, full source 4.4BSD-Lite based release for almost all Intel and AMD based computer systems. It is based primarily on FreeBSD 4.8, and includes enhancements from U.C. Berkeley's CSRG group, NetBSD, OpenBSD, 386BSD, and the Free Software Foundation. A number of additional documents which you may find very helpful in the process of installing and using DragonFly may now also be found in the `/usr/share/doc` directory on any machine.
+
+### DragonFly Origin 
+
+Matthew Dillon happened to take a picture of a dragonfly in his garden while trying to come up with a name for this new branch of BSD. Taking this as inspiration, "DragonFly" became the new name.
+
+## Updating the System 
+
+### Supported methods
+
+The only **supported** method of upgrading DragonFly BSD is by building from source code. <br><br>
+Supported upgrade process includes going from the *previous release* to *latest release*.<br>
+
+For example, in our actual case, only the upgrade process involving <u>2.10.x up to 3.0.x</u> would be supported.
+
+### Getting the source code
+
+There is a Makefile in /usr which will ease the task of retrieving the source tree; it needs to be run as root:
+
+    % cd /usr
+    % make src-create
+     [...]
+
+And that will effectively checkout the source tree on `/usr/src` and switch to master branch. For stable branch you need to check it out with the following command (remember to replace the *DragonFly_RELEASE_3_0* with the appropriate branch name for the release needed).
+
+    % cd /usr/src
+    % git checkout DragonFly_RELEASE_3_0
+
+To see the available remote branches:
+
+    # cd /usr/src 
+    # git pull
+    # git branch -r
+
+The leading edge (development trunk) version of the system will be the "master".
+
+### Build and upgrade process
+
+Build process requires some time to build all the userland programs and the DragonFly BSD kernel. Once built, next step is to install everything and make the upgrade target. No configuration files in */etc* are changed by this process. More details can be found in **[build(7)](http://leaf.dragonflybsd.org/cgi/web-man?command=build&section=ANY)** manpage. 
+
+    % cd /usr/src
+    % make buildworld
+    % make buildkernel
+    % make installkernel
+    % make installworld
+    % make upgrade
+    (reboot)
+
+**Note:** You may use a concurrent build if you have a SMP (a machine with several cores or CPUs). You may specify *-j x* parameter to make where x is the number of CPUs + 1. <br>
+If you run DragonFly 2.12 or higher the kernel will auto-detect the number of CPUs your computer has and activate them all if possible. To find out how many CPUs your computer has:
+<br>
+
+    % sysctl hw.ncpu
+    hw.ncpu: 2
+
+An explanation of each step follows.
+
+* <u>*make buildworld*</u> : This command builds all userland programs and it is the most time-consuming step.<br>
+Some programs may be discarded from the build process.<br>
+For more details check **[make.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=make.conf&section=ANY)** manpage. 
+
+* <u>*make buildkernel*</u> : This builds the kernel using the config file by default for your architecture. You may also specify a different kernel configuration file using KERNCONF=configfile. More details on **[make.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=make.conf&section=ANY)** manpage.
+
+* <u>*make installkernel*</u> This installs the kernel using the config file for your architecture or KERNCONF=file can be used to specify which one to install.
+
+* <u>*make installworld*</u> : This copies all the files built in the buildworld step (i.e. everything that is not the kernel) to the proper places in the filesystem.
+
+* <u>*make upgrade*</u> : This cleans out any files made unnecessary by this upgrade.
+
+* (reboot) : Reboot the computer to load the new kernel and use the new files installed as part of this process.
+
+If your computer fails to boot the new kernel, you can always select 'Boot DragonFly using kernel.old' in the loader menu, so that the old kernel is loaded instead of the new one.
+
+Additional upgrading instructions can be found in */usr/src/UPDATING* in the source tree. Online it can be found **[here](http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/master:/UPDATING)**
+
+# DragonFly BSD Quick Start
+
+This QuickStart is part of the [[NewHandbook|/docs/newhandbook/]].
+
+This document describes the DragonFly environment one will find on a newly installed system.  While you are getting started please pay careful attention to the version or level of DragonFly that the documentation was written for.  Some documentation on this site may be out of date. Watch for the marker `(obsolete)` on items that are out of date or need updating.
+
+[[!toc levels=3 ]]
+## Some Unix and BSD Fundamentals
+
+If you have used another Unix flavor, another BSD or Linux before, you may need to spend some time learning basic subjects.  If you have never used any flavor of Unix, BSD or otherwise, and have only used Windows before, please be prepared for a lengthy period of learning.
+
+If you already know your way around a Unix filesystem, and already know what the `/etc` folder is, how to use `vi` or `vim` to edit a file, how to use a shell like `tcsh` or `bash`, how to configure that shell, or change what shell you're using, how `su` and `sudo` work, and what a `root` account is, then you may get a lot farther in using any BSD variant (like Dragonfly BSD) then the rest of this page may be enough to orient you to your surroundings.
+
+You should understand everything in the [[Unix Basics|/docs/newhandbook/UnixBasics/]] section before you proceed with trying to use your new system.
+
+## Disk layout of a New Dragonfly BSD System using the HAMMER filesystem
+
+If you chose to install on the HAMMER file system during installation you will be left with a system with the following disk configuration:
+
+    # df -h
+    Filesystem                Size   Used  Avail Capacity  Mounted on
+    ROOT                      288G    12G   276G     4%    /
+    devfs                     1.0K   1.0K     0B   100%    /dev
+    /dev/serno/9VMBWDM1.s1a   756M   138M   558M    20%    /boot
+    /pfs/@@-1:00001           288G    12G   276G     4%    /var
+    /pfs/@@-1:00002           288G    12G   276G     4%    /tmp
+    /pfs/@@-1:00003           288G    12G   276G     4%    /usr
+    /pfs/@@-1:00004           288G    12G   276G     4%    /home
+    /pfs/@@-1:00005           288G    12G   276G     4%    /usr/obj
+    /pfs/@@-1:00006           288G    12G   276G     4%    /var/crash
+    /pfs/@@-1:00007           288G    12G   276G     4%    /var/tmp
+    procfs                    4.0K   4.0K     0B   100%    /proc
+
+In this example
+
+* `/dev/serno/9VMBWDM1` is the hard disk specified with serial number,
+* `/dev/serno/9VMBWDM1.s1` is the first slice on the hard disk.
+
+The disklabel looks at follows
+
+    # disklabel /dev/serno/9VMBWDM1.s1
+
+    # /dev/serno/9VMBWDM1.s1:
+    #
+    # Informational fields calculated from the above
+    # All byte equivalent offsets must be aligned
+    #
+    # boot space:    1044992 bytes
+    # data space:  312567643 blocks # 305241.84 MB (320069266944 bytes)
+    #
+    # NOTE: If the partition data base looks odd it may be
+    #       physically aligned instead of slice-aligned
+    #
+    diskid: e67030af-d2af-11df-b588-01138fad54f5
+    label:
+    boot2 data base:      0x000000001000
+    partitions data base: 0x000000100200
+    partitions data stop: 0x004a85ad7000
+    backup label:         0x004a85ad7000
+    total size:           0x004a85ad8200    # 305242.84 MB
+    alignment: 4096
+    display block size: 1024        # for partition display only
+
+    16 partitions:
+    #          size     offset    fstype   fsuuid
+      a:     786432          0    4.2BSD    #     768.000MB
+      b:    8388608     786432      swap    #    8192.000MB
+      d:  303392600    9175040    HAMMER    #  296281.836MB
+      a-stor_uuid: eb1c8aac-d2af-11df-b588-01138fad54f5
+      b-stor_uuid: eb1c8aec-d2af-11df-b588-01138fad54f5
+      d-stor_uuid: eb1c8b21-d2af-11df-b588-01138fad54f5
+
+The slice has 3 partitions:
+
+* `a` - for `/boot`
+* `b` - for swap
+* `d` - for `/`, a HAMMER file system labeled ROOT
+
+When you create a HAMMER file system you must give it a label, here the installer labeled it as "ROOT" and mounted it as
+
+    ROOT                      288G    12G   276G     4%    /
+
+A PFS is a Pseudo File System inside a HAMMER file system. The HAMMER file system in which the PFSes are created is referred to as the root file system. You should not confuse the "root" file system with the Label "ROOT", the label can be anything. It is just that the installer labeled it as ROOT because it is mounted as `/`.
+
+Now inside the ROOT HAMMER file system you find the installed created 7 PFSes from the `df -h` output above, let us see how they are mounted in `/etc/fstab`:
+
+    # cat /etc/fstab
+
+    # Device                Mountpoint      FStype  Options         Dump    Pass#
+    /dev/serno/9VMBWDM1.s1a         /boot           ufs     rw      1       1
+    /dev/serno/9VMBWDM1.s1b         none            swap    sw      0       0
+    /dev/serno/9VMBWDM1.s1d         /               hammer  rw      1       1
+    /pfs/var                /var            null    rw              0       0
+    /pfs/tmp                /tmp            null    rw              0       0
+    /pfs/usr                /usr            null    rw              0       0
+    /pfs/home               /home           null    rw              0       0
+    /pfs/usr.obj    /usr/obj                null    rw              0       0
+    /pfs/var.crash  /var/crash              null    rw              0       0
+    /pfs/var.tmp    /var/tmp                null    rw              0       0
+    proc                    /proc           procfs  rw              0       0
+
+The PFSes are mounted using a NULL mount because they are also HAMMER file systems. You can read more on NULL mounts here [mount_null(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mount_null&section=8).
+
+You don't need to specify a size for the PFSes like you do for logical volumes inside a volume group for LVM. All the free space in the root HAMMER file system is available to all the PFSs. That is the reason in the `df -h` output above you saw free space is same for all PFSes and the root HAMMER file system.
+
+Now if you look in `/var`
+
+    # cd /var/
+    # ls
+    account   backups   caps   cron    empty   log   msgs   run   spool   yp  at        
+    cache     crash     db     games   lib     mail  preserve   rwho  tmp
+
+you will find the above directories.
+
+If you look at the status of one of the PFSes, e.g. `/usr` you will see `/var/hammer` is the default snapshot directory.
+
+    # hammer pfs-status /usr/
+    /usr/   PFS #3 {
+        sync-beg-tid=0x0000000000000001
+        sync-end-tid=0x0000000117ac6270
+        shared-uuid=f33e318e-d2af-11df-b588-01138fad54f5
+        unique-uuid=f33e31cb-d2af-11df-b588-01138fad54f5
+        label=""
+        prune-min=00:00:00
+        operating as a MASTER
+        snapshots directory defaults to /var/hammer/<pfs>
+    }
+
+There is no "hammer" directory in `/var` now. That is because no snapshots are yet taken. You can verify this by checking the snapshots available for `/usr`
+
+    # hammer snapls /usr
+    Snapshots on /usr       PFS #3
+    Transaction ID          Timestamp               Note
+
+Snapshots will appear automatically each night as the system performs housekeeping on the Hammer filesystem.  For a new volume, an immediate snapshot can be taken by running the command 'hammer cleanup'.  Among other activites, it will take a snapshot of the filesystem.
+
+    # sudo hammer cleanup
+    cleanup /                    - HAMMER UPGRADE: Creating snapshots
+            Creating snapshots in /var/hammer/root
+     handle PFS #0 using /var/hammer/root
+               snapshots - run
+                   prune - run
+               rebalance - run..
+                 reblock - run....
+                  recopy - run....
+    cleanup /var                 - HAMMER UPGRADE: Creating snapshots
+    [...]
+    cleanup /tmp                 - HAMMER UPGRADE: Creating snapshots
+    [...]
+    cleanup /usr                 - HAMMER UPGRADE: Creating snapshots
+    [...]
+    cleanup /home                - HAMMER UPGRADE: Creating snapshots
+    [...]
+    cleanup /usr/obj             - HAMMER UPGRADE: Creating snapshots
+    [...]
+    cleanup /var/crash           - HAMMER UPGRADE: Creating snapshots
+    [...]
+    cleanup /var/tmp             - HAMMER UPGRADE: Creating snapshots
+    [...]
+    cleanup /var/isos            - HAMMER UPGRADE: Creating snapshots
+    [...]
+
+No snapshots were taken for `/tmp`, `/usr/obj` and `/var/tmp`. This is because the PFSes are flagged as `nohistory`. HAMMER tracks history for all files in a PFS, naturally this consumes disk space until the history is pruned. To prevent that temporary files on the mentioned PFSes (e.g., object files, crash dumps) consume disk space, the PFSes are marked as `nohistory`.
+
+In `/var` will be a new directory called *hammer* with the following sub directories
+
+    # cd hammer/
+    # ls -l
+    total 0
+    drwxr-xr-x  1 root  wheel  0 Oct 13 11:51 home
+    drwxr-xr-x  1 root  wheel  0 Oct 13 11:42 root
+    drwxr-xr-x  1 root  wheel  0 Oct 13 11:43 tmp
+    drwxr-xr-x  1 root  wheel  0 Oct 13 11:51 usr
+    drwxr-xr-x  1 root  wheel  0 Oct 13 11:54 var
+
+Well let us look inside `/var/hammer/usr`
+
+    # cd usr/
+    # ls -l
+    total 0
+    drwxr-xr-x  1 root  wheel   0 Oct 13 11:54 obj
+    lrwxr-xr-x  1 root  wheel  25 Oct 13 11:43 snap-20101013-1143 -> /usr/@@0x0000000117ac6cb0
+
+We have a symlink pointing to the snapshot transaction ID shown below.
+
+    # hammer snapls /usr
+    Snapshots on /usr       PFS #3
+    Transaction ID          Timestamp               Note
+    0x0000000117ac6cb0      2010-10-13 11:43:04 IST -
+    #
+
+You can read more about snapshots, prune, reblance, reblock, recopy etc from [hammer(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=hammer&section=8) especially look under the heading "cleanup [filesystem ...]"
+
+You can learn more about PFS mirroring [here](http://www.dragonflybsd.org/docs/how_to_implement_hammer_pseudo_file_system__40___pfs___41___slave_mirroring_from_pfs_master/)
+
+In order to correctly map hard disk sernos to device names you can use the 'devattr' command.
+
+    # udevd
+    # devattr -d "ad*" -p serno
+    Device ad4:
+            serno = Z2AD9WN4
+    Device ad4s1:
+    Device ad4s1d:
+
+    Device ad5:
+            serno = 9VMRFDSY
+    Device ad5s1:
+    Device ad5s1d:
+
+    Device ad3:
+            serno = Z2AD9WLW
+    Device ad3s1:
+    Device ad3s1a:
+    Device ad3s1b:
+    Device ad3s1d:
+
+Or if your disks are 'da', just change it as appropiate.
+
+## Configuring and Starting the SSH Server
+
+Described in detail [[here|/docs/newhandbook/sshserver/]]
+
+## Software/Programs and Configuration Files Location 
+
+DragonFly default installation contains the base software/programs from the DragonFly project itself and few other software from other sources. 
+
+The base system binary software programs are located in the folders 
+
+    /bin    /sbin
+    /usr/bin   /usr/sbin
+
+The configuration files for the base system can be found in `/etc`. There is also `/usr/local/etc` which is used by third-party programs.
+
+There are several different ways to install software and which version you use depends on which DragonFly BSD version you have.  You can compile things from source code, or you can use binary packages.
+
+## Installing Third-party Software
+
+Have a look at the [[dports howto|/docs/howtos/HowToDPorts/]] for an in-depth description about dealing with packaging systems. Note that DragonFly BSD has several older package managers (like `pkgin`), but that the most modern binary package installation system as of 2014, is `pkg`.
+
+### Using pkg
+
+Read [[dports howto|/docs/howtos/HowToDPorts/]] then for some errata, read [[this|http://lists.dragonflybsd.org/pipermail/users/2013-November/090339.html]].
+
+You can look at the help and the man page for the pkg tool like this:
+
+`pkg help install`
+
+Example: Read man page for pkg-install
+
+`man pkg-install`
+
+### Installing an X.org desktop X11 environment and XFCE desktop
+
+If it's already on your system run X by typing `startx`. If it's not, be sure to check your dports configuration is finished, then install it using `pkg install xorg-7.7 xfce4-desktop`. This will install the core X.org X11 server, and an XFCE based desktop environment.
+
+`(obsolete)`
+Slightly out of date instructions on installing a GUI (X desktop) environment  are in the [new handbook](http://www.dragonflybsd.org/docs/newhandbook/X/).
+
+# UNIX Basics 
+
+***Rewritten by Chris Shumway. ***
+[[!toc  levels=3]]
+
+## Synopsis 
+
+The following chapter will cover the basic commands and functionality of the DragonFly operating system. Much of this material is relevant for any UNIX®-like operating system. Feel free to skim over this chapter if you are familiar with the material. If you are new to DragonFly, then you will definitely want to read through this chapter carefully.
+
+After reading this chapter, you will know:
+
+* How to use the ***virtual consoles*** of DragonFly.
+
+* How UNIX file permissions work along with understanding file flags in DragonFly.
+
+* The default DragonFly file system layout.
+
+* The DragonFly disk organization.
+
+* How to mount and unmount file systems.
+
+* What processes, daemons, and signals are.
+
+* What a shell is, and how to change your default login environment.
+
+* How to use basic text editors.
+
+* What devices and device nodes are.
+
+* What binary format is used under DragonFly.
+
+* How to read manual pages for more information.
+
+## Virtual Consoles and Terminals 
+
+DragonFly can be used in various ways. One of them is typing commands to a text terminal. A lot of the flexibility and power of a UNIX® operating system is readily available at your hands when using DragonFly this way. This section describes what ***terminals*** and ***consoles*** are, and how you can use them in !DragonFly.
+
+<!-- XXX: also mention vesa.ko and other modes for the vt, but maybe somewhere else -->
+
+### The Console 
+
+If you have not configured DragonFly to automatically start a graphical environment during startup, the system will present you with a login prompt after it boots, right after the startup scripts finish running. You will see something similar to:
+
+    Additional ABI support:.
+    Starting cron.
+    Local package initialization:.
+    Additional TCP options:.
+    
+    Wed Feb 18 17:53:48 GMT 2009
+    
+    DragonFly/i386 (Amnesiac) (ttyv0)
+
+    login: 
+
+The messages might be a bit different on your system, but you will see something similar. The last two lines are what we are interested in right now. The second last line reads:
+
+    DragonFly/i386 (Amnesiac) (ttyv0)
+
+This line contains some bits of information about the system you have just booted. You are looking at a ***DragonFlyBSD*** console, running on an Intel or compatible processor of the x86 architecture[(1)](#FTN.AEN1036). The name of this machine (every UNIX machine has a name) is `Amnesiac`, and you are now looking at its system console--the `ttyv0` terminal. Finally, the last line is always:
+
+    login:
+
+This is the part where you are supposed to type in your <i>username</i> to log into DragonFly. The next section describes how you can do this.
+
+### Logging into DragonFly 
+
+DragonFly is a multiuser, multiprocessing system. This is the formal description that is usually given to a system that can be used by many different people, who simultaneously run a lot of programs on a single machine. Every multiuser system needs some way to distinguish one <i>user</i>from the rest. In !DragonFly (and all the UNIX-like operating systems), this is accomplished by requiring that every user must ***log into*** the system before being able to run programs. Every user has a unique name (the <i>username</i> and a personal, secret key (the <i>password</i>). DragonFly will ask for these two before allowing a user to run any programs.
+
+Right after DragonFly boots and finishes running its startup scripts[(2)](#FTN.AEN1060), it will present you with a prompt and ask for a valid username: 
+
+    login:
+
+For the sake of this example, let us assume that your username is `john`. Type `john` at this prompt and press  **Enter** . You should then be presented with a prompt to enter a <i>password</i>:
+    
+
+    login: john
+    Password:
+
+Type in `john`'s password now, and press  **Enter** . The password is <i>not echoed!</i> You need not worry about this right now. Suffice it to say that it is done for security reasons. If you have typed your password correctly, you should by now be logged into DragonFly and ready to try out all the available commands. You should see the MOTD or message of the day followed by a command prompt (a `#`, `$`, or `%` character). This indicates you have successfully logged into DragonFly.
+
+### Multiple Consoles 
+
+Running UNIX commands in one console is fine, but DragonFly can run many programs at once. Having one console where commands can be typed would be a bit of a waste when an operating system like DragonFly can run dozens of programs at the same time. This is where <i>virtual consoles</i> can be very helpful. DragonFly can be configured to present you with many different virtual consoles. You can switch from one of them to any other virtual console by pressing a couple of keys on your keyboard. Each console has its own different output channel, and DragonFly takes care of properly redirecting keyboard input and monitor output as you switch from one virtual console to the next.
+
+Special key combinations have been reserved by DragonFly for switching consoles[(3)](#FTN.AEN1087). You can use  **Alt** - **F1** ,  **Alt** - **F2** , through  **Alt** - **F8**  to switch to a different virtual console in DragonFly. As you are switching from one console to the next, DragonFly takes care of saving and restoring the screen output. The result is an <i>illusion</i> of having multiple <i>virtual</i> screens and keyboards that you can use to type commands for DragonFly to run. The programs that you launch on one virtual console do not stop running when that console is not visible. They continue running when you have switched to a different virtual console.
+
+### The /etc/ttys File 
+
+The default configuration of DragonFly will start up with eight virtual consoles. This is not a hardwired setting though, and you can easily customize your installation to boot with more or fewer virtual consoles. The number and settings of the virtual consoles are configured in the `/etc/ttys` file.
+
+You can use the `/etc/ttys` file to configure the virtual consoles of DragonFly. Each uncommented line in this file (lines that do not start with a `#` character) contains settings for a single terminal or virtual console. The default version of this file that ships with DragonFly configures nine virtual consoles, and enables eight of them. They are the lines that start with `ttyv`:
+    
+
+    # name  getty                           type    status          comments
+    #
+    ttyv0   "/usr/libexec/getty Pc"         cons25  on  secure
+    # Virtual terminals
+    ttyv1   "/usr/libexec/getty Pc"         cons25  on  secure
+    ttyv2   "/usr/libexec/getty Pc"         cons25  on  secure
+    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/pkg/xorg/bin/xdm -nodaemon"  xterm   off secure
+
+For a detailed description of every column in this file and all the options you can use to set things up for the virtual consoles, consult the [ttys(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#ttys&section5) manual page.
+
+### Single User Mode Console 
+
+A detailed description of what <i>single user mode</i> is can be found in [boot-init.html#BOOT-SINGLEUSER Section 7.5.2]. It is worth noting that there is only one console when you are running DragonFly in single user mode. There are no virtual consoles available. The settings of the single user mode console can also be found in the `/etc/ttys` file. Look for the line that starts with `console`:
+
+    
+
+    # name  getty                           type    status          comments
+    #
+    # If console is marked "insecure", then init will ask for the root password
+    # when going to single-user mode.
+    console none                            unknown off secure
+
+ **Note:** As the comments above the `console` line indicate, you can edit this line and change `secure` to `insecure`. If you do that, when DragonFly boots into single user mode, it will still ask for the `root` password. ***Be careful when changing this to insecure***. If you ever forget the `root` password, booting into single user mode is a bit involved. It is still possible, but it might be a bit hard for someone who is not very comfortable with the DragonFly booting process and the programs involved.
+
+#### Notes 
+
+[[!table  data="""
+<tablestyle="width:100%">[ (1)](consoles.html#AEN1036) | This is what `i386` means. Note that even if you are not running DragonFly on an Intel 386 CPU, this is going to be `i386`. It is not the type of your processor, but the processor ***architecture*** that is shown here. 
+ [ (2)](consoles.html#AEN1060) | Startup scripts are programs that are run automatically by DragonFly when booting. Their main function is to set things up for everything else to run, and start any services that you have configured to run in the background doing useful things. 
+ [ (3)](consoles.html#AEN1087) | A fairly technical and accurate description of all the details of the DragonFly console and keyboard drivers can be found in the manual pages of [syscons(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=syscons&section4), [atkbd(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=atkbd&section=4), [vidcontrol(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=vidcontrol&section=1) and [kbdcontrol(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=kbdcontrol&section=1). We will not expand on the details here, but the interested reader can always consult the manual pages for a more detailed and thorough explanation of how things work. |
+
+"""]]
+
+## Permissions 
+
+DragonFly, being a direct descendant of BSD UNIX®, is based on several key UNIX concepts. The first and most pronounced is that DragonFly is a multi-user operating system. The system can handle several users all working simultaneously on completely unrelated tasks. The system is responsible for properly sharing and managing requests for hardware devices, peripherals, memory, and CPU time fairly to each user.
+
+Because the system is capable of supporting multiple users, everything the system manages has a set of permissions governing who can read, write, and execute the resource. These permissions are stored as three octets broken into three pieces, one for the owner of the file, one for the group that the file belongs to, and one for everyone else. This numerical representation works like this:
+
+[[!table  data="""
+|<tablestyle="width:100%"> Value | Permission | Directory Listing 
+<tablestyle="width:100%"> 0 | No read, no write, no execute | `---` 
+ 1 | No read, no write, execute | `--x` 
+ 2 | No read, write, no execute | `-w-` 
+ 3 | No read, write, execute | `-wx` 
+ 4 | Read, no write, no execute | `r--` 
+ 5 | Read, no write, execute | `r-x` 
+ 6 | Read, write, no execute | `rw-` 
+ 7 | Read, write, execute | `rwx` |
+
+"""]]
+
+You can use the `-l` command line argument to [ls(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ls&section1) to view a long directory listing that includes a column with information about a file's permissions for the owner, group, and everyone else. For example, a `ls -l` in an arbitrary directory may show:
+
+    % ls -l
+    total 530
+    -rw-r--r--  1 root  wheel     512 Sep  5 12:31 myfile
+    -rw-r--r--  1 root  wheel     512 Sep  5 12:31 otherfile
+    -rw-r--r--  1 root  wheel    7680 Sep  5 12:31 email.txt
+    ...
+
+Here is how the first column of `ls -l` is broken up:    
+
+    -rw-r--r--
+
+<!-- XXX: Check all these http:// links to see if they are broken -->
+
+The first (leftmost) character tells if this file is a regular file, a directory, a special character device, a socket, or any other special pseudo-file device. In this case, the `-` indicates a regular file. The next three characters, `rw-` in this example, give the permissions for the owner of the file. The next three characters, `r--`, give the permissions for the group that the file belongs to. The final three characters, `r--`, give the permissions for the rest of the world. A dash means that the permission is turned off. In the case of this file, the permissions are set so the owner can read and write to the file, the group can read the file, and the rest of the world can only read the file. According to the table above, the permissions for this file would be `644`, where each digit represents the three parts of the file's permission.
+
+This is all well and good, but how does the system control permissions on devices? DragonFly actually treats most hardware devices as a file that programs can open, read, and write data to just like any other file. These special device files are stored on the `/dev` directory.
+
+Directories are also treated as files. They have read, write, and execute permissions. The executable bit for a directory has a slightly different meaning than that of files. When a directory is marked executable, it means it can be traversed into, that is, it is possible to ***cd*** (change directory) into it. This also means that within the directory it is possible to access files whose names are known (subject, of course, to the permissions on the files themselves).
+
+In particular, in order to perform a directory listing, read permission must be set on the directory, whilst to delete a file that one knows the name of, it is necessary to have write ***and*** execute permissions to the directory containing the file. There are more permission bits, but they are primarily used in special circumstances such as setuid binaries and sticky directories. If you want more information on file permissions and how to set them, be sure to look at the [chmod(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chmod&section1) manual page.
+
+### Symbolic Permissions 
+
+***Contributed by Tom Rhodes.***
+
+Symbolic permissions, sometimes referred to as symbolic expressions, use characters in place of octal values to assign permissions to files or directories. Symbolic expressions use the syntax of (who) (action) (permissions), where the following values are available:
+
+[[!table  data="""
+<tablestyle="width:100%"> Option | Letter | Represents 
+<tablestyle="width:100%"> (who) | u | User 
+ (who) | g | Group owner 
+ (who) | o | Other 
+ (who) | a | All (***world***) 
+ (action) | + | Adding permissions 
+ (action) | - | Removing permissions 
+ (action) | = | Explicitly set permissions 
+ (permissions) | r | Read 
+ (permissions) | w | Write 
+ (permissions) | x | Execute 
+ (permissions) | t | Sticky bit 
+ (permissions) | s | Set UID or GID |
+
+"""]]
+
+These values are used with the [chmod(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chmod&amp;section1) command just like before, but with letters. For an example, you could use the following command to block other users from accessing `FILE`:
+
+    
+
+    % chmod go=FILE
+
+A comma separated list can be provided when more than one set of changes to a file must be made. For example the following command will remove the groups and ***world*** write permission on `FILE`, then it adds the execute permissions for everyone:
+
+    
+
+    % chmod go-w,a+x FILE
+
+### DragonFly File Flags 
+
+***Contributed by Tom Rhodes.***
+
+In addition to file permissions discussed previously, DragonFly supports the use of ***file flags.*** These flags add an additional level of security and control over files, but not directories. These file flags add an additional level of control over files, helping to ensure that in some cases not even the `root` can remove or alter files.  File flags are altered by using the [chflags(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chflags&amp;section1) utility, using a simple interface. For example, to enable the system undeletable flag on the file `file1`, issue the following command:
+
+    
+
+    # chflags sunlink file1
+
+And to disable the system undeletable flag, simply issue the previous command with ***no*** in front of the `sunlink`. Observe:
+
+    
+
+    # chflags nosunlink file1
+
+To view the flags of this file, use the [ls(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ls&amp;section1) with the `-lo` flags:
+
+    
+
+    # ls -lo file1
+
+The output should look like the following:
+
+    
+
+    -rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 file1
+
+Several flags may only added or removed to files by the `root` user. In other cases, the file owner may set these flags. It is recommended an administrator read over the [chflags(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chflags&section1) and [chflags(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chflags&section=2) manual pages for more information.
+
+## Directory Structure 
+
+The DragonFly directory hierarchy is fundamental to obtaining an overall understanding of the system. The most important concept to grasp is that of the root directory, ***/***. This directory is the first one mounted at boot time and it contains the base system necessary to prepare the operating system for multi-user operation. The root directory also contains mount points for every other file system that you may want to mount.
+
+A mount point is a directory where additional file systems can be grafted onto the root file system. This is further described in [ this Section](disk-organization.html). Standard mount points include `/usr`, `/var`, `/tmp`, `/mnt`, and `/cdrom`. These directories are usually referenced to entries in the file `/etc/fstab`. `/etc/fstab` is a table of various file systems and mount points for reference by the system. Most of the file systems in `/etc/fstab` are mounted automatically at boot time from the script [rc(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc&section8) unless they contain the `noauto` option. Details can be found in [ this section](mount-unmount.html#DISKS-FSTAB).
+
+A complete description of the file system hierarchy is available in [hier(7)](http://leaf.dragonflybsd.org/cgi/web-man?command=hier&section7). For now, a brief overview of the most common directories will suffice.
+
+[[!table  data="""
+<tablestyle="width:100%">Directory | Description 
+<tablestyle="width:100%">  `/` | Root directory of the file system. 
+ `/bin/` | User utilities fundamental to both single-user and multi-user environments. 
+ `/boot/` | Programs and configuration files used during operating system bootstrap. 
+ `/boot/defaults/` | Default bootstrapping configuration files; see [loader.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=loader.conf&section5). 
+ `/dev/` | Device nodes; see [intro(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=intro&section4). 
+ `/etc/` | System configuration files and scripts. 
+ `/etc/defaults/` | Default system configuration files; see [rc(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc&section8). 
+ `/etc/mail/` | Configuration files for mail transport agents such as [sendmail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sendmail&section8). 
+ `/etc/namedb/` | `named` configuration files; see [named(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=named&section8). 
+ `/etc/periodic/` | Scripts that are run daily, weekly, and monthly, via [cron(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=cron&section8); see [periodic(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=periodic&section=8). 
+ `/etc/ppp/` | `ppp` configuration files; see [ppp(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=ppp&section8). 
+ `/mnt/` | Empty directory commonly used by system administrators as a temporary mount point. 
+ `/proc/` | Process file system; see [procfs(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=procfs&section5), [mount_procfs(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mount_procfs&section=8). 
+ `/root/` | Home directory for the `root` account. 
+ `/sbin/` | System programs and administration utilities fundamental to both single-user and multi-user environments. 
+ `/tmp/` | Temporary files. The contents of `/tmp` are usually NOT preserved across a system reboot. A memory-based file system is often mounted at `/tmp`. This can be automated with an entry in `/etc/fstab`; see [mfs(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mfs&section8). 
+ `/usr/` | The majority of user utilities and applications. 
+ `/usr/bin/` | Common utilities, programming tools, and applications. 
+ `/usr/include/` | Standard C include files. 
+ `/usr/lib/` | Archive libraries. 
+ `/usr/libdata/` | Miscellaneous utility data files. 
+ `/usr/libexec/` | System daemons &amp; system utilities (executed by other programs). 
+ `/usr/local/` | Local executables, libraries, etc. Within `/usr/local`, the general layout sketched out by [hier(7)](http://leaf.dragonflybsd.org/cgi/web-man?command=hier&section7) for `/usr` should be used. An exceptions is the man directory, which is directly under `/usr/local` rather than under `/usr/local/share`. 
+ `/usr/obj/` | Architecture-specific target tree produced by building the `/usr/src` tree. 
+ `/usr/pkg` | Used as the default destination for the files installed via the pkgsrc® tree or pkgsrc packages (optional). The configuration directory is tunable, but the default location is `/usr/pkg/etc`. 
+ `/usr/pkg/xorg/` | Xorg distribution executables, libraries, etc (optional). 
+ `/usr/pkgsrc` | The pkgsrc tree for installing packages (optional). 
+ `/usr/sbin/` | System daemons &amp; system utilities (executed by users). 
+ `/usr/share/` | Architecture-independent files. 
+ `/usr/src/` | BSD and/or local source files. 
+ `/var/` | Multi-purpose log, temporary, transient, and spool files. A memory-based file system is sometimes mounted at `/var`. This can be automated with an entry in `/etc/fstab`; see [mfs(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mfs&section8). 
+ `/var/log/` | Miscellaneous system log files. 
+ `/var/mail/` | User mailbox files. 
+ `/var/spool/` | Miscellaneous printer and mail system spooling directories. 
+ `/var/tmp/` | Temporary files. The files are usually preserved across a system reboot, unless `/var` is a memory-based file system. 
+ `/var/yp` | NIS maps. |
+
+"""]]
+
+## Disk Organization 
+
+The smallest unit of organization that DragonFly uses to find files is the filename. Filenames are case-sensitive, which means that `readme.txt` and `README.TXT` are two separate files. DragonFly does not use the extension (`.txt`) of a file to determine whether the file is a program, or a document, or some other form of data.
+
+Files are stored in directories.  A directory may contain no files, or it may contain many hundreds of files.  A directory can also contain other directories, allowing you to build up a hierarchy of directories within one another.  This makes it much easier to organize your data.
+
+Files and directories are referenced by giving the file or directory name, followed by a forward slash, `/`, followed by any other directory names that are necessary.  If you have directory `foo`, which contains directory `bar`, which contains the file `readme.txt`, then the full name, or ***path*** to the file is `foo/bar/readme.txt`.
+
+Directories and files are stored in a file system. Each file system contains exactly one directory at the very top level, called the ***root directory*** for that file system.  This root directory can then contain other directories.
+
+So far this is probably similar to any other operating system you may have used.  There are a few differences; for example, MS-DOS® and Windows® use `\`.
+
+DragonFly does not use drive letters, or other drive names in the path. You would not write `c:/foo/bar/readme.txt` on DragonFly.
+
+Instead, one file system is designated the ***root file system***.  The root file system's root directory is referred to as `/`.  Every other file system is then ***mounted*** under the root file system. No matter how many disks you have on your DragonFly system, every directory appears to be part of the same disk.
+
+Suppose you have three file systems, called `A`, `B`, and `C`. Each file system has one root directory, which contains two other directories, called `A1`, `A2` (and likewise `B1`, `B2` and `C1`, `C2`).
+
+Call `A` the root file system. If you used the `ls` command to view the contents of this directory you would see two subdirectories, `A1` and `A2`.  The directory tree looks like this:
+
+<!-- XXX: image -->
+
+A file system must be mounted on to a directory in another file system. So now suppose that you mount file system `B` on to the directory `A1`.  The root directory of `B` replaces `A1`, and the directories in `B` appear accordingly:
+
+<!-- XXX: image -->
+
+Any files that are in the `B1` or `B2` directories can be reached with the path `/A1/B1` or `/A1/B2` as necessary. Any files that were in `/A1` have been temporarily hidden.  They will reappear if `B` is ***unmounted*** from A.
+
+If `B` had been mounted on `A2` then the diagram would look like this:
+
+<!-- XXX: image -->
+
+and the paths would be `/A2/B1` and `/A2/B2` respectively.
+
+File systems can be mounted on top of one another.  Continuing the last example, the `C` file system could be mounted on top of the `B1` directory in the `B` file system, leading to this arrangement:
+
+<!-- XXX: image -->
+
+Or `C` could be mounted directly on to the `A` file system, under the `A1` directory:
+
+<!-- XXX: image -->
+
+If you are familiar with MS-DOS, this is similar, although not identical, to the `join` command.
+
+## Choosing File System Layout 
+
+This is not normally something you need to concern yourself with. Typically you create file systems when installing DragonFly and decide where to mount them, and then never change them unless you add a new disk.
+
+It is entirely possible to have one large root file system, and not need to create any others. There are some drawbacks to this approach, and one advantage.
+
+ **Benefits of Multiple File Systems** 
+
+* Different file systems can have different ***mount options***.  For example, with careful planning, the root file system can be mounted read-only, making it impossible for you to inadvertently delete or edit a critical file.  Separating user-writable file systems, such as `/home`, from other file systems also allows them to be mounted ***nosuid***; this option prevents the ***suid***/***guid*** bits on executables stored on the file system from taking effect, possibly improving security.
+
+* The UFS file system automatically optimizes the layout of files, depending on how the file system is being used. So a file system that contains many small files that are written frequently will have a different optimization to one that contains fewer, larger files.  By having one big file system this optimization breaks down.
+
+* DragonFly's file systems are very robust should you lose power.  However, a power loss at a critical point could still damage the structure of the file system.  By splitting your data over multiple file systems it is more likely that the system will still come up, making it easier for you to restore from backup as necessary. This a major reason to make the root file system of limited size, and with low write activity.
+
+ **Benefit of a Single File System** 
+
+* File systems are a fixed size. If you create a file system when you install DragonFly and give it a specific size, you may later discover that you need to make the partition bigger.  The [growfs(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=growfs&amp;section8) command makes it possible to increase the size of a UFS file system on the fly.
+<!-- XXX: what about hammer? -->
+
+## Disk Slices, Partitions and local UNIX file systems 
+
+Here we describe how disks are subdivided.
+
+<!-- XXX: mention serno stuff -->
+
+### Slices 
+
+A disk can be subdivided in slices.
+
+Slices are named `s0`, `s1` and so on.
+
+For example the disk `ad6` can contain the slice `ad6s3`.
+
+DragonFly support two schemes for slices, MBR and GPT, either of them will manage all slices on a disk:
+
+* MBR: set up using [fdisk(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=fdisk&amp;section8), can be up to 2 TB in size.  MBR slices are numbered from 1; but if disk is ***dangerously dedicated*** it has slice number 0.
+
+* GPT: set up using [gpt(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=gpt&amp;section8), can be extremely large: size up to 8 billion TB.  DragonFly doesn't support booting from a GPT slice in DragonFly  2.0.  Note that GPT slices are numbered from 0. ***Dangerously dedicated*** is not supported nor needed for GPT.  DragonFly 2.1 does have some support for booting from a GPT slice, this is described in [gpt(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=gpt&amp;section=8).
+
+### Partitions 
+
+Partitions are contained in slices.
+
+Partitions are named `a`, `b` and so on.
+
+DragonFly support 16 partitions per slice, that is `a` through `p`.
+
+For example the partition `ad6s3a` is contained in the slice `ad6s3`.
+
+Partition layout is defined in a label on the slice where the partition reside. DragonFly support two types of disk labels, disklabel32 and disklabel64 (the default):
+
+* [disklabel32(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel&amp;section8): 32 bit disk label which can use slices with size up to 2 TB.
+
+* [disklabel64(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel64&amp;section8): 64 bit disk label which can use very large slices: size up to 16 million TB.
+
+### Local UNIX file systems 
+
+File systems are contained in partitions.  Each partition can contain only one file system, which means that file systems often are described by either their typical mount point in the file system hierarchy, or the letter of the partition they are contained in.  ***Partition*** does not have the same meaning as the common usage of the term partition (for example, MS-DOS partition), because of DragonFly's UNIX® heritage.
+
+DragonFly support two local UNIX file systems, UFS and HAMMER:
+
+* UFS: The classical BSD UNIX file system, see [ffs(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#ffs&amp;section5), it supports size up to 2 TB.
+
+* [HAMMER(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=HAMMER&amp;section5): A new file system, as of DragonFly 2.0, with many advanced features.  HAMMER file system support size up to 1 million TB.
+
+### Typical disk layout 
+
+From the above we see the following typical disk layout scenarios:
+
+* For booting DragonFly from a local file system UFS is recommended.  A BOOT+HAMMER setup is recommended for HAMMER use, this consists of a small UFS file system for booting, typically 512MB, and a HAMMER root file system.  The BOOT file system is mounted as /boot after boot.
+
+* For moderate storage requirements UFS can be used; it can be setup on any partition, e.g. on the same disk slice as the boot partition.  HAMMER is an alternative, with extra features supported, like history retention.  You should evaluate if HAMMER is suitable, see note below.
+
+* If really big storage capacity is needed UFS can't fit the need.  You should evaluate if HAMMER is suitable, see note below.  For this use HAMMER needs to be used on a GPT slice with  a [disklabel64(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel64&amp;section8) label.  In DragonFly 2.0 it has to be set up on a disk separate from the boot disk.  In  DragonFly 2.1 one disk can be used for both booting and HAMMER file system on GPT slice, as some support for booting from GPT is present, as described in [gpt(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=gpt&amp;section=8).
+
+### HAMMER Note 
+
+[HAMMER(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=HAMMER&amp;section5)
+
+is a rather new file system, under active development.
+
+As of DragonFly 2.2.1 release HAMMER is considered production ready.  At 2.0 release it was considered to be in an early Beta state .
+
+All major features except the mirroring are quite well tested as-of the 2.2.1 release.
+
+You should evaluate if HAMMER is suitable for your needs.
+<!-- XXX: mention disk and memory requirements for efficient hammer use -->
+
+Examples of ongoing development includes:
+
+* Making HAMMER more self managing; e.g. ability to setup policy for which history to save for how long: e.g. make snapshot every hour and prune and reblock the file system regularly.  When snapshot gets older than 1 month only keep them for every 6 hours; when older than 3 months only keep snapshot for every 24 hours, when older than 3 years only keep snapshot per month.  For now you need to set up [cron(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=cron&amp;section8) jobs for this yourself, see [hammer(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=hammer&amp;section=8).
+
+* Multi master mirroring. For now only one mirror master is supported, but multiple mirror targets, called slaves, are already supported.
+
+* Support for shrinking existing HAMMER file systems.  The HAMMER design is prepared for this, utility just have to be written to support it.
+<!-- XXX: is this still accurate? Do we really want to mention it here? -->
+
+### HAMMER Features 
+
+[HAMMER(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=HAMMER&amp;section5) has several advanced features not found in UFS:
+
+* Large file systems:  Up to 1 million TB, also called 1 Exabyte is supported.
+
+* Multiple volumes:  A HAMMER file system can span up to 256 disks, each partition part of a HAMMER file system is called a volume.  Each volume can be up to 4096 TB in size.
+
+* Support for growing and shrinking existing HAMMER file systems: adding and removing volumes from the file system.  As of 2.4 release an existing HAMMER file system can be expanded by adding extra space, see the `expand` directive to [hammer(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=hammer&amp;section=8).  The HAMMER design is also prepared for removing volumes, utilities just have to be written to support it.
+
+* Instant crash recovery:  If a crash should occur, then HAMMER file systems will be ready a few seconds after boot, no lenghty fsck have to be run.
+
+* Full history retention:  All file system changes are saved every ~30 seconds.  Changes are written at least when sync() is called, see [syncer(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=syncer&amp;section4).  Every time data for files are written to disk a transaction is completed, this is assigned an ID and the file updated can after this be accessed with the contents from this moment.  To access the file with the state of this moment, the transaction ID, TID for brevity, just needs to be added to the file name, like: 'file@@<TID>'.  The TID can be saved from the 'snapshot', 'cleanup', or 'synctid' [hammer(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=hammer&amp;section=8) command or looked up with the 'hammer history file' command.  This history will typically grow over time, so any disk will fill up over time.  Two things are done so disks doesn't fill up: first: big disks are used, at least 50GB is typical for HAMMER file systems, and second: unused history information is deleted regularly. Here we need to define what unused means: a TID is used if a snapshot have been taken on it. Data assigned to unused history can be reclaimed using the `prune` and `reblock` [hammer(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=hammer&amp;section=8) commands, this will also defragment the file system and can be done while the file system is in normal operation.  Generally after file system is pruned only TIDs for the snapshots or newer than newest shapshot should be used, see explanation [here](http://leaf.dragonflybsd.org/mailarchive/bugs/2008-07/msg00213.html) (more info on HAMMER design [here](http://leaf.dragonflybsd.org/mailarchive/kernel/2008-07/msg00114.html)).  See also [hammer(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=hammer&amp;section=5). 
+
+* Mirroring:  A master file system can be mirrored online to a number of slave file systems.  Mirror targets are read-only, but does have history available.  History retension policy can even be different on slaves and master.  Mirroring can be over network and unreliable connections are handled gracefully.
+
+* Data integrity:  HAMMER has high focus in data integrity and implements a CRC checksum on all data, this means that if disk fails with bit errors it will be detected.
+
+More info on HAMMER can be found [here](http://www.dragonflybsd.org/hammer/index.html).
+
+DragonFly also uses disk space for ***swap space***.  Swap space provides DragonFly with ***virtual memory***.  This allows your computer to behave as though it has much more memory than it actually does.  When DragonFly runs low on memory it moves some of the data that is not currently being used to the swap space, and moves it back in (moving something else out) when it needs it.
+
+<!-- XXX: mention swapcache, and also how to configure and use it (somewhere else, probably) -->
+
+### Adding a Disk 
+
+Adding a disk is done by installing it physically, and to connect it to a disk controller that DragonFly supports.  If you are in doubt if controller is supported, manual pages for disk controllers can be consulted ('man -k disk' or 'man -k scsi' can be of help).  The easiest thing is normally to boot DargonFly with the controller installed and note if boot message contains the controller.
+
+Assuming that disk `ad6` is installed, we could set it up using [fdisk(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=fdisk&amp;section8) and  disklabel(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel&amp;section8) or  [gpt(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=gpt&amp;section8) and 
+[disklabel64(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel64&amp;section8).
+
+In this example we choose [gpt(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=gpt&amp;section=8) & [disklabel64(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel64&amp;section=8).
+
+<!-- XXX: mention that disklabel64 is default now -->
+    
+
+    # gpt -v create ad6
+
+    ...
+
+    # gpt add -s1 ad6
+
+    ad6s0
+
+    # gpt add ad6
+
+    ad6s1
+
+    # gpt show ad6
+
+    ...
+
+Here we first create the GPT and then add two slices.  In this example the first slice added is `ad6s0`, which is made a dummy slice of size 1 sector, this is just for not having to make further reference to it, as many users remembers that `s0` has special meaning, which really isn't true for GPT slices.  The second slice is `ad6s1` which will cover the rest of the disk.
+
+    
+
+    # disklabel64 -rw ad6s1 auto
+
+    # disklabel64 -e ad6s1          # edit label to add partitions as needed
+
+### disklabel 
+<!-- XXX: what is all this fuzz about dangerously dedicated? -->
+
+For [disklabel(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel&amp;section8) labels some partitions have certain conventions associated with them.
+
+[[!table  data="""
+<tablestyle="width:100%"> Partition | Convention 
+<tablestyle="width:100%"> `a` | Normally contains the root file system 
+ `b` | Normally contains swap space 
+ `c` | Normally the same size as the enclosing slice.  This allows utilities that need to work on the entire slice (for example, a bad block scanner) to work on the `c` partition. You would not normally create a file system on this partition. This is not necessarily true; it is possible to use the 'c' partition as a normal partition.
+ `d` | Partition `d` used to have a special meaning associated with it, although that is now gone.  To this day, some tools may operate oddly if told to work on partition `d`. |
+
+"""]]
+
+Each partition-that-contains-a-file-system is stored in what DragonFly calls a ***slice***.  Slice is DragonFly's term for what the common call partitions, and again, this is because of DragonFly's UNIX background.  Slices are numbered, starting at 1.
+
+Slice numbers follow the device name, prefixed with an `s`, starting at 1. So ***da0s1*** is the first slice on the first SCSI drive. There can only be four physical slices on a disk, but you can have logical slices inside physical slices of the appropriate type.  These extended slices are numbered starting at 5, so ***ad0s5*** is the first extended slice on the first IDE disk. These devices are used by file systems that expect to occupy a slice.
+
+<!-- XXX: gpt allows for way more than 4 partitions... let's remove this stuff above -->
+
+***Dangerously dedicated*** physical drives are accessed as slice 0.
+
+Slices, ***dangerously dedicated*** physical drives, and other drives contain ***partitions***, which are represented as letters from `a` to `p`.  This letter is appended to the device name, so ***da0s0a*** is the a partition on the first da drive, which is ***dangerously dedicated***. ***ad1s3e*** is the fifth partition in the third slice of the second IDE disk drive.
+
+Finally, each disk on the system is identified.  A disk name starts with a code that indicates the type of disk, and then a number, indicating which disk it is.  Disk numbering starts at 0. Common codes that you will see are listed in [Table 3-1](disk-organization.html#BASICS-DEV-CODES).
+
+<!-- XXX: here would probably be the right place to talk about serno -->
+
+When referring to a partition DragonFly requires that you also name the slice and disk that contains the partition, and when referring to a slice you should also refer to the disk name. Do this by listing the disk name, `s`, the slice number, and then the partition letter.  Examples are shown in [Example 3-1](disk-organization.html#BASICS-DISK-SLICE-PART).
+
+<!-- XXX: later talk also about devfs, definitely not here though. also, devfs rules -->
+
+[Example 3-2](disk-organization.html#BASICS-CONCEPT-DISK-MODEL) shows a conceptual model of the disk layout that should help make things clearer.
+
+In order to install DragonFly you must first configure the disk slices, then create partitions within the slice you will use for DragonFly, and then create a file system (or swap space) in each partition, and decide where that file system will be mounted.
+
+***'Table 3-1. Disk Device Codes***'
+
+[[!table  data="""
+<tablestyle="width:100%"> Code | Meaning 
+<tablestyle="width:100%"> `ad` | ATAPI (IDE) disk 
+ `da` | SCSI direct access disk 
+ `acd` | ATAPI (IDE) CDROM 
+ `cd` | SCSI CDROM 
+ `vn` | Virtual disk
+ `fd` | Floppy disk |
+
+"""]]
+
+***'Example 3-1. Sample Disk, Slice, and Partition Names***'
+
+[[!table  data="""
+<tablestyle="width:100%"> Name | Meaning 
+<tablestyle="width:100%"> `ad0s1a` | The first partition (`a`) on the first slice (`s1`) on the first IDE disk (`ad0`). 
+ `da1s2e` | The fifth partition (`e`) on the second slice (`s2`) on the second SCSI disk (`da1`). |
+
+"""]]
+
+***'Example 3-2. Conceptual Model of a Disk***'
+
+This diagram shows DragonFly's view of the first IDE disk attached to the system. Assume that the disk is 4 GB in size, and contains two 2 GB slices (MS-DOS partitions).  The first slice contains a MS-DOS disk, `C:`, and the second slice contains a DragonFly installation. This example DragonFly installation has three partitions, and a swap partition.
+
+The three partitions will each hold a file system. Partition `a` will be used for the root file system, `e` for the `/var` directory hierarchy, and `f` for the `/usr` directory hierarchy.
+
+<!-- XXX: image -->
+
+## Mounting and Unmounting File Systems 
+
+The file system is best visualized as a tree, rooted at `/`.
+
+The directories, e.g. `/dev` and `/usr`, in the root directory are branches,
+
+which may have their own branches, such as `/usr/local`, and so on.
+
+There are various reasons to house some of these directories on separate file systems. `/var` contains the directories `log/` and `spool/`, and various types of temporary files, and as such, may get filled up. Filling up the root file system is not a good idea, so splitting `/var` from `/` is often favorable.
+
+Another common reason to contain certain directory trees on other file systems is if they are to be housed on separate physical disks, e.g. CD-ROM, or are used as separate virtual disks, such as [Network File System](network-nfs.html) exports.
+
+### The fstab File 
+
+During the [boot process](boot.html), file systems listed in `/etc/fstab` are automatically mounted (unless they are listed with the `noauto` option).
+
+The `/etc/fstab` file contains a list of lines of the following format:
+  
+
+    device       mount-point   fstype     options      dumpfreq     passno
+
+These parameters have the following meaning:
+
+* `device`: A device name (which should exist), as explained [here](disks-naming.html).
+
+* `mount-point`: A directory (which should exist), on which to mount the file system.
+
+* `fstype`: The file system type to pass to [mount(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mount&section8). The default DragonFly file system is `ufs`.
+
+* `options`: Either `rw` for read-write file systems, or `ro` for read-only file systems, followed by any other options that may be needed. A common option is `noauto` for file systems not normally mounted during the boot sequence. Other options are listed in the [mount(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mount&section8) manual page.
+
+* `dumpfreq`: This is used by [dump(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dump&section8) to determine which file systems require dumping. If the field is missing, a value of zero is assumed.
+
+* `passno`: This determines the order in which file systems should be checked. File systems that should be skipped should have their `passno` set to zero. The root file system (which needs to be checked before everything else) should have its `passno` set to one, and other file systems' `passno` should be set to values greater than one. If more than one file systems have the same `passno` then [fsck(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=fsck&section8) will attempt to check file systems in parallel if possible.
+
+Consult the [fstab(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=fstab&section5) manual page for more information on the format of the `/etc/fstab` file and the options it contains.
+
+### The mount Command 
+
+The [mount(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mount&section8) command is what is ultimately used to mount file systems.
+
+In its most basic form, you use:
+
+    
+
+    # mount device mountpoint
+
+Or, if `mountpoint` is specified in `/etc/fstab`, just:
+
+    
+
+    # mount mountpoint
+
+There are plenty of options, as mentioned in the [mount(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mount&section8) manual page, but the most common are:
+
+ **Mount Options** 
+
+* `-a`: Mount all the file systems listed in `/etc/fstab`. Except those marked as `noauto`, excluded by the `-t` flag, or those that are already mounted.
+
+* `-d`: Do everything except for the actual mount system call. This option is useful in conjunction with the `-v` flag to determine what [mount(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mount&section8) is actually trying to do.
+
+* `-f`: Force the mount of an unclean file system (dangerous), or forces the revocation of write access when downgrading a file system's mount status from read-write to read-only.
+
+* `-r`: Mount the file system read-only. This is identical to using the `rdonly` argument to the `-o` option.
+
+* `-t` ***fstype***: Mount the given file system as the given file system type, or, if used with `-a` option, mount only file systems of the given type. `ufs` is the default file system type.
+
+* `-u`: Update mount options on the file system.
+
+* `-v`: Be verbose.
+
+* `-w`: Mount the file system read-write.
+
+The `-o` option takes a comma-separated list of the options, including the following:
+
+* `nodev:` Do not interpret special devices on the file system. This is a useful security option.
+
+* `noexec`: Do not allow execution of binaries on this file system. This is also a useful security option.
+
+* `nosuid`: Do not interpret setuid or setgid flags on the file system. This is also a useful security option.
+
+### The umount Command 
+
+The [umount(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=umount&section8) command takes, as a parameter, one of a mountpoint, a device name, or the `-a` or `-A` option.
+
+All forms take `-f` to force unmounting, and `-v` for verbosity. Be warned that `-f` is not generally a good idea. Forcibly unmounting file systems might crash the computer or damage data on the file system.
+
+`-a` and `-A` are used to unmount all mounted file systems, possibly modified by the file system types listed after `-t`. `-A`, however, does not attempt to unmount the root file system.
+
+## Processes 
+
+DragonFly is a multi-tasking operating system. This means that it seems as though more than one program is running at once. Each program running at any one time is called a ***process***. Every command you run will start at least one new process, and there are a number of system processes that run all the time, keeping the system functional.
+
+<!-- XXX: talk about LWPs and threads? -->
+
+Each process is uniquely identified by a number called a ***process ID***, or ***PID***, and, like files, each process also has one owner and group. The owner and group information is used to determine what files and devices the process can open, using the file permissions discussed earlier. Most processes also have a parent process. The parent process is the process that started them. For example, if you are typing commands to the shell then the shell is a process, and any commands you run are also processes. Each process you run in this way will have your shell as its parent process. The exception to this is a special process called [init(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=init&section8). `init` is always the first process, so its PID is always 1. `init` is started automatically by the kernel when DragonFly starts.
+
+Two commands are particularly useful to see the processes on the system, [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ps&section1) and [top(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=top&section=1). The `ps` command is used to show a static list of the currently running processes, and can show their PID, how much memory they are using, the command line they were started with, and so on. The `top` command displays all the running processes, and updates the display every few seconds, so that you can interactively see what your computer is doing.
+
+By default, `ps` only shows you the commands that are running and are owned by you. For example:
+
+    
+
+    % ps
+
+      PID  TT  STAT      TIME COMMAND
+      298  p0  Ss     0:01.10 tcsh
+     7078  p0  S      2:40.88 xemacs mdoc.xsl (xemacs-21.1.14)
+    37393  p0  I      0:03.11 xemacs freebsd.dsl (xemacs-21.1.14)
+    48630  p0  S      2:50.89 /usr/local/lib/netscape-linux/navigator-linux-4.77.bi
+    48730  p0  IW     0:00.00 (dns helper) (navigator-linux-)
+    72210  p0  R+     0:00.00 ps
+      390  p1  Is     0:01.14 tcsh
+     7059  p2  Is+    1:36.18 /usr/local/bin/mutt -y
+     6688  p3  IWs    0:00.00 tcsh
+    10735  p4  IWs    0:00.00 tcsh
+    20256  p5  IWs    0:00.00 tcsh
+      262  v0  IWs    0:00.00 -tcsh (tcsh)
+      270  v0  IW+    0:00.00 /bin/sh /usr/X11R6/bin/startx -- -bpp 16
+      280  v0  IW+    0:00.00 xinit /home/nik/.xinitrc -- -bpp 16
+      284  v0  IW     0:00.00 /bin/sh /home/nik/.xinitrc
+      285  v0  S      0:38.45 /usr/X11R6/bin/sawfish
+
+As you can see in this example, the output from [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ps&section1) is organized into a number of columns. `PID` is the process ID discussed earlier. PIDs are assigned starting from 1, go up to 99999, and wrap around back to the beginning when you run out. The `TT` column shows the tty the program is running on, and can safely be ignored for the moment. `STAT` shows the program's state, and again, can be safely ignored. `TIME` is the amount of time the program has been running on the CPU--this is usually not the elapsed time since you started the program, as most programs spend a lot of time waiting for things to happen before they need to spend time on the CPU. Finally, `COMMAND` is the command line that was used to run the program.
+
+[ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ps&section1) supports a number of different options to change the information that is displayed. One of the most useful sets is `auxww`. `a` displays information about all the running processes, not just your own. `u` displays the username of the process' owner, as well as memory usage. `x` displays information about daemon processes, and `ww` causes [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ps&section=1) to display the full command line, rather than truncating it once it gets too long to fit on the screen.
+
+The output from [top(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=top&section1) is similar. A sample session looks like this:
+
+    
+
+    % top
+    last pid: 72257;  load averages:  0.13,  0.09,  0.03    up 0+13:38:33  22:39:10
+    47 processes:  1 running, 46 sleeping
+    CPU states: 12.6% user,  0.0% nice,  7.8% system,  0.0% interrupt, 79.7% idle
+    Mem: 36M Active, 5256K Inact, 13M Wired, 6312K Cache, 15M Buf, 408K Free
+    Swap: 256M Total, 38M Used, 217M Free, 15% Inuse
+    
+
+      PID USERNAME PRI NICE  SIZE    RES STATE    TIME   WCPU    CPU COMMAND
+    72257 nik       28   0  1960K  1044K RUN      0:00 14.86%  1.42% top
+     7078 nik        2   0 15280K 10960K select   2:54  0.88%  0.88% xemacs-21.1.14
+      281 nik        2   0 18636K  7112K select   5:36  0.73%  0.73% XF86_SVGA
+      296 nik        2   0  3240K  1644K select   0:12  0.05%  0.05% xterm
+    48630 nik        2   0 29816K  9148K select   3:18  0.00%  0.00% navigator-linu
+      175 root       2   0   924K   252K select   1:41  0.00%  0.00% syslogd
+     7059 nik        2   0  7260K  4644K poll     1:38  0.00%  0.00% mutt
+    ...
+
+The output is split into two sections. The header (the first five lines) shows the PID of the last process to run, the system load averages (which are a measure of how busy the system is), the system uptime (time since the last reboot) and the current time. The other figures in the header relate to how many processes are running (47 in this case), how much memory and swap space has been taken up, and how much time the system is spending in different CPU states.
+
+Below that are a series of columns containing similar information to the output from [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ps&section1). As before you can see the PID, the username, the amount of CPU time taken, and the command that was run. [top(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=top&section=1) also defaults to showing you the amount of memory space taken by the process. This is split into two columns, one for total size, and one for resident size--total size is how much memory the application has needed, and the resident size is how much it is actually using at the moment. In this example you can see that  **Netscape®**  has required almost 30 MB of RAM, but is currently only using 9 MB.
+
+[top(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=top&section1) automatically updates this display every two seconds; this can be changed with the `s` option.
+
+## Daemons, Signals, and Killing Processes 
+
+When you run an editor it is easy to control the editor, tell it to load files, and so on. You can do this because the editor provides facilities to do so, and because the editor is attached to a ***terminal***. Some programs are not designed to be run with continuous user input, and so they disconnect from the terminal at the first opportunity. For example, a web server spends all day responding to web requests, it normally does not need any input from you. Programs that transport email from site to site are another example of this class of application.
+
+We call these programs ***daemons***. Daemons were characters in Greek mythology; neither good or evil, they were little attendant spirits that, by and large, did useful things for mankind. Much like the web servers and mail servers of today do useful things. This is why the mascot for a number of BSD-based operating systems has, for a long time, been a cheerful looking daemon with sneakers and a pitchfork.
+
+There is a convention to name programs that normally run as daemons with a trailing ***d***.  **BIND**  is the Berkeley Internet Name Daemon (and the actual program that executes is called `named`), the  **Apache**  web server program is called `httpd`, the line printer spooling daemon is `lpd` and so on. This is a convention, not a hard and fast rule; for example, the main mail daemon for the  **Sendmail**  application is called `sendmail`, and not `maild`, as you might imagine.
+
+Sometimes you will need to communicate with a daemon process. These communications are called ***signals***, and you can communicate with a daemon (or with any other running process) by sending it a signal. There are a number of different signals that you can send--some of them have a specific meaning, others are interpreted by the application, and the application's documentation will tell you how that application interprets signals. You can only send a signal to a process that you own. If you send a signal to someone else's process with [kill(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=kill&section=1) or [kill(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=kill&section=2) permission will be denied. The exception to this is the `root` user, who can send signals to everyone's processes.
+
+DragonFly will also send applications signals in some cases. If an application is badly written, and tries to access memory that it is not supposed to, DragonFly sends the process the ***Segmentation Violation*** signal (`SIGSEGV`). If an application has used the [alarm(3)](http://leaf.dragonflybsd.org/cgi/web-man?command=alarm&section=3) system call to be alerted after a period of time has elapsed then it will be sent the Alarm signal (`SIGALRM`), and so on.
+
+Two signals can be used to stop a process, `SIGTERM` and `SIGKILL`. `SIGTERM` is the polite way to kill a process; the process can ***catch*** the signal, realize that you want it to shut down, close any log files it may have open, and generally finish whatever it is doing at the time before shutting down. In some cases a process may even ignore `SIGTERM` if it is in the middle of some task that can not be interrupted.
+
+`SIGKILL` can not be ignored by a process. This is the ***I do not care what you are doing, stop right now*** signal. If you send `SIGKILL` to a process then DragonFly will stop that process there and then[(1)](#FTN.AEN2181).
+
+The other signals you might want to use are `SIGHUP`, `SIGUSR1`, and `SIGUSR2`. These are general purpose signals, and different applications will do different things when they are sent.
+
+Suppose that you have changed your web server's configuration file--you would like to tell the web server to re-read its configuration. You could stop and restart `httpd`, but this would result in a brief outage period on your web server, which may be undesirable. Most daemons are written to respond to the `SIGHUP` signal by re-reading their configuration file. So instead of killing and restarting `httpd` you would send it the `SIGHUP` signal. Because there is no standard way to respond to these signals, different daemons will have different behavior, so be sure and read the documentation for the daemon in question.
+
+Signals are sent using the [kill(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=kill&section=1) command, as this example shows.
+
+ **Sending a Signal to a Process** 
+
+This example shows how to send a signal to [inetd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=inetd&section=8). The `inetd` configuration file is `/etc/inetd.conf`, and `inetd` will re-read this configuration file when it is sent `SIGHUP`.
+
+  1. Find the process ID of the process you want to send the signal to. Do this using [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ps&section=1) and [grep(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=grep&section=1). The [grep(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=grep&section=1) command is used to search through output, looking for the string you specify. This command is run as a normal user, and [inetd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=inetd&section=8) is run as `root`, so the `ax` options must be given to [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ps&section=1).
+
+      
+
+        % ps -ax | grep inetd
+
+        198  ??  IWs    0:00.00 inetd -wW
+
+  
+
+  So the [inetd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#inetd&section8) PID is 198. In some cases the `grep inetd` command might also occur in this output. This is because of the way [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ps&section=1) has to find the list of running processes.
+
+  2. Use [kill(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=kill&section=1) to send the signal. Because [inetd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=inetd&section=8) is being run by `root` you must use [su(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=su&section=1) to become `root` first.
+
+      
+
+        % su
+
+        Password:
+
+        # /bin/kill -s HUP 198
+
+  
+
+  In common with most UNIX® commands, [kill(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=kill&section=1) will not print any output if it is successful. If you send a signal to a process that you do not own then you will see `kill: PID: Operation not permitted`. If you mistype the PID you will either send the signal to the wrong process, which could be bad, or, if you are lucky, you will have sent the signal to a PID that is not currently in use, and you will see `kill: PID: No such process`.
+
+**Why Use `/bin/kill`?** Many shells provide the `kill` command as a built in command; that is, the shell will send the signal directly, rather than running `/bin/kill`. This can be very useful, but different shells have a different syntax for specifying the name of the signal to send. Rather than try to learn all of them, it can be simpler just to use the `/bin/kill ...` command directly.
+
+Sending other signals is very similar, just substitute `TERM` or `KILL` in the command line as necessary.
+
+ **Important:** Killing random process on the system can be a bad idea. In particular, [init(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=init&section=8), process ID 1, is very special. Running `/bin/kill -s KILL 1` is a quick way to shutdown your system. ***Always*** double check the arguments you run [kill(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=kill&section=1) with ***before*** you press  **Return** .
+
+## Shells 
+
+In DragonFly, a lot of everyday work is done in a command line interface called a shell. A shell's main job is to take commands from the input channel and execute them. A lot of shells also have built in functions to help everyday tasks such as file management, file globbing, command line editing, command macros, and environment variables. DragonFly comes with a set of shells, such as `sh`, the Bourne Shell, and `tcsh`, the improved C-shell. Many other shells are available from pkgsrc®, such as `zsh` and `bash`.
+
+Which shell do you use? It is really a matter of taste. If you are a C programmer you might feel more comfortable with a C-like shell such as `tcsh`. If you have come from Linux or are new to a UNIX® command line interface you might try `bash`. The point is that each shell has unique properties that may or may not work with your preferred working environment, and that you have a choice of what shell to use.
+
+One common feature in a shell is filename completion. Given the typing of the first few letters of a command or filename, you can usually have the shell automatically complete the rest of the command or filename by hitting the  **Tab**  key on the keyboard. Here is an example. Suppose you have two files called `foobar` and `foo.bar`. You want to delete `foo.bar`. So what you would type on the keyboard is: `rm fo[ **Tab** ].[ **Tab** ]`.
+
+The shell would print out `rm foo[BEEP].bar`.
+
+The [BEEP] is the console bell, which is the shell telling me it was unable to totally complete the filename because there is more than one match. Both `foobar` and `foo.bar` start with `fo`, but it was able to complete to `foo`. If you type in `.`, then hit  **Tab**  again, the shell would be able to fill in the rest of the filename for you.
+
+Another feature of the shell is the use of environment variables. Environment variables are a variable key pair stored in the shell's environment space. This space can be read by any program invoked by the shell, and thus contains a lot of program configuration. Here is a list of common environment variables and what they mean:
+
+[[!table  data="""
+<tablestyle="width:100%"> Variable | Description 
+<tablestyle="width:100%"> `USER` | Current logged in user's name. 
+ `PATH` | Colon separated list of directories to search for binaries. 
+ `DISPLAY` | Network name of the X11 display to connect to, if available. 
+ `SHELL` | The current shell. 
+ `TERM` | The name of the user's terminal. Used to determine the capabilities of the terminal. 
+ `TERMCAP` | Database entry of the terminal escape codes to perform various terminal functions. 
+ `OSTYPE` | Type of operating system. e.g., DragonFly. 
+ `MACHTYPE` | The CPU architecture that the system is running on. 
+ `EDITOR` | The user's preferred text editor. 
+ `PAGER` | The user's preferred text pager. 
+ `MANPATH` | Colon separated list of directories to search for manual pages. |
+
+"""]]
+
+Setting an environment variable differs somewhat from shell to shell. For example, in the C-Style shells such as `tcsh` and `csh`, you would use `setenv` to set environment variables. Under Bourne shells such as `sh` and `bash`, you would use `export` to set your current environment variables. For example, to set or modify the `EDITOR` environment variable, under `csh` or `tcsh` a command like this would set `EDITOR` to `/usr/pkg/bin/emacs`:
+    
+
+    % setenv EDITOR /usr/pkg/bin/emacs
+
+Under Bourne shells:
+   
+
+    % export EDITOR="/usr/pkg/bin/emacs"
+
+You can also make most shells expand the environment variable by placing a `$` character in front of it on the command line. For example, `echo $TERM` would print out whatever `$TERM` is set to, because the shell expands `$TERM` and passes it on to `echo`.
+
+Shells treat a lot of special characters, called meta-characters as special representations of data. The most common one is the `*` character, which represents any number of characters in a filename. These special meta-characters can be used to do filename globbing. For example, typing in `echo *` is almost the same as typing in `ls` because the shell takes all the files that match `*` and puts them on the command line for `echo` to see.
+
+To prevent the shell from interpreting these special characters, they can be escaped from the shell by putting a backslash (`\`) character in front of them. `echo $TERM` prints whatever your terminal is set to. `echo \$TERM` prints `$TERM` as is.
+
+### Changing Your Shell 
+
+<!-- XXX: does chsh still exist? chpass will do, too -->
+
+The easiest way to change your shell is to use the `chsh` command. Running `chsh` will place you into the editor that is in your `EDITOR` environment variable; if it is not set, you will be placed in `vi`. Change the ***Shell:*** line accordingly.
+
+You can also give `chsh` the `-s` option; this will set your shell for you, without requiring you to enter an editor. For example, if you wanted to change your shell to `bash`, the following should do the trick:
+
+    
+
+    % chsh -s /usr/pkg/bin/bash
+
+ **Note:** The shell that you wish to use ***must*** be present in the `/etc/shells` file. If you have installed a shell from the [ pkgsrc tree ](pkgsrc.html), then this should have been done for you already. If you installed the shell by hand, you must do this.
+
+For example, if you installed `bash` by hand and placed it into `/usr/local/bin`, you would want to:
+
+    
+
+    # echo "/usr/local/bin/bash" >> /etc/shells
+
+Then rerun `chsh`.
+
+## Text Editors 
+
+A lot of configuration in DragonFly is done by editing text files. Because of this, it would be a good idea to become familiar with a text editor. DragonFly comes with a few as part of the base system, and many more are available in the pkgsrc® tree.
+
+The easiest and simplest editor to learn is an editor called  **ee** , which stands for easy editor. To start  **ee** , one would type at the command line `ee filename` where `filename` is the name of the file to be edited. For example, to edit `/etc/rc.conf`, type in `ee /etc/rc.conf`. Once inside of `ee`, all of the commands for manipulating the editor's functions are listed at the top of the display. The caret `^` character represents the  **Ctrl**  key on the keyboard, so `^e` expands to the key combination  **Ctrl** + **e** . To leave  **ee** , hit the  **Esc**  key, then choose leave editor. The editor will prompt you to save any changes if the file has been modified.
+
+DragonFly also comes with more powerful text editors such as  **vi**  as part of the base system, while other editors, like  **emacs**  and  **vim** , are part of the pkgsrc tree. These editors offer much more functionality and power at the expense of being a little more complicated to learn. However if you plan on doing a lot of text editing, learning a more powerful editor such as  **vim**  or  **emacs**  will save you much more time in the long run.
+
+## Devices and Device Nodes 
+
+A device is a term used mostly for hardware-related activities in a system, including disks, printers, graphics cards, and keyboards. When DragonFly boots, the majority of what DragonFly displays are devices being detected. You can look through the boot messages again by viewing `/var/run/dmesg.boot`.
+
+For example, `acd0` is the first IDE CDROM drive, while `kbd0` represents the keyboard.
+
+Most of these devices in a UNIX® operating system must be accessed through special files called device nodes, which are located in the `/dev` directory.
+
+The device nodes in the `/dev` directory are created and destroyed automatically on DragonFly >= 2.4, by means of the device file system (devfs).
+
+## Binary Formats 
+
+To understand why DragonFly uses the [elf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=elf&amp;section=5) format, you must first know a little about the three currently ***dominant*** executable formats for UNIX®:
+
+* [a.out(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=a.out&amp;section=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)](http://leaf.dragonflybsd.org/cgi/web-man?command=a.out&amp;section=5) for more details). It contains three loaded segments: .text, .data, and .bss plus a symbol table and a string table.
+
+* <u>COFF</u>
+
+  The SVR3 object format. The header now comprises a section table, so you can have more than just .text, .data, and .bss sections.
+
+* [elf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=elf&amp;section=5)
+
+  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. DragonFly 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)](http://leaf.dragonflybsd.org/cgi/web-man?command=brandelf&amp;section=1) for more information. DragonFly runs ELF.
+
+So, 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.
+
+ELF is more expressive than `a.out` and allows 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.
+
+<!-- XXX: do we really need all this bullshit about file formats? -->
+
+## For More Information 
+
+### Manual Pages 
+
+The most comprehensive documentation on DragonFly is in the form of manual pages. Nearly every program on the system comes with a short reference manual explaining the basic operation and various arguments. These manuals can be vie