@@ -8,51+8,57 @@ Thank you for your interest in DragonFly! The following chapter covers various a

After reading this chapter, you will know:

-* How DragonFly relates to other computer operating systems.

+* how DragonFly relates to other computer operating systems;

-* The history of the DragonFly Project.

+* the history of the DragonFly Project;

-* The goals of the DragonFly Project.

+* the goals of the DragonFly Project;

-* The basics of the DragonFly open-source development model.

+* the basics of the DragonFly open-source development model; and of course:

-* And of course: where the name ***DragonFly*** comes from.

+* 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.

+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.

+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. DragonFly 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.

+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.

+For example the `Hammer` filesystem, the default in DragonFly BSD, is the most powerful and reliable filesystem available on any operating system.

- 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 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, 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 centres and universities around the world, often available at little to no cost. Commercial applications are also available and appearing in greater numbers every day.

-The robust TCP/IP networking built into DragonFly makes it an ideal platform for a variety of Internet services such as:

+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 renders 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.

+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, 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:

+Here are some of the fields where people are using Dragonfly BSD, and the reasons that they find that 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!

+* ***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.

@@ -62,7+68,7 @@ Here are some of the fields where people are using Dragonfly BSD, and the reason

* ***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.

+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.

@@ -70,7+76,7 @@ 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.

+The following section provides some background information on the project, including a brief history, project goals, and the development model of the project.

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.

+Source for DragonFly is kept in [git](http://www.git.org/), 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.

+The only **supported** method of upgrading DragonFly BSD is by building from source code. The supported upgrade process includes going from the *previous release* to *latest release*.

### Getting the source code

@@ -113,7+115,7 @@ There is a Makefile in /usr which will ease the task of retrieving the source tr

% 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).

+This will check out (download) the source tree to `/usr/src` and switch to the master branch. For the 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

@@ -128,7+130,7 @@ 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.

+The build process requires some time to build all the userland programs and the DragonFly BSD kernel. Once built, the 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

@@ -138,24+140,20 @@ Build process requires some time to build all the userland programs and the Drag

% 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>

+**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. 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:

% 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>

+* <u>*make buildworld*</u> : This command builds all userland programs; it is the most time-consuming step of the process. Some programs may be discarded from the build process. For more information, see **[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 buildkernel*</u> : This builds the kernell by default, it uses the config file for your architecture. You may also specify a different kernel configuration file using `KERNCONF=<configfile>`. For more information, see **[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 installkernel*</u> This installs the kernel using the config file for your architecture; again, `KERNCONF=<configfile>` 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 installworld*</u> : This copies all the files built in the buildworld step (i.e. everything that is not the kernel) to their proper places in the file system.

* <u>*make upgrade*</u> : This cleans out any files made unnecessary by this upgrade.

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)**

+Additional upgrading instructions can be found in */usr/src/UPDATING* in the source tree. They can also be found online, **[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.

+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 have used another Unix flavour, another BSD, or Linux before, you may need to spend some time learning the differences between DragonFly and the system you are experienced in. 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.

+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, 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.

-When you create a HAMMER file system you must give it a label, here the installer labeled it as "ROOT" and mounted it as

+When you create a HAMMER file system, you must give it a label. Here, the installer labelled 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 `/`.

+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. The installer labeled it as ROOT because it is mounted at `/`.

-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`:

+Now inside the root HAMMER file system you find the installer created 7 PFSes from the `df -h` output above, let us see how they are mounted in `/etc/fstab`:

# cat /etc/fstab

@@ -266,11+266,12 @@ Now inside the ROOT HAMMER file system you find the installed created 7 PFSes fr

/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.

+The PFSes are mounted using a NULL mount because they are also HAMMER file systems. You can read more on NULL mounts at the [mount_null(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mount_null&section=8) manpage.

-Now if you look in `/var`

+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 PFSes; it can be seen in the `df -h` output above that the free space is the same for all PFSes and the root HAMMER file system.

+

+If you look in `/var`

# cd /var/

# ls

@@ -293,13+294,13 @@ If you look at the status of one of the PFSes, e.g. `/usr` you will see `/var/ha

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`

+At installation time, it will be seen that there is no "hammer" directory in `/var`. The reason for this is that no snapshots have yet been 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.

+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 activities, it will take a snapshot of the filesystem.

# sudo hammer cleanup

cleanup / - HAMMER UPGRADE: Creating snapshots

@@ -327,9+328,9 @@ Snapshots will appear automatically each night as the system performs housekeepi

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`.

+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 history is pruned, at which point the available disk space will stabilise. To prevent temporary files on the mentioned PFSes (e.g., object files, crash dumps) from consuming disk space, the PFSes are marked as `nohistory`.

-In `/var` will be a new directory called *hammer* with the following sub directories

+After performing nightly housekeeping, a new directory called *hammer* will be found in `/var` with the following sub directories:

# cd hammer/

# ls -l

@@ -340,7+341,8 @@ In `/var` will be a new directory called *hammer* with the following sub directo

+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). Make especially sure to 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/)

-DragonFly default installation contains the base software/programs from the DragonFly project itself and few other software from other sources.

+DragonFly default installation contains the base software/programs from the DragonFly project itself and additional 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.

+The configuration files for the base system can be found in `/etc`. Third-party programs use `/usr/local/etc`.

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`.

+For an in-depth description about dealing with packaging systems, see the [[dports howto|/docs/howtos/HowToDPorts/]] . Note that although DragonFly BSD has several older package managers (like `pkgin`), as of 2014 the most modern binary package installation system is `pkg`.

Dports is DragonFly's own third-party software build system. It is based on FreeBSD's Ports Collection. Differences between ports and DPorts are intentionally kept to a minimum, both to maintain familiarity for mutual users of both operating systems and also to leverage the tremendous amount of work the FreeBSD contributors put into ports. DPorts can and does feature ports unique to DragonFly, so it's truly a native system.

-The __pkgng__ tool called "pkg" is a modern and fast binary package manager. It was developed for FreeBSD, but PC-BSD used it in production first, followed soon after by DragonFly. In the future, it will be the only binary package manager on FreeBSD just as it is for DPorts.

+The __pkgng__ tool called "pkg" is a modern and fast binary package manager. It was developed for FreeBSD, but PC-BSD used it in production first, followed soon after by DragonFly. In the future, it will be the only binary package manager on FreeBSD, just as DPorts is currently the only port manager.

__pkgng__ is not a replacement for port management tools like `ports-mgmt/portmaster` or `ports-mgmt/portupgrade`. While `ports-mgmt/portmaster` and `ports-mgmt/portupgrade` can install third-party software from both binary packages and DPorts, __pkgng__ installs only binary packages.

## Getting started with pkgng

-DragonFly daily snapshots and Releases (starting with 3.4) come with __pkgng__ already installed. However upgrades from earlier releases won't have it. If the "pkg" program is missing on the system for any reason, it can be quickly bootstrapped without having to build it from source.

+DragonFly daily snapshots and Releases (starting with 3.4) come with __pkgng__ already installed. Upgrades from earlier releases, however, will not have it. If the "pkg" program is missing on the system for any reason, it can be quickly bootstrapped without having to build it from source.

To ensure __pkgng__ on a DragonFly BSD 3.4 or higher system is ready for use, run the following BEFORE you try to use `pkg` the first time:

@@ -1387,16+1390,17 @@ To ensure __pkgng__ on a DragonFly BSD 3.4 or higher system is ready for use,

# pkg upgrade

# rehash

-Since you may need to manually edit the configuration file `/usr/local/etc/pkg.conf` here is the

+Since you may need to manually edit the configuration file `/usr/local/etc/pkg.conf`, here is the

usual command to edit it using the vi editor:

# vi /usr/local/etc/pkg.conf

-Before using consult the man page (`man pkg`) and then try things like these examples:

+Before using consult the man page (`man pkg`) and then try these examples:

# pkg search editors

# pkg install vim

+

To bootstrap __pkgng__ with a download on a very old version of DragonFly that is still using `pkgsrc` run:

# make pkg-bootstrap

@@ -1408,38+1412,83 @@ Note that this step is unnecessary for any newly installed release from DragonFl

## Configuring pkgng

-Information previously contained in here worked for older versions of pkg, but as pkgng has undergone some changes, so too do the configurations.

+Older versions of pkgng saved their configuration at /usr/local/etc/pkg.conf; this file made reference to a PACKAGESITE. pkgng will still work based on this file, but will output errors:

-Previously /usr/local/etc/pkg.conf was used and reference to a PACKAGESITE was made. This might still work but it'll complain.

* Packages do not require any understanding of the process involved in compiling software on DragonFly.

+

**Pkgsrc source Benefits**

+

* Binary packages are normally compiled with conservative options, because they have to run on the maximum number of systems. By installing from the source, you can tweak the compilation options to (for example) generate code that is specific to a Pentium IV or Athlon processor.

* Some applications have compile time options relating to what they can and cannot do. For example, <i>Apache</i> can be configured with a wide variety of different built-in options. By building from the source you do not have to accept the default options, and can set them yourself. In some cases, multiple packages will exist for the same application to specify certain settings. For example, <i>vim</i> is available as a `vim` package and a `vim-gtk` package, depending on whether you have installed an X11 server. This sort of rough tweaking is possible with packages, but rapidly becomes impossible if an application has more than one or two different compile time options.

@@ -1822,12+1874,14 @@ You can manually set `BINPKG_BASE` and use *pkg_add* to get the same effect, usi

# setenv BINPKG_BASE http://mirror-master.dragonflybsd.org/packages

# pkg_add screen

+

#### Issues with pre-built packages

* The default remote repository for binary packages tracks quarterly pkgsrc releases, so your local install of pkgsrc should be the same quarterly release.

* Some packages are not licensed for distribution in binary form, so they may be able to build on DragonFly but won't be available with *pkg_radd*. If it fails, try going to that package's directory and install the package manually as described above.

* If you upgrade to an new DEVELOPMENT version of DragonFly very early (i.e. shortly after the branch), it might be possible that *pkg_radd* fails to install packages. This is due the fact, that it takes some time to built binary packages and thus, there are no binary packages available on the mirrors yet. Usually you'll see an announcement on the lists once the first packages for DEVELOPMENT are ready.

+

### List all installed applications

To obtain a list of all the packages that are installed on your system:

@@ -1882,6+1936,7 @@ And go to the packages directory and install the binary package with

# cd /usr/pkgsrc/packages/All

# pkg_add -u <pkg_name> (i.e. the name of the .tgz file).

+

### bmake replace

Performed in the `/usr/pkgsrc` directory that correlates with the installed package, the software is first built and then replaced.

You can issue the reboot(8), halt(8), or shutdown(8) commands from inside a virtual kernel. After doing a clean shutdown the reboot(8) command will re-exec the virtual kernel binary while the other two will cause the virtual kernel to exit.

+

# The DragonFly Booting Process

[[!toc levels=3]]

@@ -4113,7+4169,7 @@ To power down a DragonFly machine on architectures and systems that support powe

## Synopsis

-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.

+Unix, including DragonFly BSD is, as previously explained, a multi-user, multi-tasking system. It is therefore possible, and in fact very common, to have a situation where many users are logged on to one computer, and every one of these users is running many different jobs. Although only one user can physically sit at the computer and use the monitor, keyboard, and mouse connected thereto, others can get their work done by logging in through the network.

After reading this chapter, you will know:

@@ -4572,6+4628,316 @@ As you can see, `jru` is a member of the groups `jru` and `teamtwo`.

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.

+#SSH Server on DragonFly

+

+The best way to log in to a Unix machine across the network is with a program known as ssh.

+

+If you try to ssh to a newly installed dfly from another system you will get this error

+

+ $ ssh root@172.16.50.62

+ ssh: connect to host 172.16.50.62 port 22: Connection refused

+

+This is because sshd is not up and running on dfly.

+At this point if you check /etc/ssh you will only have the following files

+

+ # ls /etc/ssh

+ blacklist.DSA-1024 blacklist.RSA-2048 ssh_config

+ blacklist.DSA-2048 blacklist.RSA-4096 sshd_config

+ blacklist.RSA-1024 moduli

+

+You don't have any SSH host keys generated for the system yet!

+

+When you start sshd for the first time it is best to start it through the <b>"/etc/rc.d/sshd"</b> script which will automatically generate the host keys. For this to work right you need to do the following steps (these steps are not essential for DragonFly 2.8.2 since sshd is already enabled in rc.conf)

+

+1) Enable sshd in rc.conf

+

+ #echo "sshd_enable=yes" >> /etc/rc.conf

+

+2) Start the sshd server using the rc script

+

+ # /etc/rc.d/sshd start

+ Generating public/private rsa1 key pair.

+ Your identification has been saved in /etc/ssh/ssh_host_key.

+ Your public key has been saved in /etc/ssh/ssh_host_key.pub.

+ The key fingerprint is:

+ ........

+ Generating public/private dsa key pair.

+ Your identification has been saved in /etc/ssh/ssh_host_dsa_key.

+ Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.

+ The key fingerprint is:

+ ........

+ Starting sshd.

+

+Now if you go back and look in /etc/ssh you will find the SSH host key files too.

+

+ # ls /etc/ssh

+ blacklist.DSA-1024 moduli ssh_host_key.pub

+ blacklist.DSA-2048 ssh_config ssh_host_rsa_key

+ blacklist.RSA-1024 ssh_host_dsa_key ssh_host_rsa_key.pub

+ blacklist.RSA-2048 ssh_host_dsa_key.pub sshd_config

+ blacklist.RSA-4096 ssh_host_key

+

+At this point if you try to ssh to the dfly you will get the following error

+

+ $ ssh sgeorge@172.16.50.62

+ The authenticity of host '172.16.50.62 (172.16.50.62)' can't be established.

+** It is not advisable to allow Root Login with password especially if your System is connected to the Internet unless you use Very Strong Passwords. You could be a victim of [ssh password based brute force attacks](http://en.wikipedia.org/wiki/Password_cracking#Brute_force_attack). If you are victim of one such attack you can find entries like the following in your** ****"/var/log/auth.log file"****.

+Unix, including DragonFly BSD is, as previously explained, a multi-user, multi-tasking system. It is therefore possible, and in fact very common, to have a situation where many users are logged on to one computer, and every one of these users is running many different jobs. Although only one user can physically sit at the computer and use the monitor, keyboard, and mouse connected thereto, others can log in through the network.

+

+This document is very detailed so that a new user can be familiar with the environment.

+

+If you try to ssh to a newly installed dfly from another system you will get this error

+

+ $ ssh root@172.16.50.62

+ ssh: connect to host 172.16.50.62 port 22: Connection refused

+

+This is because sshd is not up and running on dfly.

+At this point if you check /etc/ssh you will only have the following files

+

+ # ls /etc/ssh

+ blacklist.DSA-1024 blacklist.RSA-2048 ssh_config

+ blacklist.DSA-2048 blacklist.RSA-4096 sshd_config

+ blacklist.RSA-1024 moduli

+

+You don't have any SSH host keys generated for the system yet!

+

+When you start sshd for the first time it is best to start it through the <b>"/etc/rc.d/sshd"</b> script which will automatically generate the host keys. For this to work right you need to do the following steps (these steps are not essential for DragonFly 2.8.2 since sshd is already enabled in rc.conf)

+

+1) Enable sshd in rc.conf

+

+ #echo "sshd_enable=yes" >> /etc/rc.conf

+

+2) Start the sshd server using the rc script

+

+ # /etc/rc.d/sshd start

+ Generating public/private rsa1 key pair.

+ Your identification has been saved in /etc/ssh/ssh_host_key.

+ Your public key has been saved in /etc/ssh/ssh_host_key.pub.

+ The key fingerprint is:

+ ........

+ Generating public/private dsa key pair.

+ Your identification has been saved in /etc/ssh/ssh_host_dsa_key.

+ Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.

+ The key fingerprint is:

+ ........

+ Starting sshd.

+

+Now if you go back and look in /etc/ssh you will find the SSH host key files too.

+

+ # ls /etc/ssh

+ blacklist.DSA-1024 moduli ssh_host_key.pub

+ blacklist.DSA-2048 ssh_config ssh_host_rsa_key

+ blacklist.RSA-1024 ssh_host_dsa_key ssh_host_rsa_key.pub

+ blacklist.RSA-2048 ssh_host_dsa_key.pub sshd_config

+ blacklist.RSA-4096 ssh_host_key

+

+At this point if you try to ssh to the dfly you will get the following error

+

+ $ ssh sgeorge@172.16.50.62

+ The authenticity of host '172.16.50.62 (172.16.50.62)' can't be established.

+** It is not advisable to allow Root Login with password especially if your System is connected to the Internet unless you use Very Strong Passwords. You could be a victim of [ssh password based brute force attacks](http://en.wikipedia.org/wiki/Password_cracking#Brute_force_attack). If you are victim of one such attack you can find entries like the following in your** ****"/var/log/auth.log file"****.

***Updated and restructured by Jim Mock. Originally contributed by Jake Hamby.***

@@ -7214,8215+7580,6 @@ These variables can be used by the system administrator of the host system to ad

# 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.

-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]).

-* 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].

- **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:

-[ ./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`.

-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.

-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`.

-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.

- **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. 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.

-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>

-* <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

-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.

- `/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).

- `/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/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`.

- `/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/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.

-* [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).

-* 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

-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.

- `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).

-[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:

-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:

-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:

-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®:

- 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.

- 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 viewed with the `man` command. Use of the `man` command is simple:

-

- % man command

-

-`command` is the name of the command you wish to learn about. For example, to learn more about `ls` command type:

-

- % man ls

-

-The online manual is divided up into numbered sections:

-

- 1. User commands.

- 1. System calls and error numbers.

- 1. Functions in the C libraries.

- 1. Device drivers.

- 1. File formats.

- 1. Games and other diversions.

- 1. Miscellaneous information.

- 1. System maintenance and operation commands.

- 1. Kernel internals.

-

-In some cases, the same topic may appear in more than one section of the online manual. For example, there is a `chmod` user command and a `chmod()` system call. In this case, you can tell the `man` command which one you want by specifying the section:

-

-

- % man 1 chmod

-

-This will display the manual page for the user command `chmod`. References to a particular section of the online manual are traditionally placed in parenthesis in written documentation, so [chmod(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chmod&section=1) refers to the `chmod` user command and [chmod(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chmod&section=2) refers to the system call.

-

-This is fine if you know the name of the command and simply wish to know how to use it, but what if you cannot recall the command name? You can use `man` to search for keywords in the command descriptions by using the `-k` switch:

-

-

-

- % man -k mail

-

-With this command you will be presented with a list of commands that have the keyword ***mail*** in their descriptions. This is actually functionally equivalent to using the `apropos` command.

-

-So, you are looking at all those fancy commands in `/usr/bin` but do not have the faintest idea what most of them actually do? Simply do:

-

- % cd /usr/bin

- % man -f *

-

-or

-

-

- % cd /usr/bin

- % whatis *

-

-which does the same thing.

-

-### GNU Info Files

-

-DragonFly includes many applications and utilities produced by the Free Software Foundation (FSF). In addition to manual pages, these programs come with more extensive hypertext documents called `info` files which can be viewed with the `info` command or, if you installed **emacs** , the info mode of **emacs** . To use the [info(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=info&section=1) command, simply type:

-Dports is DragonFly's own third-party software build system. It is based on FreeBSD's Ports Collection. Differences between ports and DPorts are intentionally kept to a minimum, both to maintain familiarity for mutual users of both operating systems and also to leverage the tremendous amount of work the FreeBSD contributors put into ports. DPorts can and does feature ports unique to DragonFly, so it's truly a native system.

-

-The __pkgng__ tool called "pkg" is a modern and fast binary package manager. It was developed for FreeBSD, but PC-BSD used it in production first, followed soon after by DragonFly. In the future, it will be the only binary package manager on FreeBSD just as it is for DPorts.

-

-__pkgng__ is not a replacement for port management tools like `ports-mgmt/portmaster` or `ports-mgmt/portupgrade`. While `ports-mgmt/portmaster` and `ports-mgmt/portupgrade` can install third-party software from both binary packages and DPorts, __pkgng__ installs only binary packages.

-

-## Getting started with pkgng

-

-DragonFly daily snapshots and Releases (starting with 3.4) come with __pkgng__ already installed. However upgrades from earlier releases won't have it. If the "pkg" program is missing on the system for any reason, it can be quickly bootstrapped without having to build it from source.

-

-To ensure __pkgng__ on a DragonFly BSD 3.4 or higher system is ready for use, run the following BEFORE you try to use `pkg` the first time:

-

- # cd /usr

- # make dports-create

- # rm -rf /usr/pkg

- # pkg upgrade

- # rehash

-

-Since you may need to manually edit the configuration file `/usr/local/etc/pkg.conf` here is the

-usual command to edit it using the vi editor:

-

- # vi /usr/local/etc/pkg.conf

-

-Before using consult the man page (`man pkg`) and then try things like these examples:

-

- # pkg search editors

- # pkg install vim

-

-To bootstrap __pkgng__ with a download on a very old version of DragonFly that is still using `pkgsrc` run:

-

- # make pkg-bootstrap

- # rehash

- # pkg-static install -y pkg

- # rehash

-

-Note that this step is unnecessary for any newly installed release from DragonFly 3.4 onwards.

-

-## Configuring pkgng

-

-Information previously contained in here worked for older versions of pkg, but as pkgng has undergone some changes, so too do the configurations.

-

-Previously /usr/local/etc/pkg.conf was used and reference to a PACKAGESITE was made. This might still work but it'll complain.

-pkg: Warning: use of http:// URL scheme with SRV records is deprecated: switch to pkg+http://

-

-Insead, listen to the errors. Throw an octothorpe in front of that packagesite line, save it, and move on.

-

-Go to /usr/local/etc/pkg/repos/

-

-You should see something like this with an ls

-

-df-latest.conf.sample df-releases.conf.sample

-

-cp or mv one of them to be .conf

-

-edit the one you choose and make the following changes. (I edited the latest version)

-

-Avalon: {

- url : pkg+http://mirror-master.dragonflybsd.org/dports/${ABI}/L\

-ATEST,

- mirror_type : SRV,

- signature_type : NONE,

- pubkey : NONE,

- fingerprints : /usr/share/fingerprints,

- enabled : yes

-}

-

-Depending on when and how you installed and/or upgraded, you may have to chmod 644 the file first to be able to edit it.

-

-## Basic pkgng Operations

-

-Usage information for __pkgng__ is available in the pkg(8) manual page, or by running `pkg` without additional arguments.

-

-Each __pkgng__ command argument is documented in a command-specific manual page. To read the manual page for `pkg install`, for example, run either:

-

- # pkg help install

- # man pkg-install

-

-## Obtaining Information About Installed Packages with pkgng

-

-Information about the packages installed on a system can be viewed by running `pkg info`. Similar to pkg_info(1), the package version and description for all packages will be listed. Information about a specific package is available by running:

-

- # pkg info packagename

-

-For example, to see which version of __pkgng__ is installed on the system, run:

-Packages that are no longer needed can be removed with `pkg delete`. For example, if it turns out that curl is not needed after all:

-

- # pkg delete curl

- The following packages will be deleted:

-

- curl-7.24.0_1

-

- The deletion will free 3 MB

-

- Proceed with deleting packages [y/N]: y

- Deleting curl-7.24.0_1... done

-

-## Upgrading Installed Packages with pkgng

-

-Packages that are outdated can be found with `pkg version`. If a local ports tree does not exist, pkg-version(8) will use the remote repository catalogue, otherwise the local ports tree will be used to identify package versions.

-

-Packages can be upgraded to newer versions with __pkgng__. Suppose a new version of curl has been released. The local package can be upgraded to the new version:

-

- # pkg upgrade

- Updating repository catalogue

- repo.txz 100% 297KB 296.5KB/s 296.5KB/s 00:00

- The following packages will be upgraded:

-

- Upgrading curl: 7.24.0 -> 7.24.0_1

-

- 1 MB to be downloaded

-

- Proceed with upgrading packages [y/N]: y

- curl-7.24.0_1.txz 100% 1108KB 1.1MB/s 1.1MB/s 00:00

- Checking integrity... done

- Upgrading curl from 7.24.0 to 7.24.0_1... done

-

-## Auditing Installed Packages with pkgng

-

-Occasionally, software vulnerabilities may be discovered in software within DPorts. __pkgng__ includes built-in auditing. To audit the software installed on the system, type:

-

- # pkg audit -F

-

-# Advanced pkgng Operations

-

-## Automatically Removing Leaf Dependencies with pkgng

-

-Removing a package may leave behind unnecessary dependencies, like `security/ca_root_nss` in the example above. Such packages are still installed, but nothing depends on them any more. Unneeded packages that were installed as dependencies can be automatically detected and removed:

-

- # pkg autoremove

- Packages to be autoremoved:

- ca_root_nss-3.13.5

-

- The autoremoval will free 723 kB

-

- Proceed with autoremoval of packages [y/N]: y

- Deinstalling ca_root_nss-3.13.5... done

-

-## Backing Up the pkgng Package Database

-

-__pkgng__ includes its own package database backup mechanism. To manually back up the package database contents, type:

-

- # pkg backup -d <pkgng.db>

-

-Additionally, __pkgng__ includes a periodic(8) script to automatically back up the package database daily if `daily_backup_pkgng_enable` is set to `YES` in periodic.conf(5). To prevent the `pkg_install` periodic script from also backing up the package database, set `daily_backup_pkgdb_enable` to `NO` in periodic.conf(5).

-

-To restore the contents of a previous package database backup, run:

-

- # pkg backup -r </path/to/pkgng.db>

-

-## Removing Stale pkgng Packages

-

-By default, __pkgng__ stores binary packages in a cache directory as defined by `PKG_CACHEDIR` in pkg.conf(5). When upgrading packages with pkg upgrade, old versions of the upgraded packages are not automatically removed.

-

-To remove the outdated binary packages, type:

-

- # pkg clean

-

-##Modifying pkgng Package Metadata

-

-__pkgng__ has a built-in command to update package origins. For example, if `lang/php5` was originally at version 5.3, but has been renamed to lang/php53 for the inclusion of version 5.4, the package database can be updated to deal with this. For __pkgng__, the syntax is:

-

- # pkg set -o <category/oldport>:<category/newport>

-

-For example, to change the package origin for the above example, type:

-

- # pkg set -o lang/php5:lang/php53

-

-As another example, to update lang/ruby18 to lang/ruby19, type:

-

- # pkg set -o lang/ruby18:lang/ruby19

-

-As a final example, to change the origin of the libglut shared libraries from graphics/libglut to graphics/freeglut, type:

-

- # pkg set -o graphics/libglut:graphics/freeglut

-

-_Note_: When changing package origins, in most cases it is important to reinstall packages that are dependent on the package that has had the origin changed. To force a reinstallation of dependent packages, type:

-

- # pkg install -Rf graphics/freeglut

-

-# Building DPorts from source

-

-The average user will probably not build packages from source. However, it's easy to do and it can be done even when packages have already been pre-installed on the system. Common reasons to build from source are:

-

-* The port is new and there's no pre-binary available yet

-* The pre-built binaries use the default options and the user needs a package built with a different set of options

-* Testing FreeBSD port in order to patch them and submit to DPorts

-* The user just prefers building from source

-

-## Installing DPorts tree

-

-DragonFly 3.4 or later is the minimum version that can build DPorts from source.

-

-It's probably that pkgsrc binaries are already installed because it comes bootstrapped with new systems. It is necessary to rename `/usr/pkg` directory so that the existing pkgsrc binary tools and libraries don’t get accidentally used while building DPorts, causing breakage. For the installation of the DPorts tree, type:

-

- # cd /usr

- # make dports-create-shallow

-

-If the `/usr/pkg directory` has already been renamed, `git` won’t be in the search path any more. One option is to download a tarball of DPorts and unpack it. To do this, type:

-

- # cd /usr

- # make dports-download

-

-For future updates, pull delta changes via `git` is fastest, so it is suggested to convert the static tree to a git repository by typing:

-

- # cd /usr/dports/devel/git

- # make install

- # cd /usr

- # rm -rf /usr/dports

- # make dports-create-shallow

-

-The git repository is hosted on the [github account of John Marino](https://github.com/jrmarino/DPorts/#readme).

-

-## Final thoughts

-

-Building from source works similar to ports and pkgsrc: cd into the appropriate program's directory, and type 'make'. 'make install' to install the software, 'make clean' to clean up work files, and so on. Use 'make config-recursive' if you want to set all the port's options, and the options of its dependencies, immediately instead of during the build.

-

-To take all the default build options and avoid getting the pop-up dialog box, set `NO_DIALOG=yes` on either the command line or the make.conf file.

-

-If you just want to set the options for one package, and accept the default for all of its dependencies, do 'make config' in the package in you want non-default options, and then 'make NO_DIALOG=yes'. Note that this is only necessary if you want to build from source with a non-default set of options, or if no pre-built binary package is available yet.

-

-## More reading

-* How fix/add broken ports: [[docs/howtos/fixdports]]

-* [Trick: How to get i386-only software via dports](http://leaf.dragonflybsd.org/mailarchive/users/2013-06/msg00023.html)

-

-# Disclaimer

-

-DragonFly, up to and including version 3.4, used pkgsrc to manage third party software packages. DragonFly switched to dports at the 3.6 release.

-

-This page is still useful for anyone wanting to use pkgsrc, but the recommended packaging method is dports, which is covered in a similar document here:

-of the official pkgsrc repository to make pkgsrc distribution more user-friendly.

-

-The basics of the pkgsrc system can be found in NetBSD's [Pkgsrc Guide](http://www.netbsd.org/docs/pkgsrc/), and can be considered the canonical resource.

-

-[[!toc levels=3 ]]

-

-## Overview

-

-### History

-[Pkgsrc](http://www.pkgsrc.org) is a packaging system that was originally created for NetBSD. It has been ported to DragonFly, along with other operating systems. Pkgsrc is very similar to FreeBSD's ports mechanism.

-

-### Overview

-

-The pkgsrc collection supplies a collection of files designed to automate the process of compiling an application from source code. Remember that there are a number of steps you would normally carry out if you compiled a program yourself (downloading, unpacking, patching, compiling, installing). The files that make up a pkgsrc source collection contain all the necessary information to allow the system to do this for you. You run a handful of simple commands and the source code for the application is automatically downloaded, extracted, patched, compiled, and installed for you. In fact, the pkgsrc source subsystem can also be used to generate packages which can later be manipulated with `pkg_add` and the other package management commands that will be introduced shortly.

-

-Pkgsrc understands ***dependencies***. Suppose you want to install an application that depends on a specific library being installed. Both the application and the library have been made available through the pkgsrc collection. If you use the `pkg_add` command or the pkgsrc subsystem to add the application, both will notice that the library has not been installed, and automatically install the library first. You might be wondering why pkgsrc® bothers with both. Binary packages and the source tree both have their own strengths, and which one you use will depend on your own preference.

-

- **Binary Package Benefits**

-

-* A compressed package tarball is typically smaller than the compressed tarball containing the source code for the application.

-

-* Packages do not require any additional compilation. For large applications, such as ***Mozilla***, ***KDE***, or ***GNOME*** this can be important, particularly if you are on a slow system.

-

-* Packages do not require any understanding of the process involved in compiling software on DragonFly.

-

-**Pkgsrc source Benefits**

-

-* Binary packages are normally compiled with conservative options, because they have to run on the maximum number of systems. By installing from the source, you can tweak the compilation options to (for example) generate code that is specific to a Pentium IV or Athlon processor.

-

-* Some applications have compile time options relating to what they can and cannot do. For example, <i>Apache</i> can be configured with a wide variety of different built-in options. By building from the source you do not have to accept the default options, and can set them yourself. In some cases, multiple packages will exist for the same application to specify certain settings. For example, <i>vim</i> is available as a `vim` package and a `vim-gtk` package, depending on whether you have installed an X11 server. This sort of rough tweaking is possible with packages, but rapidly becomes impossible if an application has more than one or two different compile time options.

-

-* The licensing conditions of some software distributions forbid binary distribution. They must be distributed as source code.

-

-* Some people do not trust binary distributions. With source code, it is possible to check for any vulnerabilities built into the program before installing it to an otherwise secure system. Few people perform this much review, however.

-

-* If you have local patches, you will need the source in order to apply them.

-

-* Some people like having code around, so they can read it if they get bored, hack it, debug crashes, borrow from it (license permitting, of course), and so on.

-

-To keep track of pkgsrc releases subscribe to the [NetBSD pkgsrc users mailing list](http://www.netbsd.org/MailingLists/pkgsrc-users) and the [NetBSD pkgsrc users mailing list](http://www.netbsd.org/MailingLists/tech-pkgsrc). It's also useful to watch the [DragonFly User related mailing list](http://leaf.dragonflybsd.org/mailarchive/) as errors with pkgsrc on DragonFly should be reported there.

-

- **Warning:** Before installing any application, you should check http://www.pkgsrc.org/ for security issues related to your application.

-

-Audit-packages will automatically check all installed applications for known vulnerabilities, a check will be also performed before any application build. Meanwhile, you can use the command `audit-packages -d` after you have installed some packages.

-

-**Note:** Binary packages and source packages are effectively the same software and can be manipulated with the same pkg_* tools.

-

-## Installing pkgsrc

-

-The basic pkgsrc tools are provided with every DragonFly system as part of installation. However, you still need to download the pkgsrc tree for building applications with these tools.

-

-Set GITHOST in /etc/make.conf or set it as an environment variable to select a different download location, if desired. See mirrors page for available mirrors.

-

-This downloads the stable version of the pkgsrc tree from the default mirror, if you didn't set GITHOST. As root:

-

- # cd /usr

- # make pkgsrc-create

-

-to fetch the intial pkgsrc repository from the net, or

-

- # cd /usr

- # make pkgsrc-update

-

-to update.

-

-**Note**: If your DragonFly install is not up to date, you might have ended up with an old release of the pkgsrc tree.

-

- # cd /usr/pkgsrc

- # git branch

-

-will show what release you are on. See Tracking the stable branch for more information.

-

-### Tracking the stable branch

-

-There are quarterly releases of pkgsrc that are specifically designed for stability. You should in general follow these, rather than the bleeding edge pkgsrc. When a new branch is out you need to set up a local branch tracking that one. 'make pkgsrc-update' will not do this for you.

-

-To see the available remote branches:

-

- # cd /usr/pkgsrc

- # git pull

- # git branch -r

-

-To create a local branch, tracking the remote quarterly release:

-

- # cd /usr/pkgsrc

- # git branch pkgsrc-2010Q4 origin/pkgsrc-2010Q4

-

-Branch naming format is 'pkgsrc-YYYYQX', where YYYY is the year and QX is quarters 1-4 of the year. Check [pkgsrc.org](http://www.pkgsrc.org/) to see the name of the latest stable branch.

-

-After adding a new branch, it can be downloaded with:

-

- # cd /usr/pkgsrc

- # git checkout pkgsrc-2010Q4

- # git pull

-

-## Dealing with pkgsrc packages

-

-The following section explains how to find, install and remove pkgsrc packages.

-

-### Finding Your Application

-

-Before you can install any applications you need to know what you want, and what the application is called. DragonFly's list of available applications is growing all the time. Fortunately, there are a number of ways to find what you want:

-

-Since DragonFly 1.11 [pkg_search(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=pkg_search&section1) is included in the base system. [pkg_search(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=pkg_search&section=1) searches an already installed pkgsrc INDEX for for a given package name. If pkgsrc is not installed or the INDEX file is missing, it fetches the [pkg_summary(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=pkg_summary&section=5) file.

-

- # pkg_search fvwm

- fvwm-2.4.20nb1 Newer version of X11 Virtual window manager

- fvwm-2.5.24 Development version of X11 Virtual window manager

- fvwm-themes-0.6.2nb8 Configuration framework for fvwm2 with samples

- fvwm-wharf-1.0nb1 Copy of AfterStep's Wharf compatible with fvwm2

- fvwm1-1.24rnb1 Virtual window manager for X

-

- # pkg_search -v fvwm-2.5

- Name : fvwm-2.5.24-50

- Dir : wm/fvwm-devel

- Desc : Development version of X11 Virtual window manager

- URL : any

- Deps : perl>#5.0 gettext-lib>0.14.5 [...]

-

-Its also possible to issue the command

-

- # cd /usr/pkgsrc/

- # bmake search key='package you are looking for'

-

-from the `/usr/pkgsrc` directory.

-

-It's also possible to browse website that show all the available pkgsrc packages, such as [http://pkgsrc.se/](http://pkgsrc.se) .

-

-### Installing applications

-

-Downloading a binary package is almost always faster than building from source, but not all programs in pkgsrc can be redistributed as a binary. In most cases, you will want to download a binary package if possible, and otherwise build from source if it's not available.

-

-The `bin-install` target on DragonFly (with pkgsrc from 2011/02/07 and later) will do just that:

-

- # cd /usr/pkgsrc/misc/screen

- # bmake bin-install clean

-

-This will download and install the appropriate `screen` binary package if it exists, and try building from source if it can't complete the download.

-

-### Installing applications, source only

-

-Packages are built by going into the appropriate directory and issuing `bmake install clean`. For example, to build the *screen* package you need to issue the following commands.

-

- # cd /usr/pkgsrc/misc/screen

- # bmake install clean

-

-To find out the options that can affect how a program is built:

-

- # bmake show-options

-

-To change options:

-

- # bmake PKG_OPTIONS.<package_name>="-option1 option2" install clean

-

-Listing an option enables it. Listing an option with a "-" before it disables the option.

-

-To make these option changes permanent for every future build or upgrade of this package, put a similar line in `/usr/pkg/etc/mk.conf`:

-

- . PKG_OPTIONS.<package_name>=-option1 option2

-

-### Installing applications, binary only

-

-Binary packages can be installed using *pkg_radd*:

-

- # pkg_radd screen

-

-This program works by setting the `PKG_PATH` environment variable to the appropriate path for the operating system and architecture to a remote repository of binary packages, and then using *pkg_add* to get packages. This will install most packages, but will not upgrade packages that are already installed.

-

-You can manually set `BINPKG_BASE` and use *pkg_add* to get the same effect, using a different server.

-

- # setenv BINPKG_BASE http://mirror-master.dragonflybsd.org/packages

- # pkg_add screen

-

-#### Issues with pre-built packages

-

-* The default remote repository for binary packages tracks quarterly pkgsrc releases, so your local install of pkgsrc should be the same quarterly release.

-* Some packages are not licensed for distribution in binary form, so they may be able to build on DragonFly but won't be available with *pkg_radd*. If it fails, try going to that package's directory and install the package manually as described above.

-* If you upgrade to an new DEVELOPMENT version of DragonFly very early (i.e. shortly after the branch), it might be possible that *pkg_radd* fails to install packages. This is due the fact, that it takes some time to built binary packages and thus, there are no binary packages available on the mirrors yet. Usually you'll see an announcement on the lists once the first packages for DEVELOPMENT are ready.

-

-### List all installed applications

-

-To obtain a list of all the packages that are installed on your system:

-

- # pkg_info

-

-To see if certain packages have been installed, filter for the name of the package. This example will show all *xorg*-related packages currently installed on the system:

-

- # pkg_info | grep xorg

-

-### Removing packages

-

-If a program was installed as a package:

-

- # pkg_delete packagename

-

-If a package was installed from the source files, you can also change to the directory they were installed from and issue the command:

-

- # bmake deinstall

-

-Note that these methods are effectively interchangeable. Either will work whether the package was originally installed from source or binary.

-

-#### Remove associated files needed for building a package

-

-To remove the work file from building a package, and the package's dependencies:

-

- # bmake clean clean-depends

-

-This can be combined with other steps:

-

- # bmake install clean clean-depends

-

-## Upgrading packages

-

-There's a number of ways to upgrade pkgsrc; some of these are built in and some are packages installable with pkgsrc. This list is not necessarily comprehensive.

-

-### Update pkgsrc system packages

-

-**Note**: Sometimes basic pkgsrc tools; *bmake*, *pkg_install* and *bootstrap-mk-files* need to be upgraded. However, they can't be deleted and replaced since you need that tool to accomplish replacement. The solution is to build a separate package before deletion, and install that package.

-

- # cd /usr/pkgsrc/devel/bmake

- or

- # cd /usr/pkgsrc/pkgtools/pkg_install

- or

- # cd /usr/pkgsrc/pkgtools/bootstrap-mk-files

-

- # env USE_DESTDIR=yes bmake package

- # bmake clean-depends clean

-

-And go to the packages directory and install the binary package with

-

- # cd /usr/pkgsrc/packages/All

- # pkg_add -u <pkg_name> (i.e. the name of the .tgz file).

-

-### bmake replace

-Performed in the `/usr/pkgsrc` directory that correlates with the installed package, the software is first built and then replaced.

-

- # cd /usr/pkgsrc/chat/ircII

- # bmake replace

-

-### pkg_rolling-replace

-

-*pkg_rolling-replace* replaces packages one by one and you can use it for a better way of package management. Actually it does `bmake replace` on one package at a time, sorting the packages being replaced according to their interdependencies, which avoids most duplicate rebuilds. Once *pkg_rolling-replace* is installed you can update the packages through the following steps.

-

- # cd /usr && make pkgsrc-update

- # pkg_rolling-replace -u

-

-### pkgin

-

-Downloads and installs binary packages. Check the [[mirrors]] page for sites carrying binary packages to use with pkgin. You can run the following commands to get the packages updated. This assumes that *pkgin* is already configured. Please consult the documentation and the man page on how to do so.

-

- # pkgin update

- # pkgin full-upgrade

-

-### pkg_chk

-

-It updates packages by removing them and rebuilding them. Warning: programs are unavailable until a rebuild finishes. If they don't rebuild, it won't work. *pkg_chk* requires a few steps in order to work correctly. They are listed here.

-

- # pkg_chk -g # make initial list of installed packages

- # pkg_chk -r # remove all packages that are not up to date and packages that depend on them

-The above process removes all packages at once and installs the missing packages one by one. This can cause longer disruption of services when the removed package has to wait a long time for its turn to get installed.

-

-### pkg_add -u

-

-Point at a local or online binary archive location to download and update packages.

-

-### rpkgmanager

-

-This requires that you've set up rpkgmanager first. Read more about rpkgmanager [[here|docs/howtos/rpkgmanager/]].

-

- # yes | rpkgmanager.rb

-

-## Start pkgsrc applications on system startup

-

-Packages often install rc.d scripts to control software running on startup. To specify where the rc.d scripts from the installed packages should go, add the following lines to your `/usr/pkg/etc/mk.conf` file:

-

- RCD_SCRIPTS_DIR=/etc/rc.d

- PKG_RCD_SCRIPTS=YES

-

-This option can be set in the environment to activate it for binary packages. These packages will still have to be enabled in `/etc/rc.conf/` to run at boot. If these options aren't set, the rc file will be placed in `/usr/pkg/share/examples/rc.d/` and will need to be manually copied over to `/etc/rc.d`.

-

-Many other options can be set in this file; see `/usr/pkgsrc/mk/defaults/mk.conf` for examples.

-

-## Miscellaneous topics

-

-### Post-installation Activities

-

-After installing a new application you will normally want to read any documentation it may have included, edit any configuration files that are required, ensure that the application starts at boot time (if it is a daemon), and so on.

- The exact steps you need to take to configure each application will obviously be different. However, if you have just installed a new application and are wondering *What now?* These tips might help:

-

-Use [pkg_info(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=pkg_info&section=1) to find out which files were installed, and where. For example, if you have just installed Foo_Package version 1.0.0, then this command

-

- # pkg_info -L foopackage-1.0.0 | less

-

-will show all the files installed by the package. Pay special attention to files in `man/` directories, which will be manual pages, `etc/` directories, which will be configuration files, and `doc/`, which will be more comprehensive documentation. If you are not sure which version of the application was just installed, a command like this

-

- # pkg_info | grep -i foopackage

-

-will find all the installed packages that have *foopackage* in the package name. Replace *foopackage* in your command line as necessary.

-

-Once you have identified where the application's manual pages have been installed, review them using [man(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=man&section=1). Similarly, look over the sample configuration files, and any additional documentation that may have been provided. If the application has a web site, check it for additional documentation, frequently asked questions, and so forth. If you are not sure of the web site address it may be listed in the output from

-

- # pkg_info foopackage-1.0.0

-

-A `WWW:` line, if present, should provide a URL for the application's web site.

-

-### Dealing with Broken Packages

-

-If you come across a package that does not work for you, there are a few things you can do, including:

-

- 1. Fix it! The [pkgsrc Guide](http://www.netbsd.org/Documentation/pkgsrc/) includes detailed information on the ***pkgsrc®*** infrastructure so that you can fix the occasional broken package or even submit your own!

-

- 1. Send email to the maintainer of the package first. Type `bmake maintainer` or read the `Makefile` to find the maintainer's email address. Remember to include the name and version of the port (send the `$NetBSD:` line from the `Makefile`) and the output leading up to the error when you email the maintainer. If you do not get a response from the maintainer, you can try [users](http://leaf.dragonflybsd.org/mailarchive/) .

-

- 1. Grab a pre-built package from an [[mirror|mirrors]] site near you.

-

-### What is WIP?

-

-Packages that can be built within the pkgsrc framework but are not yet necessarily ready for production use can be found in [http://pkgsrc-wip.sourceforge.net](http://pkgsrc-wip.sourceforge.net). These packages need to be downloaded separately; check the website for details. Packages in this collection are in development and may not build successfully.

-This chapter will cover the installation and some configuration of the usual way of giving your Dragonfly BSD system an X-Windows style Graphical User Interface (GUI) and a modern Desktop Environment. In Unix systems, the graphical drawing system is provided by the combination of an X11R6 compliant X-Windows Server, such as the X.org server, and other software such as Window Managers and Desktop Environments. This multi-layered approach may be surprising to people coming from systems like the Mac or like Windows where these components are not so flexible, or provided by so many separately installed and configured pieces.

-

-For more information on the video hardware support in X.org, check the [X.org](http://www.x.org/) web site. If you have problems configuring your X server, just search the web. There are lots of tutorials and guides on how to set up your X properly, if the information in this page is not enough for your situation.

-

-Before reading this chapter, you should know how to install additional third-party software. Read the `dports` section of the documentation, for DragonFly 3.4 and later.

-They are found [[here|http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/x-config.html]]

-

-## Understanding X

-

-### What is X.Org

-

-X.Org is the most popular free implementation of the X11 specification. The X11 specification is an open standard, and there are other implementations, some commercial, and some free.

-

-### The Window Manager and the Desktop Environment

-

-An X Server is a very low level piece of software. It does not provide any way to move windows around or resize them. It does not provide a title bar on the top of your windows, or a dock, or any menus.

-

-These things are the job, in the oldest style of X environment, of your window manager, or in more recent times, of a Desktop Environment.

-

-Installing X.org by itself does not give you any window manager or any desktop environment. You will have to choose one and install it yourself. Until you select one, your system will not be usable.

-

-There are dozens of window managers and desktop environments available for X. The most retro ones you might chose include `fvwm` and `twm` which have that retro 1980s workstation look and feel. There are also window managers included inside modern desktop environments like XFCE, KDE and Gnome.

-

-If you are brand new and don't know what to do, select the XFCE4 desktop and follow those instructions.

-Every desktop environment and window manager also has a different configuration mechanism. Read your chosen environment's documentation to learn more. Some are configured by text files alone, and some (like KDE and Gnome) have sophisticated graphical configuration utilities and "control panels".

-

-Note that XFCE4 and Gnome and KDE do not require you to install any window manager as they include one automatically.

-

-## Installing X

-

-**X.org** is currently available in the DragonFly dports collection.

-

-To install:

-

- pkg install xorg-7.7

-

-By the time you read this, it might be a newer version of xorg than 7.7, you can also try this general command:

-

- pkg install xorg

-

-## Configuring X

-

-You may need to add the following lines to `/etc/rc.conf` for regular PCs but you might not want to set these two lines to NO instead on a Virtual Machine as they cause problems in Dragonfly BSD 3.4 through 3.6:

-

- hald_enable ="YES"

- dbus_enable= "YES"

-

-Also see below about enabling `moused` in rc.conf, which may be required for you to see your mouse pointer in X.

-

-As of version 7.3, Xorg can often work without any configuration file by simply typing at prompt:

-

-

-

- % startx

-

-If this does not work, or if the default configuration is not acceptable, then X11 must be configured manually. For example, if X11 does not detect your mouse then you will not get a mouse pointer, you will get a desktop (either a color or a dotted-pattern) but moving your mouse will not result in you seeing a mouse pointer move around. Also, you might get a garbled display, or no display at all. If any of these happen to you, you need to do some manual configuration of X.org, which means a configuration text file.

-

-Configuration of X11 is a multi-step process. The first step is to build an initial configuration file. As the super user, simply run:

-

-

- # Xorg -configure

-

-This will generate an X11 configuration skeleton file in the `/root` directory called `xorg.conf.new` (whether you [su(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=su&amp;section=1) or do a direct login affects the inherited supervisor `$HOME` directory variable). The X11 program will attempt to probe the graphics hardware on the system and write a configuration file to load the proper drivers for the detected hardware on the target system.

-

-The next step is to test the existing configuration to verify that **X.org** can work with the graphics hardware on the target system. To perform this task, type:

-

-

-

- # Xorg -config xorg.conf.new -retro

-

-The -retro option is now required or you will only get a black desktop when testing. This retro mode is an empty X desktop with a dot pattern on the background and an X cursor in the center. If the mouse is working, you should be able to move it.

-

-If a black and grey grid and an X mouse cursor appear, the configuration was successful. To exit the test, just press **Ctrl** + **Alt** + **Backspace** simultaneously.

-

-**Note:** If the mouse does not work, you will need to first configure it before proceeding. This can usually be achieved by just using `/dev/sysmouse` as the input device in the config file and enabling `moused`:

-

- # rcenable moused

-

-Tune the `xorg.conf.new` configuration file to taste and move it to where [Xorg(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=xorg&section=1) can find it. This is typically `/etc/X11/xorg.conf` or `/usr/pkg/xorg/lib/X11/xorg.conf`.

-

-

-

-The X11 configuration process is now complete. You can start **X.org** with [startx(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=startx&section=1). The X11 server may also be started with the use of [xdm(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=xdm&section=1).

-

-## The X Display Manager

-

- ***Contributed by Seth Kingsley.***

-

-### Overview

-

- The X Display Manager ( **XDM** ) is an optional part of the X Window System that is used for login session management. This is useful for several types of situations, including minimal "X Terminals", desktops, and large network display servers. Since the X Window System is network and protocol independent, there are a wide variety of possible configurations for running X clients and servers on different machines connected by a network. **XDM** provides a graphical interface for choosing which display server to connect to, and entering authorization information such as a login and password combination.

-

- Think of **XDM** as providing the same functionality to the user as the [getty(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=getty&section=8) utility (see [ Section 17.3.2](term.html#TERM-CONFIG) for details). That is, it performs system logins to the display being connected to and then runs a session manager on behalf of the user (usually an X window manager). **XDM** then waits for this program to exit, signaling that the user is done and should be logged out of the display. At this point, **XDM** can display the login and display chooser screens for the next user to login.

-

-### Using XDM

-

- The **XDM** daemon program is located in `/usr/pkg/bin/xdm`. This program can be run at any time as `root` and it will start managing the X display on the local machine. If **XDM** is to be run every time the machine boots up, a convenient way to do this is by adding an entry to `/etc/ttys`. For more information about the format and usage of this file, see [ Section 17.3.2.1](term.html#TERM-ETCTTYS). There is a line in the default `/etc/ttys` file for running the **XDM** daemon on a virtual terminal:

-

-

-

- ttyv8 "/usr/pkg/bin/xdm -nodaemon" xterm off secure

-

- By default this entry is disabled; in order to enable it change field 5 from `off` to `on` and restart [init(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=init&section=8) using the directions in [ Section 17.3.2.2](term.html#TERM-HUP). The first field, the name of the terminal this program will manage, is `ttyv8`. This means that **XDM** will start running on the 9th virtual terminal.

-

-### Configuring XDM

-

- The **XDM** configuration directory is located in `/var/lib/xdm`. The sample configuration files are in `/usr/pkg/share/examples/xdm/`, in this directory there are several files used to change the behavior and appearance of **XDM** . Typically these files will be found:

-

-[[!table data="""

-<tablestyle="width:100%"> **File** | **Description**

-<tablestyle="width:100%"> `Xaccess` | Client authorization ruleset.

-`Xresources` | Default X resource values.

-`Xservers` | List of remote and local displays to manage.

-`Xsession` | Default session script for logins.

-`Xsetup_`* | Script to launch applications before the login interface.

-`xdm-config` | Global configuration for all displays running on this machine.

-`xdm-errors` | Errors generated by the server program.

-`xdm-pid` | The process ID of the currently running XDM. |

-

-"""]]

-

- Also in this directory are a few scripts and programs used to set up the desktop when **XDM** is running. The purpose of each of these files will be briefly described. The exact syntax and usage of all of these files is described in [xdm(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=xdm&section=1).

-

- The default configuration is a simple rectangular login window with the hostname of the machine displayed at the top in a large font and "Login:" and "Password:" prompts below. This is a good starting point for changing the look and feel of **XDM** screens.

-

-#### Xaccess

-

- The protocol for connecting to **XDM** controlled displays is called the X Display Manager Connection Protocol (XDMCP). This file is a ruleset for controlling XDMCP connections from remote machines. It is ignored unless the `xdm-config` is changed to listen for remote connections. By default, it does not allow any clients to connect.

-

-#### Xresources

-

- This is an application-defaults file for the display chooser and the login screens. This is where the appearance of the login program can be modified. The format is identical to the app-defaults file described in the X11 documentation.

-

-#### Xservers

-

- This is a list of the remote displays the chooser should provide as choices.

-

-#### Xsession

-

- This is the default session script for **XDM** to run after a user has logged in. Normally each user will have a customized session script in `~/.xsession` that overrides this script.

-

-#### Xsetup_*

-

- These will be run automatically before displaying the chooser or login interfaces. There is a script for each display being used, named `Xsetup_` followed by the local display number (for instance `Xsetup_0`). Typically these scripts will run one or two programs in the background such as `xconsole`.

-

-#### xdm-config

-

- This contains settings in the form of app-defaults that are applicable to every display that this installation manages.

-

-#### xdm-errors

-

- This contains the output of the X servers that **XDM** is trying to run. If a display that **XDM** is trying to start hangs for some reason, this is a good place to look for error messages. These messages are also written to the user's `~/.xsession-errors` file on a per-session basis.

-

-### Running a Network Display Server

-

- In order for other clients to connect to the display server, edit the access control rules, and enable the connection listener. By default these are set to conservative values. To make **XDM** listen for connections, first comment out a line in the `xdm-config` file:

-

-

-

- ! SECURITY: do not listen for XDMCP or Chooser requests

-

- ! Comment out this line if you want to manage X terminals with xdm

-

- DisplayManager.requestPort: 0

-

- and then restart **XDM** . Remember that comments in app-defaults files begin with a "!" character, not the usual "#". More strict access controls may be desired. Look at the example entries in `Xaccess`, and refer to the [xdm(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=xdm&section=1) manual page for further information.

-

-### Replacements for XDM

-

- Several replacements for the default **XDM** program exist. One of them, **kdm** (bundled with **KDE** ) is described later in this chapter. The **kdm** display manager offers many visual improvements and cosmetic frills, as well as the functionality to allow users to choose their window manager of choice at login time.

-

-----

-

-## Desktop Environments

-

- ***Contributed by Valentino Vaschetto. ***

-

- This section describes the different desktop environments available for X on FreeBSD. A ***desktop environment*** can mean anything ranging from a simple window manager to a complete suite of desktop applications, such as **KDE** or **GNOME** .

-

-### GNOME

-

-#### About GNOME

-

- **GNOME** is a user-friendly desktop environment that enables users to easily use and configure their computers. **GNOME** includes a panel (for starting applications and displaying status), a desktop (where data and applications can be placed), a set of standard desktop tools and applications, and a set of conventions that make it easy for applications to cooperate and be consistent with each other. Users of other operating systems or environments should feel right at home using the powerful graphics-driven environment that **GNOME** provides.

-

-#### Installing GNOME

-

- **GNOME** can be easily installed from a package or from the pkgsrc framework:

-

- To install the **GNOME** package from the network, simply type:

-

- # pkg install gnome-desktop

-

- To build **GNOME** from source, if you have the pkgsrc tree on your system:

-

- # cd /usr/pkgsrc/meta-pkgs/gnome

-

- # bmake install clean

-

- Once **GNOME** is installed, the X server must be told to start **GNOME** instead of a default window manager.

-

- The easiest way to start **GNOME** is with **GDM** , the GNOME Display Manager. **GDM** , which is installed as a part of the **GNOME** desktop (but is disabled by default), can be enabled by adding `gdm_enable="YES"` to `/etc/rc.conf`. Once you have rebooted, **GNOME** will start automatically once you log in -- no further configuration is necessary.

-

-**GNOME** may also be started from the command-line by properly configuring a file named `.xinitrc`. If a custom `.xinitrc` is already in place, simply replace the line that starts the current window manager with one that starts **/usr/pkg/bin/gnome-session** instead. If nothing special has been done to the configuration file, then it is enough simply to type:

-

-

-

- % echo "/usr/pkg/bin/gnome-session" > ~/.xinitrc

-

- Next, type `startx`, and the **GNOME** desktop environment will be started.

-

-**Note:** If an older display manager, like **XDM** , is being used, this will not work. Instead, create an executable `.xsession` file with the same command in it. To do this, edit the file and replace the existing window manager command with **/usr/pkg/bin/gnome-session** :

-

-

-

- % echo "#!/bin/sh" > ~/.xsession

-

- % echo "/usr/pkg/bin/gnome-session" >> ~/.xsession

-

- % chmod +x ~/.xsession

-

- Yet another option is to configure the display manager to allow choosing the window manager at login time; the section on [ KDE details](x11-wm.html#X11-WM-KDE-DETAILS) explains how to do this for **kdm** , the display manager of **KDE** .

-

-#### Anti-aliased Fonts with GNOME

-

- X11 supports anti-aliasing via its ***RENDER*** extension. GTK+ 2.0 and greater (the toolkit used by **GNOME** ) can make use of this functionality. Configuring anti-aliasing is described in [ Section 5.5.3](x-fonts.html#ANTIALIAS).

-

- So, with up-to-date software, anti-aliasing is possible within the **GNOME** desktop. Just go to **Applications->Desktop Preferences->Font** , and select either Best shapes, Best contrast, or Subpixel smoothing (LCDs). For a GTK+ application that is not part of the **GNOME** desktop, set the environment variable `GDK_USE_XFT` to `1` before launching the program.

-

-### KDE

-

-#### About KDE

-

- **KDE** is an easy to use contemporary desktop environment. Some of the things that **KDE** brings to the user are:

-

-* A beautiful contemporary desktop

-

-* A desktop exhibiting complete network transparency

-

-* An integrated help system allowing for convenient, consistent access to help on the use of the **KDE** desktop and its applications

-

-* Consistent look and feel of all **KDE** applications

-

-* Standardized menu and toolbars, keybindings, color-schemes, etc.

-

-* Internationalization: **KDE** is available in more than 40 languages

-

-* Centralized consisted dialog driven desktop configuration

-

-* A great number of useful **KDE** applications

-

- **KDE** comes with a web browser called **Konqueror** , which represents a solid competitor to other existing web browsers on UNIX® systems. More information on **KDE** can be found on the [KDE website](http://www.kde.org/).

-

-#### Installing KDE

-

- Just as with **GNOME** or any other desktop environment, the easiest way to install **KDE** is through the pkgsrc framework or from a package:

-

- To install the **KDE** 4.10 package from the network, simply type:

-

- # pkg install kde-4.10

-

- To build **KDE** from source, using the pkgsrc framework:

-

- # cd /usr/pkgsrc/meta-pkgs/kde3

-

- # bmake install clean

-

- After **KDE** has been installed, the X server must be told to launch this application instead of the default window manager. This is accomplished by editing the `.xinitrc` file:

-

- % echo "exec startkde" > ~/.xinitrc

-

- Now, whenever the X Window System is invoked with `startx`, **KDE** will be the desktop.

-

- If a display manager such as **XDM** is being used, the configuration is slightly different. Edit the `.xsession` file instead. Instructions for **kdm** are described later in this chapter.

-

-#### More Details on KDE

-

- Now that **KDE** is installed on the system, most things can be discovered through the help pages, or just by pointing and clicking at various menus. Windows® or Mac® users will feel quite at home.

-

- The best reference for **KDE** is the on-line documentation. **KDE** comes with its own web browser, **Konqueror** , dozens of useful applications, and extensive documentation. The remainder of this section discusses the technical items that are difficult to learn by random exploration.

-

-#### The KDE Display Manager

-

- An administrator of a multi-user system may wish to have a graphical login screen to welcome users. [ XDM](x-xdm.html) can be used, as described earlier. However, **KDE** includes an alternative, **kdm** , which is designed to look more attractive and include more login-time options. In particular, users can easily choose (via a menu) which desktop environment ( **KDE** , **GNOME** , or something else) to run after logging on.

-

- To enable **kdm** , the `ttyv8` entry in `/etc/ttys` has to be adapted. The line should look as follows:

-

-

- ttyv8 "/usr/pkg/bin/kdm -nodaemon" xterm on secure

-

-

-### XFce

-

-#### About XFce

-

- **XFce** is a desktop environment based on the GTK+ toolkit used by **GNOME** , but is much more lightweight and meant for those who want a simple, efficient desktop which is nevertheless easy to use and configure. Visually, it looks very much like **CDE** , found on commercial UNIX systems. Some of **XFce** 's features are:

-

-* A simple, easy-to-handle desktop

-

-* Fully configurable via mouse, with drag and drop, etc

-

-* Main panel similar to **CDE** , with menus, applets and applications launchers

-More information on **XFce** can be found on the [XFce website](http://www.xfce.org/).

-

-#### Installing XFce

-

- A binary package for **XFce** exists. To install, simply type:

-

- # pkg install xfce

-

-This should install the main xfce4 desktop package, and most of the required components.

-

- Alternatively, to build from source, use the pkgsrc framework:

-

-

-

- # cd /usr/pkgsrc/meta-pkgs/xfce4

-

- # bmake install clean

-

- Now, tell the X server to launch **XFce** the next time X is started. Simply type this:

-

- % echo "/usr/pkg/bin/startxfce4" > ~/.xinitrc

-

- The next time X is started, **XFce** will be the desktop. As before, if a display manager like **XDM** is being used, create an `.xsession`, as described in the section on [ GNOME](x11-wm.html#X11-WM-GNOME), but with the `/usr/pkg/bin/startxfce4` command; or, configure the display manager to allow choosing a desktop at login time, as explained in the section on [ kdm](x11-wm.html#X11-WM-KDE-KDM).

-

-<!-- XXX: FreeBSD's handbook has a nice user-oriented section about X applications here. maybe we should have one, too -->

-

-----

-

-# Configuration and Tuning

-

-***Written by Chern Lee. Based on a tutorial written by Mike Smith. Also based on [tuning(7)](http://leaf.dragonflybsd.org/cgi/web-man?command#tuning&section7) written by Matt Dillon.***

-

-[[!toc levels=3]]

-

-##Synopsis

-

-One of the important aspects of DragonFly is system configuration. Correct system configuration will help prevent headaches during future upgrades. This chapter will explain much of the DragonFly configuration process, including some of the parameters which can be set to tune a DragonFly system.

-

-After reading this chapter, you will know:

-

-* How to efficiently work with file systems and swap partitions.

-

-* The basics of `rc.conf` configuration and `rc.d` startup systems.

-

-* How to configure and test a network card.

-

-* How to configure virtual hosts on your network devices.

-

-* How to use the various configuration files in `/etc`.

-

-* How to tune DragonFly using `sysctl` variables.

-

-* How to tune disk performance and modify kernel limitations.

-

-Before reading this chapter, you should:

-

-* Understand UNIX® and DragonFly basics ([Chapter 3](basics.html)).

-

-* Be familiar with the basics of kernel configuration/compilation ([Chapter 9](kernelconfig.html)).

-

-## Initial Configuration

-

-### Partition Layout

-

-#### Base Partitions

-

-When laying out file systems with [disklabel(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel&section=8) remember that hard drives transfer data faster from the outer tracks to the inner. Thus smaller and heavier-accessed file systems should be closer to the outside of the drive, while larger partitions like `/usr` should be placed toward the inner. It is a good idea to create partitions in a similar order to: root, swap, `/var`, `/usr`.

-<!-- XXX: on the advent of SSDs, do we really need to talk about this stuff? Who knows where on the platter the partitions land, considering that a hard disk has multiple platters? -->

-

-The size of `/var` reflects the intended machine usage. `/var` is used to hold mailboxes, log files, and printer spools. Mailboxes and log files can grow to unexpected sizes depending on how many users exist and how long log files are kept. Most users would never require a gigabyte, but remember that `/var/tmp` must be large enough to contain packages.

-

-The `/usr` partition holds much of the files required to support the system, the pkgsrc® collection (recommended) and the source code (optional). At least 2 gigabytes would be recommended for this partition.

-

-When selecting partition sizes, keep the space requirements in mind. Running out of space in one partition while barely using another can be a hassle.

-

-#### Swap Partition

-

-As a rule of thumb, the swap partition should be about double the size of system memory (RAM). For example, if the machine has 128 megabytes of memory, the swap file should be 256 megabytes. Systems with less memory may perform better with more swap. Less than 256 megabytes of swap is not recommended and memory expansion should be considered. The kernel's VM paging algorithms are tuned to perform best when the swap partition is at least two times the size of main memory. Configuring too little swap can lead to inefficiencies in the VM page scanning code and might create issues later if more memory is added.

-<!-- XXX: do we really recommend double the RAM for swap? IMHO the amount of RAM should be more than enough -->

-

-On larger systems with multiple SCSI disks (or multiple IDE disks operating on different controllers), it is recommend that a swap is configured on each drive (up to four drives). The swap partitions should be approximately the same size. The kernel can handle arbitrary sizes but internal data structures scale to 4 times the largest swap partition. Keeping the swap partitions near the same size will allow the kernel to optimally stripe swap space across disks. Large swap sizes are fine, even if swap is not used much. It might be easier to recover from a runaway program before being forced to reboot.

-

-#### Why Partition?

-

-Several users think a single large partition will be fine, but there are several reasons why this is a bad idea. First, each partition has different operational characteristics and separating them allows the file system to tune accordingly. For example, the root and `/usr` partitions are read-mostly, without much writing. While a lot of reading and writing could occur in `/var` and `/var/tmp`.

-

-By properly partitioning a system, fragmentation introduced in the smaller write heavy partitions will not bleed over into the mostly-read partitions. Keeping the write-loaded partitions closer to the disk's edge, will increase I/O performance in the partitions where it occurs the most. Now while I/O performance in the larger partitions may be needed, shifting them more toward the edge of the disk will not lead to a significant performance improvement over moving `/var` to the edge. Finally, there are safety concerns. A smaller, neater root partition which is mostly read-only has a greater chance of surviving a bad crash.

-<!-- XXX: again, same story about the edges of disks... -->

-

-CategoryHandbook

-

-CategoryHandbook-configuration

-

-## Core Configuration

-

-The principal location for system configuration information is within `/etc/rc.conf`. This file contains a wide range of configuration information, principally used at system startup to configure the system. Its name directly implies this; it is configuration information for the `rc*` files.

-

-An administrator should make entries in the `rc.conf` file to override the default settings from `/etc/defaults/rc.conf`. The defaults file should not be copied verbatim to `/etc` - it contains default values, not examples. All system-specific changes should be made in the `rc.conf` file itself.

-

-A number of strategies may be applied in clustered applications to separate site-wide configuration from system-specific configuration in order to keep administration overhead down. The recommended approach is to place site-wide configuration into another file, such as `/etc/rc.conf.site`, and then include this file into `/etc/rc.conf`, which will contain only system-specific information.

-

-As `rc.conf` is read by [sh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=sh&section=1) it is trivial to achieve this. For example:

-

-* rc.conf:

-

- hostname="node15.example.com"

-

- network_interfaces="fxp0 lo0"

-

- ifconfig_fxp0="inet 10.1.1.1"

-

-

-

-* rc.conf.site:

-

- defaultrouter="10.1.1.254"

-

- saver="daemon"

-

- blanktime="100"

-

-

-

-The `rc.conf.site` file can then be distributed to every system using `rsync` or a similar program, while the `rc.conf` file remains unique.

-

-Upgrading the system using `make world` will not overwrite the `rc.conf` file, so system configuration information will not be lost.

-

-CategoryHandbook

-

-CategoryHandbook-configuration

-

-## Application Configuration

-

-Typically, installed applications have their own configuration files, with their own syntax, etc. It is important that these files be kept separate from the base system, so that they may be easily located and managed by the package management tools.

-

-Typically, these files are installed in `/usr/pkg/etc`. In the case where an application has a large number of configuration files, a subdirectory will be created to hold them.

-

-Normally, when a port or package is installed, sample configuration files are also installed. These are usually identified with a `.default` suffix. If there are no existing configuration files for the application, they will be created by copying the `.default` files.

-

-For example, consider the contents of the directory `/usr/pkg/etc/httpd`:

-

-

-

- total 90

-

- -rw-r--r-- 1 root wheel - 34K Jan 11 12:04 httpd.conf

-

- -rw-r--r-- 1 root wheel - 13K Jan 11 12:02 magic

-

- -rw-r--r-- 1 root wheel - 28K Jan 11 12:02 mime.types

-

- -rw-r--r-- 1 root wheel - 11K Jan 11 12:02 ssl.conf

-

-

-

-

-

-

-

-## Starting Services

-

-It is common for a system to host a number of services. These may be started in several different fashions, each having different advantages.

-

-Software installed from a port or the packages collection will often place a script in `/usr/pkg/share/examples/rc.d` which is invoked at system startup with a `start` argument, and at system shutdown with a `stop` argument. This is the recommended way for starting system-wide services that are to be run as `root`, or that expect to be started as `root`. These scripts are registered as part of the installation of the package, and will be removed when the package is removed.

-The startup scripts of DragonFly will look in `/usr/pkg/share/examples/rc.d` for scripts that have an `.sh` extension and are executable by `root`. Those scripts that are found are called with an option `start` at startup, and `stop` at shutdown to allow them to carry out their purpose. So if you wanted the above sample script to be picked up and run at the proper time during system startup, you should save it to a file called `FooBar.sh` in `/usr/local/etc/rc.d` and make sure it is executable. You can make a shell script executable with [chmod(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chmod&section=1) as shown below:

-

-

-

- # chmod 755 "FooBar.sh"

-

-Some services expect to be invoked by [inetd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=inetd&section=8) when a connection is received on a suitable port. This is common for mail reader servers (POP and IMAP, etc.). These services are enabled by editing the file `/etc/inetd.conf`. See [inetd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=inetd&section=8) for details on editing this file.

-

-Some additional system services may not be covered by the toggles in `/etc/rc.conf`. These are traditionally enabled by placing the command(s) to invoke them in `/etc/rc.local` (which does not exist by default). Note that `rc.local` is generally regarded as the location of last resort; if there is a better place to start a service, do it there.

-

- **Note:** Do ***not*** place any commands in `/etc/rc.conf`. To start daemons, or run any commands at boot time, place a script in `/usr/pkg/share/examples/rc.d` instead.

-

-It is also possible to use the [cron(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=cron&section=8) daemon to start system services. This approach has a number of advantages, not least being that because [cron(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=cron&section=8) runs these processes as the owner of the `crontab`, services may be started and maintained by non-`root` users.

-

-This takes advantage of a feature of [cron(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=cron&section=8): the time specification may be replaced by `@reboot`, which will cause the job to be run when [cron(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=cron&section=8) is started shortly after system boot.

-

-CategoryHandbook

-

-CategoryHandbook-configuration

-

-## Configuring the cron Utility

-

-<!-- XXX: can't really comment on this. someone please revise it -->

-

-***Contributed by Tom Rhodes. ***

-

-One of the most useful utilities in DragonFly is [cron(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=cron&section=8). The `cron` utility runs in the background and constantly checks the `/etc/crontab` file. The `cron` utility also checks the `/var/cron/tabs` directory, in search of new `crontab` files. These `crontab` files store information about specific functions which `cron` is supposed to perform at certain times.

-

-The `cron` utility uses two different types of configuration files, the system crontab and user crontabs. The only difference between these two formats is the sixth field. In the system crontab, the sixth field is the name of a user for the command to run as. This gives the system crontab the ability to run commands as any user. In a user crontab, the sixth field is the command to run, and all commands run as the user who created the crontab; this is an important security feature.

-

- **Note:** User crontabs allow individual users to schedule tasks without the need for root privileges. Commands in a user's crontab run with the permissions of the user who owns the crontab.

-

-The `root` user can have a user crontab just like any other user. This one is different from `/etc/crontab` (the system crontab). Because of the system crontab, there's usually no need to create a user crontab for `root`.

-

-Let us take a look at the `/etc/crontab` file (the system crontab):

-

-

-

- # /etc/crontab - root's crontab for DragonFly

-

- #

-

- # (1)

-

- #

-

- SHELL=/bin/sh

-

- PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin (2)

-

- HOME=/var/log

-

- #

-

- #

-

- #minute hour mday month wday who command (3)

-

- #

-

- #

-

-

- */5 * * * * root /usr/libexec/atrun (4)

-

- 1. Like most DragonFly configuration files, the `#` character represents a comment. A comment can be placed in the file as a reminder of what and why a desired action is performed. Comments cannot be on the same line as a command or else they will be interpreted as part of the command; they must be on a new line. Blank lines are ignored.

-

- 1. First, the environment must be defined. The equals (`=`) character is used to define any environment settings, as with this example where it is used for the `SHELL`, `PATH`, and `HOME` options. If the shell line is omitted, `cron` will use the default, which is `sh`. If the `PATH` variable is omitted, no default will be used and file locations will need to be absolute. If `HOME` is omitted, `cron` will use the invoking users home directory.

-

- 1. This line defines a total of seven fields. Listed here are the values `minute`, `hour`, `mday`, `month`, `wday`, `who`, and `command`. These are almost all self explanatory. `minute` is the time in minutes the command will be run. `hour` is similar to the `minute` option, just in hours. `mday` stands for day of the month. `month` is similar to `hour` and `minute`, as it designates the month. The `wday` option stands for day of the week. All these fields must be numeric values, and follow the twenty-four hour clock. The `who` field is special, and only exists in the `/etc/crontab` file. This field specifies which user the command should be run as. When a user installs his or her `crontab` file, they will not have this option. Finally, the `command` option is listed. This is the last field, so naturally it should designate the command to be executed.

-

- 1. This last line will define the values discussed above. Notice here we have a `*/5` listing, followed by several more `*` characters. These `*` characters mean ***first-last***, and can be interpreted as ***every*** time. So, judging by this line, it is apparent that the `atrun` command is to be invoked by `root` every five minutes regardless of what day or month it is. For more information on the `atrun` command, see the [atrun(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=atrun&section=8) manual page.Commands can have any number of flags passed to them; however, commands which extend to multiple lines need to be broken with the backslash ***\*** continuation character.

-

-This is the basic set up for every `crontab` file, although there is one thing different about this one. Field number six, where we specified the username, only exists in the system `/etc/crontab` file. This field should be omitted for individual user `crontab` files.

-

-### Installing a Crontab

-

- **Important:** You must not use the procedure described here to edit/install the system crontab. Simply use your favorite editor: the `cron` utility will notice that the file has changed and immediately begin using the updated version. If you use `crontab` to load the `/etc/crontab` file you may get an error like `root: not found` because of the system crontab's additional user field.

-

-To install a freshly written user `crontab`, first use your favorite editor to create a file in the proper format, and then use the `crontab` utility. The most common usage is:

-

-

-

- % crontab crontab-file

-

-In this example, `crontab-file` is the filename of a `crontab` that was previously created.

-

-There is also an option to list installed `crontab` files: just pass the `-l` option to `crontab` and look over the output.

-

-For users who wish to begin their own crontab file from scratch, without the use of a template, the `crontab -e` option is available. This will invoke the selected editor with an empty file. When the file is saved, it will be automatically installed by the `crontab` command.

-

-If you later want to remove your user `crontab` completely, use `crontab` with the `-r` option.

-

-## Using rc under DragonFly

-

-***Contributed by Tom Rhodes. ***

-

-DragonFly uses the NetBSD® `rc.d` system for system initialization. Users should notice the files listed in the `/etc/rc.d` directory. Many of these files are for basic services which can be controlled with the `start`, `stop`, and `restart` options. For instance, [sshd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sshd&section=8&manpath=OpenBSD+3.3) can be restarted with the following command:

-

-

-

- # /etc/rc.d/sshd restart

-

-This procedure is similar for other services. Of course, services are usually started automatically as specified in [rc.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.conf&section=5). For example, enabling the Network Address Translation daemon at startup is as simple as adding the following line to `/etc/rc.conf`:

-

- natd_enable="YES"

-

-If a `natd_enable="NO"` line is already present, then simply change the `NO` to `YES`. The rc scripts will automatically load any other dependent services during the next reboot, as described below.

-

-Another way to add services to the automatic startup/shutdown is to type, for example for `natd`,

-

- # rcenable natd

-

-Since the `rc.d` system is primarily intended to start/stop services at system startup/shutdown time, the standard `start`, `stop` and `restart` options will only perform their action if the appropriate `/etc/rc.conf` variables are set. For instance the above `sshd restart` command will only work if `sshd_enable` is set to `YES` in `/etc/rc.conf`. To `start`, `stop` or `restart` a service regardless of the settings in `/etc/rc.conf`, the commands should be prefixed with ***force***. For instance to restart `sshd` regardless of the current `/etc/rc.conf` setting, execute the following command:

-

-

-

- # /etc/rc.d/sshd forcerestart

-

-It is easy to check if a service is enabled in `/etc/rc.conf` by running the appropriate `rc.d` script with the option `rcvar`. Thus, an administrator can check that `sshd` is in fact enabled in `/etc/rc.conf` by running:

-

-

-

- # /etc/rc.d/sshd rcvar

-

- # sshd

-

- $sshd_enable=YES

-

- **Note:** The second line (`# sshd`) is the output from the `rc.d` script, not a `root` prompt.

-

-To determine if a service is running, a `status` option is available. For instance to verify that `sshd` is actually started:

-

-

-

- # /etc/rc.d/sshd status

-

- sshd is running as pid 433.

-

-It is also possible to `reload` a service. This will attempt to send a signal to an individual service, forcing the service to reload its configuration files. In most cases this means sending the service a `SIGHUP` signal.

-

-The **rcNG** structure is used both for network services and system initialization. Some services are run only at boot; and the RCNG system is what triggers them.

-

-Many system services depend on other services to function properly. For example, NIS and other RPC-based services may fail to start until after the `rpcbind` (portmapper) service has started. To resolve this issue, information about dependencies and other meta-data is included in the comments at the top of each startup script. The [rcorder(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rcorder&section=8) program is then used to parse these comments during system initialization to determine the order in which system services should be invoked to satisfy the dependencies. The following words may be included at the top of each startup file:

-

-* `PROVIDE`: Specifies the services this file provides.

-

-* `REQUIRE`: Lists services which are required for this service. This file will run ***after*** the specified services.

-

-* `BEFORE`: Lists services which depend on this service. This file will run ***before*** the specified services.

-

-* KEYWORD: When [rcorder(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rcorder&section=8) uses the `-k` option, then only the rc.d files matching this keyword are used. [(1)](#FTN.AEN4751) For example, when using `-k shutdown`, only the `rc.d` scripts defining the `shutdown` keyword are used.

-

- With the `-s` option, [rcorder(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rcorder&section=8) will skip any `rc.d` script defining the corresponding keyword to skip. For example, scripts defining the `nostart` keyword are skipped at boot time.

-

-By using this method, an administrator can easily control system services without the hassle of ***runlevels*** like some other UNIX® operating systems.

-

-Additional information about the DragonFly `rc.d` system can be found in the [rc(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc&section=8), [rc.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.conf&section=5), and [rc.subr(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.subr&section=8) manual pages.

-

-### Using DragonFly's rcrun(8)

-

-Besides the methods described above DragonFly supports [rcrun(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rcrun&section=8) to control rc(8) scripts. [rcrun(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rcrun&section=8) provides a number of command for controlling rc(8)

-

-scripts. The ***start***, ***forcestart***, ***faststart***, ***stop***, ***restart***, and ***rcvar*** commands are just passed to the scripts. See rc(8) for more information on these commands.

-If a service is not enabled in `/etc/rc.conf`, but you want it start anyway, execute the following:

-

-

-

- # rcforce dntpd

-

- Running /etc/rc.d/dntpd forcestart

-

- Starting dntpd.

-

-#### Notes

-

-[[!table data="""

-<tablestyle="width:100%"> [(1)](configtuning-rcng.html#AEN4751) | Previously this was used to define *BSD dependent features.

-| |

-

-"""]]

-

-## Setting Up Network Interface Cards

-

-***Contributed by Marc Fonvieille. ***

-

-Nowadays we can not think about a computer without thinking about a network connection. Adding and configuring a network card is a common task for any DragonFly administrator.

-

-### Locating the Correct Driver

-

-Before you begin, you should know the model of the card you have, the chip it uses, and whether it is a PCI or ISA card. DragonFly supports a wide variety of both PCI and ISA cards. Check the Hardware Compatibility List for your release to see if your card is supported.

-

-Once you are sure your card is supported, you need to determine the proper driver for the card. The file `/usr/src/sys/i386/conf/LINT` will give you the list of network interfaces drivers with some information about the supported chipsets/cards. If you have doubts about which driver is the correct one, read the manual page of the driver. The manual page will give you more information about the supported hardware and even the possible problems that could occur.

-

-If you own a common card, most of the time you will not have to look very hard for a driver. Drivers for common network cards are present in the `GENERIC` kernel, so your card should show up during boot, like so:

-In this example, we see that two cards using the [dc(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=dc&section=4) driver are present on the system.

-

-To use your network card, you will need to load the proper driver. This may be accomplished in one of two ways. The easiest way is to simply load a kernel module for your network card with [kldload(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=kldload&section=8). A module is not available for all network card drivers (ISA cards and cards using the [ed(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=ed&section=4) driver, for example). Alternatively, you may statically compile the support for your card into your kernel. Check `/usr/src/sys/i386/conf/LINT` and the manual page of the driver to know what to add in your kernel configuration file. For more information about recompiling your kernel, please see [kernelconfig.html Chapter 9]. If your card was detected at boot by your kernel (`GENERIC`) you do not have to build a new kernel.

-

-### Configuring the Network Card

-

-Once the right driver is loaded for the network card, the card needs to be configured. As with many other things, the network card may have been configured at installation time.

-

-To display the configuration for the network interfaces on your system, enter the following command:

-DragonFly uses the driver name followed by the order in which one the card is detected at the kernel boot to name the network card, starting the count at zero. For example, `sis2` would be the third network card on the system using the [sis(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=sis&section=4) driver.

-

-In this example, the `dc0` device is up and running. The key indicators are:

-

- 1. `UP` means that the card is configured and ready.

-

- 1. The card has an Internet (`inet`) address (in this case `192.168.1.3`).

-

- 1. It has a valid subnet mask (`netmask`; `0xffffff00` is the same as `255.255.255.0`).

-

- 1. It has a valid broadcast address (in this case, `192.168.1.255`).

-

- 1. The MAC address of the card (`ether`) is `00:a0:cc:da:da:da`

-

- 1. The physical media selection is on autoselection mode (`media: Ethernet autoselect (100baseTX <full-duplex>)`). We see that `dc1` was configured to run with `10baseT/UTP` media. For more information on available media types for a driver, please refer to its manual page.

-

- 1. The status of the link (`status`) is `active`, i.e. the carrier is detected. For `dc1`, we see `status: no carrier`. This is normal when an Ethernet cable is not plugged into the card.

-

-If the [ifconfig(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=ifconfig&section=8) output had shown something similar to:

-

-

-

- dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> mtu 1500

-

- ether 00:a0:cc:da:da:da

-

-it would indicate the card has not been configured.

-

-To configure your card, you need `root` privileges. The network card configuration can be done from the command line with [ifconfig(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=ifconfig&section=8) as root.

-

-

-

- # ifconfig dc0 inet 192.168.1.3 netmask 255.255.255.0

-

-Manually configuring the care has the disadvantage that you would have to do it after each reboot of the system. The file `/etc/rc.conf` is where to add the network card's configuration.

-

-Open `/etc/rc.conf` in your favorite editor. You need to add a line for each network card present on the system, for example in our case, we added these lines:

-You have to replace `dc0`, `dc1`, and so on, with the correct device for your cards, and the addresses with the proper ones. You should read the card driver and [ifconfig(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ifconfig&section8) manual pages for more details about the allowed options and also [rc.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.conf&section=5) manual page for more information on the syntax of `/etc/rc.conf`.

-

-If you configured the network during installation, some lines about the network card(s) may be already present. Double check `/etc/rc.conf` before adding any lines.

-

-You will also have to edit the file `/etc/hosts` to add the names and the IP addresses of various machines of the LAN, if they are not already there. For more information please refer to [hosts(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=hosts&section=5) and to `/usr/share/examples/etc/hosts`.

-

-### Testing and Troubleshooting

-

-Once you have made the necessary changes in `/etc/rc.conf`, you should reboot your system. This will allow the change(s) to the interface(s) to be applied, and verify that the system restarts without any configuration errors.

-

-Once the system has been rebooted, you should test the network interfaces.

-

-#### Testing the Ethernet Card

-

-To verify that an Ethernet card is configured correctly, you have to try two things. First, ping the interface itself, and then ping another machine on the LAN.

-

-First test the local interface:

-

-

-

- % ping -c5 192.168.1.3

-

- PING 192.168.1.3 (192.168.1.3): 56 data bytes

-

- 64 bytes from 192.168.1.3: icmp_seq#0 ttl64 time=0.082 ms

-

- 64 bytes from 192.168.1.3: icmp_seq#1 ttl64 time=0.074 ms

-

- 64 bytes from 192.168.1.3: icmp_seq#2 ttl64 time=0.076 ms

-

- 64 bytes from 192.168.1.3: icmp_seq#3 ttl64 time=0.108 ms

-

- 64 bytes from 192.168.1.3: icmp_seq#4 ttl64 time=0.076 ms

-

-

-

- --- 192.168.1.3 ping statistics ---

-

- 5 packets transmitted, 5 packets received, 0% packet loss

-

- round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms

-

-Now we have to ping another machine on the LAN:

-

-

-

- % ping -c5 192.168.1.2

-

- PING 192.168.1.2 (192.168.1.2): 56 data bytes

-

- 64 bytes from 192.168.1.2: icmp_seq#0 ttl64 time=0.726 ms

-

- 64 bytes from 192.168.1.2: icmp_seq#1 ttl64 time=0.766 ms

-

- 64 bytes from 192.168.1.2: icmp_seq#2 ttl64 time=0.700 ms

-

- 64 bytes from 192.168.1.2: icmp_seq#3 ttl64 time=0.747 ms

-

- 64 bytes from 192.168.1.2: icmp_seq#4 ttl64 time=0.704 ms

-

-

-

- --- 192.168.1.2 ping statistics ---

-

- 5 packets transmitted, 5 packets received, 0% packet loss

-

- round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms

-

-You could also use the machine name instead of `192.168.1.2` if you have set up the `/etc/hosts` file.

-

-#### Troubleshooting

-

-Troubleshooting hardware and software configurations is always a pain, and a pain which can be alleviated by checking the simple things first. Is your network cable plugged in? Have you properly configured the network services? Did you configure the firewall correctly? Is the card you are using supported by DragonFly? Always check the hardware notes before sending off a bug report. Update your version of DragonFly to the latest PREVIEW version. Check the mailing list archives, or perhaps search the Internet.

-

-If the card works, yet performance is poor, it would be worthwhile to read over the [tuning(7)](http://leaf.dragonflybsd.org/cgi/web-man?command=tuning&section=7) manual page. You can also check the network configuration as incorrect network settings can cause slow connections.

-

-Some users experience one or two ***device timeouts***, which is normal for some cards. If they continue, or are bothersome, you may wish to be sure the device is not conflicting with another device. Double check the cable connections. Perhaps you may just need to get another card.

-

-At times, users see a few ***`watchdog timeout`*** errors. The first thing to do here is to check your network cable. Many cards require a PCI slot which supports Bus Mastering. On some old motherboards, only one PCI slot allows it (usually slot 0). Check the network card and the motherboard documentation to determine if that may be the problem.

-

-***`No route to host`*** messages occur if the system is unable to route a packet to the destination host. This can happen if no default route is specified, or if a cable is unplugged. Check the output of `netstat -rn` and make sure there is a valid route to the host you are trying to reach. If there is not, read on to [advanced-networking.html Chapter 19].

-

-***`ping: sendto: Permission denied`*** error messages are often caused by a misconfigured firewall. If `ipfw` is enabled in the kernel but no rules have been defined, then the default policy is to deny all traffic, even ping requests! Read on to [firewalls.html Section 10.7] for more information.

-

-Sometimes performance of the card is poor, or below average. In these cases it is best to set the media selection mode from `autoselect` to the correct media selection. While this usually works for most hardware, it may not resolve this issue for everyone. Again, check all the network settings, and read over the [tuning(7)](http://leaf.dragonflybsd.org/cgi/web-man?command=tuning&section=7) manual page.

-

-## Virtual Hosts

-

-A very common use of DragonFly is virtual site hosting, where one server appears to the network as many servers. This is achieved by assigning multiple network addresses to a single interface.

-

-A given network interface has one ***real*** address, and may have any number of ***alias*** addresses. These aliases are normally added by placing alias entries in `/etc/rc.conf`.

-

-An alias entry for the interface `fxp0` looks like:

-

-

-

- ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"

-

-Note that alias entries must start with `alias0` and proceed upwards in order, (for example, `_alias1`, `_alias2`, and so on). The configuration process will stop at the first missing number.

-

-The calculation of alias netmasks is important, but fortunately quite simple. For a given interface, there must be one address which correctly represents the network's netmask. Any other addresses which fall within this network must have a netmask of all `1`s (expressed as either `255.255.255.255` or `0xffffffff`).

-

-For example, consider the case where the `fxp0` interface is connected to two networks, the `10.1.1.0` network with a netmask of `255.255.255.0` and the `202.0.75.16` network with a netmask of `255.255.255.240`. We want the system to appear at `10.1.1.1` through `10.1.1.5` and at `202.0.75.17` through `202.0.75.20`. As noted above, only the first address in a given network range (in this case, `10.0.1.1` and `202.0.75.17`) should have a real netmask; all the rest (`10.1.1.2` through `10.1.1.5` and `202.0.75.18` through `202.0.75.20`) must be configured with a netmask of `255.255.255.255`.

-

-The following entries configure the adapter correctly for this arrangement:

-

-

-

- ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0"

-

- ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255"

-

- ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255"

-

- ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255"

-

- ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255"

-

- ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240"

-

- ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255"

-

- ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255"

-

- ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"

-

-CategoryHandbook

-

-CategoryHandbook-configuration

-

-## Configuration Files

-

-### /etc Layout

-

-There are a number of directories in which configuration information is kept. These include:

- `/var/db` | Automatically generated system-specific database files, such as the package database, the locate database, and so on |

-

-"""]]

-

-### Hostnames

-

-#### /etc/resolv.conf

-

-`/etc/resolv.conf` dictates how DragonFly's resolver accesses the Internet Domain Name System (DNS).

-

-The most common entries to `resolv.conf` are:

-

-[[!table data="""

- `nameserver` | The IP address of a name server the resolver should query. The servers are queried in the order listed with a maximum of three.

- `search` | Search list for hostname lookup. This is normally determined by the domain of the local hostname.

- `domain` | The local domain name. |

-

-"""]]

-

-A typical `resolv.conf`:

-

-

-

- search example.com

-

- nameserver 147.11.1.11

-

- nameserver 147.11.100.30

-

- **Note:** Only one of the `search` and `domain` options should be used.

-

-If you are using DHCP, [dhclient(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dhclient&section=8) usually rewrites `resolv.conf` with information received from the DHCP server.

-

-#### /etc/hosts

-

-`/etc/hosts` is a simple text database reminiscent of the old Internet. It works in conjunction with DNS and NIS providing name to IP address mappings. Local computers connected via a LAN can be placed in here for simplistic naming purposes instead of setting up a [named(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=named&section=8) server. Additionally, `/etc/hosts` can be used to provide a local record of Internet names, reducing the need to query externally for commonly accessed names.

-

-

-

- #

-

- #

-

- # Host Database

-

- # This file should contain the addresses and aliases

-

- # for local hosts that share this file.

-

- # In the presence of the domain name service or NIS, this file may

-

- # not be consulted at all; see /etc/nsswitch.conf for the resolution order.

-

- #

-

- #

-

- ::1 localhost localhost.my.domain myname.my.domain

-

- 127.0.0.1 localhost localhost.my.domain myname.my.domain

-

- #

-

- # Imaginary network.

-

- #10.0.0.2 myname.my.domain myname

-

- #10.0.0.3 myfriend.my.domain myfriend

-

- #

-

- # According to RFC 1918, you can use the following IP networks for

-

- # private nets which will never be connected to the Internet:

-

- #

-

- # 10.0.0.0 - 10.255.255.255

-

- # 172.16.0.0 - 172.31.255.255

-

- # 192.168.0.0 - 192.168.255.255

-

- #

-

- # In case you want to be able to connect to the Internet, you need

-

- # real official assigned numbers. PLEASE PLEASE PLEASE do not try

-

- # to invent your own network numbers but instead get one from your

-

- # network provider (if any) or from the Internet Registry (ftp to

-

- # rs.internic.net, directory `/templates').

-

- #

-

-`/etc/hosts` takes on the simple format of:

-

-

-

- [Internet address] [official hostname] [alias1] [alias2] ...

-

-For example:

-

-

-

- 10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2

-

-Consult [hosts(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=hosts&section=5) for more information.

-

-### Log File Configuration

-

-#### syslog.conf

-

-`syslog.conf` is the configuration file for the [syslogd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=syslogd&section=8) program. It indicates which types of `syslog` messages are logged to particular log files.

-

-

-

- #

-

- #

-

- # Spaces ARE valid field separators in this file. However,

-

- # other *nix-like systems still insist on using tabs as field

-

- # separators. If you are sharing this file between systems, you

-

- # may want to use only tabs as field separators here.

-

- # Consult the syslog.conf(5) manual page.

-

-

-*.err;kern.debug;auth.notice;mail.crit /dev/console

-

- *.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages

-

- security.* /var/log/security

-

- mail.info /var/log/maillog

-

- lpr.info /var/log/lpd-errs

-

- cron.* /var/log/cron

-

-

-*.err root

-

- *.notice;news.err root

-

- *.alert root

-

- *.emerg *

-

- # uncomment this to log all writes to /dev/console to /var/log/console.log

-

- #console.info /var/log/console.log

-

- # uncomment this to enable logging of all log messages to /var/log/all.log

-

- #*.* /var/log/all.log

-

- # uncomment this to enable logging to a remote log host named loghost

-

- #*.* @loghost

-

- # uncomment these if you're running inn

-

- # news.crit /var/log/news/news.crit

-

- # news.err /var/log/news/news.err

-

- # news.notice /var/log/news/news.notice

-

- !startslip

-

-

-*.* /var/log/slip.log

-

- !ppp

-

-

-*.* /var/log/ppp.log

-

-Consult the [syslog.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=syslog.conf&section=5) manual page for more information.

-

-#### newsyslog.conf

-

-`newsyslog.conf` is the configuration file for [newsyslog(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=newsyslog&section=8), a program that is normally scheduled to run by [cron(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=cron&section=8). [newsyslog(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=newsyslog&section=8) determines when log files require archiving or rearranging. `logfile` is moved to `logfile.0`, `logfile.0` is moved to `logfile.1`, and so on. Alternatively, the log files may be archived in [gzip(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=gzip&section=1) format causing them to be named: `logfile.0.gz`, `logfile.1.gz`, and so on.

-

-`newsyslog.conf` indicates which log files are to be managed, how many are to be kept, and when they are to be touched. Log files can be rearranged and/or archived when they have either reached a certain size, or at a certain periodic time/date.

-Consult the [newsyslog(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=newsyslog&section=8) manual page for more information.

-

-### sysctl.conf

-

-`sysctl.conf` looks much like `rc.conf`. Values are set in a `variable=value` form. The specified values are set after the system goes into multi-user mode. Not all variables are settable in this mode.

-[sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8) is an interface that allows you to make changes to a running DragonFly system. This includes many advanced options of the TCP/IP stack and virtual memory system that can dramatically improve performance for an experienced system administrator. Over five hundred system variables can be read and set using [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8).

-

-At its core, [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8) serves two functions: to read and to modify system settings.

-

-To view all readable variables:

-

-

-

- % sysctl -a

-

-To read a particular variable, for example, `kern.maxproc`:

-

-

-

- % sysctl kern.maxproc

-

- kern.maxproc: 1044

-

-To set a particular variable, use the intuitive `***variable***`=`***value***` syntax:

-

-

-

- # sysctl kern.maxfiles=5000

-

- kern.maxfiles: 2088 -< 5000

-

-Settings of sysctl variables are usually either strings, numbers, or booleans (a boolean being `1` for yes or a `0` for no).

-

-If you want to set automatically some variables each time the machine boots, add them to the `/etc/sysctl.conf` file. For more information see the [sysctl.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl.conf&section=5) manual page and the [configtuning-configfiles.html#CONFIGTUNING-SYSCTLCONF Section 6.10.4].

-

-### sysctl(8) Read-only

-

-***Contributed by Tom Rhodes. ***

-

-In some cases it may be desirable to modify read-only [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8) values. While this is not recommended, it is also sometimes unavoidable.

-

-For instance on some laptop models the [cardbus(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=cardbus&section=4) device will not probe memory ranges, and fail with errors which look similar to:

-

-

-

- cbb0: Could not map register memory

-

- device_probe_and_attach: cbb0 attach returned 12

-

-Cases like the one above usually require the modification of some default [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8) settings which are set read only. To overcome these situations a user can put [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8) ***OIDs*** in their local `/boot/loader.conf`. Default settings are located in the `/boot/defaults/loader.conf` file.

-

-Fixing the problem mentioned above would require a user to set `hw.pci.allow_unsupported_io_range=1` in the aforementioned file. Now [cardbus(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=cardbus&section=4) will work properly.

-

-## Tuning Disks

-

-### Sysctl Variables

-

-#### `vfs.vmiodirenable`

-

-The `vfs.vmiodirenable` sysctl variable may be set to either 0 (off) or 1 (on); it is 1 by default. This variable controls how directories are cached by the system. Most directories are small, using just a single fragment (typically 1 K) in the file system and less (typically 512 bytes) in the buffer cache. With this variable turned off (to 0), the buffer cache will only cache a fixed number of directories even if ou have a huge amount of memory. When turned on (to 1), this sysctl allows the buffer cache to use the VM Page Cache to cache the directories, making all the memory available for caching directories. However, the minimum in-core memory used to cache a directory is the physical page size (typically 4 K) rather than 512 bytes. We recommend keeping this option on if you are running any services which manipulate large numbers of files. Such services can include web caches, large mail systems, and news systems. Keeping this option on will generally not reduce performance even with the wasted memory but you should experiment to find out.

-

-#### `vfs.write_behind`

-

-The `vfs.write_behind` sysctl variable defaults to `1` (on). This tells the file system to issue media writes as full clusters are collected, which typically occurs when writing large sequential files. The idea is to avoid saturating the buffer cache with dirty buffers when it would not benefit I/O performance. However, this may stall processes and under certain circumstances you may wish to turn it off.

-

-#### `vfs.hirunningspace`

-

-The `vfs.hirunningspace` sysctl variable determines how much outstanding write I/O may be queued to disk controllers system-wide at any given instance. The default is usually sufficient but on machines with lots of disks you may want to bump it up to four or five ***megabytes***. Note that setting too high a value (exceeding the buffer cache's write threshold) can lead to extremely bad clustering performance. Do not set this value arbitrarily high! Higher write values may add latency to reads occurring at the same time.

-

-There are various other buffer-cache and VM page cache related sysctls. We do not recommend modifying these values. The VM system does an extremely good job of automatically tuning itself.

-

-#### `vm.swap_idle_enabled`

-

-The `vm.swap_idle_enabled` sysctl variable is useful in large multi-user systems where you have lots of users entering and leaving the system and lots of idle processes. Such systems tend to generate a great deal of continuous pressure on free memory reserves. Turning this feature on and tweaking the swapout hysteresis (in idle seconds) via `vm.swap_idle_threshold1` and `vm.swap_idle_threshold2` allows you to depress the priority of memory pages associated with idle processes more quickly then the normal pageout algorithm. This gives a helping hand to the pageout daemon. Do not turn this option on unless you need it, because the tradeoff you are making is essentially pre-page memory sooner rather than later; thus eating more swap and disk bandwidth. In a small system this option will have a determinable effect but in a large system that is already doing moderate paging this option allows the VM system to stage whole processes into and out of memory easily.

-

-#### `hw.ata.wc`

-

-IDE drives lie about when a write completes. With IDE write caching turned on, IDE hard drives not only write data to disk out of order, but will sometimes delay writing some blocks indefinitely when under heavy disk loads. A crash or power failure may cause serious file system corruption. Turning off write caching will remove the danger of this data loss, but will also cause disk operations to proceed ***very slowly.*** Change this only if prepared to suffer with the disk slowdown.

-

-Changing this variable must be done from the boot loader at boot time. Attempting to do it after the kernel boots will have no effect.

-The [tunefs(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=tunefs&section=8) program can be used to fine-tune a UFS file system. This program has many different options, but for now we are only concerned with toggling Soft Updates on and off, which is done by:

-

-

-

- # tunefs -n enable /filesystem

-

- # tunefs -n disable /filesystem

-

-A filesystem cannot be modified with [tunefs(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=tunefs&section=8) while it is mounted. A good time to enable Soft Updates is before any partitions have been mounted, in single-user mode.

-

- **Note:** It is possible to enable Soft Updates at filesystem creation time, through use of the `-U` option to [newfs(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=newfs&section=8).

-

-Soft Updates drastically improves meta-data performance, mainly file creation and deletion, through the use of a memory cache. We recommend to use Soft Updates on all of your file systems. There are two downsides to Soft Updates that you should be aware of: First, Soft Updates guarantees filesystem consistency in the case of a crash but could very easily be several seconds (even a minute!) behind updating the physical disk. If your system crashes you may lose more work than otherwise. Secondly, Soft Updates delays the freeing of filesystem blocks. If you have a filesystem (such as the root filesystem) which is almost full, performing a major update, such as `make installworld`, can cause the filesystem to run out of space and the update to fail.

-

-#### More Details about Soft Updates

-<!-- XXX: consider axing this section -->

-

-There are two traditional approaches to writing a file systems meta-data back to disk. (Meta-data updates are updates to non-content data like inodes or directories.)

-

-Historically, the default behavior was to write out meta-data updates synchronously. If a directory had been changed, the system waited until the change was actually written to disk. The file data buffers (file contents) were passed through the buffer cache and backed up to disk later on asynchronously. The advantage of this implementation is that it operates safely. If there is a failure during an update, the meta-data are always in a consistent state. A file is either created completely or not at all. If the data blocks of a file did not find their way out of the buffer cache onto the disk by the time of the crash, [fsck(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#fsck&section8) is able to recognize this and repair the filesystem by setting the file length to 0. Additionally, the implementation is clear and simple. The disadvantage is that meta-data changes are slow. An `rm -r`, for instance, touches all the files in a directory sequentially, but each directory change (deletion of a file) will be written synchronously to the disk. This includes updates to the directory itself, to the inode table, and possibly to indirect blocks allocated by the file. Similar considerations apply for unrolling large hierarchies (`tar -x`).

-

-The second case is asynchronous meta-data updates. This is the default for Linux/ext2fs and `mount -o async` for *BSD ufs. All meta-data updates are simply being passed through the buffer cache too, that is, they will be intermixed with the updates of the file content data. The advantage of this implementation is there is no need to wait until each meta-data update has been written to disk, so all operations which cause huge amounts of meta-data updates work much faster than in the synchronous case. Also, the implementation is still clear and simple, so there is a low risk for bugs creeping into the code. The disadvantage is that there is no guarantee at all for a consistent state of the filesystem. If there is a failure during an operation that updated large amounts of meta-data (like a power failure, or someone pressing the reset button), the filesystem will be left in an unpredictable state. There is no opportunity to examine the state of the filesystem when the system comes up again; the data blocks of a file could already have been written to the disk while the updates of the inode table or the associated directory were not. It is actually impossible to implement a `fsck` which is able to clean up the resulting chaos (because the necessary information is not available on the disk). If the filesystem has been damaged beyond repair, the only choice is to use [newfs(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#newfs&section8) on it and restore it from backup.

-

-The usual solution for this problem was to implement ***dirty region logging***, which is also referred to as ***journaling***, although that term is not used consistently and is occasionally applied to other forms of transaction logging as well. Meta-data updates are still written synchronously, but only into a small region of the disk. Later on they will be moved to their proper location. Because the logging area is a small, contiguous region on the disk, there are no long distances for the disk heads to move, even during heavy operations, so these operations are quicker than synchronous updates. Additionally the complexity of the implementation is fairly limited, so the risk of bugs being present is low. A disadvantage is that all meta-data are written twice (once into the logging region and once to the proper location) so for normal work, a performance ***pessimization*** might result. On the other hand, in case of a crash, all pending meta-data operations can be quickly either rolled-back or completed from the logging area after the system comes up again, resulting in a fast filesystem startup.

-

-Kirk McKusick, the developer of Berkeley FFS, solved this problem with Soft Updates: all pending meta-data updates are kept in memory and written out to disk in a sorted sequence (***ordered meta-data updates***). This has the effect that, in case of heavy meta-data operations, later updates to an item ***catch*** the earlier ones if the earlier ones are still in memory and have not already been written to disk. So all operations on, say, a directory are generally performed in memory before the update is written to disk (the data blocks are sorted according to their position so that they will not be on the disk ahead of their meta-data). If the system crashes, this causes an implicit ***log rewind***: all operations which did not find their way to the disk appear as if they had never happened. A consistent filesystem state is maintained that appears to be the one of 30 to 60 seconds earlier. The algorithm used guarantees that all resources in use are marked as such in their appropriate bitmaps: blocks and inodes. After a crash, the only resource allocation error that occurs is that resources are marked as ***used*** which are actually ***free***. [fsck(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#fsck&section8) recognizes this situation, and frees the resources that are no longer used. It is safe to ignore the dirty state of the filesystem after a crash by forcibly mounting it with `mount -f`. In order to free resources that may be unused, [fsck(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=fsck&section=8) needs to be run at a later time.

-

-The advantage is that meta-data operations are nearly as fast as asynchronous updates (i.e. faster than with ***logging***, which has to write the meta-data twice). The disadvantages are the complexity of the code (implying a higher risk for bugs in an area that is highly sensitive regarding loss of user data), and a higher memory consumption. Additionally there are some idiosyncrasies one has to get used to. After a crash, the state of the filesystem appears to be somewhat ***older***. In situations where the standard synchronous approach would have caused some zero-length files to remain after the `fsck`, these files do not exist at all with a Soft Updates filesystem because neither the meta-data nor the file contents have ever been written to disk. Disk space is not released until the updates have been written to disk, which may take place some time after running `rm`. This may cause problems when installing large amounts of data on a filesystem that does not have enough free space to hold all the files twice.

-

-## Tuning Kernel Limits

-

-### File/Process Limits

-

-#### `kern.maxfiles`

-

-<!-- XXX: revise this section; someone who knows about it -->

-

-`kern.maxfiles` can be raised or lowered based upon your system requirements. This variable indicates the maximum number of file descriptors on your system. When the file descriptor table is full, ***`file: table is full`*** will show up repeatedly in the system message buffer, which can be viewed with the `dmesg` command.

-

-Each open file, socket, or fifo uses one file descriptor. A large-scale production server may easily require many thousands of file descriptors, depending on the kind and number of services running concurrently.

-

-`kern.maxfile`'s default value is dictated by the `MAXUSERS` option in your kernel configuration file. `kern.maxfiles` grows proportionally to the value of `MAXUSERS`. When compiling a custom kernel, it is a good idea to set this kernel configuration option according to the uses of your system. From this number, the kernel is given most of its pre-defined limits. Even though a production machine may not actually have 256 users connected at once, the resources needed may be similar to a high-scale web server.

-

- **Note:** Setting `MAXUSERS` to `0` in your kernel configuration file will choose a reasonable default value based on the amount of RAM present in your system. It is set to 0 in the default GENERIC kernel.

-

-#### `kern.ipc.somaxconn`

-

-The `kern.ipc.somaxconn` sysctl variable limits the size of the listen queue for accepting new TCP connections. The default value of `128` is typically too low for robust handling of new connections in a heavily loaded web server environment. For such environments, it is recommended to increase this value to `1024` or higher. The service daemon may itself limit the listen queue size (e.g. [sendmail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sendmail&section=8), or **Apache** ) but will often have a directive in its configuration file to adjust the queue size. Large listen queues also do a better job of avoiding Denial of Service (DoS) attacks.

-

-### Network Limits

-

-The `NMBCLUSTERS` kernel configuration option dictates the amount of network Mbufs available to the system. A heavily-trafficked server with a low number of Mbufs will hinder DragonFly's ability. Each cluster represents approximately 2 K of memory, so a value of 1024 represents 2 megabytes of kernel memory reserved for network buffers. A simple calculation can be done to figure out how many are needed. If you have a web server which maxes out at 1000 simultaneous connections, and each connection eats a 16 K receive and 16 K send buffer, you need approximately 32 MB worth of network buffers to cover the web server. A good rule of thumb is to multiply by 2, so 2x32 MB / 2 KB # 64 MB / 2 kB 32768. We recommend values between 4096 and 32768 for machines with greater amounts of memory. Under no circumstances should you specify an arbitrarily high value for this parameter as it could lead to a boot time crash. The `-m` option to [netstat(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=netstat&section=1) may be used to observe network cluster use. `kern.ipc.nmbclusters` loader tunable should be used to tune this at boot time.

-

-<!-- XXX: mention kern.ipc.mbufs sysctl -->

-

-For busy servers that make extensive use of the [sendfile(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=sendfile&section=2) system call, it may be necessary to increase the number of [sendfile(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=sendfile&section=2) buffers via the `NSFBUFS` kernel configuration option or by setting its value in `/boot/loader.conf` (see [loader(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=loader&section=8) for details). A common indicator that this parameter needs to be adjusted is when processes are seen in the `sfbufa` state. The sysctl variable `kern.ipc.nsfbufs` is a read-only glimpse at the kernel configured variable. This parameter nominally scales with `kern.maxusers`, however it may be necessary to tune accordingly.

-

- **Important:** Even though a socket has been marked as non-blocking, calling [sendfile(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=sendfile&section=2) on the non-blocking socket may result in the [sendfile(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=sendfile&section=2) call blocking until enough `struct sf_buf`'s are made available.

-

-#### `net.inet.ip.portrange.*`

-

-The `net.inet.ip.portrange.*` sysctl variables control the port number ranges automatically bound to TCP and UDP sockets. There are three ranges: a low range, a default range, and a high range. Most network programs use the default range which is controlled by the `net.inet.ip.portrange.first` and `net.inet.ip.portrange.last`, which default to 1024 and 5000, respectively. Bound port ranges are used for outgoing connections, and it is possible to run the system out of ports under certain circumstances. This most commonly occurs when you are running a heavily loaded web proxy. The port range is not an issue when running servers which handle mainly incoming connections, such as a normal web server, or has a limited number of outgoing connections, such as a mail relay. For situations where you may run yourself out of ports, it is recommended to increase `net.inet.ip.portrange.last` modestly. A value of `10000`, `20000` or `30000` may be reasonable. You should also consider firewall effects when changing the port range. Some firewalls may block large ranges of ports (usually low-numbered ports) and expect systems to use higher ranges of ports for outgoing connections -- for this reason it is recommended that `net.inet.ip.portrange.first` be lowered.

-

-#### TCP Bandwidth Delay Product

-<!-- XXX: Revise this stuff, I'm not familiar with it -->

-

-The TCP Bandwidth Delay Product Limiting is similar to TCP/Vegas in NetBSD. It can be enabled by setting `net.inet.tcp.inflight_enable` sysctl variable to `1`. The system will attempt to calculate the bandwidth delay product for each connection and limit the amount of data queued to the network to just the amount required to maintain optimum throughput.

-

-This feature is useful if you are serving data over modems, Gigabit Ethernet, or even high speed WAN links (or any other link with a high bandwidth delay product), especially if you are also using window scaling or have configured a large send window. If you enable this option, you should also be sure to set `net.inet.tcp.inflight_debug` to `0` (disable debugging), and for production use setting `net.inet.tcp.inflight_min` to at least `6144` may be beneficial. However, note that setting high minimums may effectively disable bandwidth limiting depending on the link. The limiting feature reduces the amount of data built up in intermediate route and switch packet queues as well as reduces the amount of data built up in the local host's interface queue. With fewer packets queued up, interactive connections, especially over slow modems, will also be able to operate with lower ***Round Trip Times***. However, note that this feature only effects data transmission (uploading / server side). It has no effect on data reception (downloading).

-

-Adjusting `net.inet.tcp.inflight_stab` is ***not*** recommended. This parameter defaults to 20, representing 2 maximal packets added to the bandwidth delay product window calculation. The additional window is required to stabilize the algorithm and improve responsiveness to changing conditions, but it can also result in higher ping times over slow links (though still much lower than you would get without the inflight algorithm). In such cases, you may wish to try reducing this parameter to 15, 10, or 5; and may also have to reduce `net.inet.tcp.inflight_min` (for example, to 3500) to get the desired effect. Reducing these parameters should be done as a last resort only.

-

-## Adding Swap Space

-<!-- XXX: swapcache -->

-

-No matter how well you plan, sometimes a system does not run as you expect. If you find you need more swap space, it is simple enough to add. You have three ways to increase swap space: adding a new hard drive, enabling swap over NFS, and creating a swap file on an existing partition.

-

-### Swap on a New Hard Drive

-

-The best way to add swap, of course, is to use this as an excuse to add another hard drive. You can always use another hard drive, after all. If you can do this, go reread the discussion about swap space in [configtuning-initial.html Section 6.2] for some suggestions on how to best arrange your swap.

-

-### Swapping over NFS

-

-Swapping over NFS is only recommended if you do not have a local hard disk to swap to. Even though DragonFly has an excellent NFS implementation, NFS swapping will be limited by the available network bandwidth and puts an additional burden on the NFS server.

-

-### Swapfiles

-

-You can create a file of a specified size to use as a swap file. In our example here we will use a 64MB file called `/usr/swap0`. You can use any name you want, of course.

-

- **Example 6-1. Creating a Swapfile**

-

- 1. Be certain that your kernel configuration includes the vnode driver. It is ***not*** in recent versions of `GENERIC`.

-

-

-

- pseudo-device vn 1 #Vnode driver (turns a file into a device)

-

-

-

- 1. Create a swapfile (`/usr/swap0`):

-

-

-

- # dd if=/dev/zero of=/usr/swap0 bs=1024k count=64

-

-

-

- 1. Set proper permissions on (`/usr/swap0`):

-

-

-

- # chmod 0600 /usr/swap0

-

-

-

- 1. Enable the swap file in `/etc/rc.conf`:

-

-

-

- swapfile="/usr/swap0" # Set to name of swapfile if aux swapfile desired.

-

-

-

- 1. Reboot the machine or to enable the swap file immediately, type:

-

-

-

- # vnconfig -e /dev/vn0b /usr/swap0 swap

-

-

-

-## Power and Resource Management

-

-***Written by Hiten Pandya and Tom Rhodes. ***

-

-It is very important to utilize hardware resources in an efficient manner. Before ACPI was introduced, it was very difficult and inflexible for operating systems to manage the power usage and thermal properties of a system. The hardware was controlled by some sort of BIOS embedded interface, such as ***Plug and Play BIOS (PNPBIOS)***, or ***Advanced Power Management (APM)*** and so on. Power and Resource Management is one of the key components of a modern operating system. For example, you may want an operating system to monitor system limits (and possibly alert you) in case your system temperature increased unexpectedly.

-

-In this section, we will provide comprehensive information about ACPI. References will be provided for further reading at the end. Please be aware that ACPI is available on DragonFly systems as a default kernel module.

-

-### What Is ACPI?

-

-Advanced Configuration and Power Interface (ACPI) is a standard written by an alliance of vendors to provide a standard interface for hardware resources and power management (hence the name). It is a key element in ***Operating System-directed configuration and Power Management***, i.e.: it provides more control and flexibility to the operating system (OS). Modern systems ***stretched*** the limits of the current Plug and Play interfaces (such as APM), prior to the introduction of ACPI. ACPI is the direct successor to APM (Advanced Power Management).

-

-### Shortcomings of Advanced Power Management (APM)

-

-The ***Advanced Power Management (APM)*** facility control's the power usage of a system based on its activity. The APM BIOS is supplied by the (system) vendor and it is specific to the hardware platform. An APM driver in the OS mediates access to the ***APM Software Interface***, which allows management of power levels.

-

-There are four major problems in APM. Firstly, power management is done by the (vendor-specific) BIOS, and the OS does not have any knowledge of it. One example of this, is when the user sets idle-time values for a hard drive in the APM BIOS, that when exceeded, it (BIOS) would spin down the hard drive, without the consent of the OS. Secondly, the APM logic is embedded in the BIOS, and it operates outside the scope of the OS. This means users can only fix problems in their APM BIOS by flashing a new one into the ROM; which, is a very dangerous procedure, and if it fails, it could leave the system in an unrecoverable state. Thirdly, APM is a vendor-specific technology, which, means that there is a lot or parity (duplication of efforts) and bugs found in one vendor's BIOS, may not be solved in others. Last but not the least, the APM BIOS did not have enough room to implement a sophisticated power policy, or one that can adapt very well to the purpose of the machine.

-

-***Plug and Play BIOS (PNPBIOS)*** was unreliable in many situations. PNPBIOS is 16-bit technology, so the OS has to use 16-bit emulation in order to ***interface*** with PNPBIOS methods.

-The `acpi.ko` driver is loaded by default at start up by the [loader(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=loader&section=8) and should ***not*** be compiled into the kernel. The reasoning behind this is that modules are easier to work with, say if switching to another `acpi.ko` without doing a kernel rebuild. This has the advantage of making testing easier. Another reason is that starting ACPI after a system has been brought up is not too useful, and in some cases can be fatal. In doubt, just disable ACPI all together. This driver should not and can not be unloaded because the system bus uses it for various hardware interactions. ACPI can be disabled with the [acpiconf(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=acpiconf&section=8) utility. In fact most of the interaction with ACPI can be done via [acpiconf(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=acpiconf&section=8). Basically this means, if anything about ACPI is in the [dmesg(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dmesg&section=8) output, then most likely it is already running.

-

- **Note:** ACPI and APM cannot coexist and should be used separately. The last one to load will terminate if the driver notices the other running.

-

-In the simplest form, ACPI can be used to put the system into a sleep mode with [acpiconf(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=acpiconf&section=8), the `-s` flag, and a `1-5` option. Most users will only need `1`. Option `5` will do a soft-off which is the same action as:

-

-

-

- # halt -p

-

-The other options are available. Check out the [acpiconf(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=acpiconf&section=8) manual page for more information.

-

-## Using and Debugging DragonFly ACPI

-

-***Written by Nate Lawson. With contributions from Peter Schultz and Tom Rhodes. ***

-

-ACPI is a fundamentally new way of discovering devices, managing power usage, and providing standardized access to various hardware previously managed by the BIOS. Progress is being made toward ACPI working on all systems, but bugs in some motherboards ***ACPI Machine Language*** (AML) bytecode, incompleteness in DragonFly's kernel subsystems, and bugs in the Intel ACPI-CA interpreter continue to appear.

-

-This document is intended to help you assist the DragonFly ACPI maintainers in identifying the root cause of problems you observe and debugging and developing a solution. Thanks for reading this and we hope we can solve your system's problems.

-

-### Submitting Debugging Information

-

- **Note:** Before submitting a problem, be sure you are running the latest BIOS version and, if available, embedded controller firmware version.

-

-For those of you that want to submit a problem right away, please send the following information to [bugs](http://leaf.dragonflybsd.org/mailarchive/)

-

-* Description of the buggy behavior, including system type and model and anything that causes the bug to appear. Also, please note as accurately as possible when the bug began occurring if it is new for you.

-

-* The dmesg output after ***boot `-v`***, including any error messages generated by you exercising the bug.

-

-* dmesg output from ***boot `-v`*** with ACPI disabled, if disabling it helps fix the problem.

-

-* Output from ***sysctl hw.acpi***. This is also a good way of figuring out what features your system offers.

-

-* URL where your ***ACPI Source Language*** (ASL) can be found. Do ***not*** send the ASL directly to the list as it can be very large. Generate a copy of your ASL by running this command:

-

-

- # acpidump -t -d > name-system.asl

-

-

-

- (Substitute your login name for `name` and manufacturer/model for `system`. Example: `njl-FooCo6000.asl`)

-

-### Background

-

-ACPI is present in all modern computers that conform to the ia32 (x86), ia64 (Itanium), and amd64 (AMD) architectures. The full standard has many features including CPU performance management, power planes control, thermal zones, various battery systems, embedded controllers, and bus enumeration. Most systems implement less than the full standard. For instance, a desktop system usually only implements the bus enumeration parts while a laptop might have cooling and battery management support as well. Laptops also have suspend and resume, with their own associated complexity.

-

-An ACPI-compliant system has various components. The BIOS and chipset vendors provide various fixed tables (e.g., FADT) in memory that specify things like the APIC map (used for SMP), config registers, and simple configuration values. Additionally, a table of bytecode (the ***Differentiated System Description Table*** DSDT) is provided that specifies a tree-like name space of devices and methods.

-

-The ACPI driver must parse the fixed tables, implement an interpreter for the bytecode, and modify device drivers and the kernel to accept information from the ACPI subsystem. For DragonFly, Intel has provided an interpreter (ACPI-CA) that is shared with Linux and NetBSD®. The path to the ACPI-CA source code is `src/sys/dev/acpica5`. Finally, drivers that implement various ACPI devices are found in `src/sys/dev/acpica5`.

-

-### Common Problems

-

-For ACPI to work correctly, all the parts have to work correctly. Here are some common problems, in order of frequency of appearance, and some possible workarounds or fixes.

-

-#### Suspend/Resume

-

-ACPI has three suspend to RAM (STR) states, `S1`-`S3`, and one suspend to disk state (`STD`), called `S4`. `S5` is ***soft off*** and is the normal state your system is in when plugged in but not powered up. `S4` can actually be implemented two separate ways. `S4`BIOS is a BIOS-assisted suspend to disk. `S4`OS is implemented entirely by the operating system.

-

-Start by checking `sysctl` `hw.acpi` for the suspend-related items. Here are the results for my Thinkpad:

-

- hw.acpi.supported_sleep_state: S3 S4 S5

-

- hw.acpi.s4bios: 0

-

-This means that I can use `acpiconf -s` to test `S3`, `S4`OS, and `S5`. If `s4bios` was one (`1`), I would have `S4`BIOS support instead of `S4` OS.

-

-When testing suspend/resume, start with `S1`, if supported. This state is most likely to work since it doesn't require much driver support. No one has implemented `S2` but if you have it, it's similar to `S1`. The next thing to try is `S3`. This is the deepest STR state and requires a lot of driver support to properly reinitialize your hardware. If you have problems resuming, feel free to email the [bugs](http://leaf.dragonflybsd.org/mailarchive/) list but do not expect the problem to be resolved since there are a lot of drivers/hardware that need more testing and work.

-

-To help isolate the problem, remove as many drivers from your kernel as possible. If it works, you can narrow down which driver is the problem by loading drivers until it fails again. Typically binary drivers like `nvidia.ko`, **X11** display drivers, and USB will have the most problems while Ethernet interfaces usually work fine. If you can load/unload the drivers ok, you can automate this by putting the appropriate commands in `/etc/rc.suspend` and `/etc/rc.resume`. There is a commented-out example for unloading and loading a driver. Try setting `hw.acpi.reset_video` to zero (0) if your display is messed up after resume. Try setting longer or shorter values for `hw.acpi.sleep_delay` to see if that helps.

-

-Another thing to try is load a recent Linux distribution with ACPI support and test their suspend/resume support on the same hardware. If it works on Linux, it's likely a DragonFly driver problem and narrowing down which driver causes the problems will help us fix the problem. Note that the ACPI maintainers do not usually maintain other drivers (e.g sound, ATA, etc.) so any work done on tracking down a driver problem should probably eventually be posted to the [bugs](http://leaf.dragonflybsd.org/mailarchive/) list and mailed to the driver maintainer. If you are feeling adventurous, go ahead and start putting some debugging [printf(3)](http://leaf.dragonflybsd.org/cgi/web-man?command#printf&section3)s in a problematic driver to track down where in its resume function it hangs.

-

-Finally, try disabling ACPI and enabling APM instead. If suspend/resume works with APM, you may be better off sticking with APM, especially on older hardware (pre-2000). It took vendors a while to get ACPI support correct and older hardware is more likely to have BIOS problems with ACPI.

-

-<-- XXX: mention sensors somewhere; but not in this section -->

-

-#### System Hangs (temporary or permanent)

-

-Most system hangs are a result of lost interrupts or an interrupt storm. Chipsets have a lot of problems based on how the BIOS configures interrupts before boot, correctness of the APIC (MADT) table, and routing of the ***System Control Interrupt*** (SCI).

-

-Interrupt storms can be distinguished from lost interrupts by checking the output of `vmstat -i` and looking at the line that has `acpi0`. If the counter is increasing at more than a couple per second, you have an interrupt storm. If the system appears hung, try breaking to DDB ( **CTRL** + **ALT** + **ESC** on console) and type `show interrupts`.

-

-Your best hope when dealing with interrupt problems is to try disabling APIC support with `hint.apic.0.disabled="1"` in `loader.conf`.

-

-#### Panics

-

-Panics are relatively rare for ACPI and are the top priority to be fixed. The first step is to isolate the steps to reproduce the panic (if possible) and get a backtrace. Follow the advice for enabling `options DDB` and setting up a serial console (see [ this section](serialconsole-setup.html#SERIALCONSOLE-DDB)) or setting up a [dump(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dump&section=8) partition. You can get a backtrace in DDB with `tr`. If you have to handwrite the backtrace, be sure to at least get the lowest five (5) and top five (5) lines in the trace.

-

-Then, try to isolate the problem by booting with ACPI disabled. If that works, you can isolate the ACPI subsystem by using various values of `debug.acpi.disable`. See the [acpi(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=acpi&section=4) manual page for some examples.

-

-#### System Powers Up After Suspend or Shutdown

-

-First, try setting `hw.acpi.disable_on_poweroff#0` in [loader.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=loader.conf&section=5). This keeps ACPI from disabling various events during the shutdown process. Some systems need this value set to ***1*** (the default) for the same reason. This usually fixes the problem of a system powering up spontaneously after a suspend or poweroff.

-

-#### Other Problems

-

-If you have other problems with ACPI (working with a docking station, devices not detected, etc.), please email a description to the mailing list as well; however, some of these issues may be related to unfinished parts of the ACPI subsystem so they might take a while to be implemented. Please be patient and prepared to test patches we may send you.

-

-### ASL, acpidump, and IASL

-<!-- XXX: IMHO all this crap about fixing your DSDT etc should be axed -->

-

-The most common problem is the BIOS vendors providing incorrect (or outright buggy!) bytecode. This is usually manifested by kernel console messages like this:

-Often, you can resolve these problems by updating your BIOS to the latest revision. Most console messages are harmless but if you have other problems like battery status not working, they're a good place to start looking for problems in the AML. The bytecode, known as AML, is compiled from a source language called ASL. The AML is found in the table known as the DSDT. To get a copy of your ASL, use [acpidump(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=acpidump&section=8). You should use both the `-t` (show contents of the fixed tables) and `-d` (disassemble AML to ASL) options. See the [submitting Debugging Information](acpi-debug.html#ACPI-SUBMITDEBUG) section for an example syntax.

-

-The simplest first check you can do is to recompile your ASL to check for errors. Warnings can usually be ignored but errors are bugs that will usually prevent ACPI from working correctly. To recompile your ASL, issue the following command:

-

-

-

- # iasl your.asl

-

-### Fixing Your ASL

-

-In the long run, our goal is for almost everyone to have ACPI work without any user intervention. At this point, however, we are still developing workarounds for common mistakes made by the BIOS vendors. The Microsoft interpreter (`acpi.sys` and `acpiec.sys`) does not strictly check for adherence to the standard, and thus many BIOS vendors who only test ACPI under Windows never fix their ASL. We hope to continue to identify and document exactly what non-standard behavior is allowed by Microsoft's interpreter and replicate it so DragonFly can work without forcing users to fix the ASL. As a workaround and to help us identify behavior, you can fix the ASL manually. If this works for you, please send a [diff(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=diff&section=1) of the old and new ASL so we can possibly work around the buggy behavior in ACPI-CA and thus make your fix unnecessary.

-

-Here is a list of common error messages, their cause, and how to fix them:

-

-#### OS dependencies

-

-Some AML assumes the world consists of various Windows versions. You can tell DragonFly to claim it is any OS to see if this fixes problems you may have. An easy way to override this is to set `hw.acpi.osname=Windows 2001` in `/boot/loader.conf` or other similar strings you find in the ASL.

-

-#### Missing Return statements

-

-Some methods do not explicitly return a value as the standard requires. While ACPI-CA does not handle this, DragonFly has a workaround that allows it to return the value implicitly. You can also add explicit Return statements where required if you know what value should be returned. To force `iasl` to compile the ASL, use the `-f` flag.

-

-#### Overriding the Default AML

-

-After you customize `your.asl`, you will want to compile it, run:

-

-

- # iasl your.asl

-

-You can add the `-f` flag to force creation of the AML, even if there are errors during compilation. Remember that some errors (e.g., missing Return statements) are automatically worked around by the interpreter.

-

-`DSDT.aml` is the default output filename for `iasl`. You can load this instead of your BIOS's buggy copy (which is still present in flash memory) by editing `/boot/loader.conf` as follows:

-

-

-

- acpi_dsdt_load="YES"

-

- acpi_dsdt_name="/boot/DSDT.aml"

-

-Be sure to copy your `DSDT.aml` to the `/boot` directory.

-

-### Getting Debugging Output From ACPI

-

-The ACPI driver has a very flexible debugging facility. It allows you to specify a set of subsystems as well as the level of verbosity. The subsystems you wish to debug are specified as ***layers*** and are broken down into ACPI-CA components (ACPI_ALL_COMPONENTS) and ACPI hardware support (ACPI_ALL_DRIVERS). The verbosity of debugging output is specified as the ***level*** and ranges from ACPI_LV_ERROR (just report errors) to ACPI_LV_VERBOSE (everything). The ***level*** is a bitmask so multiple options can be set at once, separated by spaces. In practice, you will want to use a serial console to log the output if it is so long it flushes the console message buffer.

-

-Debugging output is not enabled by default. To enable it, add `options ACPI_DEBUG` to your kernel config if ACPI is compiled into the kernel. You can add `ACPI_DEBUG=1` to your `/etc/make.conf` to enable it globally. If it is a module, you can recompile just your `acpi.ko` module as follows:

-

-

-

- # cd /sys/dev/acpica5 && make clean && make ACPI_DEBUG=1

-

-Install `acpi.ko` in `/boot/kernel` and add your desired level and layer to `loader.conf`. This example enables debug messages for all ACPI-CA components and all ACPI hardware drivers (CPU, LID, etc.) It will only output error messages, the least verbose level.

-

-

-

- debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS"

-

- debug.acpi.level="ACPI_LV_ERROR"

-

-If the information you want is triggered by a specific event (say, a suspend and then resume), you can leave out changes to `loader.conf` and instead use `sysctl` to specify the layer and level after booting and preparing your system for the specific event. The `sysctl`s are named the same as the tunables in `loader.conf`.

-

-### References

-

-More information about ACPI may be found in the following locations:

-

-* The [FreeBSD ACPI mailing list](http://lists.FreeBSD.org/mailman/listinfo/freebsd-acpi) (This is FreeBSD-specific; posting DragonFly questions here may not generate much of an answer.)

-***Obtained from [vkernel(7)](http://leaf.dragonflybsd.org/cgi/web-man?command=vkernel&section=7) written by Sascha Wildner, added by Matthias Schmidt***

-

-The idea behind the development of the vkernel architecture was to find an elegant solution to debugging of the kernel and its components. It eases debugging, as it allows for a virtual kernel being loaded in userland and hence debug it without affecting the real kernel itself. By being able to load it on a running system it also removes the need for reboots between kernel compiles.

-A number of virtual device drivers exist to supplement the virtual kernel.

-

-<!-- XXX: why do they only support 16 devices? is this really true? -->

-

-### Disk device

-

-The vkd driver allows for up to 16 [vn(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=vn&section=4) based disk devices. The root device will be `vkd0`.

-

-### CD-ROM device

-

-The vcd driver allows for up to 16 virtual CD-ROM devices. Basically this is a read only `vkd` device with a block size of 2048.

-

-### Network interface

-

-The vke driver supports up to 16 virtual network interfaces which are

-

-associated with [tap(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=tap&section=4) devices on the host. For each `vke` device, the per-interface read only [sysctl(3)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=3) variable `hw.vkeX.tap_unit` holds the unit number of the associated [tap(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=tap&section=4) device.

-

-## Setup a virtual kernel environment

-

-A couple of steps are necessary in order to prepare the system to build and run a virtual kernel.

-

-### Setting up the filesystem

-

-The vkernel architecture needs a number of files which reside in `/var/vkernel`. Since these files tend to get rather big and the `/var` partition is usually of limited size, we recommend the directory to be created in the `/home` partition with a link to it in `/var`:

-

-

-

- % mkdir /home/var.vkernel

- % ln -s /home/var.vkernel /var/vkernel

-

-Next, a filesystem image to be used by the virtual kernel has to be created and populated (assuming world has been built previously):

-A special sysctl(8), `vm.vkernel_enable`, must be set to enable vkernel operation:

-

- # sysctl vm.vkernel_enable=1

-

-To make this change permanent, edit `/etc/sysctl.conf`

-

-## Setup networking

-

-### Configuring the network on the host system

-

-In order to access a network interface of the host system from the vkernel, you must add the interface to a [bridge(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=bridge&section=4) device which will then be passed to the `-I` option:

-

-

-

- # kldload if_bridge.ko

- # kldload if_tap.ko

- # ifconfig bridge0 create

- # ifconfig bridge0 addm re0 # assuming re0 is the host's interface

- # ifconfig bridge0 up

-

- **Note** : You have to change `re0` to the interface of your host machine.

-You can issue the reboot(8), halt(8), or shutdown(8) commands from inside a virtual kernel. After doing a clean shutdown the reboot(8) command will re-exec the virtual kernel binary while the other two will cause the virtual kernel to exit.

-

-# The DragonFly Booting Process

-[[!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.

-

-After reading this chapter, you will know:

-

-* What the components of the DragonFly bootstrap system are, and how they interact.

-

-* The options you can give to the components in the DragonFly bootstrap to control the boot process.

-

-* The basics of [device.hints(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#device.hints&section5&manpath=FreeBSD+5.2-current).

-

- **x86 Only:** This chapter only describes the boot process for DragonFly running on x86 systems.

-

-## The Booting Problem

-

-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?

-

-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***.

-

-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.

-

-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.)

-

-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`.

-

-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.

-

-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.

-

-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.

-

-----

-

-## The Boot Manager and Boot Stages

-

-### The Boot Manager

-

-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** .

-

- **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:

-

- **Example 7-1. `boot0` Screenshot**

-

-

-

- F1 DOS

-

- F2 FreeBSD

-

- F3 Linux

-

- F4 ??

-

- F5 Drive 1

-

-

-

- Default: F2

-

-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:

-

-

-

- # fdisk -B -b /boot/boot0 device

-

-where `***device***` is the device that you boot from, such as `ad0` for the first IDE disk, `ad2` for the first IDE disk on a second IDE controller, `da0` for the first SCSI disk, and so on. Or, if you want a custom configuration of the MBR, use [boot0cfg(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=boot0cfg&section=8).

-

- **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:

-

-

-

- other=/dev/hdXY

-

- table=/dev/hdX

-

- loader=/boot/chain.b

-

- label=DragonFly

-

-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

-

-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).

-

-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`.

-

-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.

-

-`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.

-

-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.

-

- **Example 7-2. boot2 Screenshot**

-

-

-

- >> DragonFly/i386 BOOT

-

- Default: 0:ad(0,a)/boot/loader

-

- boot:

-

-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):

-

-

-

- # disklabel -B diskslice

-

-where `***diskslice***` is the disk and slice you boot from, such as `ad0s1` for the first slice on the first IDE disk.

-

-### Stage Three, `/boot/loader`

-

-The loader is the final stage of the three-stage bootstrap, and is located on the file system, usually as `/boot/loader`.

-

-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

-

-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.

-

-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.

-

-#### Loader Built-In Commands

-

-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).

-

-* 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.

-

-* boot [`***-options***`] [`***kernelname***`]: Immediately proceeds to boot the kernel, with the given options, if any, and with the kernel name given, if it is.

-

-*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`.

-

-* help [`***topic***`]: Shows help messages read from `/boot/loader.help`. If the topic given is `index`, then the list of available topics is given.

-

-* 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.

-

-* 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.

-

-* 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.

-

-* lsdev [`-v`]: Lists all of the devices from which it may be possible to load modules. If `-v` is specified, more details are printed.

-* more `***filename***`: Displays the files specified, with a pause at each `LINES` displayed.

-

-* reboot: Immediately reboots the system.

-

-* set `***variable***`, set `***variable***`=`***value***`: Sets the loader's environment variables.

-

-* unload: Removes all loaded modules.

-

-#### Loader Examples

-

-Here are some practical examples of loader usage:

-

-* To simply boot your usual kernel, but in single-user mode:

-

-

-

- boot -s

-

-

-

-* To unload your usual kernel and modules, and then load just your old (or another) kernel:

-

-

-

- unload

-

- load kernel.old

-

-

-

- You can use `kernel.GENERIC` to refer to the generic kernel that comes on the install disk, or `kernel.old` to refer to your previously installed kernel (when you have upgraded or configured your own kernel, for example).

-

- **Note:** Use the following to load your usual modules with another kernel:

-

-

-

- unload

-

- set kernel="kernel.old"

-

- boot-conf

-

-

-

-* To load a kernel configuration script (an automated script which does the things you would normally do in the kernel boot-time configurator):

-

-

-

- load -t userconfig_script /boot/kernel.conf

-

-

-

-----

-

-## Kernel Interaction During Boot

-

-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.

-

-### Kernel Boot Flags

-

-Here are the more common boot flags:

-

-`-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

-

- **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.

-

-## 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`.

-

-### Automatic Reboot Sequence

-

-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.

-

-### Single-User Mode

-

-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`.

-

-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).

-

-If the system `console` is set to `insecure` in `/etc/ttys`, then the system prompts for the `root` password before initiating single-user mode.

-

-***'Example 7-3. An Insecure Console in `/etc/ttys`***'

-

-

-

- # 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 insecure

-

- **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`.

-

-### Multi-User Mode

-

-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)

-

-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.

-

-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.

-

-## Shutdown Sequence

-

-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.

-

-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.

-

- **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.

-

-<!-- this section needs the info about sernos and vfs.mountrootfrom or whatever it's called -->

-

-# Users and Basic Account Management

-

-***Contributed by Neil Blakey-Milner. ***

-

-[[!toc levels=3]]

-

-## Synopsis

-

-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:

-

-* The differences between the various user accounts on a DragonFly system.

-

-* How to add user accounts.

-

-* How to remove user accounts.

-

-* 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.

-

-* How to use groups to make account management easier.

-

-Before reading this chapter, you should:

-

-* Understand the basics of UNIX® and DragonFly ([Chapter 3](basics.html)).

-

-## Introduction

-

-All access to the system is achieved via accounts, and all processes are run by users, so user and account management are of integral importance on DragonFly systems.

-

-Every account on a DragonFly system has certain information associated with it to identify the account.

-

-* User name: The user name as it would be typed at the login: prompt. User names must be unique across the computer; you may not have two users with the same user name. There are a number of rules for creating valid user names, documented in [passwd(5)](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.

-

-* 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.

-

-* Login class: Login classes are an extension to the group mechanism that provide additional flexibility when tailoring the system to different users.

-

-* 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.

-

-* 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.

-

-* 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.

-

-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.

-

-## The Superuser Account

-

-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.

-

-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.

-

-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.

-

-## System Accounts

-

-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.

-

-`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.

-

-## User Accounts

-

-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.

-

-Each user can set up their own environment to accommodate their use of the system, by using alternate shells, editors, key bindings, and language.

-

-## Modifying Accounts

-

-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.

- [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. |

-

-"""]]

-

-### 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**

-

-

-

- # adduser -v

-

- Use option -silent if you don't want to see all warnings and questions.

-

- Check /etc/shells

-

- Check /etc/master.passwd

-

- Check /etc/group

-

- Enter your default shell: csh date no sh tcsh zsh [sh]: zsh

-

- Your default shell is: zsh -&gt; /usr/local/bin/zsh

-

- Enter your default HOME partition: [/home]:

-

- Copy dotfiles from: /usr/share/skel no [/usr/share/skel]:

-

- Send message from file: /etc/adduser.message no

-

- [/etc/adduser.message]: no

-

- Do not send message

-

- Use passwords (y/n) [y]: y

-

-

-

- Write your changes to /etc/adduser.conf? (y/n) [n]: y

-

-

-

- Ok, let's go.

-

- Don't worry about mistakes. I will give you the chance later to correct any input.

-

- Enter username [a-z0-9_-]: jru

-

- Enter full name []: J. Random User

-

- Enter shell csh date no sh tcsh zsh [zsh]:

-

- Enter home directory (full path) [/home/jru]:

-

- Uid [1001]:

-

- Enter login class: default []:

-

- Login group jru [jru]:

-

- Login group is ***jru***. Invite jru into other groups: guest no

-

- [no]: wheel

-

- Enter password []:

-

- Enter password again []:

-

-

-

- Name: jru

-

- Password: ****

-

- Fullname: J. Random User

-

- Uid: 1001

-

- Gid: 1001 (jru)

-

- Class:

-

- Groups: jru wheel

-

- HOME: /home/jru

-

- Shell: /usr/local/bin/zsh

-

- OK? (y/n) [y]: y

-

- Added user ***jru***

-

- Copy files from /usr/share/skel to /home/jru

-

- Add another user? (y/n) [y]: n

-

- Goodbye!

-

- #

-

-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.

-

- **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.

-

-### rmuser

-

-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 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.

-

- 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`.

-

- 1. Removes all files owned by the user from temporary file storage areas such as `/tmp`.

-

- 1. Finally, removes the username from all groups to which it belongs in `/etc/group`.

-

- **Note:** If a group becomes empty and the group name is the same as the username, the group is removed; this complements the per-user unique groups created by [adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8).

-

-[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.

-

-By default, an interactive mode is used, which attempts to make sure you know what you are doing.

-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).

-

-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.

-

-***'Example 8-3. Interactive `chpass` by Superuser***'

-

-

-

- #Changing user database information for jru.

-

- Login: jru

-

- Password: *

-

- Uid [#]: 1001

-

- Gid [# or name]: 1001

-

- Change [month day year]:

-

- Expire [month day year]:

-

- Class:

-

- Home directory: /home/jru

-

- Shell: /usr/local/bin/zsh

-

- Full Name: J. Random User

-

- Office Location:

-

- Office Phone:

-

- Home Phone:

-

- Other information:

-

-The normal user can change only a small subset of this information, and only for themselves.

-

- **Example 8-4. Interactive chpass by Normal User**

-

-

-

- #Changing user database information for jru.

-

- Shell: /usr/local/bin/zsh

-

- Full Name: J. Random User

-

- Office Location:

-

- Office Phone:

-

- Home Phone:

-

- 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].

-

-### passwd

-

-[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.

-

- **Example 8-5. Changing Your Password**

-

-

-

- % passwd

-

- Changing local password for jru.

-

- Old password:

-

- New password:

-

- Retype new password:

-

- passwd: updating the database...

-

- passwd: done

-

-***'Example 8-6. Changing Another User's Password as the Superuser***'

-

-

-

- # passwd jru

-

- Changing local password for jru.

-

- New password:

-

- Retype new password:

-

- passwd: updating the database...

-

- passwd: done

-

- **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.

-

-### pw

-

-[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

-

-[[!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. |

-| |

-"""]]

-

-## Limiting Users

-

-<!-- XXX: check this section, I got the feeling there might be something outdated in it. I'm not familiar with it -->

-

-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].

-

-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.

-

-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).

-

-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)).

-

-* `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.

-

-* `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.

-

-* `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.

-

-* `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.

-

-* `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).

-

-* `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.

-

-There are a few other things to remember when setting resource limits. Following are some general tips, suggestions, and miscellaneous comments.

-

-* Processes started at system startup by `/etc/rc` are assigned to the `daemon` login class.

-

-* Although the `/etc/login.conf` that comes with the system is a good source of reasonable values for most limits, only you, the administrator, can know what is appropriate for your system. Setting a limit too high may open your system up to abuse, while setting it too low may put a strain on productivity.

-

-* Users of the X Window System (X11) should probably be granted more resources than other users. X11 by itself takes a lot of resources, but it also encourages users to run more programs simultaneously.

-

-* Remember that many limits apply to individual processes, not the user as a whole. For example, setting `openfiles` to 50 means that each process the user runs may open up to 50 files. Thus, the gross amount of files a user may open is the value of `openfiles` multiplied by the value of `maxproc`. This also applies to memory consumption.

-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

-

-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.

-

-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.

-

-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)**

-

-

-

- # pw groupadd teamtwo

-

- # pw groupshow teamtwo

-

- teamtwo:*:1100:

-

-The number `1100` above is the group ID of the group `teamtwo`. Right now, `teamtwo` has no members, and is thus rather useless. Let's change that by inviting `jru` to the `teamtwo` group.

-

- **Example 8-8. Adding Somebody to a Group Using pw(8)**

-

-

-

- # pw groupmod teamtwo -M jru

-

- # pw groupshow teamtwo

-

- teamtwo:*:1100:jru

-

-The argument to the `-M` option is a comma-delimited list of users who are members of the group. From the preceding sections, we know that the password file also contains a group for each user. The latter (the user) is automatically added to the group list by the system; the user will not show up as a member when using the `groupshow` command to [pw(8)](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**

-

-

-

- % id jru

-

- uid#1001(jru) gid1001(jru) groups=1001(jru), 1100(teamtwo)

-

-As you can see, `jru` is a member of the groups `jru` and `teamtwo`.

-

-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.

-

-# Configuring the DragonFly Kernel

-

-***Updated and restructured by Jim Mock. Originally contributed by Jake Hamby.***

-

-[[!toc levels=3]]

-

-## 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.

-

-After reading this chapter, you will know:

-

-* 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.

-

-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.

-

-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.

-

-* 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.

-

-* 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

-

-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.

-

-### 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.

-

-The preferred way of installing the sources is:

-

- # 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:

-

- # cd /usr/src/sys/config

- # cp GENERIC MYKERNEL

-

-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.

-

-**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:

-

- # cd /usr/src/sys/config

- # mkdir /root/kernels

- # cp GENERIC /root/kernels/MYKERNEL

- # ln -s /root/kernels/MYKERNEL

-

-**Note:** You must execute these and all of the following commands under the `root` account or you will get permission denied errors.

-

-Now, edit `MYKERNEL` with your favorite text editor. If you are just starting out, the only editor available will probably be ***vi***, which is too complex to explain here, but is covered well in many books in the [bibliography](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.

-

-### Building a Kernel - Full Source Tree

-

-**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.

-

-

-

- # cd /usr/src

-

- 1. Compile the kernel.

-

- # make buildkernel KERNCONF=MYKERNEL

-

- 1. Install the new kernel.

-

- # make installkernel KERNCONF=MYKERNEL

-

-

-

-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.

-

-### Building a Kernel - Kernel Source Only

-

-When only the kernel source is installed, you need to change step 2, above, to this:

-

-

- # make nativekernel KERNCONF=MYKERNEL

-

-The other steps are the same.

-

-### 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).

-

-**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 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`.

-The following are the mandatory keywords required in ***every*** kernel you build:

-

-

-

- machine i386

-

-This is the machine architecture. It must be `i386` at the moment. Support for `amd64` will be added in the future.

-

-

-

- cpu I386_CPU

-

- cpu I486_CPU

-

- cpu I586_CPU

-

- cpu I686_CPU

-

-The above option specifies the type of CPU you have in your system. You may have multiple instances of the CPU line (i.e., you are not sure whether you should use `I586_CPU` or `I686_CPU`), however, for a custom kernel, it is best 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.

-

-

-

- ident GENERIC

-

-This is the identification of the kernel. You should change this to whatever you named your kernel, i.e. `MYKERNEL` if you have followed the instructions of the previous examples. The value you put in the `ident` string will print when you boot up the kernel, so it is useful to give the new kernel a different name if you want to keep it separate from your usual kernel (i.e. you want to build an experimental kernel).

-

-

-

- maxusers 0

-

-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.

-

-(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.

-

- **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`].

-

-

-

- # Floating point support - do not disable.

-

- device npx0 at nexus? port IO_NPX irq 13

-

-`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.

-

-

-

- # Pseudo devices - the number indicates how many units to allocate.

-

- pseudo-device loop # Network loopback

-

-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***.

-

-Everything that follows is more or less optional. See the notes underneath or next to each option for more information.

-

-

-

- #makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols

-

-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).

-

-

-

- options MATH_EMULATE #Support for x87 emulation

-

-This line allows the kernel to simulate a math co-processor if your computer does not have one (386 or 486SX). If you have a 486DX, or a 386 or 486SX (with a separate 387 or 487 chip), or higher (Pentium®, Pentium II, etc.), you can comment this line out.

-

- **Note:** The normal math co-processor emulation routines that come with 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.

-

-

-

- options INET #InterNETworking

-

-Networking support. Leave this in, even if you do not plan to be connected to a network. Most programs require at least loopback networking (i.e., making network connections within your PC), so this is essentially mandatory.

-

-

-

- options INET6 #IPv6 communications protocols

-

-This enables the IPv6 communication protocols.

-

-

-

- options FFS #Berkeley Fast Filesystem

-

- options FFS_ROOT #FFS usable as root device [keep this!]

-

-This is the basic hard drive Filesystem. Leave it in if you boot from the hard disk.

-

-

-

- options UFS_DIRHASH #Improve performance on big directories

-

-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.

-

-

-

- options SOFTUPDATES #Enable FFS Soft Updates support

-

-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.

-

-

-

- options MFS #Memory Filesystem

-

- options MD_ROOT #MD is a potential root device

-

-This is the memory-mapped filesystem. This is basically a RAM disk for fast storage of temporary files, useful if you have a lot of swap space that you want to take advantage of. A perfect place to mount an MFS partition is on the `/tmp` directory, since many programs store temporary data here. To mount an MFS RAM disk on `/tmp`, add the following line to `/etc/fstab`:

-

-

-

- /dev/ad1s2b /tmp mfs rw 0 0

-

-Now you simply need to either reboot, or run the command `mount /tmp`.

-

-

-

- options NFS #Network Filesystem

-

- options NFS_ROOT #NFS usable as root device, NFS required

-

-The network Filesystem. Unless you plan to mount partitions from a UNIX® file server over TCP/IP, you can comment these out.

-

-

-

- options MSDOSFS #MSDOS Filesystem

-

-The MS-DOS® Filesystem. Unless you plan to mount a DOS formatted hard drive partition at boot time, you can safely comment this out. It will be automatically loaded the first time you mount a DOS partition, as described 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).

-

-

-

- options CD9660 #ISO 9660 Filesystem

-

- options CD9660_ROOT #CD-ROM usable as root, CD9660 required

-

-The ISO 9660 Filesystem for CDROMs. Comment it out if you do not have a CDROM drive or only mount data CDs occasionally (since it will be dynamically loaded the first time you mount a data CD). Audio CDs do not need this Filesystem.

-

-

-

- options PROCFS #Process filesystem

-

-The process filesystem. This is a ***pretend*** filesystem mounted on `/proc` which allows programs like [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ps&section1) to give you more information on what processes are running. ***

-

-

-

-Compatibility with 4.3BSD. Leave this in; some programs will act strangely if you comment this out.

-

-

-

- options SCSI_DELAY=5000 #Delay (in ms) before probing SCSI

-

-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 UCONSOLE #Allow users to grab the console

-

-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.

-

-

-

- options USERCONFIG #boot -c editor

-

-This option allows you to boot the configuration editor from the boot menu.

-

-

-

- options VISUAL_USERCONFIG #visual boot -c editor

-

-This option allows you to boot the visual configuration editor from the boot menu.

-

-

-

- options KTRACE #ktrace(1) support

-

-This enables kernel process tracing, which is useful in debugging.

-

-

-

- 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.

-

-

-

- options SYSVSEM #SYSV-style semaphores

-

-Support for System V semaphores. Less commonly used but only adds a few hundred bytes to the kernel.

-

-

-

- options SYSVMSG #SYSV-style message queues

-

-Support for System V messages. Again, only adds a few hundred bytes to the kernel.

-

- **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.

-

-

-

- options P1003_1B #Posix P1003_1B real-time extensions

-

- options _KPOSIX_PRIORITY_SCHEDULING

-

-Real-time extensions added in the 1993 POSIX®. Certain applications in the ports collection use these (such as **StarOffice™** ).

-

-

-

- options ICMP_BANDLIM #Rate limit bad replies

-

-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.