fddac040bb3235fdbc59d365ef57a8a0ee8bd488
[ikiwiki.git] / nmatavka / index.mdwn
1 # Chapter 1 Introduction 
2
3 ***Restructured, reorganized, and parts rewritten by Jim Mock. ***
4
5 ## Synopsis 
6
7 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.
8
9 After reading this chapter, you will know:
10
11 * How DragonFly relates to other computer operating systems.
12
13 * The history of the DragonFly Project.
14
15 * The goals of the DragonFly Project.
16
17 * The basics of the DragonFly open-source development model.
18
19 * And of course: where the name ***DragonFly*** comes from.
20
21 ----
22
23 ## Welcome to DragonFly! 
24
25  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.
26
27 ### What Can DragonFly Do? 
28
29 <!-- Cutout of "features". This is outdated bullshit -->
30
31 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. 
32
33 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. 
34
35 As many of the commercial giants struggle to field PC operating systems with such features, performance and reliability, DragonFly can offer them ***now***!
36 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.
37
38  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.
39
40  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:
41
42 The robust TCP/IP networking built into DragonFly makes it an ideal platform for a variety of Internet services such as:
43
44 * FTP servers
45 * World Wide Web servers (standard or secure [SSL])
46 * Firewalls and NAT (***IP masquerading***) gateways
47 * Electronic Mail servers
48 * USENET News or Bulletin Board Systems
49 * And more...
50
51 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.
52
53 Here are some of the fields where people are using Dragonfly BSD, and the reasons that they find DragonFly BSD fits their needs:
54
55 * ***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!
56
57 * ***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.
58
59 * ***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.
60
61 * ***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.
62
63 * ***Software Development:*** The basic DragonFly system comes with a full complement of development tools including the renowned GNU C/C++ compiler and debugger.
64
65  DragonFly is available via anonymous FTP or GIT. Please see [Appendix A](mirrors.html) for more information about obtaining DragonFly.
66
67 For more help on installing, see the appropriate sections of this handbook.
68
69 ----
70
71 ## About the DragonFly Project 
72
73  The following section provides some background information on the project, including a brief history, project goals, and the development model of the project.
74
75 ### A Brief History of DragonFly 
76
77 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.
78
79 ### DragonFly Project Goals 
80
81 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.
82
83 ### The DragonFly Development Model 
84
85 ***Written by Justin Sherrill. ***
86
87 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.
88
89 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.
90
91 ### The Current DragonFly Release 
92
93 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.
94
95 ### DragonFly Origin 
96
97 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.
98
99 ## Updating the System 
100
101 ### Supported methods
102
103 The only **supported** method of upgrading DragonFly BSD is by building from source code. <br><br>
104 Supported upgrade process includes going from the *previous release* to *latest release*.<br>
105
106 For example, in our actual case, only the upgrade process involving <u>2.10.x up to 3.0.x</u> would be supported.
107
108 ### Getting the source code
109
110 There is a Makefile in /usr which will ease the task of retrieving the source tree; it needs to be run as root:
111
112     % cd /usr
113     % make src-create
114      [...]
115
116 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).
117
118     % cd /usr/src
119     % git checkout DragonFly_RELEASE_3_0
120
121 To see the available remote branches:
122
123     # cd /usr/src 
124     # git pull
125     # git branch -r
126
127 The leading edge (development trunk) version of the system will be the "master".
128
129 ### Build and upgrade process
130
131 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. 
132
133     % cd /usr/src
134     % make buildworld
135     % make buildkernel
136     % make installkernel
137     % make installworld
138     % make upgrade
139     (reboot)
140
141 **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>
142 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:
143 <br>
144
145     % sysctl hw.ncpu
146     hw.ncpu: 2
147
148 An explanation of each step follows.
149
150 * <u>*make buildworld*</u> : This command builds all userland programs and it is the most time-consuming step.<br>
151 Some programs may be discarded from the build process.<br>
152 For more details check **[make.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=make.conf&section=ANY)** manpage. 
153
154 * <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.
155
156 * <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.
157
158 * <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.
159
160 * <u>*make upgrade*</u> : This cleans out any files made unnecessary by this upgrade.
161
162 * (reboot) : Reboot the computer to load the new kernel and use the new files installed as part of this process.
163
164 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.
165
166 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)**
167
168 # DragonFly BSD Quick Start
169
170 This QuickStart is part of the [[NewHandbook|/docs/newhandbook/]].
171
172 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.
173
174 [[!toc levels=3 ]]
175 ## Some Unix and BSD Fundamentals
176
177 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.
178
179 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.
180
181 You should understand everything in the [[Unix Basics|/docs/newhandbook/UnixBasics/]] section before you proceed with trying to use your new system.
182
183 ## Disk layout of a New Dragonfly BSD System using the HAMMER filesystem
184
185 If you chose to install on the HAMMER file system during installation you will be left with a system with the following disk configuration:
186
187     # df -h
188     Filesystem                Size   Used  Avail Capacity  Mounted on
189     ROOT                      288G    12G   276G     4%    /
190     devfs                     1.0K   1.0K     0B   100%    /dev
191     /dev/serno/9VMBWDM1.s1a   756M   138M   558M    20%    /boot
192     /pfs/@@-1:00001           288G    12G   276G     4%    /var
193     /pfs/@@-1:00002           288G    12G   276G     4%    /tmp
194     /pfs/@@-1:00003           288G    12G   276G     4%    /usr
195     /pfs/@@-1:00004           288G    12G   276G     4%    /home
196     /pfs/@@-1:00005           288G    12G   276G     4%    /usr/obj
197     /pfs/@@-1:00006           288G    12G   276G     4%    /var/crash
198     /pfs/@@-1:00007           288G    12G   276G     4%    /var/tmp
199     procfs                    4.0K   4.0K     0B   100%    /proc
200
201 In this example
202
203 * `/dev/serno/9VMBWDM1` is the hard disk specified with serial number,
204 * `/dev/serno/9VMBWDM1.s1` is the first slice on the hard disk.
205
206 The disklabel looks at follows
207
208     # disklabel /dev/serno/9VMBWDM1.s1
209
210     # /dev/serno/9VMBWDM1.s1:
211     #
212     # Informational fields calculated from the above
213     # All byte equivalent offsets must be aligned
214     #
215     # boot space:    1044992 bytes
216     # data space:  312567643 blocks # 305241.84 MB (320069266944 bytes)
217     #
218     # NOTE: If the partition data base looks odd it may be
219     #       physically aligned instead of slice-aligned
220     #
221     diskid: e67030af-d2af-11df-b588-01138fad54f5
222     label:
223     boot2 data base:      0x000000001000
224     partitions data base: 0x000000100200
225     partitions data stop: 0x004a85ad7000
226     backup label:         0x004a85ad7000
227     total size:           0x004a85ad8200    # 305242.84 MB
228     alignment: 4096
229     display block size: 1024        # for partition display only
230
231     16 partitions:
232     #          size     offset    fstype   fsuuid
233       a:     786432          0    4.2BSD    #     768.000MB
234       b:    8388608     786432      swap    #    8192.000MB
235       d:  303392600    9175040    HAMMER    #  296281.836MB
236       a-stor_uuid: eb1c8aac-d2af-11df-b588-01138fad54f5
237       b-stor_uuid: eb1c8aec-d2af-11df-b588-01138fad54f5
238       d-stor_uuid: eb1c8b21-d2af-11df-b588-01138fad54f5
239
240 The slice has 3 partitions:
241
242 * `a` - for `/boot`
243 * `b` - for swap
244 * `d` - for `/`, a HAMMER file system labeled ROOT
245
246 When you create a HAMMER file system you must give it a label, here the installer labeled it as "ROOT" and mounted it as
247
248     ROOT                      288G    12G   276G     4%    /
249
250 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 `/`.
251
252 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`:
253
254     # cat /etc/fstab
255
256     # Device                Mountpoint      FStype  Options         Dump    Pass#
257     /dev/serno/9VMBWDM1.s1a         /boot           ufs     rw      1       1
258     /dev/serno/9VMBWDM1.s1b         none            swap    sw      0       0
259     /dev/serno/9VMBWDM1.s1d         /               hammer  rw      1       1
260     /pfs/var                /var            null    rw              0       0
261     /pfs/tmp                /tmp            null    rw              0       0
262     /pfs/usr                /usr            null    rw              0       0
263     /pfs/home               /home           null    rw              0       0
264     /pfs/usr.obj    /usr/obj                null    rw              0       0
265     /pfs/var.crash  /var/crash              null    rw              0       0
266     /pfs/var.tmp    /var/tmp                null    rw              0       0
267     proc                    /proc           procfs  rw              0       0
268
269 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).
270
271 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.
272
273 Now if you look in `/var`
274
275     # cd /var/
276     # ls
277     account   backups   caps   cron    empty   log   msgs   run   spool   yp  at        
278     cache     crash     db     games   lib     mail  preserve   rwho  tmp
279
280 you will find the above directories.
281
282 If you look at the status of one of the PFSes, e.g. `/usr` you will see `/var/hammer` is the default snapshot directory.
283
284     # hammer pfs-status /usr/
285     /usr/   PFS #3 {
286         sync-beg-tid=0x0000000000000001
287         sync-end-tid=0x0000000117ac6270
288         shared-uuid=f33e318e-d2af-11df-b588-01138fad54f5
289         unique-uuid=f33e31cb-d2af-11df-b588-01138fad54f5
290         label=""
291         prune-min=00:00:00
292         operating as a MASTER
293         snapshots directory defaults to /var/hammer/<pfs>
294     }
295
296 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`
297
298     # hammer snapls /usr
299     Snapshots on /usr       PFS #3
300     Transaction ID          Timestamp               Note
301
302 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.
303
304     # sudo hammer cleanup
305     cleanup /                    - HAMMER UPGRADE: Creating snapshots
306             Creating snapshots in /var/hammer/root
307      handle PFS #0 using /var/hammer/root
308                snapshots - run
309                    prune - run
310                rebalance - run..
311                  reblock - run....
312                   recopy - run....
313     cleanup /var                 - HAMMER UPGRADE: Creating snapshots
314     [...]
315     cleanup /tmp                 - HAMMER UPGRADE: Creating snapshots
316     [...]
317     cleanup /usr                 - HAMMER UPGRADE: Creating snapshots
318     [...]
319     cleanup /home                - HAMMER UPGRADE: Creating snapshots
320     [...]
321     cleanup /usr/obj             - HAMMER UPGRADE: Creating snapshots
322     [...]
323     cleanup /var/crash           - HAMMER UPGRADE: Creating snapshots
324     [...]
325     cleanup /var/tmp             - HAMMER UPGRADE: Creating snapshots
326     [...]
327     cleanup /var/isos            - HAMMER UPGRADE: Creating snapshots
328     [...]
329
330 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`.
331
332 In `/var` will be a new directory called *hammer* with the following sub directories
333
334     # cd hammer/
335     # ls -l
336     total 0
337     drwxr-xr-x  1 root  wheel  0 Oct 13 11:51 home
338     drwxr-xr-x  1 root  wheel  0 Oct 13 11:42 root
339     drwxr-xr-x  1 root  wheel  0 Oct 13 11:43 tmp
340     drwxr-xr-x  1 root  wheel  0 Oct 13 11:51 usr
341     drwxr-xr-x  1 root  wheel  0 Oct 13 11:54 var
342
343 Well let us look inside `/var/hammer/usr`
344
345     # cd usr/
346     # ls -l
347     total 0
348     drwxr-xr-x  1 root  wheel   0 Oct 13 11:54 obj
349     lrwxr-xr-x  1 root  wheel  25 Oct 13 11:43 snap-20101013-1143 -> /usr/@@0x0000000117ac6cb0
350
351 We have a symlink pointing to the snapshot transaction ID shown below.
352
353     # hammer snapls /usr
354     Snapshots on /usr       PFS #3
355     Transaction ID          Timestamp               Note
356     0x0000000117ac6cb0      2010-10-13 11:43:04 IST -
357     #
358
359 You can read more about snapshots, prune, reblance, reblock, recopy etc from [hammer(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=hammer&section=8) especially look under the heading "cleanup [filesystem ...]"
360
361 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/)
362
363 In order to correctly map hard disk sernos to device names you can use the 'devattr' command.
364
365     # udevd
366     # devattr -d "ad*" -p serno
367     Device ad4:
368             serno = Z2AD9WN4
369     Device ad4s1:
370     Device ad4s1d:
371
372     Device ad5:
373             serno = 9VMRFDSY
374     Device ad5s1:
375     Device ad5s1d:
376
377     Device ad3:
378             serno = Z2AD9WLW
379     Device ad3s1:
380     Device ad3s1a:
381     Device ad3s1b:
382     Device ad3s1d:
383
384 Or if your disks are 'da', just change it as appropiate.
385
386 ## Configuring and Starting the SSH Server
387
388 Described in detail [[here|/docs/newhandbook/sshserver/]]
389
390 ## Software/Programs and Configuration Files Location 
391
392 DragonFly default installation contains the base software/programs from the DragonFly project itself and few other software from other sources. 
393
394 The base system binary software programs are located in the folders 
395
396     /bin    /sbin
397     /usr/bin   /usr/sbin
398
399 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.
400
401 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.
402
403 ## Installing Third-party Software
404
405 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`.
406
407 ### Using pkg
408
409 Read [[dports howto|/docs/howtos/HowToDPorts/]] then for some errata, read [[this|http://lists.dragonflybsd.org/pipermail/users/2013-November/090339.html]].
410
411 You can look at the help and the man page for the pkg tool like this:
412
413 `pkg help install`
414
415 Example: Read man page for pkg-install
416
417 `man pkg-install`
418
419 ### Installing an X.org desktop X11 environment and XFCE desktop
420
421 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.
422
423 `(obsolete)`
424 Slightly out of date instructions on installing a GUI (X desktop) environment  are in the [new handbook](http://www.dragonflybsd.org/docs/newhandbook/X/).
425
426 # UNIX Basics 
427
428 ***Rewritten by Chris Shumway. ***
429 [[!toc  levels=3]]
430
431 ## Synopsis 
432
433 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.
434
435 After reading this chapter, you will know:
436
437 * How to use the ***virtual consoles*** of DragonFly.
438
439 * How UNIX file permissions work along with understanding file flags in DragonFly.
440
441 * The default DragonFly file system layout.
442
443 * The DragonFly disk organization.
444
445 * How to mount and unmount file systems.
446
447 * What processes, daemons, and signals are.
448
449 * What a shell is, and how to change your default login environment.
450
451 * How to use basic text editors.
452
453 * What devices and device nodes are.
454
455 * What binary format is used under DragonFly.
456
457 * How to read manual pages for more information.
458
459 ## Virtual Consoles and Terminals 
460
461 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.
462
463 <!-- XXX: also mention vesa.ko and other modes for the vt, but maybe somewhere else -->
464
465 ### The Console 
466
467 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:
468
469     Additional ABI support:.
470     Starting cron.
471     Local package initialization:.
472     Additional TCP options:.
473     
474     Wed Feb 18 17:53:48 GMT 2009
475     
476     DragonFly/i386 (Amnesiac) (ttyv0)
477
478     login: 
479
480 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:
481
482     DragonFly/i386 (Amnesiac) (ttyv0)
483
484 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:
485
486     login:
487
488 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.
489
490 ### Logging into DragonFly 
491
492 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.
493
494 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: 
495
496     login:
497
498 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>:
499     
500
501     login: john
502     Password:
503
504 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.
505
506 ### Multiple Consoles 
507
508 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.
509
510 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.
511
512 ### The /etc/ttys File 
513
514 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.
515
516 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`:
517     
518
519     # name  getty                           type    status          comments
520     #
521     ttyv0   "/usr/libexec/getty Pc"         cons25  on  secure
522     # Virtual terminals
523     ttyv1   "/usr/libexec/getty Pc"         cons25  on  secure
524     ttyv2   "/usr/libexec/getty Pc"         cons25  on  secure
525     ttyv3   "/usr/libexec/getty Pc"         cons25  on  secure
526     ttyv4   "/usr/libexec/getty Pc"         cons25  on  secure
527     ttyv5   "/usr/libexec/getty Pc"         cons25  on  secure
528     ttyv6   "/usr/libexec/getty Pc"         cons25  on  secure
529     ttyv7   "/usr/libexec/getty Pc"         cons25  on  secure
530     ttyv8   "/usr/pkg/xorg/bin/xdm -nodaemon"  xterm   off secure
531
532 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.
533
534 ### Single User Mode Console 
535
536 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`:
537
538     
539
540     # name  getty                           type    status          comments
541     #
542     # If console is marked "insecure", then init will ask for the root password
543     # when going to single-user mode.
544     console none                            unknown off secure
545
546  **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.
547
548 #### Notes 
549
550 [[!table  data="""
551 <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. 
552  [ (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. 
553  [ (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. |
554
555 """]]
556
557 ## Permissions 
558
559 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.
560
561 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:
562
563 [[!table  data="""
564 |<tablestyle="width:100%"> Value | Permission | Directory Listing 
565 <tablestyle="width:100%"> 0 | No read, no write, no execute | `---` 
566  1 | No read, no write, execute | `--x` 
567  2 | No read, write, no execute | `-w-` 
568  3 | No read, write, execute | `-wx` 
569  4 | Read, no write, no execute | `r--` 
570  5 | Read, no write, execute | `r-x` 
571  6 | Read, write, no execute | `rw-` 
572  7 | Read, write, execute | `rwx` |
573
574 """]]
575
576 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:
577
578     % ls -l
579     total 530
580     -rw-r--r--  1 root  wheel     512 Sep  5 12:31 myfile
581     -rw-r--r--  1 root  wheel     512 Sep  5 12:31 otherfile
582     -rw-r--r--  1 root  wheel    7680 Sep  5 12:31 email.txt
583     ...
584
585 Here is how the first column of `ls -l` is broken up:    
586
587     -rw-r--r--
588
589 <!-- XXX: Check all these http:// links to see if they are broken -->
590
591 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.
592
593 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.
594
595 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).
596
597 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.
598
599 ### Symbolic Permissions 
600
601 ***Contributed by Tom Rhodes.***
602
603 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:
604
605 [[!table  data="""
606 <tablestyle="width:100%"> Option | Letter | Represents 
607 <tablestyle="width:100%"> (who) | u | User 
608  (who) | g | Group owner 
609  (who) | o | Other 
610  (who) | a | All (***world***) 
611  (action) | + | Adding permissions 
612  (action) | - | Removing permissions 
613  (action) | = | Explicitly set permissions 
614  (permissions) | r | Read 
615  (permissions) | w | Write 
616  (permissions) | x | Execute 
617  (permissions) | t | Sticky bit 
618  (permissions) | s | Set UID or GID |
619
620 """]]
621
622 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`:
623
624     
625
626     % chmod go=FILE
627
628 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:
629
630     
631
632     % chmod go-w,a+x FILE
633
634 ### DragonFly File Flags 
635
636 ***Contributed by Tom Rhodes.***
637
638 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:
639
640     
641
642     # chflags sunlink file1
643
644 And to disable the system undeletable flag, simply issue the previous command with ***no*** in front of the `sunlink`. Observe:
645
646     
647
648     # chflags nosunlink file1
649
650 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:
651
652     
653
654     # ls -lo file1
655
656 The output should look like the following:
657
658     
659
660     -rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 file1
661
662 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.
663
664 ## Directory Structure 
665
666 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.
667
668 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).
669
670 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.
671
672 [[!table  data="""
673 <tablestyle="width:100%">Directory | Description 
674 <tablestyle="width:100%">  `/` | Root directory of the file system. 
675  `/bin/` | User utilities fundamental to both single-user and multi-user environments. 
676  `/boot/` | Programs and configuration files used during operating system bootstrap. 
677  `/boot/defaults/` | Default bootstrapping configuration files; see [loader.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=loader.conf&section5). 
678  `/dev/` | Device nodes; see [intro(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=intro&section4). 
679  `/etc/` | System configuration files and scripts. 
680  `/etc/defaults/` | Default system configuration files; see [rc(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc&section8). 
681  `/etc/mail/` | Configuration files for mail transport agents such as [sendmail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sendmail&section8). 
682  `/etc/namedb/` | `named` configuration files; see [named(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=named&section8). 
683  `/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). 
684  `/etc/ppp/` | `ppp` configuration files; see [ppp(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=ppp&section8). 
685  `/mnt/` | Empty directory commonly used by system administrators as a temporary mount point. 
686  `/proc/` | Process file system; see [procfs(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=procfs&section5), [mount_procfs(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mount_procfs&section=8). 
687  `/root/` | Home directory for the `root` account. 
688  `/sbin/` | System programs and administration utilities fundamental to both single-user and multi-user environments. 
689  `/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). 
690  `/usr/` | The majority of user utilities and applications. 
691  `/usr/bin/` | Common utilities, programming tools, and applications. 
692  `/usr/include/` | Standard C include files. 
693  `/usr/lib/` | Archive libraries. 
694  `/usr/libdata/` | Miscellaneous utility data files. 
695  `/usr/libexec/` | System daemons &amp; system utilities (executed by other programs). 
696  `/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`. 
697  `/usr/obj/` | Architecture-specific target tree produced by building the `/usr/src` tree. 
698  `/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`. 
699  `/usr/pkg/xorg/` | Xorg distribution executables, libraries, etc (optional). 
700  `/usr/pkgsrc` | The pkgsrc tree for installing packages (optional). 
701  `/usr/sbin/` | System daemons &amp; system utilities (executed by users). 
702  `/usr/share/` | Architecture-independent files. 
703  `/usr/src/` | BSD and/or local source files. 
704  `/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). 
705  `/var/log/` | Miscellaneous system log files. 
706  `/var/mail/` | User mailbox files. 
707  `/var/spool/` | Miscellaneous printer and mail system spooling directories. 
708  `/var/tmp/` | Temporary files. The files are usually preserved across a system reboot, unless `/var` is a memory-based file system. 
709  `/var/yp` | NIS maps. |
710
711 """]]
712
713 ## Disk Organization 
714
715 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.
716
717 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.
718
719 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`.
720
721 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.
722
723 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 `\`.
724
725 DragonFly does not use drive letters, or other drive names in the path. You would not write `c:/foo/bar/readme.txt` on DragonFly.
726
727 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.
728
729 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`).
730
731 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:
732
733 <!-- XXX: image -->
734
735 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:
736
737 <!-- XXX: image -->
738
739 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.
740
741 If `B` had been mounted on `A2` then the diagram would look like this:
742
743 <!-- XXX: image -->
744
745 and the paths would be `/A2/B1` and `/A2/B2` respectively.
746
747 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:
748
749 <!-- XXX: image -->
750
751 Or `C` could be mounted directly on to the `A` file system, under the `A1` directory:
752
753 <!-- XXX: image -->
754
755 If you are familiar with MS-DOS, this is similar, although not identical, to the `join` command.
756
757 ## Choosing File System Layout 
758
759 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.
760
761 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.
762
763  **Benefits of Multiple File Systems** 
764
765 * 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.
766
767 * 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.
768
769 * 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.
770
771  **Benefit of a Single File System** 
772
773 * 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.
774 <!-- XXX: what about hammer? -->
775
776 ## Disk Slices, Partitions and local UNIX file systems 
777
778 Here we describe how disks are subdivided.
779
780 <!-- XXX: mention serno stuff -->
781
782 ### Slices 
783
784 A disk can be subdivided in slices.
785
786 Slices are named `s0`, `s1` and so on.
787
788 For example the disk `ad6` can contain the slice `ad6s3`.
789
790 DragonFly support two schemes for slices, MBR and GPT, either of them will manage all slices on a disk:
791
792 * 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.
793
794 * 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).
795
796 ### Partitions 
797
798 Partitions are contained in slices.
799
800 Partitions are named `a`, `b` and so on.
801
802 DragonFly support 16 partitions per slice, that is `a` through `p`.
803
804 For example the partition `ad6s3a` is contained in the slice `ad6s3`.
805
806 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):
807
808 * [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.
809
810 * [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.
811
812 ### Local UNIX file systems 
813
814 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.
815
816 DragonFly support two local UNIX file systems, UFS and HAMMER:
817
818 * UFS: The classical BSD UNIX file system, see [ffs(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#ffs&amp;section5), it supports size up to 2 TB.
819
820 * [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.
821
822 ### Typical disk layout 
823
824 From the above we see the following typical disk layout scenarios:
825
826 * 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.
827
828 * 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.
829
830 * 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).
831
832 ### HAMMER Note 
833
834 [HAMMER(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=HAMMER&amp;section5)
835
836 is a rather new file system, under active development.
837
838 As of DragonFly 2.2.1 release HAMMER is considered production ready.  At 2.0 release it was considered to be in an early Beta state .
839
840 All major features except the mirroring are quite well tested as-of the 2.2.1 release.
841
842 You should evaluate if HAMMER is suitable for your needs.
843 <!-- XXX: mention disk and memory requirements for efficient hammer use -->
844
845 Examples of ongoing development includes:
846
847 * 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).
848
849 * Multi master mirroring. For now only one mirror master is supported, but multiple mirror targets, called slaves, are already supported.
850
851 * Support for shrinking existing HAMMER file systems.  The HAMMER design is prepared for this, utility just have to be written to support it.
852 <!-- XXX: is this still accurate? Do we really want to mention it here? -->
853
854 ### HAMMER Features 
855
856 [HAMMER(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=HAMMER&amp;section5) has several advanced features not found in UFS:
857
858 * Large file systems:  Up to 1 million TB, also called 1 Exabyte is supported.
859
860 * 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.
861
862 * 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.
863
864 * 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.
865
866 * 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). 
867
868 * 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.
869
870 * 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.
871
872 More info on HAMMER can be found [here](http://www.dragonflybsd.org/hammer/index.html).
873
874 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.
875
876 <!-- XXX: mention swapcache, and also how to configure and use it (somewhere else, probably) -->
877
878 ### Adding a Disk 
879
880 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.
881
882 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 
883 [disklabel64(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel64&amp;section8).
884
885 In this example we choose [gpt(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=gpt&amp;section=8) & [disklabel64(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel64&amp;section=8).
886
887 <!-- XXX: mention that disklabel64 is default now -->
888     
889
890     # gpt -v create ad6
891
892     ...
893
894     # gpt add -s1 ad6
895
896     ad6s0
897
898     # gpt add ad6
899
900     ad6s1
901
902     # gpt show ad6
903
904     ...
905
906 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.
907
908     
909
910     # disklabel64 -rw ad6s1 auto
911
912     # disklabel64 -e ad6s1          # edit label to add partitions as needed
913
914 ### disklabel 
915 <!-- XXX: what is all this fuzz about dangerously dedicated? -->
916
917 For [disklabel(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel&amp;section8) labels some partitions have certain conventions associated with them.
918
919 [[!table  data="""
920 <tablestyle="width:100%"> Partition | Convention 
921 <tablestyle="width:100%"> `a` | Normally contains the root file system 
922  `b` | Normally contains swap space 
923  `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.
924  `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`. |
925
926 """]]
927
928 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.
929
930 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.
931
932 <!-- XXX: gpt allows for way more than 4 partitions... let's remove this stuff above -->
933
934 ***Dangerously dedicated*** physical drives are accessed as slice 0.
935
936 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.
937
938 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).
939
940 <!-- XXX: here would probably be the right place to talk about serno -->
941
942 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).
943
944 <!-- XXX: later talk also about devfs, definitely not here though. also, devfs rules -->
945
946 [Example 3-2](disk-organization.html#BASICS-CONCEPT-DISK-MODEL) shows a conceptual model of the disk layout that should help make things clearer.
947
948 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.
949
950 ***'Table 3-1. Disk Device Codes***'
951
952 [[!table  data="""
953 <tablestyle="width:100%"> Code | Meaning 
954 <tablestyle="width:100%"> `ad` | ATAPI (IDE) disk 
955  `da` | SCSI direct access disk 
956  `acd` | ATAPI (IDE) CDROM 
957  `cd` | SCSI CDROM 
958  `vn` | Virtual disk
959  `fd` | Floppy disk |
960
961 """]]
962
963 ***'Example 3-1. Sample Disk, Slice, and Partition Names***'
964
965 [[!table  data="""
966 <tablestyle="width:100%"> Name | Meaning 
967 <tablestyle="width:100%"> `ad0s1a` | The first partition (`a`) on the first slice (`s1`) on the first IDE disk (`ad0`). 
968  `da1s2e` | The fifth partition (`e`) on the second slice (`s2`) on the second SCSI disk (`da1`). |
969
970 """]]
971
972 ***'Example 3-2. Conceptual Model of a Disk***'
973
974 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.
975
976 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.
977
978 <!-- XXX: image -->
979
980 ## Mounting and Unmounting File Systems 
981
982 The file system is best visualized as a tree, rooted at `/`.
983
984 The directories, e.g. `/dev` and `/usr`, in the root directory are branches,
985
986 which may have their own branches, such as `/usr/local`, and so on.
987
988 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.
989
990 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.
991
992 ### The fstab File 
993
994 During the [boot process](boot.html), file systems listed in `/etc/fstab` are automatically mounted (unless they are listed with the `noauto` option).
995
996 The `/etc/fstab` file contains a list of lines of the following format:
997   
998
999     device       mount-point   fstype     options      dumpfreq     passno
1000
1001 These parameters have the following meaning:
1002
1003 * `device`: A device name (which should exist), as explained [here](disks-naming.html).
1004
1005 * `mount-point`: A directory (which should exist), on which to mount the file system.
1006
1007 * `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`.
1008
1009 * `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.
1010
1011 * `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.
1012
1013 * `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.
1014
1015 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.
1016
1017 ### The mount Command 
1018
1019 The [mount(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mount&section8) command is what is ultimately used to mount file systems.
1020
1021 In its most basic form, you use:
1022
1023     
1024
1025     # mount device mountpoint
1026
1027 Or, if `mountpoint` is specified in `/etc/fstab`, just:
1028
1029     
1030
1031     # mount mountpoint
1032
1033 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:
1034
1035  **Mount Options** 
1036
1037 * `-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.
1038
1039 * `-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.
1040
1041 * `-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.
1042
1043 * `-r`: Mount the file system read-only. This is identical to using the `rdonly` argument to the `-o` option.
1044
1045 * `-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.
1046
1047 * `-u`: Update mount options on the file system.
1048
1049 * `-v`: Be verbose.
1050
1051 * `-w`: Mount the file system read-write.
1052
1053 The `-o` option takes a comma-separated list of the options, including the following:
1054
1055 * `nodev:` Do not interpret special devices on the file system. This is a useful security option.
1056
1057 * `noexec`: Do not allow execution of binaries on this file system. This is also a useful security option.
1058
1059 * `nosuid`: Do not interpret setuid or setgid flags on the file system. This is also a useful security option.
1060
1061 ### The umount Command 
1062
1063 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.
1064
1065 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.
1066
1067 `-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.
1068
1069 ## Processes 
1070
1071 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.
1072
1073 <!-- XXX: talk about LWPs and threads? -->
1074
1075 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.
1076
1077 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.
1078
1079 By default, `ps` only shows you the commands that are running and are owned by you. For example:
1080
1081     
1082
1083     % ps
1084
1085       PID  TT  STAT      TIME COMMAND
1086       298  p0  Ss     0:01.10 tcsh
1087      7078  p0  S      2:40.88 xemacs mdoc.xsl (xemacs-21.1.14)
1088     37393  p0  I      0:03.11 xemacs freebsd.dsl (xemacs-21.1.14)
1089     48630  p0  S      2:50.89 /usr/local/lib/netscape-linux/navigator-linux-4.77.bi
1090     48730  p0  IW     0:00.00 (dns helper) (navigator-linux-)
1091     72210  p0  R+     0:00.00 ps
1092       390  p1  Is     0:01.14 tcsh
1093      7059  p2  Is+    1:36.18 /usr/local/bin/mutt -y
1094      6688  p3  IWs    0:00.00 tcsh
1095     10735  p4  IWs    0:00.00 tcsh
1096     20256  p5  IWs    0:00.00 tcsh
1097       262  v0  IWs    0:00.00 -tcsh (tcsh)
1098       270  v0  IW+    0:00.00 /bin/sh /usr/X11R6/bin/startx -- -bpp 16
1099       280  v0  IW+    0:00.00 xinit /home/nik/.xinitrc -- -bpp 16
1100       284  v0  IW     0:00.00 /bin/sh /home/nik/.xinitrc
1101       285  v0  S      0:38.45 /usr/X11R6/bin/sawfish
1102
1103 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.
1104
1105 [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.
1106
1107 The output from [top(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=top&section1) is similar. A sample session looks like this:
1108
1109     
1110
1111     % top
1112     last pid: 72257;  load averages:  0.13,  0.09,  0.03    up 0+13:38:33  22:39:10
1113     47 processes:  1 running, 46 sleeping
1114     CPU states: 12.6% user,  0.0% nice,  7.8% system,  0.0% interrupt, 79.7% idle
1115     Mem: 36M Active, 5256K Inact, 13M Wired, 6312K Cache, 15M Buf, 408K Free
1116     Swap: 256M Total, 38M Used, 217M Free, 15% Inuse
1117     
1118
1119       PID USERNAME PRI NICE  SIZE    RES STATE    TIME   WCPU    CPU COMMAND
1120     72257 nik       28   0  1960K  1044K RUN      0:00 14.86%  1.42% top
1121      7078 nik        2   0 15280K 10960K select   2:54  0.88%  0.88% xemacs-21.1.14
1122       281 nik        2   0 18636K  7112K select   5:36  0.73%  0.73% XF86_SVGA
1123       296 nik        2   0  3240K  1644K select   0:12  0.05%  0.05% xterm
1124     48630 nik        2   0 29816K  9148K select   3:18  0.00%  0.00% navigator-linu
1125       175 root       2   0   924K   252K select   1:41  0.00%  0.00% syslogd
1126      7059 nik        2   0  7260K  4644K poll     1:38  0.00%  0.00% mutt
1127     ...
1128
1129 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.
1130
1131 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.
1132
1133 [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.
1134
1135 ## Daemons, Signals, and Killing Processes 
1136
1137 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.
1138
1139 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.
1140
1141 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.
1142
1143 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.
1144
1145 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.
1146
1147 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.
1148
1149 `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).
1150
1151 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.
1152
1153 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.
1154
1155 Signals are sent using the [kill(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=kill&section=1) command, as this example shows.
1156
1157  **Sending a Signal to a Process** 
1158
1159 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`.
1160
1161   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).
1162
1163       
1164
1165         % ps -ax | grep inetd
1166
1167         198  ??  IWs    0:00.00 inetd -wW
1168
1169   
1170
1171   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.
1172
1173   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.
1174
1175       
1176
1177         % su
1178
1179         Password:
1180
1181         # /bin/kill -s HUP 198
1182
1183   
1184
1185   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`.
1186
1187 **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.
1188
1189 Sending other signals is very similar, just substitute `TERM` or `KILL` in the command line as necessary.
1190
1191  **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** .
1192
1193  
1194  
1195  
1196  
1197  
1198 ## Shells 
1199
1200 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`.
1201
1202 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.
1203
1204 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** ]`.
1205
1206 The shell would print out `rm foo[BEEP].bar`.
1207
1208 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.
1209
1210 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:
1211
1212 [[!table  data="""
1213 <tablestyle="width:100%"> Variable | Description 
1214 <tablestyle="width:100%"> `USER` | Current logged in user's name. 
1215  `PATH` | Colon separated list of directories to search for binaries. 
1216  `DISPLAY` | Network name of the X11 display to connect to, if available. 
1217  `SHELL` | The current shell. 
1218  `TERM` | The name of the user's terminal. Used to determine the capabilities of the terminal. 
1219  `TERMCAP` | Database entry of the terminal escape codes to perform various terminal functions. 
1220  `OSTYPE` | Type of operating system. e.g., DragonFly. 
1221  `MACHTYPE` | The CPU architecture that the system is running on. 
1222  `EDITOR` | The user's preferred text editor. 
1223  `PAGER` | The user's preferred text pager. 
1224  `MANPATH` | Colon separated list of directories to search for manual pages. |
1225
1226 """]]
1227
1228 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`:
1229     
1230
1231     % setenv EDITOR /usr/pkg/bin/emacs
1232
1233 Under Bourne shells:
1234    
1235
1236     % export EDITOR="/usr/pkg/bin/emacs"
1237
1238 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`.
1239
1240 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.
1241
1242 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.
1243
1244 ### Changing Your Shell 
1245
1246 <!-- XXX: does chsh still exist? chpass will do, too -->
1247
1248 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.
1249
1250 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:
1251
1252     
1253
1254     % chsh -s /usr/pkg/bin/bash
1255
1256  **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.
1257
1258 For example, if you installed `bash` by hand and placed it into `/usr/local/bin`, you would want to:
1259
1260     
1261
1262     # echo "/usr/local/bin/bash" >> /etc/shells
1263
1264 Then rerun `chsh`.
1265
1266 ## Text Editors 
1267
1268 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.
1269
1270 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.
1271
1272 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.
1273
1274 ## Devices and Device Nodes 
1275
1276 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`.
1277
1278 For example, `acd0` is the first IDE CDROM drive, while `kbd0` represents the keyboard.
1279
1280 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.
1281
1282 The device nodes in the `/dev` directory are created and destroyed automatically on DragonFly >= 2.4, by means of the device file system (devfs).
1283
1284 ## Binary Formats 
1285
1286 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®:
1287
1288 * [a.out(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=a.out&amp;section=5)
1289
1290   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.
1291
1292 * <u>COFF</u>
1293
1294   The SVR3 object format. The header now comprises a section table, so you can have more than just .text, .data, and .bss sections.
1295
1296 * [elf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=elf&amp;section=5)
1297
1298   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.
1299
1300 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.
1301
1302 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.
1303
1304 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.
1305
1306 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.
1307
1308 <!-- XXX: do we really need all this bullshit about file formats? -->
1309
1310 ## For More Information 
1311
1312 ### Manual Pages 
1313
1314 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:
1315
1316     % man command
1317
1318 `command` is the name of the command you wish to learn about. For example, to learn more about `ls` command type:
1319
1320     % man ls
1321
1322 The online manual is divided up into numbered sections:
1323
1324   1. User commands.
1325   1. System calls and error numbers.
1326   1. Functions in the C libraries.
1327   1. Device drivers.
1328   1. File formats.
1329   1. Games and other diversions.
1330   1. Miscellaneous information.
1331   1. System maintenance and operation commands.
1332   1. Kernel internals.
1333
1334 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:
1335     
1336
1337     % man 1 chmod
1338
1339 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.
1340
1341 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:
1342
1343    
1344
1345     % man -k mail
1346
1347 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.
1348
1349 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:    
1350
1351     % cd /usr/bin
1352     % man -f *
1353
1354 or
1355    
1356
1357     % cd /usr/bin
1358     % whatis *
1359
1360 which does the same thing.
1361
1362 ### GNU Info Files 
1363
1364 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:
1365
1366     % info
1367
1368 For a brief introduction, type `h`. For a quick command reference, type `?`.
1369
1370 # DPorts and pkgng
1371
1372 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.
1373
1374 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.
1375
1376 __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.
1377
1378 ## Getting started with pkgng
1379
1380 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.
1381
1382 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:
1383
1384     # cd /usr
1385     # make dports-create
1386     # rm -rf /usr/pkg
1387     # pkg upgrade
1388     # rehash
1389
1390 Since you may need to manually edit the configuration file `/usr/local/etc/pkg.conf`  here is the
1391 usual command to edit it using the vi editor:
1392
1393      # vi /usr/local/etc/pkg.conf
1394
1395 Before using consult the man page (`man pkg`) and then try things like these examples:
1396
1397     # pkg search editors
1398     # pkg install vim
1399
1400 To bootstrap __pkgng__ with a download on a very old version of DragonFly that is still using `pkgsrc` run:
1401
1402     # make pkg-bootstrap
1403     # rehash
1404     # pkg-static install -y pkg
1405     # rehash
1406
1407 Note that this step is unnecessary for any newly installed release from DragonFly 3.4 onwards.
1408
1409 ## Configuring pkgng
1410
1411 Information previously contained in here worked for older versions of pkg, but as pkgng has undergone some changes, so too do the configurations.
1412
1413 Previously /usr/local/etc/pkg.conf was used and reference to a PACKAGESITE was made. This might still work but it'll complain.
1414
1415 # pkg update
1416 pkg: PACKAGESITE in pkg.conf is deprecated. Please create a repository configuration file
1417 Updating repository catalogue
1418 pkg: Warning: use of http:// URL scheme with SRV records is deprecated: switch to pkg+http://
1419
1420 Insead, listen to the errors. Throw an octothorpe in front of that packagesite line, save it, and move on.
1421
1422 Go to /usr/local/etc/pkg/repos/
1423
1424 You should see something like this with an ls
1425
1426 df-latest.conf.sample   df-releases.conf.sample
1427
1428 cp or mv one of them to be .conf
1429
1430 edit the one you choose and make the following changes. (I edited the latest version)
1431
1432 Avalon: {
1433         url             : pkg+http://mirror-master.dragonflybsd.org/dports/${ABI}/L\
1434 ATEST,
1435         mirror_type     : SRV,
1436         signature_type  : NONE,
1437         pubkey          : NONE,
1438         fingerprints    : /usr/share/fingerprints,
1439         enabled         : yes
1440 }
1441
1442 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.
1443
1444 ## Basic pkgng Operations
1445
1446 Usage information for __pkgng__ is available in the pkg(8) manual page, or by running `pkg` without additional arguments.
1447
1448 Each __pkgng__ command argument is documented in a command-specific manual page. To read the manual page for `pkg install`, for example, run either:
1449
1450     # pkg help install
1451     # man pkg-install
1452
1453 ## Obtaining Information About Installed Packages with pkgng
1454
1455 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:
1456
1457     # pkg info packagename
1458
1459 For example, to see which version of __pkgng__ is installed on the system, run:
1460
1461     # pkg info pkg
1462     pkg-1.0.12                   New generation package manager
1463
1464 ## Installing and Removing Packages with pkgng
1465
1466 In general, most DragonFly users will install binary packages by typing:
1467
1468     # pkg install <packagename>
1469
1470 For example, to install curl:
1471
1472     # pkg install curl
1473
1474     Updating repository catalogue
1475     Repository catalogue is up-to-date, no need to fetch fresh copy
1476     The following packages will be installed:
1477     
1478         Installing ca_root_nss: 3.13.5
1479         Installing curl: 7.24.0
1480     
1481     The installation will require 4 MB more space
1482     
1483     1 MB to be downloaded
1484     
1485     Proceed with installing packages [y/N]: y
1486     ca_root_nss-3.13.5.txz           100%    255KB   255.1KB/s  255.1KB/s   00:00
1487     curl-7.24.0.txz                  100%   1108KB     1.1MB/s    1.1MB/s   00:00
1488     Checking integrity... done
1489     Installing ca_root_nss-3.13.5... done
1490     Installing curl-7.24.0... done
1491
1492 The new package and any additional packages that were installed as dependencies can be seen in the installed packages list:
1493
1494     # pkg info
1495     ca_root_nss-3.13.5    The root certificate bundle from the Mozilla Project
1496     curl-7.24.0           Non-interactive tool to get files from FTP, GOPHER, HTTP(S) servers
1497     pkg-1.0.12            New generation package manager
1498
1499 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:
1500
1501     # pkg delete curl
1502     The following packages will be deleted:
1503     
1504         curl-7.24.0_1
1505     
1506     The deletion will free 3 MB
1507     
1508     Proceed with deleting packages [y/N]: y
1509     Deleting curl-7.24.0_1... done
1510
1511 ## Upgrading Installed Packages with pkgng
1512
1513 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.
1514
1515 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:
1516
1517     # pkg upgrade
1518     Updating repository catalogue
1519     repo.txz            100%    297KB   296.5KB/s   296.5KB/s   00:00
1520     The following packages will be upgraded:
1521     
1522     Upgrading curl: 7.24.0 -> 7.24.0_1
1523     
1524     1 MB to be downloaded
1525     
1526     Proceed with upgrading packages [y/N]: y
1527     curl-7.24.0_1.txz   100%    1108KB  1.1MB/s       1.1MB/s   00:00
1528     Checking integrity... done
1529     Upgrading curl from 7.24.0 to 7.24.0_1... done
1530
1531 ## Auditing Installed Packages with pkgng
1532
1533 Occasionally, software vulnerabilities may be discovered in software within DPorts. __pkgng__ includes built-in auditing. To audit the software installed on the system, type:
1534
1535     # pkg audit -F
1536
1537 # Advanced pkgng Operations
1538
1539 ## Automatically Removing Leaf Dependencies with pkgng
1540
1541 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:
1542
1543     # pkg autoremove
1544     Packages to be autoremoved:
1545         ca_root_nss-3.13.5
1546     
1547     The autoremoval will free 723 kB
1548     
1549     Proceed with autoremoval of packages [y/N]: y
1550     Deinstalling ca_root_nss-3.13.5... done
1551
1552 ## Backing Up the pkgng Package Database
1553
1554 __pkgng__ includes its own package database backup mechanism. To manually back up the package database contents, type:
1555
1556     # pkg backup -d <pkgng.db>
1557
1558 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).
1559
1560 To restore the contents of a previous package database backup, run:
1561
1562     # pkg backup -r </path/to/pkgng.db>
1563
1564 ## Removing Stale pkgng Packages
1565
1566 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.
1567
1568 To remove the outdated binary packages, type:
1569
1570     # pkg clean
1571
1572 ##Modifying pkgng Package Metadata
1573
1574 __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:
1575
1576     # pkg set -o <category/oldport>:<category/newport>
1577
1578 For example, to change the package origin for the above example, type:
1579
1580     # pkg set -o lang/php5:lang/php53
1581
1582 As another example, to update lang/ruby18 to lang/ruby19, type:
1583
1584     # pkg set -o lang/ruby18:lang/ruby19
1585
1586 As a final example, to change the origin of the libglut shared libraries from graphics/libglut to graphics/freeglut, type:
1587
1588     # pkg set -o graphics/libglut:graphics/freeglut
1589
1590 _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:
1591
1592     # pkg install -Rf graphics/freeglut
1593
1594 # Building DPorts from source
1595
1596 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:
1597
1598 * The port is new and there's no pre-binary available yet
1599 * The pre-built binaries use the default options and the user needs a package built with a different set of options
1600 * Testing FreeBSD port in order to patch them and submit to DPorts
1601 * The user just prefers building from source
1602
1603 ## Installing DPorts tree
1604
1605 DragonFly 3.4 or later is the minimum version that can build DPorts from source.
1606
1607 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:
1608
1609     # cd /usr
1610     # make dports-create-shallow
1611
1612 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:
1613
1614     # cd /usr
1615     # make dports-download
1616
1617 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:
1618
1619     # cd /usr/dports/devel/git
1620     # make install
1621     # cd /usr
1622     # rm -rf /usr/dports
1623     # make dports-create-shallow
1624
1625 The git repository is hosted on the [github account of John Marino](https://github.com/jrmarino/DPorts/#readme).
1626
1627 ## Final thoughts
1628
1629 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.
1630
1631 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.
1632
1633 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.
1634
1635 ## More reading
1636 * How fix/add broken ports: [[docs/howtos/fixdports]]
1637 * [Trick: How to get i386-only software via dports](http://leaf.dragonflybsd.org/mailarchive/users/2013-06/msg00023.html)
1638
1639 # Disclaimer 
1640
1641 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.
1642
1643 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: 
1644
1645 [http://www.dragonflybsd.org/docs/howtos/HowToDPorts/](http://www.dragonflybsd.org/docs/howtos/HowToDPorts/)
1646
1647 ----
1648
1649 # pkgsrc on DragonFly
1650
1651 DragonFly uses a specially crafted Makefile in /usr and a git mirror
1652 of the official pkgsrc repository to make pkgsrc distribution more user-friendly.
1653
1654 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.
1655
1656 [[!toc levels=3 ]]
1657
1658 ## Overview 
1659
1660 ### History 
1661 [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.
1662
1663 ### Overview
1664
1665 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.
1666
1667 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.
1668
1669  **Binary Package Benefits** 
1670
1671 * A compressed package tarball is typically smaller than the compressed tarball containing the source code for the application.
1672
1673 * 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.
1674
1675 * Packages do not require any understanding of the process involved in compiling software on DragonFly.
1676
1677 **Pkgsrc source Benefits** 
1678
1679 * 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.
1680
1681 * 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.
1682
1683 * The licensing conditions of some software distributions forbid binary distribution. They must be distributed as source code.
1684
1685 * 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.
1686
1687 * If you have local patches, you will need the source in order to apply them.
1688
1689 * 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.
1690
1691 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.
1692
1693  **Warning:** Before installing any application, you should check http://www.pkgsrc.org/ for security issues related to your application.
1694
1695 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.
1696
1697 **Note:** Binary packages and source packages are effectively the same software and can be manipulated with the same pkg_* tools.  
1698
1699 ## Installing pkgsrc 
1700
1701 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.  
1702
1703 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.
1704
1705 This downloads the stable version of the pkgsrc tree from the default mirror, if you didn't set GITHOST. As root:
1706
1707     # cd /usr
1708     # make pkgsrc-create
1709
1710 to fetch the intial pkgsrc repository from the net, or
1711
1712     # cd /usr
1713     # make pkgsrc-update
1714
1715 to update.
1716
1717 **Note**: If your DragonFly install is not up to date, you might have ended up with an old release of the pkgsrc tree.
1718
1719     # cd /usr/pkgsrc
1720     # git branch
1721
1722 will show what release you are on. See Tracking the stable branch for more information.
1723
1724 ### Tracking the stable branch
1725
1726 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.
1727
1728 To see the available remote branches:
1729
1730     # cd /usr/pkgsrc 
1731     # git pull
1732     # git branch -r
1733
1734 To create a local branch, tracking the remote quarterly release:
1735
1736     # cd /usr/pkgsrc 
1737     # git branch pkgsrc-2010Q4 origin/pkgsrc-2010Q4
1738
1739 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.
1740
1741 After adding a new branch, it can be downloaded with:
1742
1743     # cd /usr/pkgsrc 
1744     # git checkout pkgsrc-2010Q4
1745     # git pull
1746
1747 ## Dealing with pkgsrc packages
1748
1749 The following section explains how to find, install and remove pkgsrc packages.
1750
1751 ### Finding Your Application 
1752
1753 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:
1754
1755 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.
1756
1757     # pkg_search fvwm
1758     fvwm-2.4.20nb1          Newer version of X11 Virtual window manager
1759     fvwm-2.5.24             Development version of X11 Virtual window manager
1760     fvwm-themes-0.6.2nb8    Configuration framework for fvwm2 with samples
1761     fvwm-wharf-1.0nb1       Copy of AfterStep's Wharf compatible with fvwm2
1762     fvwm1-1.24rnb1          Virtual window manager for X
1763
1764     # pkg_search -v fvwm-2.5
1765     Name    : fvwm-2.5.24-50
1766     Dir     : wm/fvwm-devel                                     
1767     Desc    : Development version of X11 Virtual window manager 
1768     URL     : any                                               
1769     Deps    : perl>#5.0 gettext-lib>0.14.5 [...]
1770
1771 Its also possible to issue the command
1772
1773     # cd /usr/pkgsrc/
1774     # bmake search key='package you are looking for'
1775
1776 from the `/usr/pkgsrc` directory.
1777
1778 It's also possible to browse website that show all the available pkgsrc packages, such as [http://pkgsrc.se/](http://pkgsrc.se) .
1779
1780 ### Installing applications
1781
1782 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.  
1783
1784 The `bin-install` target on DragonFly (with pkgsrc from 2011/02/07 and later) will do just that:
1785
1786     # cd /usr/pkgsrc/misc/screen
1787     # bmake bin-install clean
1788
1789 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.
1790
1791 ### Installing applications, source only
1792
1793 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.
1794
1795     # cd /usr/pkgsrc/misc/screen
1796     # bmake install clean
1797
1798 To find out the options that can affect how a program is built:
1799
1800     # bmake show-options
1801
1802 To change options:
1803
1804     # bmake PKG_OPTIONS.<package_name>="-option1 option2" install clean
1805
1806 Listing an option enables it.  Listing an option with a "-" before it disables the option.
1807
1808 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`:
1809
1810      . PKG_OPTIONS.<package_name>=-option1 option2
1811     
1812 ### Installing applications, binary only
1813
1814 Binary packages can be installed using *pkg_radd*:
1815
1816     # pkg_radd screen
1817
1818 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.
1819
1820 You can manually set `BINPKG_BASE` and use *pkg_add* to get the same effect, using a different server.
1821
1822     # setenv BINPKG_BASE http://mirror-master.dragonflybsd.org/packages
1823     # pkg_add screen
1824
1825 #### Issues with pre-built packages
1826
1827 * The default remote repository for binary packages tracks quarterly pkgsrc releases, so your local install of pkgsrc should be the same quarterly release.
1828 * 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.
1829 * 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.
1830
1831 ### List all installed applications 
1832
1833 To obtain a list of all the packages that are installed on your system:
1834
1835     # pkg_info
1836
1837 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:
1838
1839     # pkg_info | grep xorg
1840
1841 ### Removing packages
1842
1843 If a program was installed as a package:
1844
1845     # pkg_delete packagename
1846
1847 If a package was installed from the source files, you can also change to the directory they were installed from and issue the command:
1848
1849     # bmake deinstall
1850
1851 Note that these methods are effectively interchangeable.  Either will work whether the package was originally installed from source or binary.
1852
1853 #### Remove associated files needed for building a package 
1854
1855 To remove the work file from building a package, and the package's dependencies:
1856
1857     # bmake clean clean-depends
1858
1859 This can be combined with other steps:
1860
1861     # bmake install clean clean-depends
1862
1863 ## Upgrading packages 
1864
1865 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.
1866
1867 ### Update pkgsrc system packages
1868
1869 **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. 
1870
1871     # cd /usr/pkgsrc/devel/bmake
1872     or
1873     # cd /usr/pkgsrc/pkgtools/pkg_install
1874     or 
1875     # cd /usr/pkgsrc/pkgtools/bootstrap-mk-files
1876     
1877     # env USE_DESTDIR=yes bmake package
1878     # bmake clean-depends clean
1879
1880 And go to the packages directory and install the binary package with
1881
1882     # cd /usr/pkgsrc/packages/All
1883     # pkg_add -u <pkg_name> (i.e. the name of the .tgz file).
1884
1885 ### bmake replace
1886 Performed in the `/usr/pkgsrc` directory that correlates with the installed package, the software is first built and then replaced.
1887
1888     # cd /usr/pkgsrc/chat/ircII
1889     # bmake replace
1890
1891 ### pkg_rolling-replace
1892
1893 *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.
1894
1895     # cd /usr && make pkgsrc-update
1896     # pkg_rolling-replace -u
1897
1898 ### pkgin
1899
1900 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.
1901
1902     # pkgin update
1903     # pkgin full-upgrade 
1904
1905 ### pkg_chk
1906
1907 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.
1908
1909     # pkg_chk -g  # make initial list of installed packages
1910     # pkg_chk -r  # remove all packages that are not up to date and packages that depend on them
1911     # pkg_chk -a  # install all missing packages (use binary packages, this is the default)
1912     # pkg_chk -as # install all missing packages (build from source)
1913
1914 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. 
1915
1916 ### pkg_add -u
1917
1918 Point at a local or online binary archive location to download and update packages.
1919
1920 ### rpkgmanager
1921
1922 This requires that you've set up rpkgmanager first. Read more about rpkgmanager [[here|docs/howtos/rpkgmanager/]].
1923
1924     # yes | rpkgmanager.rb
1925
1926 ## Start pkgsrc applications on system startup
1927
1928 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:
1929
1930     RCD_SCRIPTS_DIR=/etc/rc.d
1931     PKG_RCD_SCRIPTS=YES
1932
1933 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`.
1934
1935 Many other options can be set in this file; see `/usr/pkgsrc/mk/defaults/mk.conf` for examples.
1936
1937 ## Miscellaneous topics
1938
1939 ### Post-installation Activities 
1940
1941 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.
1942  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:
1943
1944 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
1945
1946     # pkg_info -L foopackage-1.0.0 | less
1947
1948 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
1949
1950     # pkg_info | grep -i foopackage
1951
1952 will find all the installed packages that have *foopackage* in the package name. Replace *foopackage* in your command line as necessary.
1953
1954 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
1955
1956     # pkg_info foopackage-1.0.0
1957
1958 A `WWW:` line, if present, should provide a URL for the application's web site.
1959
1960 ### Dealing with Broken Packages 
1961
1962 If you come across a package that does not work for you, there are a few things you can do, including:
1963
1964   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!
1965
1966   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/) .
1967
1968   1. Grab a pre-built package from an [[mirror|mirrors]] site near you. 
1969
1970 ### What is WIP? 
1971
1972 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.
1973
1974 ### Links
1975
1976 * More information: The pkgsrc guide [http://www.netbsd.org/Documentation/pkgsrc/](http://www.netbsd.org/Documentation/pkgsrc/)
1977
1978 * Web interface for searching packages: [http://www.pkgsrc.se](http://www.pkgsrc.se)
1979
1980 * Ways to upgrade packages [http://wiki-static.aydogan.net/How_to_upgrade_packages](http://wiki-static.aydogan.net/How_to_upgrade_packages)
1981
1982 * To search and/or report bugs against packages in pkgsrc, look at [http://www.netbsd.org/support/send-pr.html](http://www.netbsd.org/support/send-pr.html) - use category 'pkg'.
1983
1984 * The #pkgsrc IRC channel on Freenode
1985
1986 * The #dragonflybsd IRC channel on EFnet
1987
1988 # The X Window System 
1989 ***Updated for X.Org's X11 server by Ken Tom and Marc Fonvieille. Updated for DragonFly by Victor Balada Diaz. Updated for 2014 pkgng by Warren Postma***
1990
1991 [[!toc  levels=3]]
1992
1993 ## Synopsis 
1994
1995 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. 
1996
1997 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.
1998
1999 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.
2000
2001 You may find the FreeBSD X Configuration instructions apply exactly and unchanged in DragonFly BSD.
2002 They are found [[here|http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/x-config.html]]
2003
2004 ## Understanding X 
2005
2006 ### What is X.Org
2007
2008 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.
2009
2010 ### The Window Manager and the Desktop Environment
2011
2012 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.
2013
2014 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.
2015
2016 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.
2017
2018 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.  
2019
2020 If you are brand new and don't know what to do, select the XFCE4 desktop and follow those instructions.
2021 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".
2022
2023 Note that XFCE4 and Gnome and KDE do not require you to install any window manager as they include one automatically.
2024
2025 ## Installing X
2026
2027 **X.org**  is currently available in the DragonFly dports collection.
2028
2029 To install:
2030
2031     pkg install xorg-7.7
2032
2033 By the time you read this, it might be a newer version of xorg than 7.7, you can also try this general command:
2034
2035     pkg install xorg
2036
2037 ## Configuring X
2038
2039 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:
2040
2041     hald_enable ="YES"
2042     dbus_enable= "YES" 
2043
2044 Also see below about enabling `moused` in rc.conf, which may be required for you to see your mouse pointer in X.
2045
2046 As of version 7.3, Xorg can often work without any configuration file by simply typing at prompt:
2047
2048     
2049
2050     % startx
2051
2052 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.
2053
2054 Configuration of X11 is a multi-step process. The first step is to build an initial configuration file. As the super user, simply run:
2055    
2056
2057     # Xorg -configure
2058
2059 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.
2060
2061 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:
2062
2063    
2064
2065     # Xorg -config xorg.conf.new -retro
2066
2067 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.
2068
2069 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.
2070
2071 **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`:
2072
2073         # rcenable moused
2074
2075 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`.
2076
2077     
2078
2079 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).
2080
2081 ## The X Display Manager 
2082
2083  ***Contributed by Seth Kingsley.***
2084
2085 ### Overview 
2086
2087  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.
2088
2089  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.
2090
2091 ### Using XDM 
2092
2093  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:
2094
2095      
2096
2097     ttyv8   "/usr/pkg/bin/xdm -nodaemon"  xterm   off secure
2098
2099  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.
2100
2101 ### Configuring XDM 
2102
2103  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:
2104
2105 [[!table  data="""
2106 <tablestyle="width:100%">  **File**  |  **Description**
2107 <tablestyle="width:100%"> `Xaccess` | Client authorization ruleset.
2108 `Xresources` | Default X resource values.
2109 `Xservers` | List of remote and local displays to manage.
2110 `Xsession` | Default session script for logins.
2111 `Xsetup_`* | Script to launch applications before the login interface.
2112 `xdm-config` | Global configuration for all displays running on this machine.
2113 `xdm-errors` | Errors generated by the server program.
2114 `xdm-pid` | The process ID of the currently running XDM. |
2115
2116 """]]
2117
2118  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).
2119
2120  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.
2121
2122 #### Xaccess 
2123
2124  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.
2125
2126 #### Xresources 
2127
2128  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.
2129
2130 #### Xservers 
2131
2132  This is a list of the remote displays the chooser should provide as choices.
2133
2134 #### Xsession 
2135
2136  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.
2137
2138 #### Xsetup_* 
2139
2140  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`.
2141
2142 #### xdm-config 
2143
2144  This contains settings in the form of app-defaults that are applicable to every display that this installation manages.
2145
2146 #### xdm-errors 
2147
2148  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.
2149
2150 ### Running a Network Display Server 
2151
2152  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:
2153
2154      
2155
2156     ! SECURITY: do not listen for XDMCP or Chooser requests
2157
2158     ! Comment out this line if you want to manage X terminals with xdm
2159
2160     DisplayManager.requestPort:     0
2161
2162  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.
2163
2164 ### Replacements for XDM 
2165
2166  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.
2167
2168 ----
2169
2170 ## Desktop Environments 
2171
2172  ***Contributed by Valentino Vaschetto. ***
2173
2174  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** .
2175
2176 ### GNOME 
2177
2178 #### About GNOME 
2179
2180    **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.
2181
2182 #### Installing GNOME 
2183
2184    **GNOME**  can be easily installed from a package or from the pkgsrc framework:
2185
2186   To install the  **GNOME**  package from the network, simply type:
2187
2188     # pkg install gnome-desktop
2189
2190   To build  **GNOME**  from source, if you have the pkgsrc tree on your system:      
2191
2192     # cd /usr/pkgsrc/meta-pkgs/gnome
2193
2194     # bmake install clean
2195
2196   Once  **GNOME**  is installed, the X server must be told to start  **GNOME**  instead of a default window manager.
2197
2198   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.
2199
2200 **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:
2201
2202       
2203
2204     % echo "/usr/pkg/bin/gnome-session" > ~/.xinitrc
2205
2206   Next, type `startx`, and the  **GNOME**  desktop environment will be started.
2207
2208 **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** :
2209
2210         
2211
2212     % echo "#!/bin/sh" > ~/.xsession
2213
2214     % echo "/usr/pkg/bin/gnome-session" >> ~/.xsession
2215
2216     % chmod +x ~/.xsession
2217
2218   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** .
2219
2220 #### Anti-aliased Fonts with GNOME 
2221
2222   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).
2223   
2224   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.
2225
2226 ### KDE 
2227
2228 #### About KDE 
2229
2230   **KDE**  is an easy to use contemporary desktop environment. Some of the things that  **KDE**  brings to the user are:
2231
2232 * A beautiful contemporary desktop
2233
2234 * A desktop exhibiting complete network transparency
2235
2236 * An integrated help system allowing for convenient, consistent access to help on the use of the  **KDE**  desktop and its applications
2237
2238 * Consistent look and feel of all  **KDE**  applications
2239
2240 * Standardized menu and toolbars, keybindings, color-schemes, etc.
2241
2242 * Internationalization:  **KDE**  is available in more than 40 languages
2243
2244 * Centralized consisted dialog driven desktop configuration
2245
2246 * A great number of useful  **KDE**  applications
2247
2248   **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/).
2249
2250 #### Installing KDE 
2251
2252  Just as with  **GNOME**  or any other desktop environment, the easiest way to install  **KDE**  is through the pkgsrc framework or from a package:
2253
2254  To install the  **KDE**  4.10 package from the network, simply type:
2255
2256    # pkg install kde-4.10
2257
2258  To build  **KDE**  from source, using the pkgsrc framework:
2259
2260     # cd /usr/pkgsrc/meta-pkgs/kde3
2261
2262     # bmake install clean
2263
2264  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:
2265
2266     % echo "exec startkde" > ~/.xinitrc
2267
2268  Now, whenever the X Window System is invoked with `startx`,  **KDE**  will be the desktop.
2269
2270  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.
2271
2272 #### More Details on KDE 
2273
2274  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.
2275
2276  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.
2277
2278 #### The KDE Display Manager 
2279
2280  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.
2281
2282  To enable  **kdm** , the `ttyv8` entry in `/etc/ttys` has to be adapted. The line should look as follows:
2283   
2284
2285     ttyv8 "/usr/pkg/bin/kdm -nodaemon" xterm on secure
2286
2287     
2288 ### XFce 
2289
2290 #### About XFce 
2291
2292   **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:
2293
2294 * A simple, easy-to-handle desktop
2295
2296 * Fully configurable via mouse, with drag and drop, etc
2297
2298 * Main panel similar to  **CDE** , with menus, applets and applications launchers
2299
2300 * Integrated window manager, file manager, sound manager,  **GNOME**  compliance module, and other things
2301
2302 * Themeable (since it uses GTK+)
2303
2304 * Fast, light and efficient: ideal for older/slower machines or machines with memory limitations
2305
2306 More information on  **XFce**  can be found on the [XFce website](http://www.xfce.org/).
2307
2308 #### Installing XFce 
2309
2310  A binary package for  **XFce**  exists. To install, simply type:
2311
2312     # pkg install xfce
2313
2314 This should install the main xfce4 desktop package, and most of the required components.
2315
2316  Alternatively, to build from source, use the pkgsrc framework:
2317
2318    
2319
2320     # cd /usr/pkgsrc/meta-pkgs/xfce4
2321
2322     # bmake install clean
2323
2324  Now, tell the X server to launch  **XFce**  the next time X is started. Simply type this:
2325
2326     % echo "/usr/pkg/bin/startxfce4" > ~/.xinitrc
2327
2328  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).
2329
2330 <!-- XXX: FreeBSD's handbook has a nice user-oriented section about X applications here. maybe we should have one, too -->
2331
2332 ----
2333
2334 # Configuration and Tuning 
2335
2336 ***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.***
2337
2338 [[!toc  levels=3]]
2339
2340 ##Synopsis 
2341
2342 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.
2343
2344 After reading this chapter, you will know:
2345
2346 * How to efficiently work with file systems and swap partitions.
2347
2348 * The basics of `rc.conf` configuration and `rc.d` startup systems.
2349
2350 * How to configure and test a network card.
2351
2352 * How to configure virtual hosts on your network devices.
2353
2354 * How to use the various configuration files in `/etc`.
2355
2356 * How to tune DragonFly using `sysctl` variables.
2357
2358 * How to tune disk performance and modify kernel limitations.
2359
2360 Before reading this chapter, you should:
2361
2362 * Understand UNIX® and DragonFly basics ([Chapter 3](basics.html)).
2363
2364 * Be familiar with the basics of kernel configuration/compilation ([Chapter 9](kernelconfig.html)).
2365
2366 ## Initial Configuration 
2367
2368 ### Partition Layout 
2369
2370 #### Base Partitions 
2371
2372 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`.
2373 <!-- 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? -->
2374
2375 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.
2376
2377 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.
2378
2379 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.
2380
2381 #### Swap Partition 
2382
2383 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.
2384 <!-- XXX: do we really recommend double the RAM for swap? IMHO the amount of RAM should be more than enough -->
2385
2386 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.
2387
2388 #### Why Partition? 
2389
2390 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`.
2391
2392 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.
2393 <!-- XXX: again, same story about the edges of disks... -->
2394
2395 CategoryHandbook
2396
2397 CategoryHandbook-configuration
2398
2399 ## Core Configuration 
2400
2401 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.
2402
2403 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.
2404
2405 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.
2406
2407 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:
2408
2409 * rc.conf:
2410
2411         hostname="node15.example.com"
2412
2413         network_interfaces="fxp0 lo0"
2414
2415         ifconfig_fxp0="inet 10.1.1.1"
2416
2417   
2418
2419 * rc.conf.site: 
2420
2421         defaultrouter="10.1.1.254"
2422
2423         saver="daemon"
2424
2425         blanktime="100"
2426
2427   
2428
2429 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.
2430
2431 Upgrading the system using `make world` will not overwrite the `rc.conf` file, so system configuration information will not be lost.
2432
2433 CategoryHandbook
2434
2435 CategoryHandbook-configuration
2436
2437 ## Application Configuration 
2438
2439 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.
2440
2441 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.
2442
2443 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.
2444
2445 For example, consider the contents of the directory `/usr/pkg/etc/httpd`:
2446
2447     
2448
2449     total 90
2450
2451     -rw-r--r--  1 root  wheel  -   34K Jan 11 12:04 httpd.conf
2452
2453     -rw-r--r--  1 root  wheel  -   13K Jan 11 12:02 magic
2454
2455     -rw-r--r--  1 root  wheel  -   28K Jan 11 12:02 mime.types
2456
2457     -rw-r--r--  1 root  wheel  -   11K Jan 11 12:02 ssl.conf
2458
2459     
2460     
2461     
2462     
2463     
2464
2465 ## Starting Services 
2466
2467 It is common for a system to host a number of services. These may be started in several different fashions, each having different advantages.
2468
2469 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.
2470
2471 A generic startup script in `/usr/pkg/share/examples/rc.d` looks like:
2472
2473     
2474
2475     #!/bin/sh
2476
2477     echo -n ' FooBar'
2478
2479     
2480
2481     case "$1" in
2482
2483     start)
2484
2485             /usr/pkg/bin/foobar
2486
2487             ;;
2488
2489     stop)
2490
2491             kill -9 `cat /var/run/foobar.pid`
2492
2493             ;;
2494
2495     
2496 *)
2497
2498             echo "Usage: `basename $0` {start|stop}" >&2
2499
2500             exit 64
2501
2502             ;;
2503
2504     esac
2505
2506     
2507
2508     exit 0
2509
2510     
2511
2512 <!-- XXX: I don't think we actually look in /usr/pkg/share/examples/rc.d -->
2513
2514 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:
2515
2516     
2517
2518     # chmod 755 "FooBar.sh"
2519
2520 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.
2521
2522 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.
2523
2524  **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.
2525
2526 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.
2527
2528 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.
2529
2530 CategoryHandbook
2531
2532 CategoryHandbook-configuration
2533
2534 ## Configuring the cron Utility 
2535
2536 <!-- XXX: can't really comment on this. someone please revise it -->
2537
2538 ***Contributed by Tom Rhodes. ***
2539
2540 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.
2541
2542 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.
2543
2544  **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.
2545
2546 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`.
2547
2548 Let us take a look at the `/etc/crontab` file (the system crontab):
2549
2550     
2551
2552     # /etc/crontab - root's crontab for DragonFly
2553
2554     #
2555
2556     #                                                                  (1)
2557
2558     #
2559
2560     SHELL=/bin/sh
2561
2562     PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin                            (2)
2563
2564     HOME=/var/log
2565
2566     #
2567
2568     #
2569
2570     #minute     hour    mday    month   wday    who     command            (3)
2571
2572     #
2573
2574     #
2575
2576     
2577     */5 *       *       *       *       root    /usr/libexec/atrun (4)
2578
2579  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.
2580
2581  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.
2582
2583  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.
2584
2585  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.
2586
2587 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.
2588
2589 ### Installing a Crontab 
2590
2591  **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.
2592
2593 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:
2594
2595     
2596
2597     % crontab crontab-file
2598
2599 In this example, `crontab-file` is the filename of a `crontab` that was previously created.
2600
2601 There is also an option to list installed `crontab` files: just pass the `-l` option to `crontab` and look over the output.
2602
2603 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.
2604
2605 If you later want to remove your user `crontab` completely, use `crontab` with the `-r` option.
2606
2607 ## Using rc under DragonFly 
2608
2609 ***Contributed by Tom Rhodes. ***
2610
2611 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:
2612
2613     
2614
2615     # /etc/rc.d/sshd restart
2616
2617 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`:
2618
2619     natd_enable="YES"
2620
2621 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.
2622
2623 Another way to add services to the automatic startup/shutdown is to type, for example for `natd`,
2624
2625      # rcenable natd
2626
2627 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:
2628
2629     
2630
2631     # /etc/rc.d/sshd forcerestart
2632
2633 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:
2634
2635     
2636
2637     # /etc/rc.d/sshd rcvar
2638
2639     # sshd
2640
2641     $sshd_enable=YES
2642
2643  **Note:** The second line (`# sshd`) is the output from the `rc.d` script, not a `root` prompt.
2644
2645 To determine if a service is running, a `status` option is available. For instance to verify that `sshd` is actually started:
2646
2647     
2648
2649     # /etc/rc.d/sshd status
2650
2651     sshd is running as pid 433.
2652
2653 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.
2654
2655 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.
2656
2657 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:
2658
2659 * `PROVIDE`: Specifies the services this file provides.
2660
2661 * `REQUIRE`: Lists services which are required for this service. This file will run ***after*** the specified services.
2662
2663 * `BEFORE`: Lists services which depend on this service. This file will run ***before*** the specified services.
2664
2665 * 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.
2666
2667   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.
2668
2669 By using this method, an administrator can easily control system services without the hassle of ***runlevels*** like some other UNIX® operating systems.
2670
2671 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.
2672
2673 ### Using DragonFly's rcrun(8) 
2674
2675 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)
2676
2677 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.
2678
2679 The remaining commands are:
2680
2681 [[!table  data="""
2682   **disable**  | Sets the corresponding `_enable` variable in rc.conf(5) to ***NO*** and runs the stop command. 
2683   **enable**   | Sets the corresponding `_enable` variable in rc.conf(5) to ***YES*** and runs the start command. 
2684   **list**  | Shows the status of the specified scripts.  If no argument is specified, the status of all scripts is shown. |
2685
2686 """]]
2687
2688 To enable the [dntpd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dntpd&section=8) service, you can use:
2689
2690      # rcenable dntpd
2691      
2692  
2693
2694 To check if [dntpd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dntpd&section=8) is running you can use the following command:
2695
2696     
2697
2698     # rclist dntpd
2699
2700     rcng_dntpd=stopped
2701
2702 To start [dntpd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dntpd&section=8):
2703
2704     
2705
2706     # rcstart dntpd
2707
2708     Running /etc/rc.d/dntpd start
2709
2710     Starting dntpd.
2711
2712 Restart and stop works the same way:
2713
2714     
2715
2716     # rcrestart dntpd
2717
2718     Stopping dntpd.
2719
2720     Starting dntpd.
2721
2722     
2723
2724     # rcstop dntpd
2725
2726     Stopping dntpd.
2727
2728 If a service is not enabled in `/etc/rc.conf`, but you want it start anyway, execute the following:
2729
2730     
2731
2732     # rcforce dntpd
2733
2734     Running /etc/rc.d/dntpd forcestart
2735
2736     Starting dntpd.
2737
2738 #### Notes 
2739
2740 [[!table  data="""
2741 <tablestyle="width:100%"> [(1)](configtuning-rcng.html#AEN4751) | Previously this was used to define *BSD dependent features.
2742 | |
2743
2744 """]]
2745
2746 ## Setting Up Network Interface Cards 
2747
2748 ***Contributed by Marc Fonvieille. ***
2749
2750 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.
2751
2752 ### Locating the Correct Driver 
2753
2754 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.
2755
2756 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.
2757
2758 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:
2759
2760     
2761
2762     dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38
2763
2764     000ff irq 15 at device 11.0 on pci0
2765
2766     dc0: Ethernet address: 00:a0:cc:da:da:da
2767
2768     miibus0: <MII bus> on dc0
2769
2770     ukphy0: <Generic IEEE 802.3u media interface> on miibus0
2771
2772     ukphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
2773
2774     dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30
2775
2776     000ff irq 11 at device 12.0 on pci0
2777
2778     dc1: Ethernet address: 00:a0:cc:da:da:db
2779
2780     miibus1: <MII bus> on dc1
2781
2782     ukphy1: <Generic IEEE 802.3u media interface> on miibus1
2783
2784     ukphy1:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
2785
2786 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.
2787
2788 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.
2789
2790 ### Configuring the Network Card 
2791
2792 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.
2793
2794 To display the configuration for the network interfaces on your system, enter the following command:
2795
2796     
2797
2798     % ifconfig
2799
2800     dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
2801
2802             inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
2803
2804             ether 00:a0:cc:da:da:da
2805
2806             media: Ethernet autoselect (100baseTX <full-duplex>)
2807
2808             status: active
2809
2810     dc1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
2811
2812             inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
2813
2814             ether 00:a0:cc:da:da:db
2815
2816             media: Ethernet 10baseT/UTP
2817
2818             status: no carrier
2819
2820     lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
2821
2822     lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
2823
2824             inet 127.0.0.1 netmask 0xff000000
2825
2826     tun0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
2827
2828  **Note:** Note that entries concerning IPv6 (`inet6` etc.) were omitted in this example.
2829
2830 In this example, the following devices were displayed:
2831
2832 * `dc0`: The first Ethernet interface
2833
2834 * `dc1`: The second Ethernet interface
2835
2836 * `lp0`: The parallel port interface
2837
2838 * `lo0`: The loopback device
2839
2840 * `tun0`: The tunnel device used by  **ppp** 
2841
2842 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.
2843
2844 In this example, the `dc0` device is up and running. The key indicators are:
2845
2846   1. `UP` means that the card is configured and ready.
2847
2848   1. The card has an Internet (`inet`) address (in this case `192.168.1.3`).
2849
2850   1. It has a valid subnet mask (`netmask`; `0xffffff00` is the same as `255.255.255.0`).
2851
2852   1. It has a valid broadcast address (in this case, `192.168.1.255`).
2853
2854   1. The MAC address of the card (`ether`) is `00:a0:cc:da:da:da`
2855
2856   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.
2857
2858   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.
2859
2860 If the [ifconfig(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=ifconfig&section=8) output had shown something similar to:
2861
2862     
2863
2864     dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
2865
2866                 ether 00:a0:cc:da:da:da
2867
2868 it would indicate the card has not been configured.
2869
2870 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.
2871
2872     
2873
2874     # ifconfig dc0 inet 192.168.1.3 netmask 255.255.255.0
2875
2876 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.
2877
2878 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:
2879
2880     
2881
2882     ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0"
2883
2884     ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP"
2885
2886 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`.
2887
2888 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.
2889
2890 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`.
2891
2892 ### Testing and Troubleshooting 
2893
2894 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.
2895
2896 Once the system has been rebooted, you should test the network interfaces.
2897
2898 #### Testing the Ethernet Card 
2899
2900 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.
2901
2902 First test the local interface:
2903
2904     
2905
2906     % ping -c5 192.168.1.3
2907
2908     PING 192.168.1.3 (192.168.1.3): 56 data bytes
2909
2910     64 bytes from 192.168.1.3: icmp_seq#0 ttl64 time=0.082 ms
2911
2912     64 bytes from 192.168.1.3: icmp_seq#1 ttl64 time=0.074 ms
2913
2914     64 bytes from 192.168.1.3: icmp_seq#2 ttl64 time=0.076 ms
2915
2916     64 bytes from 192.168.1.3: icmp_seq#3 ttl64 time=0.108 ms
2917
2918     64 bytes from 192.168.1.3: icmp_seq#4 ttl64 time=0.076 ms
2919
2920     
2921
2922     --- 192.168.1.3 ping statistics ---
2923
2924     5 packets transmitted, 5 packets received, 0% packet loss
2925
2926     round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms
2927
2928 Now we have to ping another machine on the LAN:
2929
2930     
2931
2932     % ping -c5 192.168.1.2
2933
2934     PING 192.168.1.2 (192.168.1.2): 56 data bytes
2935
2936     64 bytes from 192.168.1.2: icmp_seq#0 ttl64 time=0.726 ms
2937
2938     64 bytes from 192.168.1.2: icmp_seq#1 ttl64 time=0.766 ms
2939
2940     64 bytes from 192.168.1.2: icmp_seq#2 ttl64 time=0.700 ms
2941
2942     64 bytes from 192.168.1.2: icmp_seq#3 ttl64 time=0.747 ms
2943
2944     64 bytes from 192.168.1.2: icmp_seq#4 ttl64 time=0.704 ms
2945
2946     
2947
2948     --- 192.168.1.2 ping statistics ---
2949
2950     5 packets transmitted, 5 packets received, 0% packet loss
2951
2952     round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms
2953
2954 You could also use the machine name instead of `192.168.1.2` if you have set up the `/etc/hosts` file.
2955
2956 #### Troubleshooting 
2957
2958 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.
2959
2960 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.
2961
2962 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.
2963
2964 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.
2965
2966 ***`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].
2967
2968 ***`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.
2969
2970 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.
2971
2972 ## Virtual Hosts 
2973
2974 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.
2975
2976 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`.
2977
2978 An alias entry for the interface `fxp0` looks like:
2979
2980     
2981
2982     ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"
2983
2984 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.
2985
2986 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`).
2987
2988 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`.
2989
2990 The following entries configure the adapter correctly for this arrangement:
2991
2992     
2993
2994      ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0"
2995
2996      ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255"
2997
2998      ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255"
2999
3000      ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255"
3001
3002      ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255"
3003
3004      ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240"
3005
3006      ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255"
3007
3008      ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255"
3009
3010      ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"
3011
3012 CategoryHandbook
3013
3014 CategoryHandbook-configuration
3015
3016 ## Configuration Files 
3017
3018 ### /etc Layout 
3019
3020 There are a number of directories in which configuration information is kept. These include:
3021
3022 [[!table  data="""
3023  `/etc` | Generic system configuration information; data here is system-specific. 
3024  `/etc/defaults` | Default versions of system configuration files. 
3025  `/etc/mail` | Extra [sendmail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sendmail&section=8) configuration, other MTA configuration files. 
3026  `/etc/ppp` | Configuration for both user- and kernel-ppp programs. 
3027  `/etc/namedb` | Default location for [named(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=named&section=8) data. Normally `named.conf` and zone files are stored here. 
3028  `/usr/local/etc` | Configuration files for installed applications. May contain per-application subdirectories. 
3029  `/usr/local/etc/rc.d` | Start/stop scripts for installed applications. 
3030  `/var/db` | Automatically generated system-specific database files, such as the package database, the locate database, and so on |
3031
3032 """]]
3033
3034 ### Hostnames 
3035
3036 #### /etc/resolv.conf 
3037
3038 `/etc/resolv.conf` dictates how DragonFly's resolver accesses the Internet Domain Name System (DNS).
3039
3040 The most common entries to `resolv.conf` are:
3041
3042 [[!table  data="""
3043  `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.
3044  `search` | Search list for hostname lookup. This is normally determined by the domain of the local hostname. 
3045  `domain` | The local domain name. |
3046
3047 """]]
3048
3049 A typical `resolv.conf`:
3050
3051     
3052
3053     search example.com
3054
3055     nameserver 147.11.1.11
3056
3057     nameserver 147.11.100.30
3058
3059  **Note:** Only one of the `search` and `domain` options should be used.
3060
3061 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.
3062
3063 #### /etc/hosts 
3064
3065 `/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.
3066
3067     
3068
3069     #
3070
3071     #
3072
3073     # Host Database
3074
3075     # This file should contain the addresses and aliases
3076
3077     # for local hosts that share this file.
3078
3079     # In the presence of the domain name service or NIS, this file may
3080
3081     # not be consulted at all; see /etc/nsswitch.conf for the resolution order.
3082
3083     #
3084
3085     #
3086
3087     ::1                     localhost localhost.my.domain myname.my.domain
3088
3089     127.0.0.1               localhost localhost.my.domain myname.my.domain
3090
3091     #
3092
3093     # Imaginary network.
3094
3095     #10.0.0.2               myname.my.domain myname
3096
3097     #10.0.0.3               myfriend.my.domain myfriend
3098
3099     #
3100
3101     # According to RFC 1918, you can use the following IP networks for
3102
3103     # private nets which will never be connected to the Internet:
3104
3105     #
3106
3107     #       10.0.0.0        -   10.255.255.255
3108
3109     #       172.16.0.0      -   172.31.255.255
3110
3111     #       192.168.0.0     -   192.168.255.255
3112
3113     #
3114
3115     # In case you want to be able to connect to the Internet, you need
3116
3117     # real official assigned numbers.  PLEASE PLEASE PLEASE do not try
3118
3119     # to invent your own network numbers but instead get one from your
3120
3121     # network provider (if any) or from the Internet Registry (ftp to
3122
3123     # rs.internic.net, directory `/templates').
3124
3125     #
3126
3127 `/etc/hosts` takes on the simple format of:
3128
3129     
3130
3131     [Internet address] [official hostname] [alias1] [alias2] ...
3132
3133 For example:
3134
3135     
3136
3137     10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2
3138
3139 Consult [hosts(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=hosts&section=5) for more information.
3140
3141 ### Log File Configuration 
3142
3143 #### syslog.conf 
3144
3145 `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.
3146
3147     
3148
3149     #
3150
3151     #
3152
3153     #       Spaces ARE valid field separators in this file. However,
3154
3155     #       other *nix-like systems still insist on using tabs as field
3156
3157     #       separators. If you are sharing this file between systems, you
3158
3159     #       may want to use only tabs as field separators here.
3160
3161     #       Consult the syslog.conf(5) manual page.
3162
3163     
3164 *.err;kern.debug;auth.notice;mail.crit          /dev/console
3165
3166     *.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
3167
3168     security.*                                      /var/log/security
3169
3170     mail.info                                       /var/log/maillog
3171
3172     lpr.info                                        /var/log/lpd-errs
3173
3174     cron.*                                          /var/log/cron
3175
3176     
3177 *.err                                           root
3178
3179     *.notice;news.err                               root
3180
3181     *.alert                                         root
3182
3183     *.emerg                                         *
3184
3185     # uncomment this to log all writes to /dev/console to /var/log/console.log
3186
3187     #console.info                                   /var/log/console.log
3188
3189     # uncomment this to enable logging of all log messages to /var/log/all.log
3190
3191     #*.*                                            /var/log/all.log
3192
3193     # uncomment this to enable logging to a remote log host named loghost
3194
3195     #*.*                                            @loghost
3196
3197     # uncomment these if you're running inn
3198
3199     # news.crit                                     /var/log/news/news.crit
3200
3201     # news.err                                      /var/log/news/news.err
3202
3203     # news.notice                                   /var/log/news/news.notice
3204
3205     !startslip
3206
3207     
3208 *.*                                             /var/log/slip.log
3209
3210     !ppp
3211
3212     
3213 *.*                                             /var/log/ppp.log
3214
3215 Consult the [syslog.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=syslog.conf&section=5) manual page for more information.
3216
3217 #### newsyslog.conf 
3218
3219 `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.
3220
3221 `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.
3222
3223     
3224
3225     # configuration file for newsyslog
3226
3227     #
3228
3229     #
3230
3231     # filename          [owner:group]    mode count size when [ZB] [/pid_file] [sig_num]
3232
3233     /var/log/cron                           600  3     100  *     Z
3234
3235     /var/log/amd.log                        644  7     100  *     Z
3236
3237     /var/log/kerberos.log                   644  7     100  *     Z
3238
3239     /var/log/lpd-errs                       644  7     100  *     Z
3240
3241     /var/log/maillog                        644  7     *    @T00  Z
3242
3243     /var/log/sendmail.st                    644  10    *    168   B
3244
3245     /var/log/messages                       644  5     100  *     Z
3246
3247     /var/log/all.log                        600  7     *    @T00  Z
3248
3249     /var/log/slip.log                       600  3     100  *     Z
3250
3251     /var/log/ppp.log                        600  3     100  *     Z
3252
3253     /var/log/security                       600  10    100  *     Z
3254
3255     /var/log/wtmp                           644  3     *    @01T05 B
3256
3257     /var/log/daily.log                      640  7     *    @T00  Z
3258
3259     /var/log/weekly.log                     640  5     1    $W6D0 Z
3260
3261     /var/log/monthly.log                    640  12    *    $M1D0 Z
3262
3263     /var/log/console.log                    640  5     100  *     Z
3264
3265 Consult the [newsyslog(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=newsyslog&section=8) manual page for more information.
3266
3267 ### sysctl.conf 
3268
3269 `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.
3270
3271 A sample `sysctl.conf` turning off logging of fatal signal exits and letting Linux programs know they are really running under DragonFly:
3272
3273     
3274
3275     kern.logsigexit=0       # Do not log fatal signal exits (e.g. sig 11)
3276
3277     compat.linux.osname=DragonFly
3278
3279     compat.linux.osrelease=4.3-STABLE
3280
3281     
3282     
3283     
3284     
3285     
3286 ## Tuning with sysctl 
3287
3288 [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).
3289
3290 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.
3291
3292 To view all readable variables:
3293
3294     
3295
3296     % sysctl -a
3297
3298 To read a particular variable, for example, `kern.maxproc`:
3299
3300     
3301
3302     % sysctl kern.maxproc
3303
3304     kern.maxproc: 1044
3305
3306 To set a particular variable, use the intuitive `***variable***`=`***value***` syntax:
3307
3308     
3309
3310     # sysctl kern.maxfiles=5000
3311
3312     kern.maxfiles: 2088 -< 5000
3313
3314 Settings of sysctl variables are usually either strings, numbers, or booleans (a boolean being `1` for yes or a `0` for no).
3315
3316 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].
3317
3318 ### sysctl(8) Read-only 
3319
3320 ***Contributed by Tom Rhodes. ***
3321
3322 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.
3323
3324 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:
3325
3326     
3327
3328     cbb0: Could not map register memory
3329
3330     device_probe_and_attach: cbb0 attach returned 12
3331
3332 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.
3333
3334 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.
3335
3336 ## Tuning Disks 
3337
3338 ### Sysctl Variables 
3339
3340 #### `vfs.vmiodirenable` 
3341
3342 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.
3343
3344 #### `vfs.write_behind` 
3345
3346 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.
3347
3348 #### `vfs.hirunningspace` 
3349
3350 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.
3351
3352 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.
3353
3354 #### `vm.swap_idle_enabled` 
3355
3356 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.
3357
3358 #### `hw.ata.wc` 
3359
3360 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.
3361
3362 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.
3363
3364 For more information, please see [ata(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=ata&section=4) manual page.
3365
3366 <!-- XXX: add some more sysctls, e.g. relating to AHCI, nata, ... -->
3367
3368 ### Soft Updates 
3369
3370 **Note** that soft updates are only available on UFS.
3371
3372 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:
3373
3374     
3375
3376     # tunefs -n enable /filesystem
3377
3378     # tunefs -n disable /filesystem
3379
3380 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.
3381
3382  **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).
3383
3384 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.
3385
3386 #### More Details about Soft Updates 
3387 <!-- XXX: consider axing this section -->
3388
3389 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.)
3390
3391 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`).
3392
3393 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.
3394
3395 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.
3396
3397 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.
3398
3399 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.
3400
3401 ## Tuning Kernel Limits 
3402
3403 ### File/Process Limits 
3404
3405 #### `kern.maxfiles` 
3406
3407 <!-- XXX: revise this section; someone who knows about it -->
3408
3409 `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.
3410
3411 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.
3412
3413 `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.
3414
3415  **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.
3416
3417 #### `kern.ipc.somaxconn` 
3418
3419 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.
3420
3421 ### Network Limits 
3422
3423 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.
3424
3425 <!-- XXX: mention kern.ipc.mbufs sysctl -->
3426
3427 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.
3428
3429  **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.
3430
3431 #### `net.inet.ip.portrange.*` 
3432
3433 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.
3434
3435 #### TCP Bandwidth Delay Product 
3436 <!-- XXX: Revise this stuff, I'm not familiar with it -->
3437
3438 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.
3439
3440 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).
3441
3442 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.
3443
3444 ## Adding Swap Space 
3445 <!-- XXX: swapcache -->
3446
3447 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.
3448
3449 ### Swap on a New Hard Drive 
3450
3451 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.
3452
3453 ### Swapping over NFS 
3454
3455 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.
3456
3457 ### Swapfiles 
3458
3459 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.
3460
3461  **Example 6-1. Creating a Swapfile** 
3462
3463   1. Be certain that your kernel configuration includes the vnode driver. It is ***not*** in recent versions of `GENERIC`.
3464
3465       
3466
3467          pseudo-device   vn 1   #Vnode driver (turns a file into a device)
3468
3469   
3470
3471   1. Create a swapfile (`/usr/swap0`):
3472
3473       
3474
3475          # dd if=/dev/zero of=/usr/swap0 bs=1024k count=64
3476
3477   
3478
3479   1. Set proper permissions on (`/usr/swap0`):
3480
3481       
3482
3483          # chmod 0600 /usr/swap0
3484
3485   
3486
3487   1. Enable the swap file in `/etc/rc.conf`:
3488
3489       
3490
3491          swapfile="/usr/swap0"   # Set to name of swapfile if aux swapfile desired.
3492
3493   
3494
3495   1. Reboot the machine or to enable the swap file immediately, type:
3496
3497       
3498
3499          # vnconfig -e /dev/vn0b /usr/swap0 swap
3500
3501   
3502
3503 ## Power and Resource Management 
3504
3505 ***Written by Hiten Pandya and Tom Rhodes. ***
3506
3507 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.
3508
3509 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.
3510
3511 ### What Is ACPI? 
3512
3513 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).
3514
3515 ### Shortcomings of Advanced Power Management (APM) 
3516
3517 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.
3518
3519 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.
3520
3521 ***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.
3522
3523 The DragonFly APM driver is documented in the [apm(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=apm&section=4) manual page.
3524
3525 ### Configuring ACPI 
3526
3527 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.
3528
3529  **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.
3530
3531 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:
3532
3533   
3534
3535     # halt -p
3536
3537 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.
3538
3539 ## Using and Debugging DragonFly ACPI 
3540
3541 ***Written by Nate Lawson. With contributions from Peter Schultz and Tom Rhodes. ***
3542
3543 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.
3544
3545 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.
3546
3547 ### Submitting Debugging Information 
3548
3549  **Note:** Before submitting a problem, be sure you are running the latest BIOS version and, if available, embedded controller firmware version.
3550
3551 For those of you that want to submit a problem right away, please send the following information to [bugs](http://leaf.dragonflybsd.org/mailarchive/)
3552
3553 * 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.
3554
3555 * The dmesg output after ***boot `-v`***, including any error messages generated by you exercising the bug.
3556
3557 * dmesg output from ***boot `-v`*** with ACPI disabled, if disabling it helps fix the problem.
3558
3559 * Output from ***sysctl hw.acpi***. This is also a good way of figuring out what features your system offers.
3560
3561 * 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:
3562       
3563
3564       # acpidump -t -d > name-system.asl
3565
3566   
3567
3568   (Substitute your login name for `name` and manufacturer/model for `system`. Example: `njl-FooCo6000.asl`)
3569
3570 ### Background 
3571
3572 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.
3573
3574 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.
3575
3576 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`.
3577
3578 ### Common Problems 
3579
3580 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.
3581
3582 #### Suspend/Resume 
3583
3584 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.
3585
3586 Start by checking `sysctl` `hw.acpi` for the suspend-related items. Here are the results for my Thinkpad:
3587
3588     hw.acpi.supported_sleep_state: S3 S4 S5
3589
3590     hw.acpi.s4bios: 0
3591
3592 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.
3593
3594 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.
3595
3596 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.
3597
3598 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.
3599
3600 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.
3601
3602 <-- XXX: mention sensors somewhere; but not in this section -->
3603
3604 #### System Hangs (temporary or permanent) 
3605
3606 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).
3607
3608 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`.
3609
3610 Your best hope when dealing with interrupt problems is to try disabling APIC support with `hint.apic.0.disabled="1"` in `loader.conf`.
3611
3612 #### Panics 
3613
3614 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.
3615
3616 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.
3617
3618 #### System Powers Up After Suspend or Shutdown 
3619
3620 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.
3621
3622 #### Other Problems 
3623
3624 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.
3625
3626 ### ASL, acpidump, and IASL 
3627 <!-- XXX: IMHO all this crap about fixing your DSDT etc should  be axed -->
3628
3629 The most common problem is the BIOS vendors providing incorrect (or outright buggy!) bytecode. This is usually manifested by kernel console messages like this:
3630
3631     
3632
3633     ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\
3634
3635     (Node 0xc3f6d160), AE_NOT_FOUND
3636
3637 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.
3638
3639 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:
3640
3641     
3642
3643     # iasl your.asl
3644
3645 ### Fixing Your ASL 
3646
3647 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.
3648
3649 Here is a list of common error messages, their cause, and how to fix them:
3650
3651 #### OS dependencies 
3652
3653 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.
3654
3655 #### Missing Return statements 
3656
3657 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.
3658
3659 #### Overriding the Default AML 
3660
3661 After you customize `your.asl`, you will want to compile it, run:
3662    
3663
3664     # iasl your.asl
3665
3666 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.
3667
3668 `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:
3669
3670     
3671
3672     acpi_dsdt_load="YES"
3673
3674     acpi_dsdt_name="/boot/DSDT.aml"
3675
3676 Be sure to copy your `DSDT.aml` to the `/boot` directory.
3677
3678 ### Getting Debugging Output From ACPI 
3679
3680 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.
3681
3682 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:
3683
3684     
3685
3686     # cd /sys/dev/acpica5 && make clean && make ACPI_DEBUG=1
3687
3688 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.
3689
3690     
3691
3692     debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS"
3693
3694     debug.acpi.level="ACPI_LV_ERROR"
3695
3696 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`.
3697
3698 ### References 
3699
3700 More information about ACPI may be found in the following locations:
3701
3702 * 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.)
3703
3704 * The ACPI Mailing List Archives (FreeBSD) http://lists.freebsd.org/pipermail/freebsd-acpi/
3705
3706 * The old ACPI Mailing List Archives (FreeBSD) http://home.jp.FreeBSD.org/mail-list/acpi-jp/
3707
3708 * The ACPI 2.0 Specification http://acpi.info/spec.htm
3709
3710 * DragonFly Manual pages: [acpidump(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=acpidump&section8), [acpiconf(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=acpiconf&section=8), [acpidb(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=acpidb&section=8)
3711
3712 * [DSDT debugging resource](http://www.cpqlinux.com/acpi-howto.html#fix_broken_dsdt). (Uses Compaq as an example but generally useful.)
3713
3714 # The DragonFly virtual kernels 
3715 [[!toc  levels=3]]
3716
3717 ***Obtained from [vkernel(7)](http://leaf.dragonflybsd.org/cgi/web-man?command=vkernel&section=7) written by Sascha Wildner, added by Matthias Schmidt***
3718
3719 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.
3720
3721 The vkernel architecture allows for running DragonFly kernels in userland.
3722
3723 ## Supported devices 
3724
3725 A number of virtual device drivers exist to supplement the virtual kernel.
3726
3727 <!-- XXX: why do they only support 16 devices? is this really true? -->
3728
3729 ### Disk device 
3730
3731 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`.
3732
3733 ### CD-ROM device 
3734
3735 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.
3736
3737 ### Network interface 
3738
3739 The vke driver supports up to 16 virtual network interfaces which are
3740
3741 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.
3742
3743 ## Setup a virtual kernel environment 
3744
3745 A couple of steps are necessary in order to prepare the system to build and run a virtual kernel.
3746
3747 ### Setting up the filesystem 
3748
3749 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`:
3750
3751     
3752
3753     % mkdir /home/var.vkernel
3754     % ln -s /home/var.vkernel /var/vkernel
3755
3756 Next, a filesystem image to be used by the virtual kernel has to be created and populated (assuming world has been built previously):    
3757
3758     # dd if=/dev/zero of=/var/vkernel/rootimg.01 bs=1m count=2048
3759     # vnconfig -c vn0 /var/vkernel/rootimg.01
3760     # disklabel -r -w vn0s0 auto
3761     # disklabel -e vn0s0      # add 'a' partition with fstype `4.2BSD' size could be '*'
3762     # newfs /dev/vn0s0a
3763     # mount /dev/vn0s0a /mnt
3764
3765 If instead of using `vn0` you specify `vn` to `vnconfig`, a new `vn` device will be created and a message saying which `vnX` was created will appear. This effectively lifts the limit of 4 vn devices.
3766
3767 Assuming that you build your world before, you can populate the image now.  If you didn't build your world see [chapter 21](../updating-makeworld.html).
3768
3769     # cd /usr/src
3770     # make installworld DESTDIR=/mnt
3771     # cd etc
3772     # make distribution DESTDIR=/mnt
3773
3774 Create a fstab file to let the vkernel find your image file.
3775
3776     
3777
3778     # echo '/dev/vkd0s0a      /       ufs     rw      1  1' >/mnt/etc/fstab
3779     # echo 'proc              /proc   procfs  rw      0  0' >>/mnt/etc/fstab
3780
3781 Edit `/mnt/etc/ttys` and replace the console entry with the following line and turn off all other gettys.
3782
3783     # console "/usr/libexec/getty Pc"         cons25  on  secure
3784
3785 Then, unmount the disk.
3786
3787     # umount /mnt
3788     # vnconfig -u vn0
3789
3790 ### Compiling the virtual kernel 
3791
3792 In order to compile a virtual kernel use the VKERNEL kernel configuration file residing in `/usr/src/sys/config` (or a configuration file derived thereof):
3793     
3794
3795     # cd /usr/src
3796     # make -DNO_MODULES buildkernel KERNCONF=VKERNEL
3797     # make -DNO_MODULES installkernel KERNCONF=VKERNEL DESTDIR=/var/vkernel
3798
3799 ### Enabling virtual kernel operation 
3800
3801 A special sysctl(8), `vm.vkernel_enable`, must be set to enable vkernel operation:
3802
3803     # sysctl vm.vkernel_enable=1
3804
3805 To make this change permanent, edit `/etc/sysctl.conf`
3806
3807 ## Setup networking 
3808
3809 ### Configuring the network on the host system 
3810
3811 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:
3812
3813     
3814
3815     # kldload if_bridge.ko
3816     # kldload if_tap.ko
3817     # ifconfig bridge0 create
3818     # ifconfig bridge0 addm re0       # assuming re0 is the host's interface
3819     # ifconfig bridge0 up
3820
3821  **Note** : You have to change `re0` to the interface of your host machine.
3822
3823  
3824  
3825  
3826 ## Run a virtual kernel 
3827
3828 Finally, the virtual kernel can be run:
3829
3830     # cd /var/vkernel
3831     # ./boot/kernel/kernel -m 64m -r /var/vkernel/rootimg.01 -I auto:bridge0
3832
3833 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.
3834
3835 # The DragonFly Booting Process 
3836 [[!toc  levels=3]]
3837
3838 ## Synopsis 
3839
3840 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.
3841
3842 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.
3843
3844 After reading this chapter, you will know:
3845
3846 * What the components of the DragonFly bootstrap system are, and how they interact.
3847
3848 * The options you can give to the components in the DragonFly bootstrap to control the boot process.
3849
3850 * The basics of [device.hints(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#device.hints&section5&manpath=FreeBSD+5.2-current).
3851
3852  **x86 Only:** This chapter only describes the boot process for DragonFly running on x86 systems.
3853
3854 ## The Booting Problem 
3855
3856 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?
3857
3858 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***.
3859
3860 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.
3861
3862 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.)
3863
3864 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`.
3865
3866 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.
3867
3868 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.
3869
3870 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.
3871
3872 ----
3873
3874 ## The Boot Manager and Boot Stages 
3875
3876 ### The Boot Manager 
3877
3878 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** .
3879
3880  **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:
3881
3882  **Example 7-1. `boot0` Screenshot** 
3883
3884     
3885
3886     F1 DOS
3887
3888     F2 FreeBSD
3889
3890     F3 Linux
3891
3892     F4 ??
3893
3894     F5 Drive 1
3895
3896     
3897
3898     Default: F2
3899
3900 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:
3901
3902     
3903
3904     # fdisk -B -b /boot/boot0 device
3905
3906 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).
3907
3908  **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:
3909
3910     
3911
3912     other=/dev/hdXY
3913
3914     table=/dev/hdX
3915
3916     loader=/boot/chain.b
3917
3918     label=DragonFly
3919
3920 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.
3921
3922 ### Stage One, /boot/boot1, and Stage Two, /boot/boot2 
3923
3924 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).
3925
3926 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`.
3927
3928 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.
3929
3930 `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`.
3931
3932 `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.
3933
3934 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.
3935
3936  **Example 7-2. boot2 Screenshot** 
3937
3938     
3939
3940     >> DragonFly/i386 BOOT
3941
3942     Default: 0:ad(0,a)/boot/loader
3943
3944     boot:
3945
3946 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):
3947
3948     
3949
3950     # disklabel -B diskslice
3951
3952 where `***diskslice***` is the disk and slice you boot from, such as `ad0s1` for the first slice on the first IDE disk.
3953
3954 ### Stage Three, `/boot/loader` 
3955
3956 The loader is the final stage of the three-stage bootstrap, and is located on the file system, usually as `/boot/loader`.
3957
3958 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.
3959
3960 #### Loader Program Flow 
3961
3962 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.
3963
3964 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.
3965
3966 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.
3967
3968 #### Loader Built-In Commands 
3969
3970 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).
3971
3972 * 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.
3973
3974 * boot [`***-options***`] [`***kernelname***`]: Immediately proceeds to boot the kernel, with the given options, if any, and with the kernel name given, if it is.
3975
3976 *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`.
3977
3978 * help [`***topic***`]: Shows help messages read from `/boot/loader.help`. If the topic given is `index`, then the list of available topics is given.
3979
3980 * 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.
3981
3982 * 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.
3983
3984 * 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.
3985
3986 * lsdev [`-v`]: Lists all of the devices from which it may be possible to load modules. If `-v` is specified, more details are printed.
3987
3988 * lsmod [`-v`]: Displays loaded modules. If `-v` is specified, more details are shown.
3989
3990 * more `***filename***`: Displays the files specified, with a pause at each `LINES` displayed.
3991
3992 * reboot: Immediately reboots the system.
3993
3994 * set `***variable***`, set `***variable***`=`***value***`: Sets the loader's environment variables.
3995
3996 * unload: Removes all loaded modules.
3997
3998 #### Loader Examples 
3999
4000 Here are some practical examples of loader usage:
4001
4002 * To simply boot your usual kernel, but in single-user mode:
4003
4004       
4005
4006           boot -s
4007
4008   
4009
4010 * To unload your usual kernel and modules, and then load just your old (or another) kernel:
4011
4012       
4013
4014           unload
4015
4016           load kernel.old
4017
4018   
4019
4020   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).
4021
4022    **Note:** Use the following to load your usual modules with another kernel:
4023
4024       
4025
4026           unload
4027
4028           set kernel="kernel.old"
4029
4030           boot-conf
4031
4032   
4033
4034 * To load a kernel configuration script (an automated script which does the things you would normally do in the kernel boot-time configurator):
4035
4036       
4037
4038          load -t userconfig_script /boot/kernel.conf
4039
4040   
4041
4042 ----
4043
4044 ## Kernel Interaction During Boot 
4045
4046 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.
4047
4048 ### Kernel Boot Flags 
4049
4050 Here are the more common boot flags:
4051
4052 `-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
4053
4054  **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.
4055
4056 ## Init: Process Control Initialization 
4057
4058 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`.
4059
4060 ### Automatic Reboot Sequence 
4061
4062 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.
4063
4064 ### Single-User Mode 
4065
4066 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`.
4067
4068 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).
4069
4070 If the system `console` is set to `insecure` in `/etc/ttys`, then the system prompts for the `root` password before initiating single-user mode.
4071
4072 ***'Example 7-3. An Insecure Console in `/etc/ttys`***'
4073
4074     
4075
4076     # name  getty                           type    status          comments
4077
4078     #
4079
4080     # If console is marked "insecure", then init will ask for the root password
4081
4082     # when going to single-user mode.
4083
4084     console none                            unknown off insecure
4085
4086  **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`.
4087
4088 ### Multi-User Mode 
4089
4090 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.
4091
4092 #### Resource Configuration (rc) 
4093
4094 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.
4095
4096 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.
4097
4098 ## Shutdown Sequence 
4099
4100 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.
4101
4102 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.
4103
4104  **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.
4105
4106 <!-- this section needs the info about sernos and vfs.mountrootfrom or whatever it's called -->
4107
4108 # Users and Basic Account Management 
4109
4110 ***Contributed by Neil Blakey-Milner. ***
4111
4112 [[!toc  levels=3]]
4113
4114 ## Synopsis 
4115
4116 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.
4117
4118 After reading this chapter, you will know:
4119
4120 * The differences between the various user accounts on a DragonFly system.
4121
4122 * How to add user accounts.
4123
4124 * How to remove user accounts.
4125
4126 * How to change account details, such as the user's full name, or preferred shell.
4127
4128 * 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.
4129
4130 * How to use groups to make account management easier.
4131
4132 Before reading this chapter, you should:
4133
4134 * Understand the basics of UNIX® and DragonFly ([Chapter 3](basics.html)).
4135
4136 ## Introduction 
4137
4138 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.
4139
4140 Every account on a DragonFly system has certain information associated with it to identify the account.
4141
4142 * 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.
4143
4144 * 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.
4145
4146 * 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.
4147
4148 * Login class: Login classes are an extension to the group mechanism that provide additional flexibility when tailoring the system to different users.
4149
4150 * 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.
4151
4152 * 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.
4153
4154 * 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.
4155
4156 * 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.
4157
4158 * 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.
4159
4160 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.
4161
4162 ## The Superuser Account 
4163
4164 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.
4165
4166 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.
4167
4168 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.
4169
4170 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.
4171
4172 ## System Accounts 
4173
4174 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.
4175
4176 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.
4177
4178 `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.
4179
4180 ## User Accounts 
4181
4182 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.
4183
4184 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.
4185
4186 Each user can set up their own environment to accommodate their use of the system, by using alternate shells, editors, key bindings, and language.
4187
4188 ## Modifying Accounts 
4189
4190 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.
4191
4192 [[!table  data="""
4193 Command | Summary 
4194  [adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8) | The recommended command-line application for adding new users. 
4195  [rmuser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rmuser&section=8) | The recommended command-line application for removing users. 
4196  [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1) | A flexible tool to change user database information. 
4197  [passwd(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=passwd&section=1) | The simple command-line tool to change user passwords. 
4198  [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. |
4199
4200 """]]
4201
4202 ### adduser 
4203
4204 [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.
4205
4206 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.
4207
4208  **Example 8-1. Configuring `adduser` and adding a user** 
4209
4210    
4211
4212     # adduser -v
4213
4214     Use option -silent if you don't want to see all warnings and questions.
4215
4216     Check /etc/shells
4217
4218     Check /etc/master.passwd
4219
4220     Check /etc/group
4221
4222     Enter your default shell: csh date no sh tcsh zsh [sh]: zsh
4223
4224     Your default shell is: zsh -&gt; /usr/local/bin/zsh
4225
4226     Enter your default HOME partition: [/home]:
4227
4228     Copy dotfiles from: /usr/share/skel no [/usr/share/skel]:
4229
4230     Send message from file: /etc/adduser.message no
4231
4232     [/etc/adduser.message]: no
4233
4234     Do not send message
4235
4236     Use passwords (y/n) [y]: y
4237
4238     
4239
4240     Write your changes to /etc/adduser.conf? (y/n) [n]: y
4241
4242     
4243
4244     Ok, let's go.
4245
4246     Don't worry about mistakes. I will give you the chance later to correct any input.
4247
4248     Enter username [a-z0-9_-]: jru
4249
4250     Enter full name []: J. Random User
4251
4252     Enter shell csh date no sh tcsh zsh [zsh]:
4253
4254     Enter home directory (full path) [/home/jru]:
4255
4256     Uid [1001]:
4257
4258     Enter login class: default []:
4259
4260     Login group jru [jru]:
4261
4262     Login group is ***jru***. Invite jru into other groups: guest no
4263
4264     [no]: wheel
4265
4266     Enter password []:
4267
4268     Enter password again []:
4269
4270     
4271
4272     Name:         jru
4273
4274     Password: ****
4275
4276     Fullname: J. Random User
4277
4278     Uid:          1001
4279
4280     Gid:          1001 (jru)
4281
4282     Class:
4283
4284     Groups:       jru wheel
4285
4286     HOME:     /home/jru
4287
4288     Shell:        /usr/local/bin/zsh
4289
4290     OK? (y/n) [y]: y
4291
4292     Added user ***jru***
4293
4294     Copy files from /usr/share/skel to /home/jru
4295
4296     Add another user? (y/n) [y]: n
4297
4298     Goodbye!
4299
4300     #
4301
4302 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.)
4303
4304  **Note:** The password you type in is not echoed, nor are asterisks displayed. Make sure you do not mistype the password twice.
4305
4306  **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.
4307
4308 ### rmuser 
4309
4310 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:
4311
4312   1. Removes the user's [crontab(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=crontab&section=1) entry (if any).
4313
4314   1. Removes any [at(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=at&section=1) jobs belonging to the user.
4315
4316   1. Kills all processes owned by the user.
4317
4318   1. Removes the user from the system's local password file.
4319
4320   1. Removes the user's home directory (if it is owned by the user).
4321
4322   1. Removes the incoming mail files belonging to the user from `/var/mail`.
4323
4324   1. Removes all files owned by the user from temporary file storage areas such as `/tmp`.
4325
4326   1. Finally, removes the username from all groups to which it belongs in `/etc/group`.
4327
4328    **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).
4329
4330 [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.
4331
4332 By default, an interactive mode is used, which attempts to make sure you know what you are doing.
4333
4334  **Example 8-2. `rmuser` Interactive Account Removal** 
4335
4336     
4337
4338     # rmuser jru
4339
4340     Matching password entry:
4341
4342     jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
4343
4344     Is this the entry you wish to remove? y
4345
4346     Remove user's home directory (/home/jru)? y
4347
4348     Updating password file, updating databases, done.
4349
4350     Updating group file: trusted (removing group jru -- personal group is empty) done.
4351
4352     Removing user's incoming mail file /var/mail/jru: done.
4353
4354     Removing files belonging to jru from /tmp: done.
4355
4356     Removing files belonging to jru from /var/tmp: done.
4357
4358     Removing files belonging to jru from /var/tmp/vi.recover: done.
4359
4360     #
4361
4362 ### chpass 
4363
4364 [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1) changes user database information such as passwords, shells, and personal information.
4365
4366 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).
4367
4368 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.
4369
4370 ***'Example 8-3. Interactive `chpass` by Superuser***'
4371
4372     
4373
4374     #Changing user database information for jru.
4375
4376     Login: jru
4377
4378     Password: *
4379
4380     Uid [#]: 1001
4381
4382     Gid [# or name]: 1001
4383
4384     Change [month day year]:
4385
4386     Expire [month day year]:
4387
4388     Class:
4389
4390     Home directory: /home/jru
4391
4392     Shell: /usr/local/bin/zsh
4393
4394     Full Name: J. Random User
4395
4396     Office Location:
4397
4398     Office Phone:
4399
4400     Home Phone:
4401
4402     Other information:
4403
4404 The normal user can change only a small subset of this information, and only for themselves.
4405
4406  **Example 8-4. Interactive chpass by Normal User** 
4407
4408     
4409
4410     #Changing user database information for jru.
4411
4412     Shell: /usr/local/bin/zsh
4413
4414     Full Name: J. Random User
4415
4416     Office Location:
4417
4418     Office Phone:
4419
4420     Home Phone:
4421
4422     Other information:
4423
4424  **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].
4425
4426 ### passwd 
4427
4428 [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.
4429
4430  **Note:** To prevent accidental or unauthorized changes, the original password must be entered before a new password can be set.
4431
4432  **Example 8-5. Changing Your Password** 
4433
4434     
4435
4436     % passwd
4437
4438     Changing local password for jru.
4439
4440     Old password:
4441
4442     New password:
4443
4444     Retype new password:
4445
4446     passwd: updating the database...
4447
4448     passwd: done
4449
4450 ***'Example 8-6. Changing Another User's Password as the Superuser***'
4451
4452     
4453
4454     # passwd jru
4455
4456     Changing local password for jru.
4457
4458     New password:
4459
4460     Retype new password:
4461
4462     passwd: updating the database...
4463
4464     passwd: done
4465
4466  **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.
4467
4468 ### pw 
4469
4470 [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.
4471
4472 #### Notes 
4473
4474 [[!table  data="""
4475 <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. |
4476 | | 
4477 """]]
4478
4479 ## Limiting Users 
4480
4481 <!-- XXX: check this section, I got the feeling there might be something outdated in it. I'm not familiar with it -->
4482
4483 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.
4484
4485 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].
4486
4487 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.
4488
4489 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).
4490
4491 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).
4492
4493 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)).
4494
4495 * `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.
4496
4497 * `cputime`: This is the maximum amount of CPU time a user's process may consume. Offending processes will be killed by the kernel.
4498
4499  **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.
4500
4501 * `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.
4502
4503 * `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).
4504
4505 * `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.
4506
4507 * `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.
4508
4509 * `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).
4510
4511 * `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.
4512
4513 * `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.
4514
4515 There are a few other things to remember when setting resource limits. Following are some general tips, suggestions, and miscellaneous comments.
4516
4517 * Processes started at system startup by `/etc/rc` are assigned to the `daemon` login class.
4518
4519 * 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.
4520
4521 * 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.
4522
4523 * 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.
4524
4525 For further information on resource limits and login classes and capabilities in general, please consult the relevant manual pages: [cap_mkdb(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#cap_mkdb&section1), [getrlimit(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=getrlimit&section=2), [login.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=login.conf&section=5).
4526
4527 ## Personalizing Users 
4528
4529 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).
4530
4531 ## Groups 
4532
4533 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.
4534
4535 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.
4536
4537 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:
4538
4539  **Example 8-7. Adding a Group Using pw(8)** 
4540
4541     
4542
4543     # pw groupadd teamtwo
4544
4545     # pw groupshow teamtwo
4546
4547     teamtwo:*:1100:
4548
4549 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.
4550
4551  **Example 8-8. Adding Somebody to a Group Using pw(8)** 
4552
4553     
4554
4555     # pw groupmod teamtwo -M jru
4556
4557     # pw groupshow teamtwo
4558
4559     teamtwo:*:1100:jru
4560
4561 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`.
4562
4563  **Example 8-9. Using id(1) to Determine Group Membership** 
4564
4565     
4566
4567     % id jru
4568
4569     uid#1001(jru) gid1001(jru) groups=1001(jru), 1100(teamtwo)
4570
4571 As you can see, `jru` is a member of the groups `jru` and `teamtwo`.
4572
4573 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.
4574
4575 # Configuring the DragonFly Kernel 
4576
4577 ***Updated and restructured by Jim Mock. Originally contributed by Jake Hamby.***
4578
4579 [[!toc  levels=3]]
4580
4581 ## Synopsis 
4582
4583 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.
4584
4585 After reading this chapter, you will know:
4586
4587 * Why you might need to build a custom kernel.
4588 * How to write a kernel configuration file, or alter an existing configuration file.
4589 * How to use the kernel configuration file to create and build a new kernel.
4590 * How to install the new kernel.
4591 * How to troubleshoot if things go wrong.
4592
4593 ## Why Build a Custom Kernel? 
4594
4595 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.
4596
4597 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.
4598
4599 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.
4600
4601 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:
4602
4603 * 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.
4604
4605 * 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.
4606
4607 * 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.
4608
4609 ## Building and Installing a Custom Kernel 
4610
4611 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.
4612
4613 ### Installing the Source
4614
4615 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.
4616
4617 The preferred way of installing the sources is:
4618
4619     # cd /usr
4620     # make src-create
4621     
4622 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:
4623
4624     # make src-update
4625
4626 ### Your Custom Config File
4627
4628 Next, move to the `config` directory and copy the `GENERIC` configuration file to the name you want to give your kernel. For example:
4629
4630     # cd /usr/src/sys/config
4631     # cp GENERIC MYKERNEL
4632
4633 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.
4634
4635 **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.
4636
4637 For example:
4638
4639     # cd /usr/src/sys/config
4640     # mkdir /root/kernels
4641     # cp GENERIC /root/kernels/MYKERNEL
4642     # ln -s /root/kernels/MYKERNEL
4643
4644 **Note:** You must execute these and all of the following commands under the `root` account or you will get permission denied errors.
4645
4646 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`.
4647
4648 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.
4649
4650 ### Building a Kernel - Full Source Tree
4651
4652 **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.
4653
4654  1. Change to the `/usr/src` directory.
4655
4656      
4657
4658           # cd /usr/src
4659
4660  1. Compile the kernel.
4661
4662           # make buildkernel KERNCONF=MYKERNEL
4663
4664  1. Install the new kernel.     
4665
4666           # make installkernel KERNCONF=MYKERNEL
4667
4668     
4669
4670 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.
4671
4672 ### Building a Kernel - Kernel Source Only
4673
4674 When only the kernel source is installed, you need to change step 2, above, to this:
4675      
4676
4677       # make nativekernel KERNCONF=MYKERNEL
4678
4679 The other steps are the same.
4680
4681 ### Running Your New Kernel
4682
4683 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).
4684
4685 **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.
4686
4687 ## The Configuration File 
4688 <!-- XXX: do we really want to mention all these million config options? -->
4689 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`.
4690
4691 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`.
4692
4693     
4694
4695     #
4696
4697     #
4698
4699     # GENERIC -- Generic kernel configuration file for DragonFly/i386
4700
4701     #
4702
4703     # Check the LINT configuration file in sys/config, for an
4704
4705     # exhaustive list of options.
4706
4707     #
4708
4709     # $DragonFly: src/sys/config/GENERIC,v 1.56 2007/12/26 14:02:36 sephe Exp $
4710
4711 The following are the mandatory keywords required in ***every*** kernel you build:
4712
4713     
4714
4715     machine         i386
4716
4717 This is the machine architecture. It must be `i386` at the moment.  Support for `amd64` will be added in the future.
4718
4719     
4720
4721     cpu          I386_CPU
4722
4723     cpu          I486_CPU
4724
4725     cpu          I586_CPU
4726
4727     cpu          I686_CPU
4728
4729 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.
4730
4731     
4732
4733     ident          GENERIC
4734
4735 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).
4736
4737     
4738
4739     maxusers          0
4740
4741 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.
4742
4743 (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.
4744
4745  **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`].
4746
4747     
4748
4749     # Floating point support - do not disable.
4750
4751     device          npx0     at nexus? port IO_NPX irq 13
4752
4753 `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.
4754
4755     
4756
4757     # Pseudo devices - the number indicates how many units to allocate.
4758
4759     pseudo-device   loop          # Network loopback
4760
4761 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***.
4762
4763 Everything that follows is more or less optional. See the notes underneath or next to each option for more information.
4764
4765     
4766
4767     #makeoptions     DEBUG=-g          #Build kernel with gdb(1) debug symbols
4768
4769 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).
4770
4771     
4772
4773     options          MATH_EMULATE      #Support for x87 emulation
4774
4775 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.
4776
4777  **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.
4778
4779     
4780
4781     options          INET          #InterNETworking
4782
4783 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.
4784
4785     
4786
4787     options          INET6          #IPv6 communications protocols
4788
4789 This enables the IPv6 communication protocols.
4790
4791     
4792
4793     options          FFS          #Berkeley Fast Filesystem
4794
4795     options          FFS_ROOT     #FFS usable as root device [keep this!]
4796
4797 This is the basic hard drive Filesystem. Leave it in if you boot from the hard disk.
4798
4799     
4800
4801     options          UFS_DIRHASH  #Improve performance on big directories
4802
4803 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.
4804
4805     
4806
4807     options          SOFTUPDATES  #Enable FFS Soft Updates support
4808
4809 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.
4810
4811     
4812
4813     options          MFS          #Memory Filesystem
4814
4815     options          MD_ROOT      #MD is a potential root device
4816
4817 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`:
4818
4819     
4820
4821     /dev/ad1s2b     /tmp mfs rw 0 0
4822
4823 Now you simply need to either reboot, or run the command `mount /tmp`.
4824
4825     
4826
4827     options          NFS          #Network Filesystem
4828
4829     options          NFS_ROOT     #NFS usable as root device, NFS required
4830
4831 The network Filesystem. Unless you plan to mount partitions from a UNIX® file server over TCP/IP, you can comment these out.
4832
4833     
4834
4835     options          MSDOSFS      #MSDOS Filesystem
4836
4837 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).
4838
4839     
4840
4841     options          CD9660       #ISO 9660 Filesystem
4842
4843     options          CD9660_ROOT  #CD-ROM usable as root, CD9660 required
4844
4845 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.
4846
4847     
4848
4849     options          PROCFS       #Process filesystem
4850
4851 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. ***
4852
4853     
4854
4855 Compatibility with 4.3BSD. Leave this in; some programs will act strangely if you comment this out.
4856
4857     
4858
4859     options          SCSI_DELAY=5000    #Delay (in ms) before probing SCSI
4860
4861 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.
4862
4863     
4864
4865     options          UCONSOLE            #Allow users to grab the console
4866
4867 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.
4868
4869     
4870
4871     options          USERCONFIG          #boot -c editor
4872
4873 This option allows you to boot the configuration editor from the boot menu.
4874
4875     
4876
4877     options          VISUAL_USERCONFIG   #visual boot -c editor
4878
4879 This option allows you to boot the visual configuration editor from the boot menu.
4880
4881     
4882
4883     options          KTRACE              #ktrace(1) support
4884
4885 This enables kernel process tracing, which is useful in debugging.
4886
4887     
4888
4889     options          SYSVSHM             #SYSV-style shared memory
4890
4891 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.
4892
4893     
4894
4895     options          SYSVSEM             #SYSV-style semaphores
4896
4897 Support for System V semaphores. Less commonly used but only adds a few hundred bytes to the kernel.
4898
4899     
4900
4901     options          SYSVMSG             #SYSV-style message queues
4902
4903 Support for System V messages. Again, only adds a few hundred bytes to the kernel.
4904
4905  **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.
4906
4907     
4908
4909     options         P1003_1B                #Posix P1003_1B real-time extensions
4910
4911     options         _KPOSIX_PRIORITY_SCHEDULING
4912
4913 Real-time extensions added in the 1993 POSIX®. Certain applications in the ports collection use these (such as  **StarOffice™** ).
4914
4915     
4916
4917     options         ICMP_BANDLIM            #Rate limit bad replies
4918
4919 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.
4920
4921     
4922
4923     # To make an SMP kernel, the next two are needed
4924
4925     #options        SMP                     # Symmetric MultiProcessor Kernel
4926
4927     #options        APIC_IO                 # Symmetric (APIC) I/O
4928
4929 The above are both required for SMP support.
4930
4931     
4932
4933     device          isa
4934
4935 All PCs supported by DragonFly have one of these. Do not remove, even if you have no ISA slots. If you have an IBM PS/2 (Micro Channel Architecture), DragonFly provides some limited support at this time. For more information about the MCA support, see `/usr/src/sys/config/LINT`.
4936
4937     
4938
4939     device          eisa
4940
4941 Include this if you have an EISA motherboard. This enables auto-detection and configuration support for all devices on the EISA bus.
4942
4943     
4944
4945     device          pci
4946
4947 Include this if you have a PCI motherboard. This enables auto-detection of PCI cards and gatewaying from the PCI to ISA bus.
4948
4949     
4950
4951     device          agp
4952
4953 Include this if you have an AGP card in the system. This will enable support for AGP, and AGP GART for boards which have these features.
4954
4955     
4956
4957     # Floppy drives
4958
4959     device          fdc0        at isa? port IO_FD1 irq 6 drq 2
4960
4961     device          fd0         at fdc0 drive 0
4962
4963     device          fd1         at fdc0 drive 1
4964
4965 This is the floppy drive controller. `fd0` is the `A:` floppy drive, and `fd1` is the `B:` drive.
4966
4967     
4968
4969     device          ata
4970
4971 This driver supports all ATA and ATAPI devices. You only need one `device ata` line for the kernel to detect all PCI ATA/ATAPI devices on modern machines.
4972
4973     
4974
4975     device          atadisk                 # ATA disk drives
4976
4977 This is needed along with `device ata` for ATA disk drives.
4978
4979     
4980
4981     device          atapicd                 # ATAPI CDROM drives
4982
4983 This is needed along with `device ata` for ATAPI CDROM drives.
4984
4985     
4986
4987     device          atapifd                 # ATAPI floppy drives
4988
4989 This is needed along with `device ata` for ATAPI floppy drives.
4990
4991     
4992
4993     device          atapist                 # ATAPI tape drives
4994
4995 This is needed along with `device ata` for ATAPI tape drives.
4996
4997     
4998
4999     options         ATA_STATIC_ID           #Static device numbering
5000
5001 This makes the controller number static (like the old driver) or else the device numbers are dynamically allocated.
5002
5003     
5004
5005     # ATA and ATAPI devices
5006
5007     device          ata0        at isa? port IO_WD1 irq 14
5008
5009     device          ata1        at isa? port IO_WD2 irq 15
5010
5011 Use the above for older, non-PCI systems.
5012
5013     
5014
5015     # SCSI Controllers
5016
5017     device          ahb        # EISA AHA1742 family
5018
5019     device          ahc        # AHA2940 and onboard AIC7xxx devices
5020
5021     device          amd        # AMD 53C974 (Teckram DC-390(T))
5022
5023     device          dpt        # DPT Smartcache - See LINT for options!
5024
5025     device          isp        # Qlogic family
5026
5027     device          ncr        # NCR/Symbios Logic
5028
5029     device          sym        # NCR/Symbios Logic (newer chipsets)
5030
5031     device          adv0       at isa?
5032
5033     device          adw
5034
5035     device          bt0        at isa?
5036
5037     device          aha0       at isa?
5038
5039     device          aic0       at isa?
5040
5041 SCSI controllers. Comment out any you do not have in your system. If you have an IDE only system, you can remove these altogether.
5042
5043     
5044
5045     # SCSI peripherals
5046
5047     device          scbus      # SCSI bus (required)
5048
5049     device          da         # Direct Access (disks)
5050
5051     device          sa         # Sequential Access (tape etc)
5052
5053     device          cd         # CD
5054
5055     device          pass       # Passthrough device (direct SCSI
5056
5057     access)
5058
5059 SCSI peripherals. Again, comment out any you do not have, or if you have only IDE hardware, you can remove them completely.
5060
5061  **Note:** The USB [umass(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#umass&section4) driver (and a few other drivers) use the SCSI subsystem even though they are not real SCSI devices. Therefore make sure not to remove SCSI support, if any such drivers are included in the kernel configuration.
5062
5063     
5064
5065     # RAID controllers
5066
5067     device          ida        # Compaq Smart RAID
5068
5069     device          amr        # AMI MegaRAID
5070
5071     device          mlx        # Mylex DAC960 family
5072
5073 Supported RAID controllers. If you do not have any of these, you can comment them out or remove them.
5074
5075     
5076
5077     # atkbdc0 controls both the keyboard and the PS/2 mouse
5078
5079     device          atkbdc0    at isa? port IO_KBD
5080
5081 The keyboard controller (`atkbdc`) provides I/O services for the AT keyboard and PS/2 style pointing devices. This controller is required by the keyboard driver (`atkbd`) and the PS/2 pointing device driver (`psm`).
5082
5083     
5084
5085     device          atkbd0     at atkbdc? irq 1
5086
5087 The `atkbd` driver, together with `atkbdc` controller, provides access to the AT 84 keyboard or the AT enhanced keyboard which is connected to the AT keyboard controller.
5088
5089     
5090
5091     device          psm0       at atkbdc? irq 12
5092
5093 Use this device if your mouse plugs into the PS/2 mouse port.
5094
5095     
5096
5097     device          vga0        at isa?
5098
5099 The video card driver.
5100
5101     
5102
5103     # splash screen/screen saver
5104
5105     pseudo-device          splash
5106
5107 Splash screen at start up! Screen savers require this too.
5108
5109     
5110
5111     # syscons is the default console driver, resembling an SCO console
5112
5113     device          sc0          at isa?
5114
5115 `sc0` is the default console driver, which resembles a SCO console. Since most full-screen programs access the console through a terminal database library like `termcap`, it should not matter whether you use this or `vt0`, the `VT220` compatible console driver. When you log in, set your `TERM` variable to `scoansi` if full-screen programs have trouble running under this console.
5116
5117     
5118
5119     # Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver
5120
5121     #device          vt0     at isa?
5122
5123     #options         XSERVER          # support for X server on a vt console
5124
5125     #options         FAT_CURSOR       # start with block cursor
5126
5127     # If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines
5128
5129     #options         PCVT_SCANSET=2   # IBM keyboards are non-std
5130
5131 This is a VT220-compatible console driver, backward compatible to VT100/102. It works well on some laptops which have hardware incompatibilities with `sc0`. Also set your `TERM` variable to `vt100` or `vt220` when you log in. This driver might also prove useful when connecting to a large number of different machines over the network, where `termcap` or `terminfo` entries for the `sc0` device are often not available -- `vt100` should be available on virtually any platform.
5132
5133     
5134
5135     # Power management support (see LINT for more options)
5136
5137     device          apm0     at nexus? disable flags 0x20  # Advanced Power Management
5138
5139 Advanced Power Management support. Useful for laptops.
5140
5141     
5142
5143     # PCCARD (PCMCIA) support
5144
5145     device          card
5146
5147     device          pcic0    at isa? irq 10 port 0x3e0 iomem 0xd0000
5148
5149     device          pcic1    at isa? irq 11 port 0x3e2 iomem 0xd4000 disable
5150
5151 PCMCIA support. You want this if you are using a laptop.
5152
5153     
5154
5155     # Serial (COM) ports
5156
5157     device          sio0     at isa? port IO_COM1 flags 0x10 irq 4
5158
5159     device          sio1     at isa? port IO_COM2 irq 3
5160
5161     device          sio2     at isa? disable port IO_COM3 irq 5
5162
5163     device          sio3     at isa? disable port IO_COM4 irq 9
5164
5165 These are the four serial ports referred to as COM1 through COM4 in the MS-DOS/Windows® world.
5166
5167  **Note:** If you have an internal modem on COM4 and a serial port at COM2, you will have to change the IRQ of the modem to 2 (for obscure technical reasons, IRQ2 # IRQ 9) in order to access it from DragonFly. If you have a multiport serial card, check the manual page for [sio(4)](http://leaf.dragonflybsd.org/cgi/web-man?commandsio&section=4) for more information on the proper values for these lines. Some video cards (notably those based on S3 chips) use IO addresses in the form of `0x*2e8`, and since many cheap serial cards do not fully decode the 16-bit IO address space, they clash with these cards making the COM4 port practically unavailable.
5168
5169 Each serial port is required to have a unique IRQ (unless you are using one of the multiport cards where shared interrupts are supported), so the default IRQs for COM3 and COM4 cannot be used.
5170
5171     
5172
5173     # Parallel port
5174
5175     device          ppc0    at isa? irq 7
5176
5177 This is the ISA-bus parallel port interface.
5178
5179     
5180
5181     device          ppbus      # Parallel port bus (required)
5182
5183 Provides support for the parallel port bus.
5184
5185     
5186
5187     device          lpt        # Printer
5188
5189 Support for parallel port printers.
5190
5191  **Note:** All three of the above are required to enable parallel printer support.
5192
5193     
5194
5195     device          plip       # TCP/IP over parallel
5196
5197 This is the driver for the parallel network interface.
5198
5199     
5200
5201     device          ppi        # Parallel port interface device
5202
5203 The general-purpose I/O (***geek port) + IEEE1284 I/O.
5204
5205     
5206
5207     #device         vpo        # Requires scbus and da
5208
5209 This is for an Iomega Zip drive. It requires `scbus` and `da` support. Best performance is achieved with ports in EPP 1.9 mode.
5210
5211     
5212
5213     # PCI Ethernet NICs.
5214
5215     device          de         # DEC/Intel DC21x4x (Tulip)
5216
5217     device          fxp        # Intel EtherExpress PRO/100B (82557, 82558)
5218
5219     device          tx         # SMC 9432TX (83c170 EPIC)
5220
5221     device          vx         # 3Com 3c590, 3c595 (Vortex)
5222
5223     device          wx         # Intel Gigabit Ethernet Card (Wiseman)
5224
5225 Various PCI network card drivers. Comment out or remove any of these not present in your system.
5226
5227     
5228
5229     # PCI Ethernet NICs that use the common MII bus controller code.
5230
5231     device          miibus     # MII bus support
5232
5233 MII bus support is required for some PCI 10/100 Ethernet NICs, namely those which use MII-compliant transceivers or implement transceiver control interfaces that operate like an MII. Adding `device miibus` to the kernel config pulls in support for the generic miibus API and all of the PHY drivers, including a generic one for PHYs that are not specifically handled by an individual driver.
5234
5235     
5236
5237     device          dc         # DEC/Intel 21143 and various workalikes
5238
5239     device          rl         # RealTek 8129/8139
5240
5241     device          sf         # Adaptec AIC-6915 (Starfire)
5242
5243     device          sis        # Silicon Integrated Systems SiS 900/SiS 7016
5244
5245     device          ste        # Sundance ST201 (D-Link DFE-550TX)
5246
5247     device          tl         # Texas Instruments ThunderLAN
5248
5249     device          vr         # VIA Rhine, Rhine II
5250
5251     device          wb         # Winbond W89C840F
5252
5253     device          xl         # 3Com 3c90x (Boomerang, Cyclone)
5254
5255 Drivers that use the MII bus controller code.
5256
5257     
5258
5259     # ISA Ethernet NICs.
5260
5261     device          ed0    at isa? port 0x280 irq 10 iomem 0xd8000
5262
5263     device          ex
5264
5265     device          ep
5266
5267     # WaveLAN/IEEE 802.11 wireless NICs. Note: the WaveLAN/IEEE really
5268
5269     # exists only as a PCMCIA device, so there is no ISA attachment needed
5270
5271     # and resources will always be dynamically assigned by the pccard code.
5272
5273     device          wi
5274
5275     # Aironet 4500/4800 802.11 wireless NICs. Note: the declaration below will
5276
5277     # work for PCMCIA and PCI cards, as well as ISA cards set to ISA PnP
5278
5279     # mode (the factory default). If you set the switches on your ISA
5280
5281     # card for a manually chosen I/O address and IRQ, you must specify
5282
5283     # those parameters here.
5284
5285     device          an
5286
5287     # The probe order of these is presently determined by i386/isa/isa_compat.c.
5288
5289     device          ie0    at isa? port 0x300 irq 10 iomem 0xd0000
5290
5291     device          fe0    at isa? port 0x300
5292
5293     device          le0    at isa? port 0x300 irq 5 iomem 0xd0000
5294
5295     device          lnc0   at isa? port 0x280 irq 10 drq 0
5296
5297     device          cs0    at isa? port 0x300
5298
5299     device          sn0    at isa? port 0x300 irq 10
5300
5301     # requires PCCARD (PCMCIA) support to be activated
5302
5303     #device         xe0    at isa?
5304
5305 ISA Ethernet drivers. See `/usr/src/sys/config/LINT` for which cards are supported by which driver.
5306
5307     
5308
5309     pseudo-device   ether         # Ethernet support
5310
5311 `ether` is only needed if you have an Ethernet card. It includes generic Ethernet protocol code.
5312
5313     
5314
5315     pseudo-device   sl      1     # Kernel SLIP
5316
5317 `sl` is for SLIP support. This has been almost entirely supplanted by PPP, which is easier to set up, better suited for modem-to-modem connection, and more powerful. The ***number*** after `sl` specifies how many simultaneous SLIP sessions to support.
5318
5319     
5320
5321     pseudo-device   ppp     1     # Kernel PPP
5322
5323 This is for kernel PPP support for dial-up connections. There is also a version of PPP implemented as a userland application that uses `tun` and offers more flexibility and features such as demand dialing. The ***number*** after `ppp` specifies how many simultaneous PPP connections to support. .
5324
5325     
5326
5327     device   tun           # Packet tunnel.
5328
5329 This is used by the userland PPP software. A ***number*** after `tun` specifies the number of simultaneous PPP sessions to support. See the [userppp.html PPP] section of this book for more information.
5330
5331     
5332
5333     pseudo-device   pty           # Pseudo-ttys (telnet etc)
5334
5335 This is a ***pseudo-terminal*** or simulated login port. It is used by incoming `telnet` and `rlogin` sessions, ***xterm***, and some other applications such as ***Emacs***. The ***number*** after `pty` indicates the number of `pty`s to create. If you need more than the default of 16 simultaneous ***xterm*** windows and/or remote logins, be sure to increase this number accordingly, up to a maximum of 256. ***
5336
5337     
5338
5339 Memory disk pseudo-devices.
5340
5341     
5342
5343     pseudo-device   gif     # IPv6 and IPv4 tunneling
5344
5345 This implements IPv6 over IPv4 tunneling, IPv4 over IPv6 tunneling, IPv4 over IPv4 tunneling, and IPv6 over IPv6 tunneling.
5346
5347     
5348
5349     pseudo-device   faith   # IPv6-to-IPv4 relaying (translation)
5350
5351 This pseudo-device captures packets that are sent to it and diverts them to the IPv4/IPv6 translation daemon.
5352
5353     
5354
5355     # The `bpf' device enables the Berkeley Packet Filter.
5356
5357     # Be aware of the administrative consequences of enabling this!
5358
5359     pseudo-device   bpf           # Berkeley packet filter
5360
5361 This is the Berkeley Packet Filter. This pseudo-device allows network interfaces to be placed in promiscuous mode, capturing every packet on a broadcast network (e.g., an Ethernet). These packets can be captured to disk and or examined with the [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#tcpdump&section1) program.
5362
5363  **Note:** The [bpf(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#bpf&section4) device is also used by [dhclient(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dhclient&section=8) to obtain the IP address of the default router (gateway) and so on. If you use DHCP, leave this uncommented.
5364
5365     
5366
5367     # USB support
5368
5369     #device         uhci          # UHCI PCI-&gt;USB interface
5370
5371     #device         ohci          # OHCI PCI-&gt;USB interface
5372
5373     #device         usb           # USB Bus (required)
5374
5375     #device         ugen          # Generic
5376
5377     #device         uhid          # ***Human Interface Devices***
5378
5379     #device         ukbd          # Keyboard
5380
5381     #device         ulpt          # Printer
5382
5383     #device         umass         # Disks/Mass storage - Requires scbus and da
5384
5385     #device         ums           # Mouse
5386
5387     # USB Ethernet, requires mii
5388
5389     #device         aue           # ADMtek USB ethernet
5390
5391     #device         cue           # CATC USB ethernet
5392
5393     #device         kue           # Kawasaki LSI USB ethernet
5394
5395 Support for various USB devices.
5396
5397 For more information and additional devices supported by DragonFly, see `/usr/src/sys/i386/conf/LINT`.
5398
5399 #### Notes 
5400
5401 [[!table  data="""
5402 <tablewidth="100%"> [(1)](kernelconfig-config.html#AEN7414) | The auto-tuning algorithm sets `maxuser` equal to the amount of memory in the system, with a minimum of 32, and a maximum of 384. |
5403 | | 
5404 """]]
5405
5406 ## Device Nodes 
5407
5408 Almost every device in the kernel has a corresponding node entry in the `/dev` directory. These nodes look like regular files, but are actually special entries into the kernel which programs use to access the device. 
5409
5410 These nodes are created automatically once devfs is mounted, which happens manually for the root `/dev` during boot, just after the root mount.
5411
5412 ## If Something Goes Wrong 
5413
5414  **Note:** If you are having trouble building a kernel, make sure to keep a `GENERIC`, or some other kernel that is known to work on hand as a different name that will not get erased on the next build. You cannot rely on `kernel.old` because when installing a new kernel, `kernel.old` is overwritten with the last installed kernel which may be non-functional. Also, as soon as possible, move the working kernel to the proper `kernel` location or commands such as [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ps&section1) will not work properly. The proper command to ***unlock*** the kernel file that `make` installs (in order to move another kernel back permanently) is:
5415
5416      % chflags noschg /boot/kernel
5417      
5418
5419 If you find you cannot do this, you are probably running at a [securelevel(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#securelevel&section8) greater than zero. Edit `kern_securelevel` in `/etc/rc.conf` and set it to `-1`, then reboot. You can change it back to its previous setting when you are happy with your new kernel.
5420
5421 And, if you want to ***lock*** your new kernel into place, or any file for that matter, so that it cannot be moved or tampered with:
5422
5423     
5424
5425     % chflags schg /boot/kernel
5426     
5427
5428 There are five categories of trouble that can occur when building a custom kernel. They are:
5429
5430 * `config` fails: If the [config(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#config&section8) command fails when you give it your kernel description, you have probably made a simple error somewhere. Fortunately, [config(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=config&section=8) will print the line number that it had trouble with, so you can quickly skip to it with ***vi***. For example, if you see `config: line 17: syntax error`. You can skip to the problem in ***vi*** by typing `17G` in command mode. Make sure the keyword is typed correctly, by comparing it to the `GENERIC` kernel or another reference.
5431
5432 * `make` fails: If the `make` command fails, it usually signals an error in your kernel description, but not severe enough for [config(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#config&section8) to catch it. Again, look over your configuration, and if you still cannot resolve the problem, send mail to the [DragonFly Bugs mailing list](http://leaf.dragonflybsd.org/mailarchive/) with your kernel configuration, and it should be diagnosed very quickly.
5433
5434 * Installing the new kernel fails: If the kernel compiled fine, but failed to install (the `make install` or `make installkernel` command failed), the first thing to check is if your system is running at securelevel 1 or higher (see [init(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#init&section8)). The kernel installation tries to remove the immutable flag from your kernel and set the immutable flag on the new one. Since securelevel 1 or higher prevents unsetting the immutable flag for any files on the system, the kernel installation needs to be performed at securelevel 0 or lower.
5435
5436 * The kernel does not boot: If your new kernel does not boot, or fails to recognize your devices, do not panic! Fortunately, DragonFly has an excellent mechanism for recovering from incompatible kernels. Simply choose the kernel you want to boot from at the DragonFly boot loader. You can access this when the system counts down from 10. Hit any key except for the  **Enter**  key, type `unload` and then type `boot ***kernel.old***`, or the filename of any other kernel that will boot properly. When reconfiguring a kernel, it is always a good idea to keep a kernel that is known to work on hand. After booting with a good kernel you can check over your configuration file and try to build it again. One helpful resource is the `/var/log/messages` file which records, among other things, all of the kernel messages from every successful boot. Also, the [dmesg(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#dmesg&section8) command will print the kernel messages from the current boot.
5437
5438 * The kernel works, but [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ps&section1) does not work any more: If you have installed a different version of the kernel from the one that the system utilities have been built with, many system-status commands like [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ps&section=1) and [vmstat(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=vmstat&section=8) will not work any more. You must recompile the `libkvm` library as well as these utilities. This is one reason it is not normally a good idea to use a different version of the kernel from the rest of the operating system.
5439
5440 # Security 
5441 ***Much of this chapter has been taken from the security(7) manual page by Matthew Dillon. ***
5442
5443 [[!toc levels=3]]
5444
5445 ## Synopsis 
5446
5447 This chapter will provide a basic introduction to system security concepts, some general good rules of thumb, and some advanced topics under DragonFly. A lot of the topics covered here can be applied to system and Internet security in general as well. The Internet is no longer a ***friendly*** place in which everyone wants to be your kind neighbor. Securing your system is imperative to protect your data, intellectual property, time, and much more from the hands of hackers and the like.
5448
5449 DragonFly provides an array of utilities and mechanisms to ensure the integrity and security of your system and network.
5450
5451 After reading this chapter, you will know:
5452
5453 * Basic system security concepts, in respect to DragonFly.
5454
5455 * About the various crypt mechanisms available in DragonFly, such as DES and MD5.
5456
5457 * How to set up one-time password authentication.
5458
5459 * How to create firewalls using IPFW.
5460
5461 * How to configure IPsec and create a VPN between DragonFly/Windows® machines.
5462
5463 * How to configure and use  **OpenSSH** , DragonFly's SSH implementation.
5464
5465 Before reading this chapter, you should:
5466
5467 * Understand basic DragonFly and Internet concepts.
5468
5469 CategoryHandbook
5470
5471 Category
5472
5473 ## Introduction 
5474
5475 Security is a function that begins and ends with the system administrator. While all BSD UNIX® multi-user systems have some inherent security, the job of building and maintaining additional security mechanisms to keep those users ***honest*** is probably one of the single largest undertakings of the sysadmin. Machines are only as secure as you make them, and security concerns are ever competing with the human necessity for convenience. UNIX systems, in general, are capable of running a huge number of simultaneous processes and many of these processes operate as servers -- meaning that external entities can connect and talk to them. As yesterday's mini-computers and mainframes become today's desktops, and as computers become networked and internetworked, security becomes an even bigger issue.
5476
5477 Security is best implemented through a layered ***onion*** approach. In a nutshell, what you want to do is to create as many layers of security as are convenient and then carefully monitor the system for intrusions. You do not want to overbuild your security or you will interfere with the detection side, and detection is one of the single most important aspects of any security mechanism. For example, it makes little sense to set the `schg` flags (see [chflags(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#chflags&section1)) on every system binary because while this may temporarily protect the binaries, it prevents an attacker who has broken in from making an easily detectable change that may result in your security mechanisms not detecting the attacker at all.
5478
5479 System security also pertains to dealing with various forms of attack, including attacks that attempt to crash, or otherwise make a system unusable, but do not attempt to compromise the `root` account (***break root***). Security concerns can be split up into several categories:
5480
5481   1. Denial of service attacks.
5482
5483   1. User account compromises.
5484
5485   1. Root compromise through accessible servers.
5486
5487   1. Root compromise via user accounts.
5488
5489   1. Backdoor creation.
5490
5491 A denial of service attack is an action that deprives the machine of needed resources. Typically, DoS attacks are brute-force mechanisms that attempt to crash or otherwise make a machine unusable by overwhelming its servers or network stack. Some DoS attacks try to take advantage of bugs in the networking stack to crash a machine with a single packet. The latter can only be fixed by applying a bug fix to the kernel. Attacks on servers can often be fixed by properly specifying options to limit the load the servers incur on the system under adverse conditions. Brute-force network attacks are harder to deal with. A spoofed-packet attack, for example, is nearly impossible to stop, short of cutting your system off from the Internet. It may not be able to take your machine down, but it can saturate your Internet connection.
5492
5493 A user account compromise is even more common than a DoS attack. Many sysadmins still run standard  **telnetd** ,  **rlogind** ,  **rshd** , and  **ftpd**  servers on their machines. These servers, by default, do not operate over encrypted connections. The result is that if you have any moderate-sized user base, one or more of your users logging into your system from a remote location (which is the most common and convenient way to login to a system) will have his or her password sniffed. The attentive system admin will analyze his remote access logs looking for suspicious source addresses even for successful logins.
5494
5495 One must always assume that once an attacker has access to a user account, the attacker can break `root`. However, the reality is that in a well secured and maintained system, access to a user account does not necessarily give the attacker access to `root`. The distinction is important because without access to `root` the attacker cannot generally hide his tracks and may, at best, be able to do nothing more than mess with the user's files, or crash the machine. User account compromises are very common because users tend not to take the precautions that sysadmins take.
5496
5497 System administrators must keep in mind that there are potentially many ways to break `root` on a machine. The attacker may know the `root` password, the attacker may find a bug in a root-run server and be able to break `root` over a network connection to that server, or the attacker may know of a bug in a suid-root program that allows the attacker to break `root` once he has broken into a user's account. If an attacker has found a way to break `root` on a machine, the attacker may not have a need to install a backdoor. Many of the `root` holes found and closed to date involve a considerable amount of work by the attacker to cleanup after himself, so most attackers install backdoors. A backdoor provides the attacker with a way to easily regain `root` access to the system, but it also gives the smart system administrator a convenient way to detect the intrusion. Making it impossible for an attacker to install a backdoor may actually be detrimental to your security, because it will not close off the hole the attacker found to break in the first place.
5498
5499 Security remedies should always be implemented with a multi-layered ***onion peel*** approach and can be categorized as follows:
5500
5501   1. Securing `root` and staff accounts.
5502
5503   1. Securing `root` -- root-run servers and suid/sgid binaries.
5504
5505   1. Securing user accounts.
5506
5507   1. Securing the password file.
5508
5509   1. Securing the kernel core, raw devices, and filesystems.
5510
5511   1. Quick detection of inappropriate changes made to the system.
5512
5513   1. Paranoia.
5514
5515 The next section of this chapter will cover the above bullet items in greater depth.
5516
5517 CategoryHandbook
5518
5519 CategoryHandbook-security
5520
5521 ## Securing DragonFly 
5522
5523  **Command vs. Protocol:**  Throughout this document, we will use  **bold**  text to refer to a command or application. This is used for instances such as ssh, since it is a protocol as well as command.
5524
5525 The sections that follow will cover the methods of securing your DragonFly system that were mentioned in the [last section](security-intro.html) of this chapter.
5526
5527 ### Securing the root Account and Staff Accounts 
5528
5529 First off, do not bother securing staff accounts if you have not secured the `root` account. Most systems have a password assigned to the `root` account. The first thing you do is assume that the password is ***always*** compromised. This does not mean that you should remove the password. The password is almost always necessary for console access to the machine. What it does mean is that you should not make it possible to use the password outside of the console or possibly even with the [su(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#su&section1) command. For example, make sure that your pty's are specified as being insecure in the `/etc/ttys` file so that direct `root` logins via `telnet` or `rlogin` are disallowed. If using other login services such as  **sshd** , make sure that direct `root` logins are disabled there as well. You can do this by editing your `/etc/ssh/sshd_config` file, and making sure that `PermitRootLogin` is set to `NO`. Consider every access method -- services such as FTP often fall through the cracks. Direct `root` logins should only be allowed via the system console.
5530
5531 Of course, as a sysadmin you have to be able to get to `root`, so we open up a few holes. But we make sure these holes require additional password verification to operate. One way to make `root` accessible is to add appropriate staff accounts to the `wheel` group (in `/etc/group`). The staff members placed in the `wheel` group are allowed to `su` to `root`. You should never give staff members native `wheel` access by putting them in the `wheel` group in their password entry. Staff accounts should be placed in a `staff` group, and then added to the `wheel` group via the `/etc/group` file. Only those staff members who actually need to have `root` access should be placed in the `wheel` group.  While having the `wheel` mechanism is better than having nothing at all, it is not necessarily the safest option.
5532
5533 An indirect way to secure staff accounts, and ultimately `root` access is to use an alternative login access method and do what is known as ***starring*** out the encrypted password for the staff accounts. Using the [vipw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#vipw&section8) command, one can replace each instance of an encrypted password with a single `*` character. This command will update the `/etc/master.passwd` file and user/password database to disable password-authenticated logins.
5534
5535 A staff account entry such as:
5536
5537     
5538
5539     foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
5540
5541 Should be changed to this:
5542
5543     
5544
5545     foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
5546
5547 This change will prevent normal logins from occurring, since the encrypted password will never match `*`. With this done, staff members must use another mechanism to authenticate themselves such as  [ssh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ssh&section=1&manpath=OpenBSD+3.3) using a public/private key pair. When using a public/private key pair with ssh, one must generally secure the machine used to login ***from*** (typically one's workstation). An additional layer of protection can be added to the key pair by password protecting the key pair when creating it with [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ssh-keygen&section=1). Being able to ***star*** out the passwords for staff accounts also guarantees that staff members can only login through secure access methods that you have set up. This forces all staff members to use secure, encrypted connections for all of their sessions, which closes an important hole used by many intruders: sniffing the network from an unrelated, less secure machine.
5548
5549 The more indirect security mechanisms also assume that you are logging in from a more restrictive server to a less restrictive server. For example, if your main box is running all sorts of servers, your workstation should not be running any. In order for your workstation to be reasonably secure you should run as few servers as possible, up to and including no servers at all, and you should run a password-protected screen blanker. Of course, given physical access to a workstation an attacker can break any sort of security you put on it. This is definitely a problem that you should consider, but you should also consider the fact that the vast majority of break-ins occur remotely, over a network, from people who do not have physical access to your workstation or servers.
5550
5551 ### Securing Root-run Servers and SUID/SGID Binaries 
5552
5553 The prudent sysadmin only runs the servers he needs to, no more, no less. Be aware that third party servers are often the most bug-prone. For example, running an old version of  **imapd**  or  **popper**  is like giving a universal `root` ticket out to the entire world. Never run a server that you have not checked out carefully. Many servers do not need to be run as `root`. For example, the  **ntalk** ,  **comsat** , and  **finger**  daemons can be run in special user ***sandboxes***. A sandbox is not perfect, unless you go through a large amount of trouble, but the onion approach to security still stands: If someone is able to break in through a server running in a sandbox, they still have to break out of the sandbox. The more layers the attacker must break through, the lower the likelihood of his success. Root holes have historically been found in virtually every server ever run as `root`, including basic system servers. If you are running a machine through which people only login via  **sshd**  and never login via  **telnetd**  or  **rshd**  or  **rlogind** , then turn off those services!
5554
5555 DragonFly now defaults to running  **ntalkd** ,  **comsat** , and  **finger**  in a sandbox. Another program which may be a candidate for running in a sandbox is [named(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#named&section8). `/etc/defaults/rc.conf` includes the arguments necessary to run  **named**  in a sandbox in a commented-out form. Depending on whether you are installing a new system or upgrading an existing system, the special user accounts used by these sandboxes may not be installed. The prudent sysadmin would research and implement sandboxes for servers whenever possible.
5556
5557 There are a number of other servers that typically do not run in sandboxes:  **sendmail** ,  **popper** ,  **imapd** ,  **ftpd** , and others. There are alternatives to some of these, but installing them may require more work than you are willing to perform (the convenience factor strikes again). You may have to run these servers as `root` and rely on other mechanisms to detect break-ins that might occur through them.
5558
5559 The other big potential `root` holes in a system are the suid-root and sgid binaries installed on the system. Most of these binaries, such as  **rlogin** , reside in `/bin`, `/sbin`, `/usr/bin`, or `/usr/sbin`. While nothing is 100% safe, the system-default suid and sgid binaries can be considered reasonably safe. Still, `root` holes are occasionally found in these binaries. A `root` hole was found in `Xlib` in 1998 that made  **xterm**  (which is typically suid) vulnerable. It is better to be safe than sorry and the prudent sysadmin will restrict suid binaries, that only staff should run, to a special group that only staff can access, and get rid of (`chmod 000`) any suid binaries that nobody uses. A server with no display generally does not need an  **xterm**  binary. Sgid binaries can be almost as dangerous. If an intruder can break an sgid-kmem binary, the intruder might be able to read `/dev/kmem` and thus read the encrypted password file, potentially compromising any passworded account. Alternatively an intruder who breaks group `kmem` can monitor keystrokes sent through pty's, including pty's used by users who login through secure methods. An intruder that breaks the `tty` group can write to almost any user's tty. If a user is running a terminal program or emulator with a keyboard-simulation feature, the intruder can potentially generate a data stream that causes the user's terminal to echo a command, which is then run as that user.
5560
5561 ### Securing User Accounts 
5562
5563 User accounts are usually the most difficult to secure. While you can impose Draconian access restrictions on your staff and ***star*** out their passwords, you may not be able to do so with any general user accounts you might have. If you do have sufficient control, then you may win out and be able to secure the user accounts properly. If not, you simply have to be more vigilant in your monitoring of those accounts. Use of ssh for user accounts is more problematic, due to the extra administration and technical support required, but still a very good solution compared to a crypted password file.
5564
5565 ### Securing the Password File 
5566
5567 The only sure fire way is to `*` out as many passwords as you can and use ssh for access to those accounts. Even though the encrypted password file (`/etc/spwd.db`) can only be read by `root`, it may be possible for an intruder to obtain read access to that file even if the attacker cannot obtain root-write access.
5568
5569 Your security scripts should always check for and report changes to the password file (see the [Checking file integrity](securing-freebsd.html#SECURITY-INTEGRITY) section below).
5570
5571 ### Securing the Kernel Core, Raw Devices, and Filesystems 
5572
5573 If an attacker breaks `root` he can do just about anything, but there are certain conveniences. For example, most modern kernels have a packet sniffing device driver built in. Under DragonFly it is called the `bpf` device. An intruder will commonly attempt to run a packet sniffer on a compromised machine. You do not need to give the intruder the capability and most systems do not have the need for the `bpf` device compiled in.
5574
5575 But even if you turn off the `bpf` device, you still have `/dev/mem` and `/dev/kmem` to worry about. For that matter, the intruder can still write to raw disk devices. Also, there is another kernel feature called the module loader, [kldload(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#kldload&section8). An enterprising intruder can use a KLD module to install his own `bpf` device, or other sniffing device, on a running kernel. To avoid these problems you have to run the kernel at a higher secure level, at least securelevel 1. The securelevel can be set with a `sysctl` on the `kern.securelevel` variable. Once you have set the securelevel to 1, write access to raw devices will be denied and special `chflags` flags, such as `schg`, will be enforced. You must also ensure that the `schg` flag is set on critical startup binaries, directories, and script files -- everything that gets run up to the point where the securelevel is set. This might be overdoing it, and upgrading the system is much more difficult when you operate at a higher secure level. You may compromise and run the system at a higher secure level but not set the `schg` flag for every system file and directory under the sun. Another possibility is to simply mount `/` and `/usr` read-only. It should be noted that being too Draconian in what you attempt to protect may prevent the all-important detection of an intrusion.
5576
5577 ### Checking File Integrity: Binaries, Configuration Files, Etc. 
5578
5579 When it comes right down to it, you can only protect your core system configuration and control files so much before the convenience factor rears its ugly head. For example, using `chflags` to set the `schg` bit on most of the files in `/` and `/usr` is probably counterproductive, because while it may protect the files, it also closes a detection window. The last layer of your security onion is perhaps the most important -- detection. The rest of your security is pretty much useless (or, worse, presents you with a false sense of safety) if you cannot detect potential incursions. Half the job of the onion is to slow down the attacker, rather than stop him, in order to give the detection side of the equation a chance to catch him in the act.
5580
5581 The best way to detect an incursion is to look for modified, missing, or unexpected files. The best way to look for modified files is from another (often centralized) limited-access system. Writing your security scripts on the extra-secure limited-access system makes them mostly invisible to potential attackers, and this is important. In order to take maximum advantage you generally have to give the limited-access box significant access to the other machines in the business, usually either by doing a read-only NFS export of the other machines to the limited-access box, or by setting up ssh key-pairs to allow the limited-access box to ssh to the other machines. Except for its network traffic, NFS is the least visible method -- allowing you to monitor the filesystems on each client box virtually undetected. If your limited-access server is connected to the client boxes through a switch, the NFS method is often the better choice. If your limited-access server is connected to the client boxes through a hub, or through several layers of routing, the NFS method may be too insecure (network-wise) and using ssh may be the better choice even with the audit-trail tracks that ssh lays.
5582
5583 Once you give a limited-access box, at least read access to the client systems it is supposed to monitor, you must write scripts to do the actual monitoring. Given an NFS mount, you can write scripts out of simple system utilities such as [find(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#find&section1) and [md5(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=md5&section=1). It is best to physically md5 the client-box files at least once a day, and to test control files such as those found in `/etc` and `/usr/local/etc` even more often. When mismatches are found, relative to the base md5 information the limited-access machine knows is valid, it should scream at a sysadmin to go check it out. A good security script will also check for inappropriate suid binaries and for new or deleted files on system partitions such as `/` and `/usr`.
5584
5585 When using ssh rather than NFS, writing the security script is much more difficult. You essentially have to `scp` the scripts to the client box in order to run them, making them visible, and for safety you also need to `scp` the binaries (such as find) that those scripts use. The  **ssh**  client on the client box may already be compromised. All in all, using ssh may be necessary when running over insecure links, but it is also a lot harder to deal with.
5586
5587 A good security script will also check for changes to user and staff members access configuration files: `.rhosts`, `.shosts`, `.ssh/authorized_keys` and so forth... files that might fall outside the purview of the `MD5` check.
5588
5589 If you have a huge amount of user disk space, it may take too long to run through every file on those partitions. In this case, setting mount flags to disallow suid binaries and devices on those partitions is a good idea. The `nodev` and `nosuid` options (see [mount(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#mount&section8)) are what you want to look into. You should probably scan them anyway, at least once a week, since the object of this layer is to detect a break-in whether or not the break-in is effective.
5590
5591 Process accounting (see [accton(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#accton&section8)) is a relatively low-overhead feature of the operating system which might help as a post-break-in evaluation mechanism. It is especially useful in tracking down how an intruder has actually broken into a system, assuming the file is still intact after the break-in occurs.
5592
5593 Finally, security scripts should process the log files, and the logs themselves should be generated in as secure a manner as possible -- remote syslog can be very useful. An intruder tries to cover his tracks, and log files are critical to the sysadmin trying to track down the time and method of the initial break-in. One way to keep a permanent record of the log files is to run the system console to a serial port and collect the information on a continuing basis through a secure machine monitoring the consoles.
5594
5595 ### Paranoia 
5596
5597 A little paranoia never hurts. As a rule, a sysadmin can add any number of security features, as long as they do not affect convenience, and can add security features that ***do*** affect convenience with some added thought. Even more importantly, a security administrator should mix it up a bit -- if you use recommendations such as those given by this document verbatim, you give away your methodologies to the prospective attacker who also has access to this document.
5598
5599 ### Denial of Service Attacks 
5600
5601 This section covers Denial of Service attacks. A DoS attack is typically a packet attack. While there is not much you can do about modern spoofed packet attacks that saturate your network, you can generally limit the damage by ensuring that the attacks cannot take down your servers.
5602
5603   1. Limiting server forks.
5604
5605   1. Limiting springboard attacks (ICMP response attacks, ping broadcast, etc.).
5606
5607   1. Kernel Route Cache.
5608
5609 A common DoS attack is against a forking server that attempts to cause the server to eat processes, file descriptors, and memory, until the machine dies.  **inetd**  (see [inetd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#inetd&section8)) has several options to limit this sort of attack. It should be noted that while it is possible to prevent a machine from going down, it is not generally possible to prevent a service from being disrupted by the attack. Read the  **inetd**  manual page carefully and pay specific attention to the `-c`, `-C`, and `-R` options. Note that spoofed-IP attacks will circumvent the `-C` option to  **inetd** , so typically a combination of options must be used. Some standalone servers have self-fork-limitation parameters.
5610
5611  **Sendmail**  has its `-OMaxDaemonChildren` option, which tends to work much better than trying to use sendmail's load limiting options due to the load lag. You should specify a `MaxDaemonChildren` parameter, when you start  **sendmail** , high enough to handle your expected load, but not so high that the computer cannot handle that number of  **sendmails**  without falling on its face. It is also prudent to run sendmail in queued mode (`-ODeliveryMode=queued`) and to run the daemon (`sendmail -bd`) separate from the queue-runs (`sendmail -q15m`). If you still want real-time delivery you can run the queue at a much lower interval, such as `-q1m`, but be sure to specify a reasonable `MaxDaemonChildren` option for ***that*** sendmail to prevent cascade failures.
5612
5613  **Syslogd**  can be attacked directly and it is strongly recommended that you use the `-s` option whenever possible, and the `-a` option otherwise.
5614
5615 You should also be fairly careful with connect-back services such as  **tcpwrapper**  s reverse-identd, which can be attacked directly. You generally do not want to use the reverse-ident feature of  **tcpwrappers**  for this reason.
5616
5617 It is a very good idea to protect internal services from external access by firewalling them off at your border routers. The idea here is to prevent saturation attacks from outside your LAN, not so much to protect internal services from network-based `root` compromise. Always configure an exclusive firewall, i.e., firewall everything ***except*** ports A, B, C, D, and M-Z. This way you can firewall off all of your low ports except for certain specific services such as  **named**  (if you are primary for a zone),  **ntalkd** ,  **sendmail** , and other Internet-accessible services. If you try to configure the firewall the other way -- as an inclusive or permissive firewall, there is a good chance that you will forget to ***close*** a couple of services, or that you will add a new internal service and forget to update the firewall. You can still open up the high-numbered port range on the firewall, to allow permissive-like operation, without compromising your low ports. Also take note that DragonFly allows you to control the range of port numbers used for dynamic binding, via the various `net.inet.ip.portrange` `sysctl`'s (`sysctl -a | fgrep portrange`), which can also ease the complexity of your firewall's configuration. For example, you might use a normal first/last range of 4000 to 5000, and a hiport range of 49152 to 65535, then block off everything under 4000 in your firewall (except for certain specific Internet-accessible ports, of course).
5618
5619 Another common DoS attack is called a springboard attack -- to attack a server in a manner that causes the server to generate responses which overloads the server, the local network, or some other machine. The most common attack of this nature is the ***ICMP ping broadcast attack***. The attacker spoofs ping packets sent to your LAN's broadcast address with the source IP address set to the actual machine they wish to attack. If your border routers are not configured to stomp on ping's to broadcast addresses, your LAN winds up generating sufficient responses to the spoofed source address to saturate the victim, especially when the attacker uses the same trick on several dozen broadcast addresses over several dozen different networks at once. Broadcast attacks of over a hundred and twenty megabits have been measured. A second common springboard attack is against the ICMP error reporting system. By constructing packets that generate ICMP error responses, an attacker can saturate a server's incoming network and cause the server to saturate its outgoing network with ICMP responses. This type of attack can also crash the server by running it out of mbuf's, especially if the server cannot drain the ICMP responses it generates fast enough. The DragonFly kernel has a new kernel compile option called `ICMP_BANDLIM` which limits the effectiveness of these sorts of attacks. The last major class of springboard attacks is related to certain internal  **inetd**  services such as the udp echo service. An attacker simply spoofs a UDP packet with the source address being server A's echo port, and the destination address being server B's echo port, where server A and B are both on your LAN. The two servers then bounce this one packet back and forth between each other. The attacker can overload both servers and their LANs simply by injecting a few packets in this manner. Similar problems exist with the internal  **chargen**  port. A competent sysadmin will turn off all of these inetd-internal test services.
5620
5621 Spoofed packet attacks may also be used to overload the kernel route cache. Refer to the `net.inet.ip.rtexpire`, `rtminexpire`, and `rtmaxcache` `sysctl` parameters. A spoofed packet attack that uses a random source IP will cause the kernel to generate a temporary cached route in the route table, viewable with `netstat -rna | fgrep W3`. These routes typically timeout in 1600 seconds or so. If the kernel detects that the cached route table has gotten too big it will dynamically reduce the `rtexpire` but will never decrease it to less than `rtminexpire`. There are two problems:
5622
5623   1. The kernel does not react quickly enough when a lightly loaded server is suddenly attacked.
5624
5625   1. The `rtminexpire` is not low enough for the kernel to survive a sustained attack.
5626
5627 If your servers are connected to the Internet via a T3 or better, it may be prudent to manually override both `rtexpire` and `rtminexpire` via [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#sysctl&section8). Never set either parameter to zero (unless you want to crash the machine). Setting both parameters to two seconds should be sufficient to protect the route table from attack.
5628
5629 ## DES, MD5, and Crypt 
5630
5631 ***Parts rewritten and updated by Bill Swingle. ***
5632
5633 Every user on a UNIX® system has a password associated with their account. It seems obvious that these passwords need to be known only to the user and the actual operating system. In order to keep these passwords secret, they are encrypted with what is known as a ***one-way hash***, that is, they can only be easily encrypted but not decrypted. In other words, what we told you a moment ago was obvious is not even true: the operating system itself does not ***really*** know the password. It only knows the ***encrypted*** form of the password. The only way to get the ***plain-text*** password is by a brute force search of the space of possible passwords.
5634
5635 Unfortunately the only secure way to encrypt passwords when UNIX came into being was based on DES, the Data Encryption Standard. This was not such a problem for users resident in the US, but since the source code for DES could not be exported outside the US, DragonFly had to find a way to both comply with US law and retain compatibility with all the other UNIX variants that still used DES.
5636
5637 The solution was to divide up the encryption libraries so that US users could install the DES libraries and use DES but international users still had an encryption method that could be exported abroad. This is how DragonFly came to use MD5 as its default encryption method. MD5 is believed to be more secure than DES, so installing DES is offered primarily for compatibility reasons.
5638
5639 ### Recognizing Your Crypt Mechanism 
5640
5641 `libcrypt.a` provides a configurable password authentication hash library. Currently the library supports DES, MD5, Blowfish, SHA256, and SHA512 hash functions. By default DragonFly uses SHA256 to encrypt passwords.
5642
5643 It is pretty easy to identify which encryption method DragonFly is set up to use. Examining the encrypted passwords in the `/etc/master.passwd` file is one way. Passwords encrypted with the MD5 hash are longer than those encrypted with the DES hash and also begin with the characters `$1$`. Passwords starting with `$2a$` are encrypted with the Blowfish hash function. DES password strings do not have any particular identifying characteristics, but they are shorter than MD5 passwords, and are coded in a 64-character alphabet which does not include the `$` character, so a relatively short string which does not begin with a dollar sign is very likely a DES password.
5644
5645 The password format used for new passwords is controlled by the `passwd_format` login capability in `/etc/login.conf`, which takes values of `des`, `md5` or `blf`. See the [login.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#login.conf&amp;section5) manual page for more information about login capabilities.
5646
5647 ## One-time Passwords 
5648
5649 S/Key is a one-time password scheme based on a one-way hash function. DragonFly uses the MD4 hash for compatibility but other systems have used MD5 and DES-MAC. S/Key ia part of the FreeBSD base system, and is also used on a growing number of other operating systems. S/Key is a registered trademark of Bell Communications Research, Inc.
5650
5651 There are three different sorts of passwords which we will discuss below. The first is your usual UNIX® style password; we will call this a ***UNIX password***. The second sort is the one-time password which is generated by the S/Key `key` program or the OPIE [opiekey(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#opiekey&section1) program and accepted by the `keyinit` or [opiepasswd(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=opiepasswd&section=1) programs and the login prompt; we will call this a ***one-time password***. The final sort of password is the secret password which you give to the `key`/`opiekey` programs (and sometimes the `keyinit`/`opiepasswd` programs) which it uses to generate one-time passwords; we will call it a ***secret password*** or just unqualified ***password***.
5652
5653 The secret password does not have anything to do with your UNIX password; they can be the same but this is not recommended. S/Key and OPIE secret passwords are not limited to eight characters like old UNIX passwords[(1)](#FTN.AEN8429), they can be as long as you like. Passwords of six or seven word long phrases are fairly common. For the most part, the S/Key or OPIE system operates completely independently of the UNIX password system.
5654
5655 Besides the password, there are two other pieces of data that are important to S/Key and OPIE. One is what is known as the ***seed*** or ***key***, consisting of two letters and five digits. The other is what is called the ***iteration count***, a number between 1 and 100. S/Key creates the one-time password by concatenating the seed and the secret password, then applying the MD4/MD5 hash as many times as specified by the iteration count and turning the result into six short English words. These six English words are your one-time password. The authentication system (primarily PAM) keeps track of the last one-time password used, and the user is authenticated if the hash of the user-provided password is equal to the previous password. Because a one-way hash is used it is impossible to generate future one-time passwords if a successfully used password is captured; the iteration count is decremented after each successful login to keep the user and the login program in sync. When the iteration count gets down to 1, S/Key and OPIE must be reinitialized.
5656
5657 There are three programs involved in each system which we will discuss below. The `key` and `opiekey` programs accept an iteration count, a seed, and a secret password, and generate a one-time password or a consecutive list of one-time passwords. The `keyinit` and `opiepasswd` programs are used to initialize S/Key and OPIE respectively, and to change passwords, iteration counts, or seeds; they take either a secret passphrase, or an iteration count, seed, and one-time password. The `keyinfo` and `opieinfo` programs examine the relevant credentials files (`/etc/skeykeys` or `/etc/opiekeys`) and print out the invoking user's current iteration count and seed.
5658
5659 There are four different sorts of operations we will cover. The first is using `keyinit` or `opiepasswd` over a secure connection to set up one-time-passwords for the first time, or to change your password or seed. The second operation is using `keyinit` or `opiepasswd` over an insecure connection, in conjunction with `key` or `opiekey` over a secure connection, to do the same. The third is using `key`/`opiekey` to log in over an insecure connection. The fourth is using `key` or `opiekey` to generate a number of keys which can be written down or printed out to carry with you when going to some location without secure connections to anywhere.
5660
5661 ### Secure Connection Initialization 
5662
5663 To initialize S/Key for the first time, change your password, or change your seed while logged in over a secure connection (e.g., on the console of a machine or via  **ssh** ), use the `keyinit` command without any parameters while logged in as yourself:
5664
5665     
5666
5667     % keyinit
5668
5669     Adding unfurl:
5670
5671     Reminder - Only use this method if you are directly connected.
5672
5673     If you are using telnet or rlogin exit with no password and use keyinit -s.
5674
5675     Enter secret password:
5676
5677     Again secret password:
5678
5679     
5680
5681     ID unfurl s/key is 99 to17757
5682
5683     DEFY CLUB PRO NASH LACE SOFT
5684
5685 For OPIE, `opiepasswd` is used instead:
5686
5687     
5688
5689     % opiepasswd -c
5690
5691     [grimreaper] ~ $ opiepasswd -f -c
5692
5693     Adding unfurl:
5694
5695     Only use this method from the console; NEVER from remote. If you are using
5696
5697     telnet, xterm, or a dial-in, type ^C now or exit with no password.
5698
5699     Then run opiepasswd without the -c parameter.
5700
5701     Using MD5 to compute responses.
5702
5703     Enter new secret pass phrase:
5704
5705     Again new secret pass phrase:
5706
5707     ID unfurl OTP key is 499 to4268
5708
5709     MOS MALL GOAT ARM AVID COED
5710
5711 At the Enter new secret pass phrase: or Enter secret password: prompts, you should enter a password or phrase. Remember, this is not the password that you will use to login with, this is used to generate your one-time login keys. The ***ID*** line gives the parameters of your particular instance: your login name, the iteration count, and seed. When logging in the system will remember these parameters and present them back to you so you do not have to remember them. The last line gives the particular one-time password which corresponds to those parameters and your secret password; if you were to re-login immediately, this one-time password is the one you would use.
5712
5713 ### Insecure Connection Initialization 
5714
5715 To initialize or change your secret password over an insecure connection, you will need to already have a secure connection to some place where you can run `key` or `opiekey`; this might be in the form of a desk accessory on a Macintosh®, or a shell prompt on a machine you trust. You will also need to make up an iteration count (100 is probably a good value), and you may make up your own seed or use a randomly-generated one. Over on the insecure connection (to the machine you are initializing), use the `keyinit -s` command:
5716
5717     
5718
5719     % keyinit -s
5720
5721     Updating unfurl:
5722
5723     Old key: to17758
5724
5725     Reminder you need the 6 English words from the key command.
5726
5727     Enter sequence count from 1 to 9999: 100
5728
5729     Enter new key [default to17759]:
5730
5731     s/key 100 to 17759
5732
5733     s/key access password:
5734
5735     s/key access password:CURE MIKE BANE HIM RACY GORE
5736
5737 For OPIE, you need to use `opiepasswd`:
5738
5739     
5740
5741     % opiepasswd
5742
5743     
5744
5745     Updating unfurl:
5746
5747     You need the response from an OTP generator.
5748
5749     Old secret pass phrase:
5750
5751             otp-md5 498 to4268 ext
5752
5753             Response: GAME GAG WELT OUT DOWN CHAT
5754
5755     New secret pass phrase:
5756
5757             otp-md5 499 to4269
5758
5759             Response: LINE PAP MILK NELL BUOY TROY
5760
5761     
5762
5763     ID mark OTP key is 499 gr4269
5764
5765     LINE PAP MILK NELL BUOY TROY
5766
5767 To accept the default seed (which the `keyinit` program confusingly calls a `key`), press  **Return** . Then before entering an access password, move over to your secure connection or S/Key desk accessory, and give it the same parameters:
5768
5769     
5770
5771     % key 100 to17759
5772
5773     Reminder - Do not use this program while logged in via telnet or rlogin.
5774
5775     Enter secret password: &lt;secret password&gt;
5776
5777     CURE MIKE BANE HIM RACY GORE
5778
5779 Or for OPIE:
5780
5781     
5782
5783     % opiekey 498 to4268
5784
5785     Using the MD5 algorithm to compute response.
5786
5787     Reminder: Don't use opiekey from telnet or dial-in sessions.
5788
5789     Enter secret pass phrase:
5790
5791     GAME GAG WELT OUT DOWN CHAT
5792
5793 Now switch back over to the insecure connection, and copy the one-time password generated over to the relevant program.
5794
5795 ### Generating a Single One-time Password 
5796
5797 Once you have initialized S/Key, when you login you will be presented with a prompt like this:
5798
5799     
5800
5801     % telnet example.com
5802
5803     Trying 10.0.0.1...
5804
5805     Connected to example.com
5806
5807     Escape character is '^]'.
5808
5809     
5810
5811     DragonFly/i386 (example.com) (ttypa)
5812
5813     
5814
5815     login: &lt;username&gt;
5816
5817     s/key 97 fw13894
5818
5819     Password:
5820
5821 Or for OPIE:
5822
5823     
5824
5825     % telnet example.com
5826
5827     Trying 10.0.0.1...
5828
5829     Connected to example.com
5830
5831     Escape character is '^]'.
5832
5833     
5834
5835     DragonFly/i386 (example.com) (ttypa)
5836
5837     
5838
5839     login: &lt;username&gt;
5840
5841     otp-md5 498 gr4269 ext
5842
5843     Password:
5844
5845 As a side note, the S/Key and OPIE prompts have a useful feature (not shown here): if you press  **Return**  at the password prompt, the prompter will turn echo on, so you can see what you are typing. This can be extremely useful if you are attempting to type in a password by hand, such as from a printout.
5846
5847 At this point you need to generate your one-time password to answer this login prompt. This must be done on a trusted system that you can run `key` or `opiekey` on. (There are versions of these for DOS, Windows® and Mac OS® as well.) They need both the iteration count and the seed as command line options. You can cut-and-paste these right from the login prompt on the machine that you are logging in to.
5848
5849 On the trusted system:
5850
5851     
5852
5853     % key 97 fw13894
5854
5855     Reminder - Do not use this program while logged in via telnet or rlogin.
5856
5857     Enter secret password:
5858
5859     WELD LIP ACTS ENDS ME HAAG
5860
5861 For OPIE:
5862
5863     
5864
5865     % opiekey 498 to4268
5866
5867     Using the MD5 algorithm to compute response.
5868
5869     Reminder: Don't use opiekey from telnet or dial-in sessions.
5870
5871     Enter secret pass phrase:
5872
5873     GAME GAG WELT OUT DOWN CHAT
5874
5875 Now that you have your one-time password you can continue logging in:
5876
5877     
5878
5879     login: &lt;username&gt;
5880
5881     s/key 97 fw13894
5882
5883     Password: &lt;return to enable echo&gt;
5884
5885     s/key 97 fw13894
5886
5887     Password [echo on]: WELD LIP ACTS ENDS ME HAAG
5888
5889     Last login: Tue Mar 21 11:56:41 from 10.0.0.2 ...
5890
5891 ### Generating Multiple One-time Passwords 
5892
5893 Sometimes you have to go places where you do not have access to a trusted machine or secure connection. In this case, it is possible to use the `key` and `opiekey` commands to generate a number of one-time passwords beforehand to be printed out and taken with you. For example:
5894
5895     
5896
5897     % key -n 5 30 zz99999
5898
5899     Reminder - Do not use this program while logged in via telnet or rlogin.
5900
5901     Enter secret password: &lt;secret password&gt;
5902
5903     26: SODA RUDE LEA LIND BUDD SILT
5904
5905     27: JILT SPY DUTY GLOW COWL ROT
5906
5907     28: THEM OW COLA RUNT BONG SCOT
5908
5909     29: COT MASH BARR BRIM NAN FLAG
5910
5911     30: CAN KNEE CAST NAME FOLK BILK
5912
5913 Or for OPIE:
5914
5915     
5916
5917     % opiekey -n 5 30 zz99999
5918
5919     Using the MD5 algorithm to compute response.
5920
5921     Reminder: Don't use opiekey from telnet or dial-in sessions.
5922
5923     Enter secret pass phrase: &lt;secret password&gt;
5924
5925     26: JOAN BORE FOSS DES NAY QUIT
5926
5927     27: LATE BIAS SLAY FOLK MUCH TRIG
5928
5929     28: SALT TIN ANTI LOON NEAL USE
5930
5931     29: RIO ODIN GO BYE FURY TIC
5932
5933     30: GREW JIVE SAN GIRD BOIL PHI
5934
5935 The `-n 5` requests five keys in sequence, the `30` specifies what the last iteration number should be. Note that these are printed out in ***reverse*** order of eventual use. If you are really paranoid, you might want to write the results down by hand; otherwise you can cut-and-paste into `lpr`. Note that each line shows both the iteration count and the one-time password; you may still find it handy to scratch off passwords as you use them.
5936
5937 ### Restricting Use of UNIX® Passwords 
5938
5939 S/Key can place restrictions on the use of UNIX passwords based on the host name, user name, terminal port, or IP address of a login session. These restrictions can be found in the configuration file `/etc/skey.access`. The [skey.access(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#skey.access&section5) manual page has more information on the complete format of the file and also details some security cautions to be aware of before depending on this file for security.
5940
5941 If there is no `/etc/skey.access` file (this is the default), then all users will be allowed to use UNIX passwords. If the file exists, however, then all users will be required to use S/Key unless explicitly permitted to do otherwise by configuration statements in the `skey.access` file. In all cases, UNIX passwords are permitted on the console.
5942
5943 Here is a sample `skey.access` configuration file which illustrates the three most common sorts of configuration statements:
5944
5945     
5946
5947     permit internet 192.168.0.0 255.255.0.0
5948
5949     permit user fnord
5950
5951     permit port ttyd0
5952
5953 The first line (`permit internet`) allows users whose IP source address (which is vulnerable to spoofing) matches the specified value and mask, to use UNIX passwords. This should not be considered a security mechanism, but rather, a means to remind authorized users that they are using an insecure network and need to use S/Key for authentication.
5954
5955 The second line (`permit user`) allows the specified username, in this case `fnord`, to use UNIX passwords at any time. Generally speaking, this should only be used for people who are either unable to use the `key` program, like those with dumb terminals, or those who are uneducable.
5956
5957 The third line (`permit port`) allows all users logging in on the specified terminal line to use UNIX passwords; this would be used for dial-ups.
5958
5959 Here is a sample `opieaccess` file:
5960
5961     
5962
5963     permit 192.168.0.0 255.255.0.0
5964
5965 This line allows users whose IP source address (which is vulnerable to spoofing) matches the specified value and mask, to use UNIX passwords at any time.
5966
5967 If no rules in `opieaccess` are matched, the default is to deny non-OPIE logins.
5968
5969 #### Notes 
5970
5971 [[!table  data="""
5972 |<tablestyle="width:100%"> [one-time-passwords.html#AEN8429 (1)] | Under DragonFly the standard login password may be up to 128 characters in length. |
5973
5974 """]]
5975
5976 CategoryHandbook
5977
5978 CategoryHandbook-security
5979
5980 ## Firewalls 
5981
5982 ***Contributed by Gary Palmer and Alex Nash. ***
5983
5984 Firewalls are an area of increasing interest for people who are connected to the Internet, and are even finding applications on private networks to provide enhanced security. This section will hopefully explain what firewalls are, how to use them, and how to use the facilities provided in the DragonFly kernel to implement them.
5985
5986  **Note:** People often think that having a firewall between your internal network and the ***Big Bad Internet*** will solve all your security problems. It may help, but a poorly set up firewall system is more of a security risk than not having one at all. A firewall can add another layer of security to your systems, but it cannot stop a really determined cracker from penetrating your internal network. If you let internal security lapse because you believe your firewall to be impenetrable, you have just made the crackers job that much easier.
5987
5988 ### What Is a Firewall? 
5989
5990 There are currently two distinct types of firewalls in common use on the Internet today. The first type is more properly called a ***packet filtering router***. This type of firewall utilizes a multi-homed machine and a set of rules to determine whether to forward or block individual packets. A multi-homed machine is simply a device with multiple network interfaces. The second type, known as a ***proxy server***, relies on daemons to provide authentication and to forward packets, possibly on a multi-homed machine which has kernel packet forwarding disabled.
5991
5992 Sometimes sites combine the two types of firewalls, so that only a certain machine (known as a ***bastion host***) is allowed to send packets through a packet filtering router onto an internal network. Proxy services are run on the bastion host, which are generally more secure than normal authentication mechanisms.
5993
5994 DragonFly comes with a kernel packet filter (known as IPFW), which is what the rest of this section will concentrate on. Proxy servers can be built on DragonFly from third party software, but there is such a variety of proxy servers available that it would be impossible to cover them in this section.
5995
5996 #### Packet Filtering Routers 
5997
5998 A router is a machine which forwards packets between two or more networks. A packet filtering router is programmed to compare each packet to a list of rules before deciding if it should be forwarded or not. Most modern IP routing software includes packet filtering functionality that defaults to forwarding all packets. To enable the filters, you need to define a set of rules.
5999
6000 To decide whether a packet should be passed on, the firewall looks through its set of rules for a rule which matches the contents of the packet's headers. Once a match is found, the rule action is obeyed. The rule action could be to drop the packet, to forward the packet, or even to send an ICMP message back to the originator. Only the first match counts, as the rules are searched in order. Hence, the list of rules can be referred to as a ***rule chain***.
6001
6002 The packet-matching criteria varies depending on the software used, but typically you can specify rules which depend on the source IP address of the packet, the destination IP address, the source port number, the destination port number (for protocols which support ports), or even the packet type (UDP, TCP, ICMP, etc).
6003
6004 #### Proxy Servers 
6005
6006 Proxy servers are machines which have had the normal system daemons ( **telnetd** ,  **ftpd** , etc) replaced with special servers. These servers are called ***proxy servers***, as they normally only allow onward connections to be made. This enables you to run (for example) a proxy  **telnet**  server on your firewall host, and people can  **telnet**  in to your firewall from the outside, go through some authentication mechanism, and then gain access to the internal network (alternatively, proxy servers can be used for signals coming from the internal network and heading out).
6007
6008 Proxy servers are normally more secure than normal servers, and often have a wider variety of authentication mechanisms available, including ***one-shot*** password systems so that even if someone manages to discover what password you used, they will not be able to use it to gain access to your systems as the password expires immediately after the first use. As they do not actually give users access to the host machine, it becomes a lot more difficult for someone to install backdoors around your security system.
6009
6010 Proxy servers often have ways of restricting access further, so that only certain hosts can gain access to the servers. Most will also allow the administrator to specify which users can talk to which destination machines. Again, what facilities are available depends largely on what proxy software you choose.
6011
6012 ### Firewall options in DragonFlyBSD
6013
6014 DragonFlyBSD inherited the IPFW firewall (versions 1 and 2) when it forked from FreeBSD. Pretty soon after though, we imported the new pf packet filter that the OpenBSD developers created from scratch. It is a cleaner code base and is now the recommended solution for firewalling DragonFly. Keep in mind that the PF version in DragonFly is not in sync with OpenBSD's PF code. We have not yet incorporated the improvements made in PF over the last few years, but we have some improvements of our own. IPFW is still and will remain supported for the forseeable future; it has some features not yet available in PF.
6015
6016 A copy of the OpenBSD PF user's guide corresponding to the version of PF in DragonFly can be found in [[PFUsersGuide]].
6017
6018 #### What Does IPFW Allow Me to Do? 
6019
6020 IPFW, the software supplied with DragonFly, is a packet filtering and accounting system which resides in the kernel, and has a user-land control utility, [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8). Together, they allow you to define and query the rules used by the kernel in its routing decisions.
6021
6022 There are two related parts to IPFW. The firewall section performs packet filtering. There is also an IP accounting section which tracks usage of the router, based on rules similar to those used in the firewall section. This allows the administrator to monitor how much traffic the router is getting from a certain machine, or how much WWW traffic it is forwarding, for example.
6023
6024 As a result of the way that IPFW is designed, you can use IPFW on non-router machines to perform packet filtering on incoming and outgoing connections. This is a special case of the more general use of IPFW, and the same commands and techniques should be used in this situation.
6025
6026 #### Enabling IPFW on DragonFly 
6027
6028 As the main part of the IPFW system lives in the kernel, you will need to add one or more options to your kernel configuration file, depending on what facilities you want, and recompile your kernel. See "Reconfiguring your Kernel" ([kernelconfig.html Chapter 9]) for more details on how to recompile your kernel.
6029
6030  **Warning:** IPFW defaults to a policy of `deny ip from any to any`. If you do not add other rules during startup to allow access, ***you will lock yourself out*** of the server upon rebooting into a firewall-enabled kernel. We suggest that you set `firewall_type=open` in your `/etc/rc.conf` file when first enabling this feature, then refining the firewall rules in `/etc/rc.firewall` after you have tested that the new kernel feature works properly. To be on the safe side, you may wish to consider performing the initial firewall configuration from the local console rather than via  **ssh** . Another option is to build a kernel using both the `IPFIREWALL` and `IPFIREWALL_DEFAULT_TO_ACCEPT` options. This will change the default rule of IPFW to `allow ip from any to any` and avoid the possibility of a lockout.
6031
6032 There are currently four kernel configuration options relevant to IPFW:
6033
6034 `options IPFIREWALL`:: Compiles into the kernel the code for packet filtering.`options IPFIREWALL_VERBOSE`:: Enables code to allow logging of packets through [syslogd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#syslogd&section8). Without this option, even if you specify that packets should be logged in the filter rules, nothing will happen.`options IPFIREWALL_VERBOSE_LIMIT=10`:: Limits the number of packets logged through [syslogd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=syslogd&section=8) on a per entry basis. You may wish to use this option in hostile environments in which you want to log firewall activity, but do not want to be open to a denial of service attack via syslog flooding.
6035
6036 When a chain entry reaches the packet limit specified, logging is turned off for that particular entry. To resume logging, you will need to reset the associated counter using the [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8) utility:
6037
6038     
6039
6040     # ipfw zero 4500
6041
6042 Where 4500 is the chain entry you wish to continue logging.`options IPFIREWALL_DEFAULT_TO_ACCEPT`:: This changes the default rule action from ***deny*** to ***allow***. This avoids the possibility of locking yourself out if you happen to boot a kernel with `IPFIREWALL` support but have not configured your firewall yet. It is also very useful if you often use [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8) as a filter for specific problems as they arise. Use with care though, as this opens up the firewall and changes the way it works.
6043
6044 #### Configuring IPFW 
6045
6046 The configuration of the IPFW software is done through the [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8) utility. The syntax for this command looks quite complicated, but it is relatively simple once you understand its structure.
6047
6048 There are currently four different command categories used by the utility: addition/deletion, listing, flushing, and clearing. Addition/deletion is used to build the rules that control how packets are accepted, rejected, and logged. Listing is used to examine the contents of your rule set (otherwise known as the chain) and packet counters (accounting). Flushing is used to remove all entries from the chain. Clearing is used to zero out one or more accounting entries.
6049
6050 ##### Altering the IPFW Rules 
6051
6052 The syntax for this form of the command is:
6053
6054 `ipfw` [-N] command [index] action [log] protocol addresses [options]
6055
6056 There is one valid flag when using this form of the command:
6057
6058 -N:: Resolve addresses and service names in output.
6059
6060 The ***command*** given can be shortened to the shortest unique form. The valid ***commands*** are:
6061
6062 add:: Add an entry to the firewall/accounting rule listdelete:: Delete an entry from the firewall/accounting rule list
6063
6064 Previous versions of IPFW used separate firewall and accounting entries. The present version provides packet accounting with each firewall entry.
6065
6066 If an ***index*** value is supplied, it is used to place the entry at a specific point in the chain. Otherwise, the entry is placed at the end of the chain at an index 100 greater than the last chain entry (this does not include the default policy, rule 65535, deny).
6067
6068 The `log` option causes matching rules to be output to the system console if the kernel was compiled with `IPFIREWALL_VERBOSE`.
6069
6070 Valid ***actions*** are:
6071
6072 reject:: Drop the packet, and send an ICMP host or port unreachable (as appropriate) packet to the source.allow:: Pass the packet on as normal. (aliases: `pass`, `permit`, and `accept`)deny:: Drop the packet. The source is not notified via an ICMP message (thus it appears that the packet never arrived at the destination).count:: Update packet counters but do not allow/deny the packet based on this rule. The search continues with the next chain entry.
6073
6074 Each ***action*** will be recognized by the shortest unambiguous prefix.
6075
6076 The ***protocols*** which can be specified are:
6077
6078 all:: Matches any IP packeticmp:: Matches ICMP packetstcp:: Matches TCP packetsudp:: Matches UDP packets
6079
6080 The ***address*** specification is:
6081
6082 from `***address/mask***` [`***port***`] to `***address/mask***` [`***port***`] [via `***interface***`]
6083
6084 You can only specify `***port***` in conjunction with ***protocols*** which support ports (UDP and TCP).
6085
6086 The `via` is optional and may specify the IP address or domain name of a local IP interface, or an interface name (e.g. `ed0`) to match only packets coming through this interface. Interface unit numbers can be specified with an optional wildcard. For example, `ppp*` would match all kernel PPP interfaces.
6087
6088 The syntax used to specify an `***address/mask***` is:
6089
6090     
6091
6092     `***address***`
6093
6094  or
6095
6096     
6097
6098     `***address***`/`***mask-bits***`
6099
6100  or
6101
6102     
6103
6104     `***address***`:`***mask-pattern***`
6105
6106 A valid hostname may be specified in place of the IP address. ' **mask-bits** ' is a decimal number representing how many bits in the address mask should be set. e.g. specifying `192.216.222.1/24` will create a mask which will allow any address in a class C subnet (in this case, `192.216.222`) to be matched. ' **mask-pattern** ' is an IP address which will be logically AND'ed with the address given. The keyword `any` may be used to specify ***any IP address***.
6107
6108 The port numbers to be blocked are specified as:
6109
6110 `***port***` [,`***port***` [,`***port***` [...]]]
6111
6112  to specify either a single port or a list of ports, or
6113
6114 `***port***`-`***port***`
6115
6116  to specify a range of ports. You may also combine a single range with a list, but the range must always be specified first.
6117
6118 The ***options*** available are:
6119
6120 frag:: Matches if the packet is not the first fragment of the datagram.in:: Matches if the packet is on the way in.out:: Matches if the packet is on the way out.ipoptions `***spec***`:: Matches if the IP header contains the comma separated list of options specified in `***spec***`. The supported IP options are: `ssrr` (strict source route), `lsrr` (loose source route), `rr` (record packet route), and `ts` (time stamp). The absence of a particular option may be specified with a leading `!`.established:: Matches if the packet is part of an already established TCP connection (i.e. it has the RST or ACK bits set). You can optimize the performance of the firewall by placing ***established*** rules early in the chain.setup:: Matches if the packet is an attempt to establish a TCP connection (the SYN bit is set but the ACK bit is not).tcpflags `***flags***`:: Matches if the TCP header contains the comma separated list of `***flags***`. The supported flags are `fin`, `syn`, `rst`, `psh`, `ack`, and `urg`. The absence of a particular flag may be indicated by a leading `!`.icmptypes `***types***`:: Matches if the ICMP type is present in the list `***types***`. The list may be specified as any combination of ranges and/or individual types separated by commas. Commonly used ICMP types are: `0` echo reply (ping reply), `3` destination unreachable, `5` redirect, `8` echo request (ping request), and `11` time exceeded (used to indicate TTL expiration as with [traceroute(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#traceroute&section8)).
6121
6122 ##### Listing the IPFW Rules 
6123
6124 The syntax for this form of the command is:
6125
6126 `ipfw` [-a] [-c] [-d] [-e] [-t] [-N] [-S] list
6127
6128 There are seven valid flags when using this form of the command:
6129
6130 -a:: While listing, show counter values. This option is the only way to see accounting counters.-c:: List rules in compact form.-d:: Show dynamic rules in addition to static rules.-e:: If `-d` was specified, also show expired dynamic rules.-t:: Display the last match times for each chain entry. The time listing is incompatible with the input syntax used by the [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8) utility.-N:: Attempt to resolve given addresses and service names.-S:: Show the set each rule belongs to. If this flag is not specified, disabled rules will not be listed.
6131
6132 ##### Flushing the IPFW Rules 
6133
6134 The syntax for flushing the chain is:
6135
6136 `ipfw` flush
6137
6138 This causes all entries in the firewall chain to be removed except the fixed default policy enforced by the kernel (index 65535). Use caution when flushing rules; the default deny policy will leave your system cut off from the network until allow entries are added to the chain.
6139
6140 ##### Clearing the IPFW Packet Counters 
6141
6142 The syntax for clearing one or more packet counters is:
6143
6144 `ipfw` zero [`***index***`]
6145
6146 When used without an `***index***` argument, all packet counters are cleared. If an `***index***` is supplied, the clearing operation only affects a specific chain entry.
6147
6148 #### Example Commands for  **ipfw**  
6149
6150 This command will deny all packets from the host `evil.crackers.org` to the telnet port of the host `nice.people.org`:
6151
6152     
6153
6154     # ipfw add deny tcp from evil.crackers.org to nice.people.org 23
6155
6156 The next example denies and logs any TCP traffic from the entire `crackers.org` network (a class C) to the `nice.people.org` machine (any port).
6157
6158     
6159
6160     # ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org
6161
6162 If you do not want people sending X sessions to your internal network (a subnet of a class C), the following command will do the necessary filtering:
6163
6164     
6165
6166     # ipfw add deny tcp from any to my.org/28 6000 setup
6167
6168 To see the accounting records:
6169
6170     
6171
6172     # ipfw -a list
6173
6174  or in the short form
6175
6176     
6177
6178     # ipfw -a l
6179
6180 You can also see the last time a chain entry was matched with:
6181
6182     
6183
6184     # ipfw -at l
6185
6186 #### Building a Packet Filtering Firewall 
6187
6188  **Note:** The following suggestions are just that: suggestions. The requirements of each firewall are different and we cannot tell you how to build a firewall to meet your particular requirements.
6189
6190 When initially setting up your firewall, unless you have a test bench setup where you can configure your firewall host in a controlled environment, it is strongly recommend you use the logging version of the commands and enable logging in the kernel. This will allow you to quickly identify problem areas and cure them without too much disruption. Even after the initial setup phase is complete, I recommend using the logging for `deny' as it allows tracing of possible attacks and also modification of the firewall rules if your requirements alter.
6191
6192  **Note:** If you use the logging versions of the `accept` command, be aware that it can generate ***large*** amounts of log data. One log entry will be generated for every packet that passes through the firewall, so large FTP/http transfers, etc, will really slow the system down. It also increases the latencies on those packets as it requires more work to be done by the kernel before the packet can be passed on.  **syslogd**  will also start using up a lot more processor time as it logs all the extra data to disk, and it could quite easily fill the partition `/var/log` is located on.
6193
6194 You should enable your firewall from `/etc/rc.conf.local` or `/etc/rc.conf`. The associated manual page explains which knobs to fiddle and lists some preset firewall configurations. If you do not use a preset configuration, `ipfw list` will output the current ruleset into a file that you can pass to `rc.conf`. If you do not use `/etc/rc.conf.local` or `/etc/rc.conf` to enable your firewall, it is important to make sure your firewall is enabled before any IP interfaces are configured.
6195
6196 The next problem is what your firewall should actually ***do***! This is largely dependent on what access to your network you want to allow from the outside, and how much access to the outside world you want to allow from the inside. Some general rules are:
6197
6198 * Block all incoming access to ports below 1024 for TCP. This is where most of the security sensitive services are, like finger, SMTP (mail) and telnet.
6199
6200 * Block ***all*** incoming UDP traffic. There are very few useful services that travel over UDP, and what useful traffic there is, is normally a security threat (e.g. Suns RPC and NFS protocols). This has its disadvantages also, since UDP is a connectionless protocol, denying incoming UDP traffic also blocks the replies to outgoing UDP traffic. This can cause a problem for people (on the inside) using external archie (prospero) servers. If you want to allow access to archie, you will have to allow packets coming from ports 191 and 1525 to any internal UDP port through the firewall.  **ntp**  is another service you may consider allowing through, which comes from port 123.
6201
6202 * Block traffic to port 6000 from the outside. Port 6000 is the port used for access to X11 servers, and can be a security threat (especially if people are in the habit of doing `xhost +` on their workstations). X11 can actually use a range of ports starting at 6000, the upper limit being how many X displays you can run on the machine. The upper limit as defined by RFC 1700 (Assigned Numbers) is 6063.
6203
6204 * Check what ports any internal servers use (e.g. SQL servers, etc). It is probably a good idea to block those as well, as they normally fall outside the 1-1024 range specified above.
6205
6206 Another checklist for firewall configuration is available from CERT at http://www.cert.org/tech_tips/packet_filtering.html
6207
6208 As stated above, these are only ***guidelines***. You will have to decide what filter rules you want to use on your firewall yourself. We cannot accept ANY responsibility if someone breaks into your network, even if you follow the advice given above.
6209
6210 #### IPFW Overhead and Optimization 
6211
6212 Many people want to know how much overhead IPFW adds to a system. The answer to this depends mostly on your rule set and processor speed. For most applications dealing with Ethernet and small rule sets, the answer is ***negligible***. For those of you that need actual measurements to satisfy your curiosity, read on.
6213
6214 The following measurements were made using FreeBSD 2.2.5-STABLE on a 486-66. (While IPFW has changed slightly in later releases of DragonFly, it still performs with similar speed.) IPFW was modified to measure the time spent within the `ip_fw_chk` routine, displaying the results to the console every 1000 packets.
6215
6216 Two rule sets, each with 1000 rules, were tested. The first set was designed to demonstrate a worst case scenario by repeating the rule:
6217
6218     
6219
6220     # ipfw add deny tcp from any to any 55555
6221
6222 This demonstrates a worst case scenario by causing most of IPFW's packet check routine to be executed before finally deciding that the packet does not match the rule (by virtue of the port number). Following the 999th iteration of this rule was an `allow ip from any to any`.
6223
6224 The second set of rules were designed to abort the rule check quickly:
6225
6226     
6227
6228     # ipfw add deny ip from 1.2.3.4 to 1.2.3.4
6229
6230 The non-matching source IP address for the above rule causes these rules to be skipped very quickly. As before, the 1000th rule was an `allow ip from any to any`.
6231
6232 The per-packet processing overhead in the former case was approximately 2.703 ms/packet, or roughly 2.7 microseconds per rule. Thus the theoretical packet processing limit with these rules is around 370 packets per second. Assuming 10 Mbps Ethernet and a ~1500 byte packet size, we would only be able to achieve 55.5% bandwidth utilization.
6233
6234 For the latter case each packet was processed in approximately 1.172 ms, or roughly 1.2 microseconds per rule. The theoretical packet processing limit here would be about 853 packets per second, which could consume 10 Mbps Ethernet bandwidth.
6235
6236 The excessive number of rules tested and the nature of those rules do not provide a real-world scenario -- they were used only to generate the timing information presented here. Here are a few things to keep in mind when building an efficient rule set:
6237
6238 * Place an `established` rule early on to handle the majority of TCP traffic. Do not put any `allow tcp` statements before this rule.
6239
6240 * Place heavily triggered rules earlier in the rule set than those rarely used (***without changing the permissiveness of the firewall***, of course). You can see which rules are used most often by examining the packet counting statistics with `ipfw -a l`.
6241
6242 CategoryHandbook
6243
6244 CategoryHandbook-security
6245
6246 ## OpenSSL 
6247
6248 [OpenSSL](http://www.openssl.org/) provides a general-purpose cryptography library, as well as the Secure Sockets Layer v2/v3 (SSLv2/SSLv3) and Transport Layer Security v1 (TLSv1) network security protocols.
6249
6250 However, one of the algorithms (specifically IDEA) included in OpenSSL is protected by patents in the USA and elsewhere, and is not available for unrestricted use. IDEA is included in the OpenSSL sources in DragonFly, but it is not built by default. If you wish to use it, and you comply with the license terms, enable the `MAKE_IDEA` switch in `/etc/make.conf` and rebuild your sources using `make world`.
6251
6252 Today, the RSA algorithm is free for use in USA and other countries. In the past it was protected by a patent.
6253
6254 ## VPN over IPsec 
6255
6256 <!-- XXX: someone revise this and add words about pf. I've no clue about this stuff -->
6257
6258 ***Written by Nik Clayton. ***
6259
6260 Creating a VPN between two networks, separated by the Internet, using DragonFly gateways.
6261
6262 ### Understanding IPsec 
6263
6264 ***Written by Hiten M. Pandya. ***
6265
6266 This section will guide you through the process of setting up IPsec, and to use it in an environment which consists of DragonFly and  **Microsoft® Windows® 2000/XP**  machines, to make them communicate securely. In order to set up IPsec, it is necessary that you are familiar with the concepts of building a custom kernel (see [kernelconfig.html Chapter 9]).
6267
6268 ***IPsec*** is a protocol which sits on top of the Internet Protocol (IP) layer. It allows two or more hosts to communicate in a secure manner (hence the name). The DragonFly IPsec ***network stack*** is based on the [KAME](http://www.kame.net/) implementation, which has support for both protocol families, IPv4 and IPv6.
6269
6270 IPsec consists of two sub-protocols:
6271
6272 * ***Encapsulated Security Payload (ESP)***, protects the IP packet data from third party interference, by encrypting the contents using symmetric cryptography algorithms (like Blowfish, 3DES).
6273
6274 * ***Authentication Header (AH)***, protects the IP packet header from third party interference and spoofing, by computing a cryptographic checksum and hashing the IP packet header fields with a secure hashing function. This is then followed by an additional header that contains the hash, to allow the information in the packet to be authenticated.
6275
6276 ESP and AH can either be used together or separately, depending on the environment.
6277
6278 IPsec can either be used to directly encrypt the traffic between two hosts (known as ***Transport Mode***); or to build ***virtual tunnels*** between two subnets, which could be used for secure communication between two corporate networks (known as ***Tunnel Mode***). The latter is more commonly known as a ***Virtual Private Network (VPN)***. The [ipsec(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipsec&section4) manual page should be consulted for detailed information on the IPsec subsystem in DragonFly.
6279
6280 To add IPsec support to your kernel, add the following options to your kernel configuration file:
6281
6282     
6283
6284     options   IPSEC        #IP security
6285
6286     options   IPSEC_ESP    #IP security (crypto; define w/ IPSEC)
6287
6288     
6289
6290 If IPsec debugging support is desired, the following kernel option should also be added:
6291
6292     
6293
6294     options   IPSEC_DEBUG  #debug for IP security
6295
6296     
6297
6298 ### The Problem 
6299
6300 There's no standard for what constitutes a VPN. VPNs can be implemented using a number of different technologies, each of which have their own strengths and weaknesses. This article presents a number of scenarios, and strategies for implementing a VPN for each scenario.
6301
6302 ### Scenario #1: Two networks, connected to the Internet, to behave as one 
6303
6304 This is the scenario that caused me to first investigating VPNs. The premise is as follows:
6305
6306 * You have at least two sites
6307
6308 * Both sites are using IP internally
6309
6310 * Both sites are connected to the Internet, through a gateway that is running DragonFly.
6311
6312 * The gateway on each network has at least one public IP address.
6313
6314 * The internal addresses of the two networks can be public or private IP addresses, it doesn't matter. You can be running NAT on the gateway machine if necessary.
6315
6316 * The internal IP addresses of the two networks ***do not collide***. While I expect it is theoretically possible to use a combination of VPN technology and NAT to get this to work, I expect it to be a configuration nightmare.
6317
6318 If you find that you are trying to connect two networks, both of which, internally, use the same private IP address range (e.g., both of them use `192.168.1.x`), then one of the networks will have to be renumbered.
6319
6320 The network topology might look something like this:
6321
6322 security/ipsec-network.png
6323
6324 Notice the two public IP addresses. I'll use the letters to refer to them in the rest of this article. Anywhere you see those letters in this article, replace them with your own public IP addresses. Note also that internally, the two gateway machines have .1 IP addresses, and that the two networks have different private IP addresses (`192.168.1.x` and `192.168.2.x` respectively). All the machines on the private networks have been configured to use the `.1` machine as their default gateway.
6325
6326 The intention is that, from a network point of view, each network should view the machines on the other network as though they were directly attached the same router -- albeit a slightly slow router with an occasional tendency to drop packets.
6327
6328 This means that (for example), machine `192.168.1.20` should be able to run
6329
6330     
6331
6332     ping 192.168.2.34
6333
6334 and have it work, transparently. Windows machines should be able to see the machines on the other network, browse file shares, and so on, in exactly the same way that they can browse machines on the local network.
6335
6336 And the whole thing has to be secure. This means that traffic between the two networks has to be encrypted.
6337
6338 Creating a VPN between these two networks is a multi-step process. The stages are as follows:
6339
6340   1. Create a ***virtual*** network link between the two networks, across the Internet. Test it, using tools like [ping(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ping&section8), to make sure it works.
6341
6342   1. Apply security policies to ensure that traffic between the two networks is transparently encrypted and decrypted as necessary. Test this, using tools like [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#tcpdump&section1), to ensure that traffic is encrypted.
6343
6344   1. Configure additional software on the DragonFly gateways, to allow Windows machines to see one another across the VPN.
6345
6346 #### Step 1: Creating and testing a ***virtual*** network link 
6347
6348 Suppose that you were logged in to the gateway machine on network #1 (with public IP address `A.B.C.D`, private IP address `192.168.1.1`), and you ran `ping 192.168.2.1`, which is the private address of the machine with IP address `W.X.Y.Z`. What needs to happen in order for this to work?
6349
6350   1. The gateway machine needs to know how to reach `192.168.2.1`. In other words, it needs to have a route to `192.168.2.1`.
6351
6352   1. Private IP addresses, such as those in the `192.168.x` range are not supposed to appear on the Internet at large. Instead, each packet you send to `192.168.2.1` will need to be wrapped up inside another packet. This packet will need to appear to be from `A.B.C.D`, and it will have to be sent to `W.X.Y.Z`. This process is called ***encapsulation***.
6353
6354   1. Once this packet arrives at `W.X.Y.Z` it will need to ***unencapsulated***, and delivered to `192.168.2.1`.
6355
6356 You can think of this as requiring a ***tunnel*** between the two networks. The two ***tunnel mouths*** are the IP addresses `A.B.C.D` and `W.X.Y.Z`, and the tunnel must be told the addresses of the private IP addresses that will be allowed to pass through it. The tunnel is used to transfer traffic with private IP addresses across the public Internet.
6357
6358 This tunnel is created by using the generic interface, or `gif` devices on DragonFly. As you can imagine, the `gif` interface on each gateway host must be configured with four IP addresses; two for the public IP addresses, and two for the private IP addresses.
6359
6360 Support for the gif device must be compiled in to the DragonFly kernel on both machines. You can do this by adding the line:
6361
6362     
6363
6364     pseudo-device gif
6365
6366 to the kernel configuration files on both machines, and then compile, install, and reboot as normal.
6367
6368 Configuring the tunnel is a two step process. First the tunnel must be told what the outside (or public) IP addresses are, using [gifconfig(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#gifconfig&section8). Then the private IP addresses must be configured using [ifconfig(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=ifconfig&section=8).
6369
6370 On the gateway machine on network #1 you would run the following two commands to configure the tunnel.
6371
6372     
6373
6374     gifconfig gif0 A.B.C.D W.X.Y.Z
6375
6376     ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff
6377
6378     
6379
6380 On the other gateway machine you run the same commands, but with the order of the IP addresses reversed.
6381
6382     
6383
6384     gifconfig gif0 W.X.Y.Z A.B.C.D
6385
6386     ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff
6387
6388     
6389
6390 You can then run:
6391
6392     
6393
6394     gifconfig gif0
6395
6396 to see the configuration. For example, on the network #1 gateway, you would see this:
6397
6398     
6399
6400     # gifconfig gif0
6401
6402     gif0: flags=8011&lt;UP,POINTTOPOINT,MULTICAST&gt; mtu 1280
6403
6404     inet 192.168.1.1 --&gt; 192.168.2.1 netmask 0xffffffff
6405
6406     physical address inet A.B.C.D --&gt; W.X.Y.Z
6407
6408     
6409
6410 As you can see, a tunnel has been created between the physical addresses `A.B.C.D` and `W.X.Y.Z`, and the traffic allowed through the tunnel is that between `192.168.1.1` and `192.168.2.1`.
6411
6412 This will also have added an entry to the routing table on both machines, which you can examine with the command `netstat -rn`. This output is from the gateway host on network #1.
6413
6414     
6415
6416     # netstat -rn
6417
6418     Routing tables
6419
6420     
6421
6422     Internet:
6423
6424     Destination      Gateway       Flags    Refs    Use    Netif  Expire
6425
6426     ...
6427
6428     192.168.2.1      192.168.1.1   UH        0        0    gif0
6429
6430     ...
6431
6432     
6433
6434 As the ***Flags*** value indicates, this is a host route, which means that each gateway knows how to reach the other gateway, but they do not know how to reach the rest of their respective networks. That problem will be fixed shortly.
6435
6436 It is likely that you are running a firewall on both machines. This will need to be circumvented for your VPN traffic. You might want to allow all traffic between both networks, or you might want to include firewall rules that protect both ends of the VPN from one another.
6437
6438 It greatly simplifies testing if you configure the firewall to allow all traffic through the VPN. You can always tighten things up later. If you are using [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8) on the gateway machines then a command like
6439
6440     
6441
6442     ipfw add 1 allow ip from any to any via gif0
6443
6444 will allow all traffic between the two end points of the VPN, without affecting your other firewall rules. Obviously you will need to run this command on both gateway hosts.
6445
6446 This is sufficient to allow each gateway machine to ping the other. On `192.168.1.1`, you should be able to run
6447
6448     
6449
6450     ping 192.168.2.1
6451
6452 and get a response, and you should be able to do the same thing on the other gateway machine.
6453
6454 However, you will not be able to reach internal machines on either network yet. This is because of the routing -- although the gateway machines know how to reach one another, they do not know how to reach the network behind each one.
6455
6456 To solve this problem you must add a static route on each gateway machine. The command to do this on the first gateway would be:
6457
6458     
6459
6460     route add 192.168.2.0 192.168.2.1 netmask 0xffffff00
6461
6462     
6463
6464 This says ***In order to reach the hosts on the network `192.168.2.0`, send the packets to the host `192.168.2.1`***. You will need to run a similar command on the other gateway, but with the `192.168.1.x` addresses instead.
6465
6466 IP traffic from hosts on one network will now be able to reach hosts on the other network.
6467
6468 That has now created two thirds of a VPN between the two networks, in as much as it is ***virtual*** and it is a ***network***. It is not private yet. You can test this using [ping(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ping&section8) and [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=tcpdump&section=1). Log in to the gateway host and run
6469
6470     
6471
6472     tcpdump dst host 192.168.2.1
6473
6474 In another log in session on the same host run
6475
6476     
6477
6478     ping 192.168.2.1
6479
6480 You will see output that looks something like this:
6481
6482     
6483
6484     16:10:24.018080 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
6485
6486     16:10:24.018109 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
6487
6488     16:10:25.018814 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
6489
6490     16:10:25.018847 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
6491
6492     16:10:26.028896 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
6493
6494     16:10:26.029112 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
6495
6496     
6497
6498 As you can see, the ICMP messages are going back and forth unencrypted. If you had used the `-s` parameter to [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#tcpdump&section1) to grab more bytes of data from the packets you would see more information.
6499
6500 Obviously this is unacceptable. The next section will discuss securing the link between the two networks so that it all traffic is automatically encrypted.
6501
6502  **Summary:** 
6503
6504 * Configure both kernels with ***pseudo-device gif***.
6505
6506 * Edit `/etc/rc.conf` on gateway host #1 and add the following lines (replacing IP addresses as necessary).
6507
6508       
6509
6510       gifconfig_gif0="A.B.C.D W.X.Y.Z"
6511
6512       ifconfig_gif0="inet 192.168.1.1 192.168.2.1 netmask 0xffffffff"
6513
6514       static_routes="vpn"
6515
6516       route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00"
6517
6518   
6519
6520 * Edit your firewall script (`/etc/rc.firewall`, or similar) on both hosts, and add
6521
6522       
6523
6524       ipfw add 1 allow ip from any to any via gif0
6525
6526   
6527
6528 * Make similar changes to `/etc/rc.conf` on gateway host #2, reversing the order of IP addresses.
6529
6530 #### Step 2: Securing the link 
6531
6532 To secure the link we will be using IPsec. IPsec provides a mechanism for two hosts to agree on an encryption key, and to then use this key in order to encrypt data between the two hosts.
6533
6534 The are two areas of configuration to be considered here.
6535
6536   1. There must be a mechanism for two hosts to agree on the encryption mechanism to use. Once two hosts have agreed on this mechanism there is said to be a ***security association*** between them.
6537
6538   1. There must be a mechanism for specifying which traffic should be encrypted. Obviously, you don't want to encrypt all your outgoing traffic -- you only want to encrypt the traffic that is part of the VPN. The rules that you put in place to determine what traffic will be encrypted are called ***security policies***.
6539
6540 Security associations and security policies are both maintained by the kernel, and can be modified by userland programs. However, before you can do this you must configure the kernel to support IPsec and the Encapsulated Security Payload (ESP) protocol. This is done by configuring a kernel with:
6541
6542     
6543
6544     options IPSEC
6545
6546     options IPSEC_ESP
6547
6548     
6549
6550 and recompiling, reinstalling, and rebooting. As before you will need to do this to the kernels on both of the gateway hosts.
6551
6552 You have two choices when it comes to setting up security associations. You can configure them by hand between two hosts, which entails choosing the encryption algorithm, encryption keys, and so forth, or you can use daemons that implement the Internet Key Exchange protocol (IKE) to do this for you.
6553
6554 I recommend the latter. Apart from anything else, it is easier to set up.
6555
6556 Editing and displaying security policies is carried out using [setkey(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#setkey&section8). By analogy, `setkey` is to the kernel's security policy tables as [route(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=route&section=8) is to the kernel's routing tables. `setkey` can also display the current security associations, and to continue the analogy further, is akin to `netstat -r` in that respect.
6557
6558 There are a number of choices for daemons to manage security associations with DragonFly. This article will describe how to use one of these, racoon. racoon is in the FreeBSD ports collection, in the security/ category, and is installed in the usual way.
6559
6560 racoon must be run on both gateway hosts. On each host it is configured with the IP address of the other end of the VPN, and a secret key (which you choose, and must be the same on both gateways).
6561
6562 The two daemons then contact one another, confirm that they are who they say they are (by using the secret key that you configured). The daemons then generate a new secret key, and use this to encrypt the traffic over the VPN. They periodically change this secret, so that even if an attacker were to crack one of the keys (which is as theoretically close to unfeasible as it gets) it won't do them much good -- by the time they've cracked the key the two daemons have chosen another one.
6563
6564 racoon's configuration is stored in `${PREFIX}/etc/racoon`. You should find a configuration file there, which should not need to be changed too much. The other component of racoon's configuration, which you will need to change, is the ***pre-shared key***.
6565
6566 The default racoon configuration expects to find this in the file `${PREFIX}/etc/racoon/psk.txt`. It is important to note that the pre-shared key is ***not*** the key that will be used to encrypt your traffic across the VPN link, it is simply a token that allows the key management daemons to trust one another.
6567
6568 `psk.txt` contains a line for each remote site you are dealing with. In this example, where there are two sites, each `psk.txt` file will contain one line (because each end of the VPN is only dealing with one other end).
6569
6570 On gateway host #1 this line should look like this:
6571
6572     
6573
6574     W.X.Y.Z            secret
6575
6576 That is, the ***public*** IP address of the remote end, whitespace, and a text string that provides the secret. Obviously, you shouldn't use ***secret*** as your key -- the normal rules for choosing a password apply.
6577
6578 On gateway host #2 the line would look like this
6579
6580     
6581
6582     A.B.C.D            secret
6583
6584 That is, the public IP address of the remote end, and the same secret key. `psk.txt` must be mode `0600` (i.e., only read/write to `root`) before racoon will run.
6585
6586 You must run racoon on both gateway machines. You will also need to add some firewall rules to allow the IKE traffic, which is carried over UDP to the ISAKMP (Internet Security Association Key Management Protocol) port. Again, this should be fairly early in your firewall ruleset.
6587
6588     
6589
6590     ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
6591
6592     ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
6593
6594     
6595
6596 Once racoon is running you can try pinging one gateway host from the other. The connection is still not encrypted, but racoon will then set up the security associations between the two hosts -- this might take a moment, and you may see this as a short delay before the ping commands start responding.
6597
6598 Once the security association has been set up you can view it using [setkey(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#setkey&section8). Run
6599
6600     
6601
6602     setkey -D
6603
6604 on either host to view the security association information.
6605
6606 That's one half of the problem. They other half is setting your security policies.
6607
6608 To create a sensible security policy, let's review what's been set up so far. This discussions hold for both ends of the link.
6609
6610 Each IP packet that you send out has a header that contains data about the packet. The header includes the IP addresses of both the source and destination. As we already know, private IP addresses, such as the `192.168.x.y` range are not supposed to appear on the public Internet. Instead, they must first be encapsulated inside another packet. This packet must have the public source and destination IP addresses substituted for the private addresses.
6611
6612 So if your outgoing packet started looking like this:
6613
6614 security/ipsec-out-pkt.png
6615
6616 Then it will be encapsulated inside another packet, looking something like this:
6617
6618 security/ipsec-encap-pkt.png
6619
6620 This encapsulation is carried out by the `gif` device. As you can see, the packet now has real IP addresses on the outside, and our original packet has been wrapped up as data inside the packet that will be put out on the Internet.
6621
6622 Obviously, we want all traffic between the VPNs to be encrypted. You might try putting this in to words, as:
6623
6624 ***If a packet leaves from `A.B.C.D`, and it is destined for `W.X.Y.Z`, then encrypt it, using the necessary security associations.***
6625
6626 ***If a packet arrives from `W.X.Y.Z`, and it is destined for `A.B.C.D`, then decrypt it, using the necessary security associations.***
6627
6628 That's close, but not quite right. If you did this, all traffic to and from `W.X.Y.Z`, even traffic that was not part of the VPN, would be encrypted. That's not quite what you want. The correct policy is as follows
6629
6630 ***If a packet leaves from `A.B.C.D`, and that packet is encapsulating another packet, and it is destined for `W.X.Y.Z`, then encrypt it, using the necessary security associations.***
6631
6632 ***If a packet arrives from `W.X.Y.Z`, and that packet is encapsulating another packet, and it is destined for `A.B.C.D`, then encrypt it, using the necessary security associations.***
6633
6634 A subtle change, but a necessary one.
6635
6636 Security policies are also set using [setkey(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#setkey&section8). [setkey(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=setkey&section=8) features a configuration language for defining the policy. You can either enter configuration instructions via stdin, or you can use the `-f` option to specify a filename that contains configuration instructions.
6637
6638 The configuration on gateway host #1 (which has the public IP address `A.B.C.D`) to force all outbound traffic to `W.X.Y.Z` to be encrypted is:
6639
6640     
6641
6642     spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;
6643
6644     
6645
6646 Put these commands in a file (e.g., `/etc/ipsec.conf`) and then run
6647
6648     
6649
6650     # setkey -f /etc/ipsec.conf
6651
6652 `spdadd` tells [setkey(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#setkey&section8) that we want to add a rule to the secure policy database. The rest of this line specifies which packets will match this policy. `A.B.C.D/32` and `W.X.Y.Z/32` are the IP addresses and netmasks that identify the network or hosts that this policy will apply to. In this case, we want it to apply to traffic between these two hosts. `ipencap` tells the kernel that this policy should only apply to packets that encapsulate other packets. `-P out` says that this policy applies to outgoing packets, and `ipsec` says that the packet will be secured.
6653
6654 The second line specifies how this packet will be encrypted. `esp` is the protocol that will be used, while `tunnel` indicates that the packet will be further encapsulated in an IPsec packet. The repeated use of `A.B.C.D` and `W.X.Y.Z` is used to select the security association to use, and the final `require` mandates that packets must be encrypted if they match this rule.
6655
6656 This rule only matches outgoing packets. You will need a similar rule to match incoming packets.
6657
6658     
6659
6660     spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;
6661
6662 Note the `in` instead of `out` in this case, and the necessary reversal of the IP addresses.
6663
6664 The other gateway host (which has the public IP address `W.X.Y.Z`) will need similar rules.
6665
6666     
6667
6668     spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;
6669
6670            spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;
6671
6672 Finally, you need to add firewall rules to allow ESP and IPENCAP packets back and forth. These rules will need to be added to both hosts.
6673
6674     
6675
6676     ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
6677
6678     ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
6679
6680     ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
6681
6682     ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
6683
6684     
6685
6686 Because the rules are symmetric you can use the same rules on each gateway host.
6687
6688 Outgoing packets will now look something like this:
6689
6690 security/ipsec-crypt-pkt.png
6691
6692 When they are received by the far end of the VPN they will first be decrypted (using the security associations that have been negotiated by racoon). Then they will enter the `gif` interface, which will unwrap the second layer, until you are left with the innermost packet, which can then travel in to the inner network.
6693
6694 You can check the security using the same [ping(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ping&section8) test from earlier. First, log in to the `A.B.C.D` gateway machine, and run:
6695
6696     
6697
6698     tcpdump dst host 192.168.2.1
6699
6700 In another log in session on the same host run
6701
6702     
6703
6704     ping 192.168.2.1
6705
6706 This time you should see output like the following:
6707
6708     
6709
6710     XXX tcpdump output
6711
6712 Now, as you can see, [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#tcpdump&section1) shows the ESP packets. If you try to examine them with the `-s` option you will see (apparently) gibberish, because of the encryption.
6713
6714 Congratulations. You have just set up a VPN between two remote sites.
6715
6716  **Summary** 
6717
6718 * Configure both kernels with:
6719
6720       
6721
6722       options IPSEC
6723
6724       options IPSEC_ESP
6725
6726   
6727
6728 * Install [`security/racoon`](http://pkgsrc.se/security/racoon). Edit `${PREFIX}/etc/racoon/psk.txt` on both gateway hosts, adding an entry for the remote host's IP address and a secret key that they both know. Make sure this file is mode 0600.
6729
6730 * Add the following lines to `/etc/rc.conf` on each host:
6731
6732       
6733
6734       ipsec_enable="YES"
6735
6736       ipsec_file="/etc/ipsec.conf"
6737
6738   
6739
6740 * Create an `/etc/ipsec.conf` on each host that contains the necessary spdadd lines. On gateway host #1 this would be:
6741
6742       
6743
6744       spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec
6745
6746         esp/tunnel/A.B.C.D-W.X.Y.Z/require;
6747
6748       spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec
6749
6750         esp/tunnel/W.X.Y.Z-A.B.C.D/require;
6751
6752   
6753
6754   On gateway host #2 this would be:
6755
6756       
6757
6758       spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec
6759
6760         esp/tunnel/W.X.Y.Z-A.B.C.D/require;
6761
6762       spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec
6763
6764         esp/tunnel/A.B.C.D-W.X.Y.Z/require;
6765
6766   
6767
6768 * Add firewall rules to allow IKE, ESP, and IPENCAP traffic to both hosts:
6769
6770       
6771
6772       ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
6773
6774       ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
6775
6776       ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
6777
6778       ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
6779
6780       ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
6781
6782       ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
6783
6784   
6785
6786 The previous two steps should suffice to get the VPN up and running. Machines on each network will be able to refer to one another using IP addresses, and all traffic across the link will be automatically and securely encrypted.
6787
6788 ----
6789
6790 ## OpenSSH 
6791
6792 ***Contributed by Chern Lee. ***
6793
6794  **OpenSSH**  is a set of network connectivity tools used to access remote machines securely. It can be used as a direct replacement for `rlogin`, `rsh`, `rcp`, and `telnet`. Additionally, any other TCP/IP connections can be tunneled/forwarded securely through SSH.  **OpenSSH**  encrypts all traffic to effectively eliminate eavesdropping, connection hijacking, and other network-level attacks.
6795
6796  **OpenSSH**  is maintained by the OpenBSD project, and is based upon SSH v1.2.12 with all the recent bug fixes and updates. It is compatible with both SSH protocols 1 and 2.
6797
6798 ### Advantages of Using OpenSSH 
6799
6800 Normally, when using [telnet(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#telnet&section1) or [rlogin(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=rlogin&section=1), data is sent over the network in an clear, un-encrypted form. Network sniffers anywhere in between the client and server can steal your user/password information or data transferred in your session.  **OpenSSH**  offers a variety of authentication and encryption methods to prevent this from happening.
6801
6802 ### Enabling sshd 
6803
6804 Be sure to make the following addition to your `rc.conf` file:
6805
6806     
6807
6808     sshd_enable="YES"
6809
6810 This will load [sshd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#sshd&section8&manpath=OpenBSD+3.3), the daemon program for  **OpenSSH** , the next time your system initializes. Alternatively, you can simply run directly the  **sshd**  daemon by typing `rcstart sshd` on the command line.
6811
6812 ### SSH Client 
6813
6814 The [ssh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh&section1&manpath=OpenBSD+3.3) utility works similarly to [rlogin(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=rlogin&section=1).
6815
6816     
6817
6818     # ssh user@example.com
6819
6820     Host key not found from the list of known hosts.
6821
6822     Are you sure you want to continue connecting (yes/no)? yes
6823
6824     Host 'example.com' added to the list of known hosts.
6825
6826     user@example.com's password: *******
6827
6828 The login will continue just as it would have if a session was created using `rlogin` or `telnet`. SSH utilizes a key fingerprint system for verifying the authenticity of the server when the client connects. The user is prompted to enter `yes` only when connecting for the first time. Future attempts to login are all verified against the saved fingerprint key. The SSH client will alert you if the saved fingerprint differs from the received fingerprint on future login attempts. The fingerprints are saved in `~/.ssh/known_hosts`, or `~/.ssh/known_hosts2` for SSH v2 fingerprints.
6829
6830 By default,  **OpenSSH**  servers are configured to accept both SSH v1 and SSH v2 connections. The client, however, can choose between the two. Version 2 is known to be more robust and secure than its predecessor.
6831
6832 The [ssh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh&section1&manpath=OpenBSD+3.3) command can be forced to use either protocol by passing it the `-1` or `-2` argument for v1 and v2, respectively.
6833
6834 ### Secure Copy 
6835
6836 The [scp(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#scp&section1&manpath=OpenBSD+3.3) command works similarly to [rcp(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=rcp&section=1); it copies a file to or from a remote machine, except in a secure fashion.
6837
6838     
6839
6840     #  scp user@example.com:/COPYRIGHT COPYRIGHT
6841
6842     user@example.com's password: *******
6843
6844     COPYRIGHT            100% |*****************************|  4735
6845
6846     00:00
6847
6848     #
6849
6850 Since the fingerprint was already saved for this host in the previous example, it is verified when using [scp(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#scp&section1&manpath=OpenBSD+3.3) here.
6851
6852 The arguments passed to [scp(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#scp&section1&manpath=OpenBSD+3.3) are similar to [cp(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=cp&section=1), with the file or files in the first argument, and the destination in the second. Since the file is fetched over the network, through SSH, one or more of the file arguments takes on the form `user@host:<path_to_remote_file>`. The `user@` part is optional. If omitted, it will default to the same username as you are currently logged in as, unless configured otherwise.
6853
6854 ### Configuration 
6855
6856 The system-wide configuration files for both the  **OpenSSH**  daemon and client reside within the `/etc/ssh` directory.
6857
6858 `ssh_config` configures the client settings, while `sshd_config` configures the daemon.
6859
6860 Additionally, the `sshd_program` (`/usr/sbin/sshd` by default), and `sshd_flags` `rc.conf` options can provide more levels of configuration.
6861
6862 Each user can have a personal configuration file in `~/.ssh/config`. The file can configure various client options, and can include host-specific options. With the following configuration file, a user could type `ssh shell` which would be equivalent to `ssh -X user@shell.example.com`.
6863
6864     
6865
6866     Host shell
6867
6868      Hostname shell.example.com
6869
6870      Username user
6871
6872      Protocol 2
6873
6874      ForwardX11 yes
6875
6876 ### ssh-keygen 
6877
6878 Instead of using passwords, [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-keygen&section1&manpath=OpenBSD+3.3) can be used to generate RSA keys to authenticate a user:
6879
6880     
6881
6882     % ssh-keygen -t rsa1
6883
6884     Initializing random number generator...
6885
6886     Generating p:  .++ (distance 66)
6887
6888     Generating q:  ..............................++ (distance 498)
6889
6890     Computing the keys...
6891
6892     Key generation complete.
6893
6894     Enter file in which to save the key (/home/user/.ssh/identity):
6895
6896     Enter passphrase:
6897
6898     Enter the same passphrase again:
6899
6900     Your identification has been saved in /home/user/.ssh/identity.
6901
6902     ...
6903
6904 [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-keygen&section1&manpath=OpenBSD+3.3) will create a public and private key pair for use in authentication. The private key is stored in `~/.ssh/identity`, whereas the public key is stored in `~/.ssh/identity.pub`. The public key must be placed in `~/.ssh/authorized_keys` of the remote machine in order for the setup to work.
6905
6906 This will allow connection to the remote machine based upon RSA authentication instead of passwords.
6907
6908  **Note:** The `-t rsa1` option will create RSA keys for use by SSH protocol version 1. If you want to use RSA keys with the SSH protocol version 2, you have to use the command `ssh-keygen -t rsa`.
6909
6910 If a passphrase is used in [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-keygen&section1&manpath=OpenBSD+3.3), the user will be prompted for a password each time in order to use the private key.
6911
6912 A SSH protocol version 2 DSA key can be created for the same purpose by using the `ssh-keygen -t dsa` command. This will create a public/private DSA key for use in SSH protocol version 2 sessions only. The public key is stored in `~/.ssh/id_dsa.pub`, while the private key is in `~/.ssh/id_dsa`.
6913
6914 DSA public keys are also placed in `~/.ssh/authorized_keys` on the remote machine.
6915
6916 [ssh-agent(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-agent&section1&manpath=OpenBSD+3.3) and [ssh-add(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ssh-add&section=1&manpath=OpenBSD+3.3) are utilities used in managing multiple passworded private keys.
6917
6918  **Warning:** The various options and files can be different according to the  **OpenSSH**  version you have on your system, to avoid problems you should consult the [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-keygen&section1&manpath=OpenBSD+3.3) manual page.
6919
6920 ### SSH Tunneling 
6921
6922  **OpenSSH**  has the ability to create a tunnel to encapsulate another protocol in an encrypted session.
6923
6924 The following command tells [ssh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh&section1&manpath=OpenBSD+3.3) to create a tunnel for  **telnet** :
6925
6926     
6927
6928     % ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com
6929
6930     %
6931
6932 The `ssh` command is used with the following options:
6933
6934 `-2`
6935
6936  :: Forces `ssh` to use version 2 of the protocol. (Do not use if you are working with older SSH servers)
6937
6938 `-N`
6939
6940  :: Indicates no command, or tunnel only. If omitted, `ssh` would initiate a normal session.
6941
6942 `-f`
6943
6944  :: Forces `ssh` to run in the background.
6945
6946 `-L`
6947
6948  :: Indicates a local tunnel in `***localport:remotehost:remoteport***` fashion.
6949
6950 `user@foo.example.com`
6951
6952  :: The remote SSH server.
6953
6954 An SSH tunnel works by creating a listen socket on `localhost` on the specified port. It then forwards any connection received on the local host/port via the SSH connection to the specified remote host and port.
6955
6956 In the example, port `***5023***` on `localhost` is being forwarded to port `***23***` on `localhost` of the remote machine. Since `***23***` is  **telnet** , this would create a secure  **telnet**  session through an SSH tunnel.
6957
6958 This can be used to wrap any number of insecure TCP protocols such as SMTP, POP3, FTP, etc.
6959
6960  **Example 10-1. Using SSH to Create a Secure Tunnel for SMTP** 
6961
6962     
6963
6964     % ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com
6965
6966     user@mailserver.example.com's password: *****
6967
6968     % telnet localhost 5025
6969
6970     Trying 127.0.0.1...
6971
6972     Connected to localhost.
6973
6974     Escape character is '^]'.
6975
6976     220 mailserver.example.com ESMTP
6977
6978 This can be used in conjunction with an [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-keygen&section1&manpath=OpenBSD+3.3) and additional user accounts to create a more seamless/hassle-free SSH tunneling environment. Keys can be used in place of typing a password, and the tunnels can be run as a separate user.
6979
6980 #### Practical SSH Tunneling Examples 
6981
6982 ##### Secure Access of a POP3 Server 
6983
6984 At work, there is an SSH server that accepts connections from the outside. On the same office network resides a mail server running a POP3 server. The network, or network path between your home and office may or may not be completely trustable. Because of this, you need to check your e-mail in a secure manner. The solution is to create an SSH connection to your office's SSH server, and tunnel through to the mail server.
6985
6986     
6987
6988     % ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com
6989
6990     user@ssh-server.example.com's password: ******
6991
6992 When the tunnel is up and running, you can point your mail client to send POP3 requests to `localhost` port 2110. A connection here will be forwarded securely across the tunnel to `mail.example.com`.
6993
6994 ##### Bypassing a Draconian Firewall 
6995
6996 Some network administrators impose extremely draconian firewall rules, filtering not only incoming connections, but outgoing connections. You may be only given access to contact remote machines on ports 22 and 80 for SSH and web surfing.
6997
6998 You may wish to access another (perhaps non-work related) service, such as an Ogg Vorbis server to stream music. If this Ogg Vorbis server is streaming on some other port than 22 or 80, you will not be able to access it.
6999
7000 The solution is to create an SSH connection to a machine outside of your network's firewall, and use it to tunnel to the Ogg Vorbis server.
7001
7002     
7003
7004     % ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org
7005
7006     user@unfirewalled-system.example.org's password: *******
7007
7008 Your streaming client can now be pointed to `localhost` port 8888, which will be forwarded over to `music.example.com` port 8000, successfully evading the firewall.
7009
7010  ***Contributed by Matteo Riondato. Updated for DragonFly by Dario Banno.***
7011
7012  [[!toc levels=3]]
7013
7014 ## Synopsis 
7015
7016  This chapter will provide an explanation of what DragonFly jails are and how to use them. Jails, sometimes referred to as an enhanced replacement of chroot environments, are a very powerful tool for system administrators, but their basic usage can also be useful for advanced users.
7017
7018  After reading this chapter, you will know:
7019
7020 * What a jail is, and what purpose it may serve in DragonFly installations.
7021
7022 * How to build, start, and stop a jail.
7023
7024 * The basics of jail administration, both from inside and outside the jail.
7025 ***
7026
7027  Other sources of useful information about jails are:
7028
7029 * The [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) manual page. This is the full reference of the jail utility -- the administrative tool which can be used in DragonFly to start, stop, and control DragonFly jails.
7030
7031 * The mailing lists and their archives. The archives of the DragonFly general questions mailing list and other mailing lists hosted by the DragonFly list server already contain a wealth of material for jails. It should always be engaging to search the archives, or post a new question to the [users mailing list](mailto:users@lists.dragonflybsd.org).
7032 ***
7033   ***
7034
7035 For information on how to setup a jail, see: [Setting up a jail](http://www.youtube.com/watch?v=s4_dJjfwtR4)
7036
7037 ----
7038
7039 ## Terms Related to Jails 
7040
7041  To facilitate better understanding of parts of the DragonFly system related to jails, their internals and the way they interact with the rest of DragonFly, the following terms are used further in this chapter:
7042
7043  ***[chroot(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=8) (command)***
7044
7045   A system call of DragonFly, which changes the root directory of a process and all its descendants.
7046
7047 ***
7048
7049  ***[chroot(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=2) (environment)***
7050
7051   The environment of processes running in a “chroot”. This includes resources such as the part of the file system which is visible, user and group IDs which are available, network interfaces and other IPC mechanisms, etc.
7052
7053 ***
7054
7055 *** [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) (command)***
7056
7057   The system administration utility which allows launching of processes within a jail environment.
7058
7059 ***
7060
7061  ***host (system, process, user, etc.)***
7062
7063   The controlling system of a jail environment. The host system has access to all the hardware resources available, and can control processes both outside of and inside a jail environment. One of the important differences of the host system from a jail is that the limitations which apply to superuser processes inside a jail are not enforced for processes of the host system.
7064
7065 ***
7066
7067  ***hosted (system, process, user, etc.)***
7068
7069   A process, user or other entity, whose access to resources is restricted by a DragonFly jail.
7070
7071 ----
7072
7073 ## Introduction 
7074
7075  Since system administration is a difficult and perplexing task, many powerful tools were developed to make life easier for the administrator. These tools mostly provide enhancements of some sort to the way systems are installed, configured and maintained. Part of the tasks which an administrator is expected to do is to properly configure the security of a system, so that it can continue serving its real purpose, without allowing security violations.
7076 ***
7077
7078  One of the tools which can be used to enhance the security of a DragonFly system are jails. The jail feature was written by Poul-Henning Kamp <phk@freebsd.org> for R&D Associates [[http://www.rndassociates.com/]] who contributed it to FreeBSD 4.X. Support for multiple IPs and IPv6 were introduced in DragonFly 1.7. Their development still goes on, enhancing their usefulness, performance, reliability, and security.
7079
7080 ## What is a Jail 
7081
7082  BSD-like operating systems have had [chroot(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=2) since the time of 4.2BSD. The [chroot(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=8) utility can be used to change the root directory of a set of processes, creating a safe environment, separate from the rest of the system. Processes created in the chrooted environment can not access files or resources outside of it. For that reason, compromising a service running in a chrooted environment should not allow the attacker to compromise the entire system. The chroot(8) utility is good for easy tasks, which do not require a lot of flexibility or complex and advanced features. Since the inception of the chroot concept, however, many ways have been found to escape from a chrooted environment and, although they have been fixed in modern versions of the DragonFly kernel, it was clear that chroot(2) was not the ideal solution for securing services. A new subsystem had to be implemented.
7083
7084  This is one of the main reasons why ***jails*** were developed.
7085
7086  Jails improve on the concept of the traditional [chroot(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=2) environment, in several ways. In a traditional [chroot(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=2) environment, processes are only limited in the part of the file system they can access. The rest of the system resources (like the set of system users, the running processes, or the networking subsystem) are shared by the chrooted processes and the processes of the host system. Jails expand this model by virtualizing not only access to the file system, but also the set of users, the networking subsystem of the DragonFly kernel and a few other things. A more complete set of fine-grained controls available for tuning the access of a jailed environment is described in Section 12.5.
7087 ***
7088
7089  A jail is characterized by four elements:
7090
7091 * A directory subtree -- the starting point from which a jail is entered. Once inside the jail, a process is not permitted to escape outside of this subtree. Traditional security issues which plagued the original chroot(2) design will not affect DragonFly jails.
7092
7093 * A hostname -- the hostname which will be used within the jail. Jails are mainly used for hosting network services, therefore having a descriptive hostname for each jail can really help the system administrator.
7094
7095 * An IP address -- this will be assigned to the jail and cannot be changed in any way during the jail's life span. The IP address of a jail is usually an alias address for an existing network interface, but this is not strictly necessary.
7096
7097 * A command -- the path name of an executable to run inside the jail. This is relative to the root directory of the jail environment, and may vary a lot, depending on the type of the specific jail environment.
7098 ***
7099
7100  Apart from these, jails can have their own set of users and their own root user. Naturally, the powers of the root user are limited within the jail environment and, from the point of view of the host system, the jail root user is not an omnipotent user. In addition, the root user of a jail is not allowed to perform critical operations to the system outside of the associated jail(8) environment. More information about capabilities and restrictions of the root user will be discussed in Section 12.5 below.
7101
7102 ----
7103
7104 ## Creating and Controlling Jails 
7105
7106  Some administrators divide jails into the following two types: ***complete*** jails, which resemble a real DragonFly system, and ***service*** jails, dedicated to one application or service, possibly running with privileges. This is only a conceptual division and the process of building a jail is not affected by it. The [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) manual page is quite clear about the procedure for building a jail:
7107
7108      
7109
7110     # setenv D /here/is/the/jail
7111     # mkdir -p $D                                     (1)
7112     # cd /usr/src
7113     # make installworld DESTDIR=$D                    (2)
7114     # cd etc 
7115     # make distribution DESTDIR=$D -DNO_MAKEDEV_RUN   (3)
7116     # cd $D
7117     # ln -sf dev/null kernel
7118     # mount_devfs -o jail $D/dev
7119     #
7120
7121   **(1)** 
7122
7123   Selecting a location for a jail is the best starting point. This is where the jail will physically reside within the file system of the jail's host. A good choice can be ***/usr/jail/jailname***, where jailname is the hostname identifying the jail. The ***/usr/*** file system usually has enough space for the jail file system, which for ***complete*** jails is, essentially, a replication of every file present in a default installation of the DragonFly base system.
7124 ***
7125
7126   **(2)** 
7127
7128   This command will populate the directory subtree chosen as jail's physical location on the file system with the necessary binaries, libraries, manual pages and so on. Everything is done in the typical DragonFly style -- first everything is built/compiled, then installed to the destination path.
7129 ***
7130
7131  **(3)**
7132
7133   The distribution target for make installs every needed configuration file. In simple words, it installs every installable file of ***/usr/src/etc/*** to the ***/etc*** directory of the jail environment: ***$D/etc/***.
7134
7135 ***
7136
7137  Once a jail is installed, it can be started by using the [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) utility. The [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) utility takes four mandatory arguments which are described in the Section 12.3.1. Other arguments may be specified too, e.g., to run the jailed process with the credentials of a specific user. The command argument depends on the type of the jail; for a virtual system, ***/etc/rc*** is a good choice, since it will replicate the startup sequence of a real DragonFly system. For a service jail, it depends on the service or application that will run within the jail.
7138
7139  Jails are often started at boot time and the DragonFly rc mechanism provides an easy way to do this.
7140
7141 ***
7142  A list of the jails which are enabled to start at boot time should be added to the [rc.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.conf&section=5) file:
7143
7144      
7145
7146     jail_enable="YES"   # Set to NO to disable starting of any jails
7147     jail_list="www"     # Space separated list of names of jails
7148     #
7149
7150 ***
7151
7152  For each jail listed in ***jail_list***, a group of [rc.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.conf&section=5) settings, which describe the particular jail, should be added:
7153
7154      
7155
7156     jail_www_rootdir="/usr/jail/www"     # jail's root directory
7157     jail_www_hostname="www.example.org"  # jail's hostname
7158     jail_www_ip="192.168.0.10"           # jail's IP address
7159     #
7160
7161  The default startup of jails configured in [rc.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.conf&section=5), will run the ***/etc/rc*** script of the jail, which assumes the jail is a complete virtual system. For service jails, the default startup command of the jail should be changed, by setting the ***jail_jailname_exec_start*** option appropriately.
7162
7163    **Note:**  For a full list of available options, please see the [rc.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.conf&section=5) manual page.
7164
7165  The ***/etc/rc.d/jail*** script can be used to start or stop a jail by hand, if an entry for it exists in ***rc.conf***:
7166
7167     # /etc/rc.d/jail start www
7168     # /etc/rc.d/jail stop www
7169
7170 ***
7171
7172  A clean way to shut down a [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) is not available at the moment. This is because commands normally used to accomplish a clean system shutdown cannot be used inside a jail. The best way to shut down a jail is to run the following command from within the jail itself or using the [jexec(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jexec&section=8) utility from outside the jail:
7173
7174      
7175
7176     # sh /etc/rc.shutdown
7177
7178  More information about this can be found in the [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) manual page.
7179
7180 ----
7181
7182 ## Fine Tuning and Administration 
7183
7184  There are several options which can be set for any jail, and various ways of combining a host DragonFly system with jails, to produce higher level applications. This section presents some of the options available for tuning the behavior and security restrictions implemented by a jail installation.
7185
7186 ## System tools for jail tuning in DragonFly 
7187
7188  Fine tuning of a jail's configuration is mostly done by setting [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8) variables. A special subtree of sysctl exists as a basis for organizing all the relevant options: the ***securityjail**** hierarchy of DragonFly kernel options. Here is a list of the main jail-related sysctls, complete with their default value. Names should be self-explanatory, but for more information about them, please refer to the [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) and [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8) manual pages.
7189
7190 * jail.set_hostname_allowed: 1
7191
7192 * jail.socket_unixiproute_only: 1
7193
7194 * jail.sysvipc_allowed: 0
7195
7196 * jail.enforce_statfs: 2
7197
7198 * jail.allow_raw_sockets: 0
7199
7200 * jail.chflags_allowed: 0
7201
7202 * jail.jailed: 0
7203
7204 These variables can be used by the system administrator of the host system to add or remove some of the limitations imposed by default on the root user. Note that there are some limitations which cannot be removed. The root user is not allowed to mount or unmount file systems from within a [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8). The root inside a jail may not set firewall rules or do many other administrative tasks which require modifications of in-kernel data, such as setting the securelevel of the kernel.
7205
7206 ***
7207
7208  The base system of DragonFly contains a basic set of tools for viewing information about the active jails, and attaching to a jail to run administrative commands. The [jls(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jls&section=8) and [jexec(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jexec&section=8) commands are part of the base DragonFly system, and can be used to perform the following simple tasks:
7209
7210  * Print a list of active jails and their corresponding jail identifier (JID), IP address, hostname and path.
7211
7212  * Attach to a running jail, from its host system, and run a command inside the jail or perform administrative tasks inside the jail itself. This is especially useful when the root user wants to cleanly shut down a jail. The [jexec(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jexec&section=8) utility can also be used to start a shell in a jail to do administration in it; for example:
7213
7214        
7215
7216           # jexec 1 tcsh
7217
7218 ***This Page is under constructions. New software are being added regularly.***
7219 **Follow the links below to see how to make corresponding software work on DragonFly**
7220
7221 [[!toc levels=3 ]]
7222
7223 ## Servers
7224 [[SSHserver]]
7225
7226 [FTP Server](http://www.dragonflybsd.org/docs/newhandbook/FTP/)
7227
7228 ## Installing flash player on firefox.
7229
7230 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
7231
7232 ### Configure Linux Support
7233
7234     # echo "linux_load=yes" >> /boot/loader.conf
7235     # echo "linux_enable=yes" >> /etc/rc.conf
7236     # echo "proc  /compat/linux/proc  linprocfs  rw  0  0" >> /etc/fstab
7237
7238 **Reboot DragonFly** ( not necessarry but easier for new users )  so that Linux Emulation is loaded to the kernel and configured correctly.
7239
7240 ### Install multimedia/libflashsupport from pkgsrc. 
7241
7242     # cd /usr/pkgsrc/multimedia/libflashsupport
7243     # bmake package
7244
7245 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.
7246
7247     # pkg_info |grep suse
7248     suse_openssl-10.0nb5 Linux compatibility package for OpenSSL
7249     suse_gtk2-10.0nb4   Linux compatibility package for GTK+-2.x
7250     suse_gtk-10.0nb2    Linux compatibility package for GTK+-1.x
7251     suse_libjpeg-10.0nb2 Linux compatibility package for JPEG
7252     suse_base-10.0nb5   Linux compatibility package
7253     suse_slang-10.0nb3  Linux compatibility package for S-Lang
7254     suse_locale-10.0nb2 Linux compatibility package with locale files
7255     suse_fontconfig-10.0nb6 Linux compatibility package for fontconfig
7256     suse_libtiff-10.0nb4 Linux compatibility package for TIFF
7257     suse_openmotif-10.0nb2 Linux compatibility package for OpenMotif
7258     suse_libpng-10.0nb4 Linux compatibility package for PNG
7259     suse_libcups-10.0nb4 Linux compatibility package for CUPS
7260     suse_gdk-pixbuf-10.0nb3 Linux compatibility package for gdk-pixbuf
7261     suse_expat-10.0nb2  Linux compatibility package for expat
7262     suse_vmware-10.0nb2 Linux compatibility package to help run VMware
7263     suse_libxml2-10.0nb2 Linux compatibility package for libxml2
7264     suse_compat-10.0nb3 Linux compatibility package with old shared libraries
7265     suse_x11-10.0nb4    Linux compatibility package for X11
7266     suse_glx-10.0nb4    Linux compatibility package for OpenGL/Mesa
7267     suse_freetype2-10.0nb5 Linux compatibility package for freetype-2.x
7268     suse_aspell-10.0nb2 Linux compatibility package for aspell
7269     suse-10.0nb4        SUSE-based Linux binary emulation environment
7270
7271 ### Install www/nspluginwrapper 
7272
7273 This will allow DragonFly to use the Linux Binary Flash Plugin
7274
7275     # cd /usr/pkgsrc/www/nspluginwrapper
7276     # bmake package
7277
7278 ### Install multimedia/ns-flash
7279
7280 This is the Linux Flash Plugin itself.
7281
7282     # cd /usr/pkgsrc/multimedia/ns-flash
7283     # bmake NO_CHECKSUM=yes package
7284
7285 You can check if the Flash plugin is installed right by.
7286
7287     # /usr/pkg/bin/nspluginwrapper --list
7288     /usr/pkg/lib/netscape/plugins/npwrapper.libflashplayer.so
7289       Original plugin: /usr/pkg/lib/netscape/plugins/libflashplayer.so
7290       Wrapper version string: 1.2.2
7291     /usr/pkg/lib/netscape/plugins/npwrapper.libflashplayer.so
7292       Original plugin: /usr/pkg/lib/netscape/plugins/libflashplayer.so
7293       Wrapper version string: 1.2.2
7294
7295 Don't worry if it is listed twice as above.
7296
7297 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).
7298
7299 You can watch Streaming Flash now.
7300
7301 ## Chapter 18 Serial Communications 
7302 [[!toc  levels=3]]
7303
7304 ***Reorganized, and parts rewritten by Ivailo Mladenov. ***
7305
7306 ## Synopsis 
7307
7308 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.
7309
7310 After reading this chapter, you will know:
7311
7312 * How to connect terminals to your DragonFly system.
7313
7314 * How to use a modem to dial out to remote hosts.
7315
7316 * How to allow remote users to login to your system with a modem.
7317
7318 * How to boot your system from a serial console.
7319
7320 Before reading this chapter, you should:
7321
7322 * Know how to configure and install a new kernel ([kernelconfig.html Chapter 10]).
7323
7324 * Understand UNIX permissions and processes ([basics.html Chapter 3]).
7325
7326 * Have access to the technical manual for the serial hardware (modem or multi-port card) that you would like to use with DragonFly.
7327
7328 ***
7329
7330 ## 18.1 Introduction 
7331
7332 ### 18.1.1 Terminology 
7333
7334 bps:: Bits per Second -- the rate at which data is transmitted;
7335
7336 DTE:: Data Terminal Equipment -- for example, your computer;
7337
7338 DCE:: Data Communications Equipment -- your modem;
7339
7340 RS-232:: EIA standard for hardware serial communications.
7341
7342 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).
7343
7344 ### 18.1.2 Cables and Ports 
7345
7346 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.
7347
7348 #### 18.1.2.1 Cables 
7349
7350 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.
7351
7352 ##### 18.1.2.1.1 Null-modem Cables 
7353
7354 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.
7355
7356 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.
7357
7358 [[!table  data="""
7359 | Signal | Pin # |  | Pin # | Signal 
7360  SG | 7 | connects to | 7 | SG 
7361  TxD | 2 | connects to | 3 | RxD 
7362  RxD | 3 | connects to | 2 | TxD 
7363  RTS | 4 | connects to | 5 | CTS 
7364  CTS | 5 | connects to | 4 | RTS 
7365  DTR | 20 | connects to | 6 | DSR 
7366  DCD | 8 |  | 6 | DSR 
7367  DSR | 6 | connects to | 20 | DTR |
7368
7369 """]]
7370
7371  **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.
7372
7373 ##### 18.1.2.1.2 Standard RS-232C Cables 
7374
7375 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.
7376
7377 #### 18.1.2.2 Ports 
7378
7379 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.
7380
7381 ##### 18.1.2.2.1 Kinds of Ports 
7382
7383 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.
7384
7385 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.
7386
7387 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.
7388
7389 ##### 18.1.2.2.2 Port Names 
7390
7391 In DragonFly, you access each serial port through an entry in the `/dev` directory. There are two different kinds of entries:
7392
7393 * 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.
7394
7395 * 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.
7396
7397 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.
7398
7399 ### 18.1.3 Kernel Configuration 
7400
7401 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.
7402
7403 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`.
7404
7405  **Tip:** To view just the messages that have the word `sio`, use the command:
7406
7407     
7408
7409     # /sbin/dmesg | grep 'sio'
7410
7411 For example, on a system with four serial ports, these are the serial-port specific kernel boot messages:
7412
7413     
7414
7415     sio0 at 0x3f8-0x3ff irq 4 on isa
7416
7417     sio0: type 16550A
7418
7419     sio1 at 0x2f8-0x2ff irq 3 on isa
7420
7421     sio1: type 16550A
7422
7423     sio2 at 0x3e8-0x3ef irq 5 on isa
7424
7425     sio2: type 16550A
7426
7427     sio3 at 0x2e8-0x2ef irq 9 on isa
7428
7429     sio3: type 16550A
7430
7431 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].
7432
7433 The relevant device lines for your kernel configuration file would look like this:
7434
7435     
7436
7437     device              sio0    at isa? port IO_COM1 irq 4
7438
7439     device              sio1    at isa? port IO_COM2 irq 3
7440
7441     device              sio2    at isa? port IO_COM3 irq 5
7442
7443     device              sio3    at isa? port IO_COM4 irq 9
7444
7445  **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).
7446
7447 ### 18.1.4 Device Special Files 
7448
7449 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.
7450
7451 ### 18.1.5 Serial Port Configuration 
7452
7453 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
7454
7455     
7456
7457     # stty -a -f /dev/ttyd1
7458
7459 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:
7460
7461     
7462
7463     # stty -f /dev/ttyid5 clocal cs8 ixon ixoff
7464
7465 System-wide initialization of the serial devices is controlled in `/etc/rc.serial`. This file affects the default settings of serial devices.
7466
7467 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:
7468
7469     
7470
7471     # stty -f /dev/ttyld5 57600
7472
7473 Now, an application that opens `ttyd5` and tries to change the speed of the port will be stuck with 57600 bps.
7474
7475 Naturally, you should make the initial state and lock state devices writable only by the `root` account.
7476
7477 ***
7478
7479 ## 18.2 Terminals 
7480
7481 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.
7482
7483 ### 18.2.1 Uses and Types of Terminals 
7484
7485 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.
7486
7487 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.
7488
7489 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.
7490
7491 For DragonFly, there are three kinds of terminals:
7492
7493 * [ Dumb terminals](term.html#TERM-DUMB)
7494
7495 * [ PCs acting as terminals](term.html#TERM-PCS)
7496
7497 * [ X terminals](term.html#TERM-X)
7498
7499 #### 18.2.1.1 Dumb Terminals 
7500
7501 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.
7502
7503 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.
7504
7505 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.
7506
7507 #### 18.2.1.2 PCs Acting as Terminals 
7508
7509 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.
7510
7511 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.
7512
7513 #### 18.2.1.3 X Terminals 
7514
7515 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.
7516
7517 We introduce X terminals just for the sake of completeness. However, this chapter does ***not*** cover setup, configuration, or use of X terminals.
7518
7519 ### 18.2.2 Configuration 
7520
7521 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.
7522
7523 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.
7524
7525 Thus, to configure terminals for your DragonFly system the following steps should be taken as `root`:
7526
7527   1. Add a line to `/etc/ttys` for the entry in the `/dev` directory for the serial port if it is not already there.
7528
7529   1. Specify that `/usr/libexec/getty` be run on the port, and specify the appropriate `***getty***` type from the `/etc/gettytab` file.
7530
7531   1. Specify the default terminal type.
7532
7533   1. Set the port to ***on.***
7534
7535   1. Specify whether the port should be ***secure.***
7536
7537   1. Force `init` to reread the `/etc/ttys` file.
7538
7539 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.
7540
7541 #### 18.2.2.1 Adding an Entry to `/etc/ttys` 
7542
7543 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`).
7544
7545 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.
7546
7547  **Example 17-1. Adding Terminal Entries to `/etc/ttys`** 
7548
7549 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:
7550
7551     
7552
7553     ttyd1./imagelib/callouts/1.png  "/usr/libexec/getty std.38400"./imagelib/callouts/2.png  wy50./imagelib/callouts/3.png  on./imagelib/callouts/4.png  insecure./imagelib/callouts/5.png
7554
7555     ttyd5   "/usr/libexec/getty std.19200"  vt100  on  insecure
7556
7557     
7558
7559 [ ./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.
7560
7561 #### 18.2.2.2 Force `init` to Reread `/etc/ttys` 
7562
7563 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:
7564
7565     
7566
7567     # kill -HUP 1
7568
7569  **Note:** `init` is always the first process run on a system, therefore it will always have PID 1.
7570
7571 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.
7572
7573 ### 18.2.3 Troubleshooting Your Connection 
7574
7575 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.
7576
7577 #### 18.2.3.1 No Login Prompt Appears 
7578
7579 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.
7580
7581 Make sure the cable is connected firmly to both the terminal and the DragonFly computer. Make sure it is the right kind of cable.
7582
7583 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.
7584
7585 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:
7586
7587     
7588
7589     # ps -axww|grep getty
7590
7591 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`:
7592
7593     
7594
7595     22189  d1  Is+    0:00.03 /usr/libexec/getty std.38400 ttyd1
7596
7597 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.
7598
7599 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.
7600
7601 #### 18.2.3.2 If Garbage Appears Instead of a Login Prompt 
7602
7603 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`.
7604
7605 #### 18.2.3.3 Characters Appear Doubled, the Password Appears When Typed 
7606
7607 Switch the terminal (or the terminal emulation software) from ***half duplex*** or ***local echo*** to ***full duplex.***
7608
7609 ***
7610
7611 ## 18.3 Dial-in Service 
7612
7613 Configuring your DragonFly system for dial-in service is very similar to connecting terminals except that you are dealing with modems instead of terminals.
7614
7615 ### 18.3.1 External vs. Internal Modems 
7616
7617 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.
7618
7619 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.
7620
7621 #### 18.3.1.1 Modems and Cables 
7622
7623 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:
7624
7625 * Transmitted Data (SD)
7626
7627 * Received Data (RD)
7628
7629 * Request to Send (RTS)
7630
7631 * Clear to Send (CTS)
7632
7633 * Data Set Ready (DSR)
7634
7635 * Data Terminal Ready (DTR)
7636
7637 * Carrier Detect (CD)
7638
7639 * Signal Ground (SG)
7640
7641 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.
7642
7643 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.
7644
7645 ### 18.3.2 Serial Interface Considerations 
7646
7647 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.
7648
7649 ### 18.3.3 Quick Overview 
7650
7651 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:
7652
7653     
7654
7655      4850 ??  I      0:00.09 /usr/libexec/getty V19200 ttyd0
7656
7657 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.
7658
7659 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.
7660
7661 ### 18.3.4 Configuration Files 
7662
7663 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.
7664
7665 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.
7666
7667 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.
7668
7669 This section will try to give balanced configuration information, but is biased towards having the modem's data rate follow the connection rate.
7670
7671 #### 18.3.4.1 `/etc/gettytab` 
7672
7673 `/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.
7674
7675 ##### 18.3.4.1.1 Locked-speed Config 
7676
7677 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`.
7678
7679 ##### 18.3.4.1.2 Matching-speed Config 
7680
7681 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.
7682
7683     
7684
7685     #
7686
7687     # Fast dialup terminals, 2400/1200/300 rotary (can start either way)
7688
7689     #
7690
7691     D2400|d2400|Fast-Dial-2400:\
7692
7693             :nx#D1200:tc2400-baud:
7694
7695     3|D1200|Fast-Dial-1200:\
7696
7697             :nx#D300:tc1200-baud:
7698
7699     5|D300|Fast-Dial-300:\
7700
7701             :nx#D2400:tc300-baud:
7702
7703 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:
7704
7705     
7706
7707     #
7708
7709     # Additions for a V.32bis Modem
7710
7711     #
7712
7713     um|V300|High Speed Modem at 300,8-bit:\
7714
7715             :nx#V19200:tcstd.300:
7716
7717     un|V1200|High Speed Modem at 1200,8-bit:\
7718
7719             :nx#V300:tcstd.1200:
7720
7721     uo|V2400|High Speed Modem at 2400,8-bit:\
7722
7723             :nx#V1200:tcstd.2400:
7724
7725     up|V9600|High Speed Modem at 9600,8-bit:\
7726
7727             :nx#V2400:tcstd.9600:
7728
7729     uq|V19200|High Speed Modem at 19200,8-bit:\
7730
7731             :nx#V9600:tcstd.19200:
7732
7733 This will result in 8-bit, no parity connections.
7734
7735 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.
7736
7737 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:
7738
7739     
7740
7741     #
7742
7743     # Additions for a V.32bis or V.34 Modem
7744
7745     # Starting at 57.6 Kbps
7746
7747     #
7748
7749     vm|VH300|Very High Speed Modem at 300,8-bit:\
7750
7751             :nx#VH57600:tcstd.300:
7752
7753     vn|VH1200|Very High Speed Modem at 1200,8-bit:\
7754
7755             :nx#VH300:tcstd.1200:
7756
7757     vo|VH2400|Very High Speed Modem at 2400,8-bit:\
7758
7759             :nx#VH1200:tcstd.2400:
7760
7761     vp|VH9600|Very High Speed Modem at 9600,8-bit:\
7762
7763             :nx#VH2400:tcstd.9600:
7764
7765     vq|VH57600|Very High Speed Modem at 57600,8-bit:\
7766
7767             :nx#VH9600:tcstd.57600:
7768
7769 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.
7770
7771 #### 18.3.4.2 `/etc/ttys` 
7772
7773 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:
7774
7775     
7776
7777     ttyd0   "/usr/libexec/getty `***xxx***`"   dialup on
7778
7779 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).
7780
7781 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.
7782
7783 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
7784
7785     
7786
7787     # kill -HUP 1
7788
7789  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`.
7790
7791 ##### 18.3.4.2.1 Locked-speed Config 
7792
7793 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:
7794
7795     
7796
7797     ttyd0   "/usr/libexec/getty std.19200"   dialup on
7798
7799 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`.
7800
7801 ##### 18.3.4.2.2 Matching-speed Config 
7802
7803 In a matching-speed configuration, your `ttys` entry needs to reference the appropriate beginning ***auto-baud*** (sic) entry in `/etc/gettytab`. For example, if you added the above suggested entry for a matching-speed modem that starts at 19.2 Kbps (the `gettytab` entry containing the `V19200` starting point), your `ttys` entry might look like this:
7804
7805     
7806
7807     ttyd0   "/usr/libexec/getty V19200"   dialup on
7808
7809 #### 18.3.4.3 `/etc/rc.serial` 
7810
7811 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.
7812
7813 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`:
7814
7815     
7816
7817     # Serial port initial configuration
7818
7819     stty -f /dev/ttyid1 crtscts
7820
7821     stty -f /dev/cuaia1 crtscts
7822
7823 ### 18.3.5 Modem Settings 
7824
7825 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:
7826
7827 * CD asserted when connected
7828
7829 * DTR asserted for operation; dropping DTR hangs up line and resets modem
7830
7831 * CTS transmitted data flow control
7832
7833 * Disable XON/XOFF flow control
7834
7835 * RTS received data flow control
7836
7837 * Quiet mode (no result codes)
7838
7839 * No command echo
7840
7841 Please read the documentation for your modem to find out what commands and/or DIP switch settings you need to give it.
7842
7843 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:
7844
7845     
7846
7847     ATZ
7848
7849     AT&amp;C1&amp;D2&amp;H1&amp;I0&amp;R2&amp;W
7850
7851 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.
7852
7853 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:
7854
7855 * Switch 1: UP -- DTR Normal
7856
7857 * Switch 2: N/A (Verbal Result Codes/Numeric Result Codes)
7858
7859 * Switch 3: UP -- Suppress Result Codes
7860
7861 * Switch 4: DOWN -- No echo, offline commands
7862
7863 * Switch 5: UP -- Auto Answer
7864
7865 * Switch 6: UP -- Carrier Detect Normal
7866
7867 * Switch 7: UP -- Load NVRAM Defaults
7868
7869 * Switch 8: N/A (Smart Mode/Dumb Mode)
7870
7871 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.
7872
7873 #### 18.3.5.1 Locked-speed Config 
7874
7875 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:
7876
7877     
7878
7879     ATZ
7880
7881     AT&amp;B1&amp;W
7882
7883 #### 18.3.5.2 Matching-speed Config 
7884
7885 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:
7886     
7887
7888     ATZ
7889
7890     AT&amp;B2&amp;W
7891
7892 #### 18.3.5.3 Checking the Modem's Configuration 
7893
7894 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`.
7895
7896 If you have a different brand of modem, check your modem's manual to see how to double-check your modem's configuration parameters.
7897
7898 ### 18.3.6 Troubleshooting 
7899
7900 Here are a few steps you can follow to check out the dial-up modem on your system.
7901
7902 #### 18.3.6.1 Checking Out the DragonFly System 
7903
7904 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.
7905
7906 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:
7907
7908     
7909
7910       114 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd0
7911
7912       115 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd1
7913
7914 If you see something different, like this:
7915
7916     
7917
7918       114 d0  I      0:00.10 /usr/libexec/getty V19200 ttyd0
7919
7920 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.
7921
7922 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.
7923
7924 #### 18.3.6.2 Try Dialing In 
7925
7926 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).
7927
7928 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).
7929
7930 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.
7931
7932 ***
7933 ## 18.4 Dial-out Service 
7934
7935 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.
7936
7937 This is useful to log onto a BBS.
7938
7939 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.
7940
7941 ### 18.4.1 My Stock Hayes Modem Is Not Supported, What Can I Do? 
7942
7943 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.
7944
7945 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`).
7946
7947 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`.
7948
7949  **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.
7950
7951 Edit the line `#define HAYES 0` to `#define HAYES 1`. Then `make` and `make install`. Everything works nicely after that.
7952
7953 ### 18.4.2 How Am I Expected to Enter These AT Commands? 
7954
7955 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:
7956
7957     
7958
7959     cuaa0:dv#/dev/cuaa0:br#19200:panone
7960
7961 Use the highest bps rate your modem supports in the br capability. Then, type `tip cuaa0` and you will be connected to your modem.
7962
7963 Or use `cu` as `root` with the following command:
7964
7965     
7966
7967     # cu -l`***line***` -s`***speed***`
7968
7969 `***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.
7970
7971 ### 18.4.3 The `@` Sign for the pn Capability Does Not Work! 
7972
7973 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:
7974
7975     
7976
7977     pn=\@
7978
7979 ### 18.4.4 How Can I Dial a Phone Number on the Command Line? 
7980
7981 Put what is called a ***generic*** entry in your `/etc/remote` file. For example:
7982
7983     
7984
7985     tip115200|Dial any phone number at 115200 bps:\
7986
7987             :dv#/dev/cuaa0:br#115200:athayes:pa=none:du:
7988
7989     tip57600|Dial any phone number at 57600 bps:\
7990
7991             :dv#/dev/cuaa0:br#57600:athayes:pa=none:du:
7992
7993 Then you can do things like:
7994
7995     
7996
7997     # tip -115200 5551234
7998
7999 If you prefer `cu` over `tip`, use a generic `cu` entry:
8000
8001     
8002
8003     cu115200|Use cu to dial any number at 115200bps:\
8004
8005             :dv#/dev/cuaa1:br#57600:athayes:pa=none:du:
8006
8007 and type:
8008
8009     
8010
8011     # cu 5551234 -s 115200
8012
8013 ### 18.4.5 Do I Have to Type in the bps Rate Every Time I Do That? 
8014
8015 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.
8016
8017 ### 18.4.6 I Access a Number of Hosts Through a Terminal Server 
8018
8019 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`:
8020
8021     
8022
8023     pain|pain.deep13.com|Forrester's machine:\
8024
8025             :cm#CONNECT pain\n:tcdeep13:
8026
8027     muffin|muffin.deep13.com|Frank's machine:\
8028
8029             :cm#CONNECT muffin\n:tcdeep13:
8030
8031     deep13:Gizmonics Institute terminal server:\
8032
8033             :dv#/dev/cuaa2:br#38400:athayes:du:pa=none:pn=5551234:
8034
8035 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.
8036
8037 ### 18.4.7 Can Tip Try More Than One Line for Each Site? 
8038
8039 This is often a problem where a university has several modem lines and several thousand students trying to use them.
8040
8041 Make an entry for your university in `/etc/remote` and use `@` for the `pn` capability:
8042
8043     
8044
8045     big-university:\
8046
8047             :pn#\@:tcdialout
8048
8049     dialout:\
8050
8051             :dv#/dev/cuaa3:br#9600:atcourier:du:pa=none:
8052
8053 Then, list the phone numbers for the university in `/etc/phones`:
8054
8055     
8056
8057     big-university 5551111
8058
8059     big-university 5551112
8060
8061     big-university 5551113
8062
8063     big-university 5551114
8064
8065 `tip` will try each one in the listed order, then give up. If you want to keep retrying, run `tip` in a while loop.
8066
8067 ### 18.4.8 Why Do I Have to Hit  **Ctrl** + **P**  Twice to Send  **Ctrl** + **P**  Once? 
8068
8069  **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.***
8070
8071 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.
8072
8073 You can have the force character be whatever you want by specifying the following in your `$HOME/.tiprc` file:
8074
8075     
8076
8077     force=&lt;single-char&gt;
8078
8079 ### 18.4.9 Suddenly Everything I Type Is in Upper Case?? 
8080
8081 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.
8082
8083 Here is a sample .tiprc file perfect for  **Emacs**  users who need to type  **Ctrl** + **2**  and  **Ctrl** + **A**  a lot:
8084
8085     
8086
8087     force=^^
8088
8089     raisechar=^^
8090
8091 The ^^ is  **Shift** + **Ctrl** + **6** .
8092
8093 ### 18.4.10 How Can I Do File Transfers with `tip`? 
8094
8095 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:
8096
8097 `~p` local-file [remote-file]
8098
8099 `~t` remote-file [local-file]
8100
8101 There is no error checking, so you probably should use another protocol, like zmodem.
8102
8103 ### 18.4.11 How Can I Run zmodem with `tip`? 
8104
8105 To receive files, start the sending program on the remote end. Then, type `~C rz` to begin receiving them locally.
8106
8107 To send files, start the receiving program on the remote end. Then, type `~C sz `***files****** to send them to the remote system.
8108
8109 ***
8110
8111 ## 18.5 Setting Up the Serial Console 
8112
8113 ### 18.5.1 Introduction 
8114
8115 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.
8116
8117 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.
8118
8119 In order to set up the serial console you must configure the boot block code, the boot loader code and the kernel.
8120
8121 ### 18.5.2 Serial Console Configuration, Terse Version 
8122
8123 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].
8124
8125   1. Connect the serial port. The serial console will be on COM1.
8126
8127   1. `echo -h &gt; /boot.config` to enable the serial console for the boot loader and kernel.
8128
8129   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.
8130
8131   1. `shutdown -r now` will reboot the system with the serial console.
8132
8133 ### 18.5.3 Serial Console Configuration 
8134
8135   1. Prepare a serial cable.
8136
8137   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.
8138
8139   1. Unplug your keyboard.
8140
8141   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.
8142
8143   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.)
8144
8145   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.
8146
8147    **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.
8148
8149    **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.
8150
8151   1. Plug a dumb terminal into `COM1` (`sio0`).
8152
8153   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.)
8154
8155   1. Make sure the configuration file of your kernel has appropriate flags set for `COM1` (`sio0`).
8156
8157   Relevant flags are:
8158
8159   `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.
8160
8161   Example:
8162
8163       
8164
8165       device sio0 at isa? port IO_COM1 flags 0x10 irq 4
8166
8167   
8168
8169   See the [sio(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#sio&section4) manual page for more details.
8170
8171   If the flags were not set, you need to run UserConfig (on a different console) or recompile the kernel.
8172
8173   1. Create `boot.config` in the root directory of the `a` partition on the boot drive.
8174
8175   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:
8176
8177   `-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.
8178
8179    **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.
8180
8181   Use either the `-P` option to select the console automatically, or the `-h` option to activate the serial console.
8182
8183   You may include other options described in [boot(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#boot&section8) as well.
8184
8185   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.
8186
8187   1. Boot the machine.
8188
8189   When you start your DragonFly box, the boot blocks will echo the contents of `/boot.config` to the console. For example:
8190
8191       
8192
8193       /boot.config: -P
8194
8195       Keyboard: no
8196
8197   
8198
8199   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`.
8200
8201   || Options || Message goes to ||
8202
8203   || none || internal console ||
8204
8205   || `-h` || serial console ||
8206
8207   || `-D` || serial and internal consoles ||
8208
8209   || `-Dh` || serial and internal consoles ||
8210
8211   || `-P`, keyboard present || internal console ||
8212
8213   || `-P`, keyboard absent || serial console ||
8214
8215   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.
8216
8217   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:
8218
8219       
8220
8221       &gt;&gt; DragonFly/i386 BOOT
8222
8223       Default: 0:ad(0,a)/boot/loader
8224
8225       boot:
8226
8227   
8228
8229   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.
8230
8231   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.
8232
8233 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].
8234
8235 ### 18.5.4 Summary 
8236
8237 Here is the summary of various settings discussed in this section and the console eventually selected.
8238
8239 #### 18.5.4.1 Case 1: You Set the Flags to 0x10 for `sio0` 
8240
8241     
8242
8243     device sio0 at isa? port IO_COM1 flags 0x10 irq 4
8244
8245 [[!table  data="""
8246 | Options in /boot.config | Console during boot blocks | Console during boot loader | Console in kernel 
8247  nothing | internal | internal | internal 
8248  `-h` | serial | serial | serial 
8249  `-D` | serial and internal | internal | internal 
8250  `-Dh` | serial and internal | serial | serial 
8251  `-P`, keyboard present | internal | internal | internal 
8252  `-P`, keyboard absent | serial and internal | serial | serial |
8253
8254 """]]
8255
8256 #### 18.5.4.2 Case 2: You Set the Flags to 0x30 for sio0 
8257
8258     
8259
8260     device sio0 at isa? port IO_COM1 flags 0x30 irq 4
8261
8262 [[!table  data="""
8263 | Options in /boot.config | Console during boot blocks | Console during boot loader | Console in kernel 
8264  nothing | internal | internal | serial 
8265  `-h` | serial | serial | serial 
8266  `-D` | serial and internal | internal | serial 
8267  `-Dh` | serial and internal | serial | serial 
8268  `-P`, keyboard present | internal | internal | serial 
8269  `-P`, keyboard absent | serial and internal | serial | serial |
8270
8271 """]]
8272
8273 ### 18.5.5 Tips for the Serial Console 
8274
8275 #### 18.5.5.1 Setting a Faster Serial Port Speed 
8276
8277 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:
8278
8279     
8280
8281     BOOT_COMCONSOLE_SPEED=19200
8282
8283 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:
8284
8285     
8286
8287     options CONSPEED=19200
8288
8289 #### 18.5.5.2 Using Serial Port Other Than `sio0` for the Console 
8290
8291 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.
8292
8293   1. Get the kernel source.
8294
8295   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.
8296
8297   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:
8298
8299       
8300
8301       device sio1 at isa? port IO_COM2 flags 0x10 irq 3
8302
8303   
8304
8305   or
8306
8307       
8308
8309       device sio1 at isa? port IO_COM2 flags 0x30 irq 3
8310
8311   
8312
8313   The console flags for the other serial ports should not be set.
8314
8315   1. Recompile and install the boot blocks and the boot loader:
8316
8317       
8318
8319       # cd /sys/boot
8320
8321       # make
8322
8323       # make install
8324
8325   
8326
8327   1. Rebuild and install the kernel.
8328
8329   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.
8330
8331 #### 18.5.5.3 Entering the DDB Debugger from the Serial Line 
8332
8333 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:
8334
8335     
8336
8337     options BREAK_TO_DEBUGGER
8338
8339     options DDB
8340
8341 #### 18.5.5.4 Getting a Login Prompt on the Serial Console 
8342
8343 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.
8344
8345 Open the file `/etc/ttys` with an editor and locate the lines:
8346
8347     
8348
8349     ttyd0 "/usr/libexec/getty std.9600" unknown off secure
8350
8351     ttyd1 "/usr/libexec/getty std.9600" unknown off secure
8352
8353     ttyd2 "/usr/libexec/getty std.9600" unknown off secure
8354
8355     ttyd3 "/usr/libexec/getty std.9600" unknown off secure
8356
8357 `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`.
8358
8359 You may also want to change the terminal type from `unknown` to the actual type of your serial terminal.
8360
8361 After editing the file, you must `kill -HUP 1` to make this change take effect.
8362
8363 ### 18.5.6 Changing Console from the Boot Loader 
8364
8365 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.
8366
8367 #### 18.5.6.1 Setting Up the Serial Console 
8368
8369 You can easily specify the boot loader and the kernel to use the serial console by writing just one line in `/boot/loader.rc`:
8370
8371     
8372
8373     set console=comconsole
8374
8375 This will take effect regardless of the settings in the boot block discussed in the previous section.
8376
8377 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.
8378
8379 Likewise, you can specify the internal console as:
8380
8381     
8382
8383     set console=vidconsole
8384
8385 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.
8386
8387 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:
8388
8389     
8390
8391     include /boot/loader.4th
8392
8393     start
8394
8395 Then, create `/boot/loader.conf.local` and put the following line there.
8396
8397     
8398
8399     console=comconsole
8400
8401 or
8402
8403     
8404
8405     console=vidconsole
8406
8407  **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.
8408
8409 #### 18.5.6.2 Using a Serial Port Other Than `sio0` for the Console 
8410
8411 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].
8412
8413 ### 18.5.7 Caveats 
8414
8415 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.***
8416
8417 # Chapter 1 Introduction 
8418
8419 ***Restructured, reorganized, and parts rewritten by Jim Mock. ***
8420
8421 ## Synopsis 
8422
8423 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.
8424
8425 After reading this chapter, you will know:
8426
8427 * How DragonFly relates to other computer operating systems.
8428
8429 * The history of the DragonFly Project.
8430
8431 * The goals of the DragonFly Project.
8432
8433 * The basics of the DragonFly open-source development model.
8434
8435 * And of course: where the name ***DragonFly*** comes from.
8436
8437 ----
8438
8439 ## Welcome to DragonFly! 
8440
8441  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.
8442
8443 ### What Can DragonFly Do? 
8444
8445 <!-- Cutout of "features". This is outdated bullshit -->
8446
8447 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. 
8448
8449 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. 
8450
8451 As many of the commercial giants struggle to field PC operating systems with such features, performance and reliability, DragonFly can offer them ***now***!
8452 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.
8453
8454  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.
8455
8456  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:
8457
8458 The robust TCP/IP networking built into DragonFly makes it an ideal platform for a variety of Internet services such as:
8459
8460 * FTP servers
8461 * World Wide Web servers (standard or secure [SSL])
8462 * Firewalls and NAT (***IP masquerading***) gateways
8463 * Electronic Mail servers
8464 * USENET News or Bulletin Board Systems
8465 * And more...
8466
8467 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.
8468
8469 Here are some of the fields where people are using Dragonfly BSD, and the reasons that they find DragonFly BSD fits their needs:
8470
8471 * ***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!
8472
8473 * ***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.
8474
8475 * ***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.
8476
8477 * ***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.
8478
8479 * ***Software Development:*** The basic DragonFly system comes with a full complement of development tools including the renowned GNU C/C++ compiler and debugger.
8480
8481  DragonFly is available via anonymous FTP or GIT. Please see [Appendix A](mirrors.html) for more information about obtaining DragonFly.
8482
8483 For more help on installing, see the appropriate sections of this handbook.
8484
8485 ----
8486
8487 ## About the DragonFly Project 
8488
8489  The following section provides some background information on the project, including a brief history, project goals, and the development model of the project.
8490
8491 ### A Brief History of DragonFly 
8492
8493 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.
8494
8495 ### DragonFly Project Goals 
8496
8497 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.
8498
8499 ### The DragonFly Development Model 
8500
8501 ***Written by Justin Sherrill. ***
8502
8503 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.
8504
8505 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.
8506
8507 ### The Current DragonFly Release 
8508
8509 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.
8510
8511 ### DragonFly Origin 
8512
8513 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.
8514
8515 ## Updating the System 
8516
8517 ### Supported methods
8518
8519 The only **supported** method of upgrading DragonFly BSD is by building from source code. <br><br>
8520 Supported upgrade process includes going from the *previous release* to *latest release*.<br>
8521
8522 For example, in our actual case, only the upgrade process involving <u>2.10.x up to 3.0.x</u> would be supported.
8523
8524 ### Getting the source code
8525
8526 There is a Makefile in /usr which will ease the task of retrieving the source tree; it needs to be run as root:
8527
8528     % cd /usr
8529     % make src-create
8530      [...]
8531
8532 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).
8533
8534     % cd /usr/src
8535     % git checkout DragonFly_RELEASE_3_0
8536
8537 To see the available remote branches:
8538
8539     # cd /usr/src 
8540     # git pull
8541     # git branch -r
8542
8543 The leading edge (development trunk) version of the system will be the "master".
8544
8545 ### Build and upgrade process
8546
8547 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. 
8548
8549     % cd /usr/src
8550     % make buildworld
8551     % make buildkernel
8552     % make installkernel
8553     % make installworld
8554     % make upgrade
8555     (reboot)
8556
8557 **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>
8558 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:
8559 <br>
8560
8561     % sysctl hw.ncpu
8562     hw.ncpu: 2
8563
8564 An explanation of each step follows.
8565
8566 * <u>*make buildworld*</u> : This command builds all userland programs and it is the most time-consuming step.<br>
8567 Some programs may be discarded from the build process.<br>
8568 For more details check **[make.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=make.conf&section=ANY)** manpage. 
8569
8570 * <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.
8571
8572 * <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.
8573
8574 * <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.
8575
8576 * <u>*make upgrade*</u> : This cleans out any files made unnecessary by this upgrade.
8577
8578 * (reboot) : Reboot the computer to load the new kernel and use the new files installed as part of this process.
8579
8580 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.
8581
8582 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)**
8583
8584 # DragonFly BSD Quick Start
8585
8586 This QuickStart is part of the [[NewHandbook|/docs/newhandbook/]].
8587
8588 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.
8589
8590 [[!toc levels=3 ]]
8591 ## Some Unix and BSD Fundamentals
8592
8593 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.
8594
8595 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.
8596
8597 You should understand everything in the [[Unix Basics|/docs/newhandbook/UnixBasics/]] section before you proceed with trying to use your new system.
8598
8599 ## Disk layout of a New Dragonfly BSD System using the HAMMER filesystem
8600
8601 If you chose to install on the HAMMER file system during installation you will be left with a system with the following disk configuration:
8602
8603     # df -h
8604     Filesystem                Size   Used  Avail Capacity  Mounted on
8605     ROOT                      288G    12G   276G     4%    /
8606     devfs                     1.0K   1.0K     0B   100%    /dev
8607     /dev/serno/9VMBWDM1.s1a   756M   138M   558M    20%    /boot
8608     /pfs/@@-1:00001           288G    12G   276G     4%    /var
8609     /pfs/@@-1:00002           288G    12G   276G     4%    /tmp
8610     /pfs/@@-1:00003           288G    12G   276G     4%    /usr
8611     /pfs/@@-1:00004           288G    12G   276G     4%    /home
8612     /pfs/@@-1:00005           288G    12G   276G     4%    /usr/obj
8613     /pfs/@@-1:00006           288G    12G   276G     4%    /var/crash
8614     /pfs/@@-1:00007           288G    12G   276G     4%    /var/tmp
8615     procfs                    4.0K   4.0K     0B   100%    /proc
8616
8617 In this example
8618
8619 * `/dev/serno/9VMBWDM1` is the hard disk specified with serial number,
8620 * `/dev/serno/9VMBWDM1.s1` is the first slice on the hard disk.
8621
8622 The disklabel looks at follows
8623
8624     # disklabel /dev/serno/9VMBWDM1.s1
8625
8626     # /dev/serno/9VMBWDM1.s1:
8627     #
8628     # Informational fields calculated from the above
8629     # All byte equivalent offsets must be aligned
8630     #
8631     # boot space:    1044992 bytes
8632     # data space:  312567643 blocks # 305241.84 MB (320069266944 bytes)
8633     #
8634     # NOTE: If the partition data base looks odd it may be
8635     #       physically aligned instead of slice-aligned
8636     #
8637     diskid: e67030af-d2af-11df-b588-01138fad54f5
8638     label:
8639     boot2 data base:      0x000000001000
8640     partitions data base: 0x000000100200
8641     partitions data stop: 0x004a85ad7000
8642     backup label:         0x004a85ad7000
8643     total size:           0x004a85ad8200    # 305242.84 MB
8644     alignment: 4096
8645     display block size: 1024        # for partition display only
8646
8647     16 partitions:
8648     #          size     offset    fstype   fsuuid
8649       a:     786432          0    4.2BSD    #     768.000MB
8650       b:    8388608     786432      swap    #    8192.000MB
8651       d:  303392600    9175040    HAMMER    #  296281.836MB
8652       a-stor_uuid: eb1c8aac-d2af-11df-b588-01138fad54f5
8653       b-stor_uuid: eb1c8aec-d2af-11df-b588-01138fad54f5
8654       d-stor_uuid: eb1c8b21-d2af-11df-b588-01138fad54f5
8655
8656 The slice has 3 partitions:
8657
8658 * `a` - for `/boot`
8659 * `b` - for swap
8660 * `d` - for `/`, a HAMMER file system labeled ROOT
8661
8662 When you create a HAMMER file system you must give it a label, here the installer labeled it as "ROOT" and mounted it as
8663
8664     ROOT                      288G    12G   276G     4%    /
8665
8666 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 `/`.
8667
8668 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`:
8669
8670     # cat /etc/fstab
8671
8672     # Device                Mountpoint      FStype  Options         Dump    Pass#
8673     /dev/serno/9VMBWDM1.s1a         /boot           ufs     rw      1       1
8674     /dev/serno/9VMBWDM1.s1b         none            swap    sw      0       0
8675     /dev/serno/9VMBWDM1.s1d         /               hammer  rw      1       1
8676     /pfs/var                /var            null    rw              0       0
8677     /pfs/tmp                /tmp            null    rw              0       0
8678     /pfs/usr                /usr            null    rw              0       0
8679     /pfs/home               /home           null    rw              0       0
8680     /pfs/usr.obj    /usr/obj                null    rw              0       0
8681     /pfs/var.crash  /var/crash              null    rw              0       0
8682     /pfs/var.tmp    /var/tmp                null    rw              0       0
8683     proc                    /proc           procfs  rw              0       0
8684
8685 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).
8686
8687 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.
8688
8689 Now if you look in `/var`
8690
8691     # cd /var/
8692     # ls
8693     account   backups   caps   cron    empty   log   msgs   run   spool   yp  at        
8694     cache     crash     db     games   lib     mail  preserve   rwho  tmp
8695
8696 you will find the above directories.
8697
8698 If you look at the status of one of the PFSes, e.g. `/usr` you will see `/var/hammer` is the default snapshot directory.
8699
8700     # hammer pfs-status /usr/
8701     /usr/   PFS #3 {
8702         sync-beg-tid=0x0000000000000001
8703         sync-end-tid=0x0000000117ac6270
8704         shared-uuid=f33e318e-d2af-11df-b588-01138fad54f5
8705         unique-uuid=f33e31cb-d2af-11df-b588-01138fad54f5
8706         label=""
8707         prune-min=00:00:00
8708         operating as a MASTER
8709         snapshots directory defaults to /var/hammer/<pfs>
8710     }
8711
8712 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`
8713
8714     # hammer snapls /usr
8715     Snapshots on /usr       PFS #3
8716     Transaction ID          Timestamp               Note
8717
8718 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.
8719
8720     # sudo hammer cleanup
8721     cleanup /                    - HAMMER UPGRADE: Creating snapshots
8722             Creating snapshots in /var/hammer/root
8723      handle PFS #0 using /var/hammer/root
8724                snapshots - run
8725                    prune - run
8726                rebalance - run..
8727                  reblock - run....
8728                   recopy - run....
8729     cleanup /var                 - HAMMER UPGRADE: Creating snapshots
8730     [...]
8731     cleanup /tmp                 - HAMMER UPGRADE: Creating snapshots
8732     [...]
8733     cleanup /usr                 - HAMMER UPGRADE: Creating snapshots
8734     [...]
8735     cleanup /home                - HAMMER UPGRADE: Creating snapshots
8736     [...]
8737     cleanup /usr/obj             - HAMMER UPGRADE: Creating snapshots
8738     [...]
8739     cleanup /var/crash           - HAMMER UPGRADE: Creating snapshots
8740     [...]
8741     cleanup /var/tmp             - HAMMER UPGRADE: Creating snapshots
8742     [...]
8743     cleanup /var/isos            - HAMMER UPGRADE: Creating snapshots
8744     [...]
8745
8746 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`.
8747
8748 In `/var` will be a new directory called *hammer* with the following sub directories
8749
8750     # cd hammer/
8751     # ls -l
8752     total 0
8753     drwxr-xr-x  1 root  wheel  0 Oct 13 11:51 home
8754     drwxr-xr-x  1 root  wheel  0 Oct 13 11:42 root
8755     drwxr-xr-x  1 root  wheel  0 Oct 13 11:43 tmp
8756     drwxr-xr-x  1 root  wheel  0 Oct 13 11:51 usr
8757     drwxr-xr-x  1 root  wheel  0 Oct 13 11:54 var
8758
8759 Well let us look inside `/var/hammer/usr`
8760
8761     # cd usr/
8762     # ls -l
8763     total 0
8764     drwxr-xr-x  1 root  wheel   0 Oct 13 11:54 obj
8765     lrwxr-xr-x  1 root  wheel  25 Oct 13 11:43 snap-20101013-1143 -> /usr/@@0x0000000117ac6cb0
8766
8767 We have a symlink pointing to the snapshot transaction ID shown below.
8768
8769     # hammer snapls /usr
8770     Snapshots on /usr       PFS #3
8771     Transaction ID          Timestamp               Note
8772     0x0000000117ac6cb0      2010-10-13 11:43:04 IST -
8773     #
8774
8775 You can read more about snapshots, prune, reblance, reblock, recopy etc from [hammer(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=hammer&section=8) especially look under the heading "cleanup [filesystem ...]"
8776
8777 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/)
8778
8779 In order to correctly map hard disk sernos to device names you can use the 'devattr' command.
8780
8781     # udevd
8782     # devattr -d "ad*" -p serno
8783     Device ad4:
8784             serno = Z2AD9WN4
8785     Device ad4s1:
8786     Device ad4s1d:
8787
8788     Device ad5:
8789             serno = 9VMRFDSY
8790     Device ad5s1:
8791     Device ad5s1d:
8792
8793     Device ad3:
8794             serno = Z2AD9WLW
8795     Device ad3s1:
8796     Device ad3s1a:
8797     Device ad3s1b:
8798     Device ad3s1d:
8799
8800 Or if your disks are 'da', just change it as appropiate.
8801
8802 ## Configuring and Starting the SSH Server
8803
8804 Described in detail [[here|/docs/newhandbook/sshserver/]]
8805
8806 ## Software/Programs and Configuration Files Location 
8807
8808 DragonFly default installation contains the base software/programs from the DragonFly project itself and few other software from other sources. 
8809
8810 The base system binary software programs are located in the folders 
8811
8812     /bin    /sbin
8813     /usr/bin   /usr/sbin
8814
8815 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.
8816
8817 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.
8818
8819 ## Installing Third-party Software
8820
8821 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`.
8822
8823 ### Using pkg
8824
8825 Read [[dports howto|/docs/howtos/HowToDPorts/]] then for some errata, read [[this|http://lists.dragonflybsd.org/pipermail/users/2013-November/090339.html]].
8826
8827 You can look at the help and the man page for the pkg tool like this:
8828
8829 `pkg help install`
8830
8831 Example: Read man page for pkg-install
8832
8833 `man pkg-install`
8834
8835 ### Installing an X.org desktop X11 environment and XFCE desktop
8836
8837 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.
8838
8839 `(obsolete)`
8840 Slightly out of date instructions on installing a GUI (X desktop) environment  are in the [new handbook](http://www.dragonflybsd.org/docs/newhandbook/X/).
8841
8842 # UNIX Basics 
8843
8844 ***Rewritten by Chris Shumway. ***
8845 [[!toc  levels=3]]
8846
8847 ## Synopsis 
8848
8849 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.
8850
8851 After reading this chapter, you will know:
8852
8853 * How to use the ***virtual consoles*** of DragonFly.
8854
8855 * How UNIX file permissions work along with understanding file flags in DragonFly.
8856
8857 * The default DragonFly file system layout.
8858
8859 * The DragonFly disk organization.
8860
8861 * How to mount and unmount file systems.
8862
8863 * What processes, daemons, and signals are.
8864
8865 * What a shell is, and how to change your default login environment.
8866
8867 * How to use basic text editors.
8868
8869 * What devices and device nodes are.
8870
8871 * What binary format is used under DragonFly.
8872
8873 * How to read manual pages for more information.
8874
8875 ## Virtual Consoles and Terminals 
8876
8877 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.
8878
8879 <!-- XXX: also mention vesa.ko and other modes for the vt, but maybe somewhere else -->
8880
8881 ### The Console 
8882
8883 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:
8884
8885     Additional ABI support:.
8886     Starting cron.
8887     Local package initialization:.
8888     Additional TCP options:.
8889     
8890     Wed Feb 18 17:53:48 GMT 2009
8891     
8892     DragonFly/i386 (Amnesiac) (ttyv0)
8893
8894     login: 
8895
8896 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:
8897
8898     DragonFly/i386 (Amnesiac) (ttyv0)
8899
8900 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:
8901
8902     login:
8903
8904 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.
8905
8906 ### Logging into DragonFly 
8907
8908 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.
8909
8910 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: 
8911
8912     login:
8913
8914 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>:
8915     
8916
8917     login: john
8918     Password:
8919
8920 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.
8921
8922 ### Multiple Consoles 
8923
8924 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.
8925
8926 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.
8927
8928 ### The /etc/ttys File 
8929
8930 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.
8931
8932 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`:
8933     
8934
8935     # name  getty                           type    status          comments
8936     #
8937     ttyv0   "/usr/libexec/getty Pc"         cons25  on  secure
8938     # Virtual terminals
8939     ttyv1   "/usr/libexec/getty Pc"         cons25  on  secure
8940     ttyv2   "/usr/libexec/getty Pc"         cons25  on  secure
8941     ttyv3   "/usr/libexec/getty Pc"         cons25  on  secure
8942     ttyv4   "/usr/libexec/getty Pc"         cons25  on  secure
8943     ttyv5   "/usr/libexec/getty Pc"         cons25  on  secure
8944     ttyv6   "/usr/libexec/getty Pc"         cons25  on  secure
8945     ttyv7   "/usr/libexec/getty Pc"         cons25  on  secure
8946     ttyv8   "/usr/pkg/xorg/bin/xdm -nodaemon"  xterm   off secure
8947
8948 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.
8949
8950 ### Single User Mode Console 
8951
8952 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`:
8953
8954     
8955
8956     # name  getty                           type    status          comments
8957     #
8958     # If console is marked "insecure", then init will ask for the root password
8959     # when going to single-user mode.
8960     console none                            unknown off secure
8961
8962  **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.
8963
8964 #### Notes 
8965
8966 [[!table  data="""
8967 <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. 
8968  [ (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. 
8969  [ (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. |
8970
8971 """]]
8972
8973 ## Permissions 
8974
8975 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.
8976
8977 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:
8978
8979 [[!table  data="""
8980 |<tablestyle="width:100%"> Value | Permission | Directory Listing 
8981 <tablestyle="width:100%"> 0 | No read, no write, no execute | `---` 
8982  1 | No read, no write, execute | `--x` 
8983  2 | No read, write, no execute | `-w-` 
8984  3 | No read, write, execute | `-wx` 
8985  4 | Read, no write, no execute | `r--` 
8986  5 | Read, no write, execute | `r-x` 
8987  6 | Read, write, no execute | `rw-` 
8988  7 | Read, write, execute | `rwx` |
8989
8990 """]]
8991
8992 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:
8993
8994     % ls -l
8995     total 530
8996     -rw-r--r--  1 root  wheel     512 Sep  5 12:31 myfile
8997     -rw-r--r--  1 root  wheel     512 Sep  5 12:31 otherfile
8998     -rw-r--r--  1 root  wheel    7680 Sep  5 12:31 email.txt
8999     ...
9000
9001 Here is how the first column of `ls -l` is broken up:    
9002
9003     -rw-r--r--
9004
9005 <!-- XXX: Check all these http:// links to see if they are broken -->
9006
9007 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.
9008
9009 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.
9010
9011 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).
9012
9013 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.
9014
9015 ### Symbolic Permissions 
9016
9017 ***Contributed by Tom Rhodes.***
9018
9019 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:
9020
9021 [[!table  data="""
9022 <tablestyle="width:100%"> Option | Letter | Represents 
9023 <tablestyle="width:100%"> (who) | u | User 
9024  (who) | g | Group owner 
9025  (who) | o | Other 
9026  (who) | a | All (***world***) 
9027  (action) | + | Adding permissions 
9028  (action) | - | Removing permissions 
9029  (action) | = | Explicitly set permissions 
9030  (permissions) | r | Read 
9031  (permissions) | w | Write 
9032  (permissions) | x | Execute 
9033  (permissions) | t | Sticky bit 
9034  (permissions) | s | Set UID or GID |
9035
9036 """]]
9037
9038 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`:
9039
9040     
9041
9042     % chmod go=FILE
9043
9044 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:
9045
9046     
9047
9048     % chmod go-w,a+x FILE
9049
9050 ### DragonFly File Flags 
9051
9052 ***Contributed by Tom Rhodes.***
9053
9054 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:
9055
9056     
9057
9058     # chflags sunlink file1
9059
9060 And to disable the system undeletable flag, simply issue the previous command with ***no*** in front of the `sunlink`. Observe:
9061
9062     
9063
9064     # chflags nosunlink file1
9065
9066 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:
9067
9068     
9069
9070     # ls -lo file1
9071
9072 The output should look like the following:
9073
9074     
9075
9076     -rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 file1
9077
9078 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.
9079
9080 ## Directory Structure 
9081
9082 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.
9083
9084 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).
9085
9086 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.
9087
9088 [[!table  data="""
9089 <tablestyle="width:100%">Directory | Description 
9090 <tablestyle="width:100%">  `/` | Root directory of the file system. 
9091  `/bin/` | User utilities fundamental to both single-user and multi-user environments. 
9092  `/boot/` | Programs and configuration files used during operating system bootstrap. 
9093  `/boot/defaults/` | Default bootstrapping configuration files; see [loader.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=loader.conf&section5). 
9094  `/dev/` | Device nodes; see [intro(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=intro&section4). 
9095  `/etc/` | System configuration files and scripts. 
9096  `/etc/defaults/` | Default system configuration files; see [rc(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc&section8). 
9097  `/etc/mail/` | Configuration files for mail transport agents such as [sendmail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sendmail&section8). 
9098  `/etc/namedb/` | `named` configuration files; see [named(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=named&section8). 
9099  `/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). 
9100  `/etc/ppp/` | `ppp` configuration files; see [ppp(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=ppp&section8). 
9101  `/mnt/` | Empty directory commonly used by system administrators as a temporary mount point. 
9102  `/proc/` | Process file system; see [procfs(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=procfs&section5), [mount_procfs(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mount_procfs&section=8). 
9103  `/root/` | Home directory for the `root` account. 
9104  `/sbin/` | System programs and administration utilities fundamental to both single-user and multi-user environments. 
9105  `/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). 
9106  `/usr/` | The majority of user utilities and applications. 
9107  `/usr/bin/` | Common utilities, programming tools, and applications. 
9108  `/usr/include/` | Standard C include files. 
9109  `/usr/lib/` | Archive libraries. 
9110  `/usr/libdata/` | Miscellaneous utility data files. 
9111  `/usr/libexec/` | System daemons &amp; system utilities (executed by other programs). 
9112  `/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`. 
9113  `/usr/obj/` | Architecture-specific target tree produced by building the `/usr/src` tree. 
9114  `/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`. 
9115  `/usr/pkg/xorg/` | Xorg distribution executables, libraries, etc (optional). 
9116  `/usr/pkgsrc` | The pkgsrc tree for installing packages (optional). 
9117  `/usr/sbin/` | System daemons &amp; system utilities (executed by users). 
9118  `/usr/share/` | Architecture-independent files. 
9119  `/usr/src/` | BSD and/or local source files. 
9120  `/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). 
9121  `/var/log/` | Miscellaneous system log files. 
9122  `/var/mail/` | User mailbox files. 
9123  `/var/spool/` | Miscellaneous printer and mail system spooling directories. 
9124  `/var/tmp/` | Temporary files. The files are usually preserved across a system reboot, unless `/var` is a memory-based file system. 
9125  `/var/yp` | NIS maps. |
9126
9127 """]]
9128
9129 ## Disk Organization 
9130
9131 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.
9132
9133 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.
9134
9135 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`.
9136
9137 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.
9138
9139 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 `\`.
9140
9141 DragonFly does not use drive letters, or other drive names in the path. You would not write `c:/foo/bar/readme.txt` on DragonFly.
9142
9143 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.
9144
9145 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`).
9146
9147 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:
9148
9149 <!-- XXX: image -->
9150
9151 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:
9152
9153 <!-- XXX: image -->
9154
9155 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.
9156
9157 If `B` had been mounted on `A2` then the diagram would look like this:
9158
9159 <!-- XXX: image -->
9160
9161 and the paths would be `/A2/B1` and `/A2/B2` respectively.
9162
9163 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:
9164
9165 <!-- XXX: image -->
9166
9167 Or `C` could be mounted directly on to the `A` file system, under the `A1` directory:
9168
9169 <!-- XXX: image -->
9170
9171 If you are familiar with MS-DOS, this is similar, although not identical, to the `join` command.
9172
9173 ## Choosing File System Layout 
9174
9175 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.
9176
9177 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.
9178
9179  **Benefits of Multiple File Systems** 
9180
9181 * 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.
9182
9183 * 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.
9184
9185 * 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.
9186
9187  **Benefit of a Single File System** 
9188
9189 * 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.
9190 <!-- XXX: what about hammer? -->
9191
9192 ## Disk Slices, Partitions and local UNIX file systems 
9193
9194 Here we describe how disks are subdivided.
9195
9196 <!-- XXX: mention serno stuff -->
9197
9198 ### Slices 
9199
9200 A disk can be subdivided in slices.
9201
9202 Slices are named `s0`, `s1` and so on.
9203
9204 For example the disk `ad6` can contain the slice `ad6s3`.
9205
9206 DragonFly support two schemes for slices, MBR and GPT, either of them will manage all slices on a disk:
9207
9208 * 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.
9209
9210 * 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).
9211
9212 ### Partitions 
9213
9214 Partitions are contained in slices.
9215
9216 Partitions are named `a`, `b` and so on.
9217
9218 DragonFly support 16 partitions per slice, that is `a` through `p`.
9219
9220 For example the partition `ad6s3a` is contained in the slice `ad6s3`.
9221
9222 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):
9223
9224 * [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.
9225
9226 * [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.
9227
9228 ### Local UNIX file systems 
9229
9230 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.
9231
9232 DragonFly support two local UNIX file systems, UFS and HAMMER:
9233
9234 * UFS: The classical BSD UNIX file system, see [ffs(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#ffs&amp;section5), it supports size up to 2 TB.
9235
9236 * [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.
9237
9238 ### Typical disk layout 
9239
9240 From the above we see the following typical disk layout scenarios:
9241
9242 * 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.
9243
9244 * 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.
9245
9246 * 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).
9247
9248 ### HAMMER Note 
9249
9250 [HAMMER(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=HAMMER&amp;section5)
9251
9252 is a rather new file system, under active development.
9253
9254 As of DragonFly 2.2.1 release HAMMER is considered production ready.  At 2.0 release it was considered to be in an early Beta state .
9255
9256 All major features except the mirroring are quite well tested as-of the 2.2.1 release.
9257
9258 You should evaluate if HAMMER is suitable for your needs.
9259 <!-- XXX: mention disk and memory requirements for efficient hammer use -->
9260
9261 Examples of ongoing development includes:
9262
9263 * 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).
9264
9265 * Multi master mirroring. For now only one mirror master is supported, but multiple mirror targets, called slaves, are already supported.
9266
9267 * Support for shrinking existing HAMMER file systems.  The HAMMER design is prepared for this, utility just have to be written to support it.
9268 <!-- XXX: is this still accurate? Do we really want to mention it here? -->
9269
9270 ### HAMMER Features 
9271
9272 [HAMMER(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=HAMMER&amp;section5) has several advanced features not found in UFS:
9273
9274 * Large file systems:  Up to 1 million TB, also called 1 Exabyte is supported.
9275
9276 * 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.
9277
9278 * 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.
9279
9280 * 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.
9281
9282 * 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). 
9283
9284 * 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.
9285
9286 * 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.
9287
9288 More info on HAMMER can be found [here](http://www.dragonflybsd.org/hammer/index.html).
9289
9290 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.
9291
9292 <!-- XXX: mention swapcache, and also how to configure and use it (somewhere else, probably) -->
9293
9294 ### Adding a Disk 
9295
9296 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.
9297
9298 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 
9299 [disklabel64(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel64&amp;section8).
9300
9301 In this example we choose [gpt(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=gpt&amp;section=8) & [disklabel64(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel64&amp;section=8).
9302
9303 <!-- XXX: mention that disklabel64 is default now -->
9304     
9305
9306     # gpt -v create ad6
9307
9308     ...
9309
9310     # gpt add -s1 ad6
9311
9312     ad6s0
9313
9314     # gpt add ad6
9315
9316     ad6s1
9317
9318     # gpt show ad6
9319
9320     ...
9321
9322 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.
9323
9324     
9325
9326     # disklabel64 -rw ad6s1 auto
9327
9328     # disklabel64 -e ad6s1          # edit label to add partitions as needed
9329
9330 ### disklabel 
9331 <!-- XXX: what is all this fuzz about dangerously dedicated? -->
9332
9333 For [disklabel(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel&amp;section8) labels some partitions have certain conventions associated with them.
9334
9335 [[!table  data="""
9336 <tablestyle="width:100%"> Partition | Convention 
9337 <tablestyle="width:100%"> `a` | Normally contains the root file system 
9338  `b` | Normally contains swap space 
9339  `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.
9340  `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`. |
9341
9342 """]]
9343
9344 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.
9345
9346 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.
9347
9348 <!-- XXX: gpt allows for way more than 4 partitions... let's remove this stuff above -->
9349
9350 ***Dangerously dedicated*** physical drives are accessed as slice 0.
9351
9352 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.
9353
9354 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).
9355
9356 <!-- XXX: here would probably be the right place to talk about serno -->
9357
9358 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).
9359
9360 <!-- XXX: later talk also about devfs, definitely not here though. also, devfs rules -->
9361
9362 [Example 3-2](disk-organization.html#BASICS-CONCEPT-DISK-MODEL) shows a conceptual model of the disk layout that should help make things clearer.
9363
9364 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.
9365
9366 ***'Table 3-1. Disk Device Codes***'
9367
9368 [[!table  data="""
9369 <tablestyle="width:100%"> Code | Meaning 
9370 <tablestyle="width:100%"> `ad` | ATAPI (IDE) disk 
9371  `da` | SCSI direct access disk 
9372  `acd` | ATAPI (IDE) CDROM 
9373  `cd` | SCSI CDROM 
9374  `vn` | Virtual disk
9375  `fd` | Floppy disk |
9376
9377 """]]
9378
9379 ***'Example 3-1. Sample Disk, Slice, and Partition Names***'
9380
9381 [[!table  data="""
9382 <tablestyle="width:100%"> Name | Meaning 
9383 <tablestyle="width:100%"> `ad0s1a` | The first partition (`a`) on the first slice (`s1`) on the first IDE disk (`ad0`). 
9384  `da1s2e` | The fifth partition (`e`) on the second slice (`s2`) on the second SCSI disk (`da1`). |
9385
9386 """]]
9387
9388 ***'Example 3-2. Conceptual Model of a Disk***'
9389
9390 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.
9391
9392 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.
9393
9394 <!-- XXX: image -->
9395
9396 ## Mounting and Unmounting File Systems 
9397
9398 The file system is best visualized as a tree, rooted at `/`.
9399
9400 The directories, e.g. `/dev` and `/usr`, in the root directory are branches,
9401
9402 which may have their own branches, such as `/usr/local`, and so on.
9403
9404 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.
9405
9406 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.
9407
9408 ### The fstab File 
9409
9410 During the [boot process](boot.html), file systems listed in `/etc/fstab` are automatically mounted (unless they are listed with the `noauto` option).
9411
9412 The `/etc/fstab` file contains a list of lines of the following format:
9413   
9414
9415     device       mount-point   fstype     options      dumpfreq     passno
9416
9417 These parameters have the following meaning:
9418
9419 * `device`: A device name (which should exist), as explained [here](disks-naming.html).
9420
9421 * `mount-point`: A directory (which should exist), on which to mount the file system.
9422
9423 * `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`.
9424
9425 * `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.
9426
9427 * `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.
9428
9429 * `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.
9430
9431 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.
9432
9433 ### The mount Command 
9434
9435 The [mount(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mount&section8) command is what is ultimately used to mount file systems.
9436
9437 In its most basic form, you use:
9438
9439     
9440
9441     # mount device mountpoint
9442
9443 Or, if `mountpoint` is specified in `/etc/fstab`, just:
9444
9445     
9446
9447     # mount mountpoint
9448
9449 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:
9450
9451  **Mount Options** 
9452
9453 * `-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.
9454
9455 * `-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.
9456
9457 * `-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.
9458
9459 * `-r`: Mount the file system read-only. This is identical to using the `rdonly` argument to the `-o` option.
9460
9461 * `-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.
9462
9463 * `-u`: Update mount options on the file system.
9464
9465 * `-v`: Be verbose.
9466
9467 * `-w`: Mount the file system read-write.
9468
9469 The `-o` option takes a comma-separated list of the options, including the following:
9470
9471 * `nodev:` Do not interpret special devices on the file system. This is a useful security option.
9472
9473 * `noexec`: Do not allow execution of binaries on this file system. This is also a useful security option.
9474
9475 * `nosuid`: Do not interpret setuid or setgid flags on the file system. This is also a useful security option.
9476
9477 ### The umount Command 
9478
9479 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.
9480
9481 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.
9482
9483 `-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.
9484
9485 ## Processes 
9486
9487 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.
9488
9489 <!-- XXX: talk about LWPs and threads? -->
9490
9491 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.
9492
9493 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.
9494
9495 By default, `ps` only shows you the commands that are running and are owned by you. For example:
9496
9497     
9498
9499     % ps
9500
9501       PID  TT  STAT      TIME COMMAND
9502       298  p0  Ss     0:01.10 tcsh
9503      7078  p0  S      2:40.88 xemacs mdoc.xsl (xemacs-21.1.14)
9504     37393  p0  I      0:03.11 xemacs freebsd.dsl (xemacs-21.1.14)
9505     48630  p0  S      2:50.89 /usr/local/lib/netscape-linux/navigator-linux-4.77.bi
9506     48730  p0  IW     0:00.00 (dns helper) (navigator-linux-)
9507     72210  p0  R+     0:00.00 ps
9508       390  p1  Is     0:01.14 tcsh
9509      7059  p2  Is+    1:36.18 /usr/local/bin/mutt -y
9510      6688  p3  IWs    0:00.00 tcsh
9511     10735  p4  IWs    0:00.00 tcsh
9512     20256  p5  IWs    0:00.00 tcsh
9513       262  v0  IWs    0:00.00 -tcsh (tcsh)
9514       270  v0  IW+    0:00.00 /bin/sh /usr/X11R6/bin/startx -- -bpp 16
9515       280  v0  IW+    0:00.00 xinit /home/nik/.xinitrc -- -bpp 16
9516       284  v0  IW     0:00.00 /bin/sh /home/nik/.xinitrc
9517       285  v0  S      0:38.45 /usr/X11R6/bin/sawfish
9518
9519 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.
9520
9521 [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.
9522
9523 The output from [top(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=top&section1) is similar. A sample session looks like this:
9524
9525     
9526
9527     % top
9528     last pid: 72257;  load averages:  0.13,  0.09,  0.03    up 0+13:38:33  22:39:10
9529     47 processes:  1 running, 46 sleeping
9530     CPU states: 12.6% user,  0.0% nice,  7.8% system,  0.0% interrupt, 79.7% idle
9531     Mem: 36M Active, 5256K Inact, 13M Wired, 6312K Cache, 15M Buf, 408K Free
9532     Swap: 256M Total, 38M Used, 217M Free, 15% Inuse
9533     
9534
9535       PID USERNAME PRI NICE  SIZE    RES STATE    TIME   WCPU    CPU COMMAND
9536     72257 nik       28   0  1960K  1044K RUN      0:00 14.86%  1.42% top
9537      7078 nik        2   0 15280K 10960K select   2:54  0.88%  0.88% xemacs-21.1.14
9538       281 nik        2   0 18636K  7112K select   5:36  0.73%  0.73% XF86_SVGA
9539       296 nik        2   0  3240K  1644K select   0:12  0.05%  0.05% xterm
9540     48630 nik        2   0 29816K  9148K select   3:18  0.00%  0.00% navigator-linu
9541       175 root       2   0   924K   252K select   1:41  0.00%  0.00% syslogd
9542      7059 nik        2   0  7260K  4644K poll     1:38  0.00%  0.00% mutt
9543     ...
9544
9545 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.
9546
9547 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.
9548
9549 [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.
9550
9551 ## Daemons, Signals, and Killing Processes 
9552
9553 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.
9554
9555 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.
9556
9557 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.
9558
9559 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.
9560
9561 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.
9562
9563 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.
9564
9565 `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).
9566
9567 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.
9568
9569 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.
9570
9571 Signals are sent using the [kill(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=kill&section=1) command, as this example shows.
9572
9573  **Sending a Signal to a Process** 
9574
9575 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`.
9576
9577   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).
9578
9579       
9580
9581         % ps -ax | grep inetd
9582
9583         198  ??  IWs    0:00.00 inetd -wW
9584
9585   
9586
9587   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.
9588
9589   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.
9590
9591       
9592
9593         % su
9594
9595         Password:
9596
9597         # /bin/kill -s HUP 198
9598
9599   
9600
9601   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`.
9602
9603 **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.
9604
9605 Sending other signals is very similar, just substitute `TERM` or `KILL` in the command line as necessary.
9606
9607  **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** .
9608
9609  
9610  
9611  
9612  
9613  
9614 ## Shells 
9615
9616 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`.
9617
9618 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.
9619
9620 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** ]`.
9621
9622 The shell would print out `rm foo[BEEP].bar`.
9623
9624 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.
9625
9626 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:
9627
9628 [[!table  data="""
9629 <tablestyle="width:100%"> Variable | Description 
9630 <tablestyle="width:100%"> `USER` | Current logged in user's name. 
9631  `PATH` | Colon separated list of directories to search for binaries. 
9632  `DISPLAY` | Network name of the X11 display to connect to, if available. 
9633  `SHELL` | The current shell. 
9634  `TERM` | The name of the user's terminal. Used to determine the capabilities of the terminal. 
9635  `TERMCAP` | Database entry of the terminal escape codes to perform various terminal functions. 
9636  `OSTYPE` | Type of operating system. e.g., DragonFly. 
9637  `MACHTYPE` | The CPU architecture that the system is running on. 
9638  `EDITOR` | The user's preferred text editor. 
9639  `PAGER` | The user's preferred text pager. 
9640  `MANPATH` | Colon separated list of directories to search for manual pages. |
9641
9642 """]]
9643
9644 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`:
9645     
9646
9647     % setenv EDITOR /usr/pkg/bin/emacs
9648
9649 Under Bourne shells:
9650    
9651
9652     % export EDITOR="/usr/pkg/bin/emacs"
9653
9654 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`.
9655
9656 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.
9657
9658 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.
9659
9660 ### Changing Your Shell 
9661
9662 <!-- XXX: does chsh still exist? chpass will do, too -->
9663
9664 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.
9665
9666 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:
9667
9668     
9669
9670     % chsh -s /usr/pkg/bin/bash
9671
9672  **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.
9673
9674 For example, if you installed `bash` by hand and placed it into `/usr/local/bin`, you would want to:
9675
9676     
9677
9678     # echo "/usr/local/bin/bash" >> /etc/shells
9679
9680 Then rerun `chsh`.
9681
9682 ## Text Editors 
9683
9684 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.
9685
9686 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.
9687
9688 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.
9689
9690 ## Devices and Device Nodes 
9691
9692 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`.
9693
9694 For example, `acd0` is the first IDE CDROM drive, while `kbd0` represents the keyboard.
9695
9696 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.
9697
9698 The device nodes in the `/dev` directory are created and destroyed automatically on DragonFly >= 2.4, by means of the device file system (devfs).
9699
9700 ## Binary Formats 
9701
9702 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®:
9703
9704 * [a.out(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=a.out&amp;section=5)
9705
9706   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.
9707
9708 * <u>COFF</u>
9709
9710   The SVR3 object format. The header now comprises a section table, so you can have more than just .text, .data, and .bss sections.
9711
9712 * [elf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=elf&amp;section=5)
9713
9714   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.
9715
9716 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.
9717
9718 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.
9719
9720 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.
9721
9722 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.
9723
9724 <!-- XXX: do we really need all this bullshit about file formats? -->
9725
9726 ## For More Information 
9727
9728 ### Manual Pages 
9729
9730 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:
9731
9732     % man command
9733
9734 `command` is the name of the command you wish to learn about. For example, to learn more about `ls` command type:
9735
9736     % man ls
9737
9738 The online manual is divided up into numbered sections:
9739
9740   1. User commands.
9741   1. System calls and error numbers.
9742   1. Functions in the C libraries.
9743   1. Device drivers.
9744   1. File formats.
9745   1. Games and other diversions.
9746   1. Miscellaneous information.
9747   1. System maintenance and operation commands.
9748   1. Kernel internals.
9749
9750 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:
9751     
9752
9753     % man 1 chmod
9754
9755 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.
9756
9757 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:
9758
9759    
9760
9761     % man -k mail
9762
9763 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.
9764
9765 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:    
9766
9767     % cd /usr/bin
9768     % man -f *
9769
9770 or
9771    
9772
9773     % cd /usr/bin
9774     % whatis *
9775
9776 which does the same thing.
9777
9778 ### GNU Info Files 
9779
9780 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:
9781
9782     % info
9783
9784 For a brief introduction, type `h`. For a quick command reference, type `?`.
9785
9786 # DPorts and pkgng
9787
9788 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.
9789
9790 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.
9791
9792 __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.
9793
9794 ## Getting started with pkgng
9795
9796 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.
9797
9798 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:
9799
9800     # cd /usr
9801     # make dports-create
9802     # rm -rf /usr/pkg
9803     # pkg upgrade
9804     # rehash
9805
9806 Since you may need to manually edit the configuration file `/usr/local/etc/pkg.conf`  here is the
9807 usual command to edit it using the vi editor:
9808
9809      # vi /usr/local/etc/pkg.conf
9810
9811 Before using consult the man page (`man pkg`) and then try things like these examples:
9812
9813     # pkg search editors
9814     # pkg install vim
9815
9816 To bootstrap __pkgng__ with a download on a very old version of DragonFly that is still using `pkgsrc` run:
9817
9818     # make pkg-bootstrap
9819     # rehash
9820     # pkg-static install -y pkg
9821     # rehash
9822
9823 Note that this step is unnecessary for any newly installed release from DragonFly 3.4 onwards.
9824
9825 ## Configuring pkgng
9826
9827 Information previously contained in here worked for older versions of pkg, but as pkgng has undergone some changes, so too do the configurations.
9828
9829 Previously /usr/local/etc/pkg.conf was used and reference to a PACKAGESITE was made. This might still work but it'll complain.
9830
9831 # pkg update
9832 pkg: PACKAGESITE in pkg.conf is deprecated. Please create a repository configuration file
9833 Updating repository catalogue
9834 pkg: Warning: use of http:// URL scheme with SRV records is deprecated: switch to pkg+http://
9835
9836 Insead, listen to the errors. Throw an octothorpe in front of that packagesite line, save it, and move on.
9837
9838 Go to /usr/local/etc/pkg/repos/
9839
9840 You should see something like this with an ls
9841
9842 df-latest.conf.sample   df-releases.conf.sample
9843
9844 cp or mv one of them to be .conf
9845
9846 edit the one you choose and make the following changes. (I edited the latest version)
9847
9848 Avalon: {
9849         url             : pkg+http://mirror-master.dragonflybsd.org/dports/${ABI}/L\
9850 ATEST,
9851         mirror_type     : SRV,
9852         signature_type  : NONE,
9853         pubkey          : NONE,
9854         fingerprints    : /usr/share/fingerprints,
9855         enabled         : yes
9856 }
9857
9858 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.
9859
9860 ## Basic pkgng Operations
9861
9862 Usage information for __pkgng__ is available in the pkg(8) manual page, or by running `pkg` without additional arguments.
9863
9864 Each __pkgng__ command argument is documented in a command-specific manual page. To read the manual page for `pkg install`, for example, run either:
9865
9866     # pkg help install
9867     # man pkg-install
9868
9869 ## Obtaining Information About Installed Packages with pkgng
9870
9871 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:
9872
9873     # pkg info packagename
9874
9875 For example, to see which version of __pkgng__ is installed on the system, run:
9876
9877     # pkg info pkg
9878     pkg-1.0.12                   New generation package manager
9879
9880 ## Installing and Removing Packages with pkgng
9881
9882 In general, most DragonFly users will install binary packages by typing:
9883
9884     # pkg install <packagename>
9885
9886 For example, to install curl:
9887
9888     # pkg install curl
9889
9890     Updating repository catalogue
9891     Repository catalogue is up-to-date, no need to fetch fresh copy
9892     The following packages will be installed:
9893     
9894         Installing ca_root_nss: 3.13.5
9895         Installing curl: 7.24.0
9896     
9897     The installation will require 4 MB more space
9898     
9899     1 MB to be downloaded
9900     
9901     Proceed with installing packages [y/N]: y
9902     ca_root_nss-3.13.5.txz           100%    255KB   255.1KB/s  255.1KB/s   00:00
9903     curl-7.24.0.txz                  100%   1108KB     1.1MB/s    1.1MB/s   00:00
9904     Checking integrity... done
9905     Installing ca_root_nss-3.13.5... done
9906     Installing curl-7.24.0... done
9907
9908 The new package and any additional packages that were installed as dependencies can be seen in the installed packages list:
9909
9910     # pkg info
9911     ca_root_nss-3.13.5    The root certificate bundle from the Mozilla Project
9912     curl-7.24.0           Non-interactive tool to get files from FTP, GOPHER, HTTP(S) servers
9913     pkg-1.0.12            New generation package manager
9914
9915 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:
9916
9917     # pkg delete curl
9918     The following packages will be deleted:
9919     
9920         curl-7.24.0_1
9921     
9922     The deletion will free 3 MB
9923     
9924     Proceed with deleting packages [y/N]: y
9925     Deleting curl-7.24.0_1... done
9926
9927 ## Upgrading Installed Packages with pkgng
9928
9929 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.
9930
9931 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:
9932
9933     # pkg upgrade
9934     Updating repository catalogue
9935     repo.txz            100%    297KB   296.5KB/s   296.5KB/s   00:00
9936     The following packages will be upgraded:
9937     
9938     Upgrading curl: 7.24.0 -> 7.24.0_1
9939     
9940     1 MB to be downloaded
9941     
9942     Proceed with upgrading packages [y/N]: y
9943     curl-7.24.0_1.txz   100%    1108KB  1.1MB/s       1.1MB/s   00:00
9944     Checking integrity... done
9945     Upgrading curl from 7.24.0 to 7.24.0_1... done
9946
9947 ## Auditing Installed Packages with pkgng
9948
9949 Occasionally, software vulnerabilities may be discovered in software within DPorts. __pkgng__ includes built-in auditing. To audit the software installed on the system, type:
9950
9951     # pkg audit -F
9952
9953 # Advanced pkgng Operations
9954
9955 ## Automatically Removing Leaf Dependencies with pkgng
9956
9957 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:
9958
9959     # pkg autoremove
9960     Packages to be autoremoved:
9961         ca_root_nss-3.13.5
9962     
9963     The autoremoval will free 723 kB
9964     
9965     Proceed with autoremoval of packages [y/N]: y
9966     Deinstalling ca_root_nss-3.13.5... done
9967
9968 ## Backing Up the pkgng Package Database
9969
9970 __pkgng__ includes its own package database backup mechanism. To manually back up the package database contents, type:
9971
9972     # pkg backup -d <pkgng.db>
9973
9974 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).
9975
9976 To restore the contents of a previous package database backup, run:
9977
9978     # pkg backup -r </path/to/pkgng.db>
9979
9980 ## Removing Stale pkgng Packages
9981
9982 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.
9983
9984 To remove the outdated binary packages, type:
9985
9986     # pkg clean
9987
9988 ##Modifying pkgng Package Metadata
9989
9990 __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:
9991
9992     # pkg set -o <category/oldport>:<category/newport>
9993
9994 For example, to change the package origin for the above example, type:
9995
9996     # pkg set -o lang/php5:lang/php53
9997
9998 As another example, to update lang/ruby18 to lang/ruby19, type:
9999
10000     # pkg set -o lang/ruby18:lang/ruby19
10001
10002 As a final example, to change the origin of the libglut shared libraries from graphics/libglut to graphics/freeglut, type:
10003
10004     # pkg set -o graphics/libglut:graphics/freeglut
10005
10006 _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:
10007
10008     # pkg install -Rf graphics/freeglut
10009
10010 # Building DPorts from source
10011
10012 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:
10013
10014 * The port is new and there's no pre-binary available yet
10015 * The pre-built binaries use the default options and the user needs a package built with a different set of options
10016 * Testing FreeBSD port in order to patch them and submit to DPorts
10017 * The user just prefers building from source
10018
10019 ## Installing DPorts tree
10020
10021 DragonFly 3.4 or later is the minimum version that can build DPorts from source.
10022
10023 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:
10024
10025     # cd /usr
10026     # make dports-create-shallow
10027
10028 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:
10029
10030     # cd /usr
10031     # make dports-download
10032
10033 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:
10034
10035     # cd /usr/dports/devel/git
10036     # make install
10037     # cd /usr
10038     # rm -rf /usr/dports
10039     # make dports-create-shallow
10040
10041 The git repository is hosted on the [github account of John Marino](https://github.com/jrmarino/DPorts/#readme).
10042
10043 ## Final thoughts
10044
10045 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.
10046
10047 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.
10048
10049 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.
10050
10051 ## More reading
10052 * How fix/add broken ports: [[docs/howtos/fixdports]]
10053 * [Trick: How to get i386-only software via dports](http://leaf.dragonflybsd.org/mailarchive/users/2013-06/msg00023.html)
10054
10055 # Disclaimer 
10056
10057 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.
10058
10059 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: 
10060
10061 [http://www.dragonflybsd.org/docs/howtos/HowToDPorts/](http://www.dragonflybsd.org/docs/howtos/HowToDPorts/)
10062
10063 ----
10064
10065 # pkgsrc on DragonFly
10066
10067 DragonFly uses a specially crafted Makefile in /usr and a git mirror
10068 of the official pkgsrc repository to make pkgsrc distribution more user-friendly.
10069
10070 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.
10071
10072 [[!toc levels=3 ]]
10073
10074 ## Overview 
10075
10076 ### History 
10077 [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.
10078
10079 ### Overview
10080
10081 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.
10082
10083 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.
10084
10085  **Binary Package Benefits** 
10086
10087 * A compressed package tarball is typically smaller than the compressed tarball containing the source code for the application.
10088
10089 * 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.
10090
10091 * Packages do not require any understanding of the process involved in compiling software on DragonFly.
10092
10093 **Pkgsrc source Benefits** 
10094
10095 * 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.
10096
10097 * 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.
10098
10099 * The licensing conditions of some software distributions forbid binary distribution. They must be distributed as source code.
10100
10101 * 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.
10102
10103 * If you have local patches, you will need the source in order to apply them.
10104
10105 * 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.
10106
10107 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.
10108
10109  **Warning:** Before installing any application, you should check http://www.pkgsrc.org/ for security issues related to your application.
10110
10111 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.
10112
10113 **Note:** Binary packages and source packages are effectively the same software and can be manipulated with the same pkg_* tools.  
10114
10115 ## Installing pkgsrc 
10116
10117 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.  
10118
10119 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.
10120
10121 This downloads the stable version of the pkgsrc tree from the default mirror, if you didn't set GITHOST. As root:
10122
10123     # cd /usr
10124     # make pkgsrc-create
10125
10126 to fetch the intial pkgsrc repository from the net, or
10127
10128     # cd /usr
10129     # make pkgsrc-update
10130
10131 to update.
10132
10133 **Note**: If your DragonFly install is not up to date, you might have ended up with an old release of the pkgsrc tree.
10134
10135     # cd /usr/pkgsrc
10136     # git branch
10137
10138 will show what release you are on. See Tracking the stable branch for more information.
10139
10140 ### Tracking the stable branch
10141
10142 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.
10143
10144 To see the available remote branches:
10145
10146     # cd /usr/pkgsrc 
10147     # git pull
10148     # git branch -r
10149
10150 To create a local branch, tracking the remote quarterly release:
10151
10152     # cd /usr/pkgsrc 
10153     # git branch pkgsrc-2010Q4 origin/pkgsrc-2010Q4
10154
10155 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.
10156
10157 After adding a new branch, it can be downloaded with:
10158
10159     # cd /usr/pkgsrc 
10160     # git checkout pkgsrc-2010Q4
10161     # git pull
10162
10163 ## Dealing with pkgsrc packages
10164
10165 The following section explains how to find, install and remove pkgsrc packages.
10166
10167 ### Finding Your Application 
10168
10169 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:
10170
10171 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.
10172
10173     # pkg_search fvwm
10174     fvwm-2.4.20nb1          Newer version of X11 Virtual window manager
10175     fvwm-2.5.24             Development version of X11 Virtual window manager
10176     fvwm-themes-0.6.2nb8    Configuration framework for fvwm2 with samples
10177     fvwm-wharf-1.0nb1       Copy of AfterStep's Wharf compatible with fvwm2
10178     fvwm1-1.24rnb1          Virtual window manager for X
10179
10180     # pkg_search -v fvwm-2.5
10181     Name    : fvwm-2.5.24-50
10182     Dir     : wm/fvwm-devel                                     
10183     Desc    : Development version of X11 Virtual window manager 
10184     URL     : any                                               
10185     Deps    : perl>#5.0 gettext-lib>0.14.5 [...]
10186
10187 Its also possible to issue the command
10188
10189     # cd /usr/pkgsrc/
10190     # bmake search key='package you are looking for'
10191
10192 from the `/usr/pkgsrc` directory.
10193
10194 It's also possible to browse website that show all the available pkgsrc packages, such as [http://pkgsrc.se/](http://pkgsrc.se) .
10195
10196 ### Installing applications
10197
10198 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.  
10199
10200 The `bin-install` target on DragonFly (with pkgsrc from 2011/02/07 and later) will do just that:
10201
10202     # cd /usr/pkgsrc/misc/screen
10203     # bmake bin-install clean
10204
10205 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.
10206
10207 ### Installing applications, source only
10208
10209 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.
10210
10211     # cd /usr/pkgsrc/misc/screen
10212     # bmake install clean
10213
10214 To find out the options that can affect how a program is built:
10215
10216     # bmake show-options
10217
10218 To change options:
10219
10220     # bmake PKG_OPTIONS.<package_name>="-option1 option2" install clean
10221
10222 Listing an option enables it.  Listing an option with a "-" before it disables the option.
10223
10224 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`:
10225
10226      . PKG_OPTIONS.<package_name>=-option1 option2
10227     
10228 ### Installing applications, binary only
10229
10230 Binary packages can be installed using *pkg_radd*:
10231
10232     # pkg_radd screen
10233
10234 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.
10235
10236 You can manually set `BINPKG_BASE` and use *pkg_add* to get the same effect, using a different server.
10237
10238     # setenv BINPKG_BASE http://mirror-master.dragonflybsd.org/packages
10239     # pkg_add screen
10240
10241 #### Issues with pre-built packages
10242
10243 * The default remote repository for binary packages tracks quarterly pkgsrc releases, so your local install of pkgsrc should be the same quarterly release.
10244 * 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.
10245 * 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.
10246
10247 ### List all installed applications 
10248
10249 To obtain a list of all the packages that are installed on your system:
10250
10251     # pkg_info
10252
10253 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:
10254
10255     # pkg_info | grep xorg
10256
10257 ### Removing packages
10258
10259 If a program was installed as a package:
10260
10261     # pkg_delete packagename
10262
10263 If a package was installed from the source files, you can also change to the directory they were installed from and issue the command:
10264
10265     # bmake deinstall
10266
10267 Note that these methods are effectively interchangeable.  Either will work whether the package was originally installed from source or binary.
10268
10269 #### Remove associated files needed for building a package 
10270
10271 To remove the work file from building a package, and the package's dependencies:
10272
10273     # bmake clean clean-depends
10274
10275 This can be combined with other steps:
10276
10277     # bmake install clean clean-depends
10278
10279 ## Upgrading packages 
10280
10281 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.
10282
10283 ### Update pkgsrc system packages
10284
10285 **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. 
10286
10287     # cd /usr/pkgsrc/devel/bmake
10288     or
10289     # cd /usr/pkgsrc/pkgtools/pkg_install
10290     or 
10291     # cd /usr/pkgsrc/pkgtools/bootstrap-mk-files
10292     
10293     # env USE_DESTDIR=yes bmake package
10294     # bmake clean-depends clean
10295
10296 And go to the packages directory and install the binary package with
10297
10298     # cd /usr/pkgsrc/packages/All
10299     # pkg_add -u <pkg_name> (i.e. the name of the .tgz file).
10300
10301 ### bmake replace
10302 Performed in the `/usr/pkgsrc` directory that correlates with the installed package, the software is first built and then replaced.
10303
10304     # cd /usr/pkgsrc/chat/ircII
10305     # bmake replace
10306
10307 ### pkg_rolling-replace
10308
10309 *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.
10310
10311     # cd /usr && make pkgsrc-update
10312     # pkg_rolling-replace -u
10313
10314 ### pkgin
10315
10316 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.
10317
10318     # pkgin update
10319     # pkgin full-upgrade 
10320
10321 ### pkg_chk
10322
10323 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.
10324
10325     # pkg_chk -g  # make initial list of installed packages
10326     # pkg_chk -r  # remove all packages that are not up to date and packages that depend on them
10327     # pkg_chk -a  # install all missing packages (use binary packages, this is the default)
10328     # pkg_chk -as # install all missing packages (build from source)
10329
10330 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. 
10331
10332 ### pkg_add -u
10333
10334 Point at a local or online binary archive location to download and update packages.
10335
10336 ### rpkgmanager
10337
10338 This requires that you've set up rpkgmanager first. Read more about rpkgmanager [[here|docs/howtos/rpkgmanager/]].
10339
10340     # yes | rpkgmanager.rb
10341
10342 ## Start pkgsrc applications on system startup
10343
10344 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:
10345
10346     RCD_SCRIPTS_DIR=/etc/rc.d
10347     PKG_RCD_SCRIPTS=YES
10348
10349 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`.
10350
10351 Many other options can be set in this file; see `/usr/pkgsrc/mk/defaults/mk.conf` for examples.
10352
10353 ## Miscellaneous topics
10354
10355 ### Post-installation Activities 
10356
10357 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.
10358  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:
10359
10360 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
10361
10362     # pkg_info -L foopackage-1.0.0 | less
10363
10364 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
10365
10366     # pkg_info | grep -i foopackage
10367
10368 will find all the installed packages that have *foopackage* in the package name. Replace *foopackage* in your command line as necessary.
10369
10370 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
10371
10372     # pkg_info foopackage-1.0.0
10373
10374 A `WWW:` line, if present, should provide a URL for the application's web site.
10375
10376 ### Dealing with Broken Packages 
10377
10378 If you come across a package that does not work for you, there are a few things you can do, including:
10379
10380   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!
10381
10382   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/) .
10383
10384   1. Grab a pre-built package from an [[mirror|mirrors]] site near you. 
10385
10386 ### What is WIP? 
10387
10388 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.
10389
10390 ### Links
10391
10392 * More information: The pkgsrc guide [http://www.netbsd.org/Documentation/pkgsrc/](http://www.netbsd.org/Documentation/pkgsrc/)
10393
10394 * Web interface for searching packages: [http://www.pkgsrc.se](http://www.pkgsrc.se)
10395
10396 * Ways to upgrade packages [http://wiki-static.aydogan.net/How_to_upgrade_packages](http://wiki-static.aydogan.net/How_to_upgrade_packages)
10397
10398 * To search and/or report bugs against packages in pkgsrc, look at [http://www.netbsd.org/support/send-pr.html](http://www.netbsd.org/support/send-pr.html) - use category 'pkg'.
10399
10400 * The #pkgsrc IRC channel on Freenode
10401
10402 * The #dragonflybsd IRC channel on EFnet
10403
10404 # The X Window System 
10405 ***Updated for X.Org's X11 server by Ken Tom and Marc Fonvieille. Updated for DragonFly by Victor Balada Diaz. Updated for 2014 pkgng by Warren Postma***
10406
10407 [[!toc  levels=3]]
10408
10409 ## Synopsis 
10410
10411 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. 
10412
10413 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.
10414
10415 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.
10416
10417 You may find the FreeBSD X Configuration instructions apply exactly and unchanged in DragonFly BSD.
10418 They are found [[here|http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/x-config.html]]
10419
10420 ## Understanding X 
10421
10422 ### What is X.Org
10423
10424 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.
10425
10426 ### The Window Manager and the Desktop Environment
10427
10428 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.
10429
10430 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.
10431
10432 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.
10433
10434 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.  
10435
10436 If you are brand new and don't know what to do, select the XFCE4 desktop and follow those instructions.
10437 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".
10438
10439 Note that XFCE4 and Gnome and KDE do not require you to install any window manager as they include one automatically.
10440
10441 ## Installing X
10442
10443 **X.org**  is currently available in the DragonFly dports collection.
10444
10445 To install:
10446
10447     pkg install xorg-7.7
10448
10449 By the time you read this, it might be a newer version of xorg than 7.7, you can also try this general command:
10450
10451     pkg install xorg
10452
10453 ## Configuring X
10454
10455 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:
10456
10457     hald_enable ="YES"
10458     dbus_enable= "YES" 
10459
10460 Also see below about enabling `moused` in rc.conf, which may be required for you to see your mouse pointer in X.
10461
10462 As of version 7.3, Xorg can often work without any configuration file by simply typing at prompt:
10463
10464     
10465
10466     % startx
10467
10468 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.
10469
10470 Configuration of X11 is a multi-step process. The first step is to build an initial configuration file. As the super user, simply run:
10471    
10472
10473     # Xorg -configure
10474
10475 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.
10476
10477 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:
10478
10479    
10480
10481     # Xorg -config xorg.conf.new -retro
10482
10483 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.
10484
10485 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.
10486
10487 **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`:
10488
10489         # rcenable moused
10490
10491 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`.
10492
10493     
10494
10495 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).
10496
10497 ## The X Display Manager 
10498
10499  ***Contributed by Seth Kingsley.***
10500
10501 ### Overview 
10502
10503  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.
10504
10505  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.
10506
10507 ### Using XDM 
10508
10509  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:
10510
10511      
10512
10513     ttyv8   "/usr/pkg/bin/xdm -nodaemon"  xterm   off secure
10514
10515  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.
10516
10517 ### Configuring XDM 
10518
10519  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:
10520
10521 [[!table  data="""
10522 <tablestyle="width:100%">  **File**  |  **Description**
10523 <tablestyle="width:100%"> `Xaccess` | Client authorization ruleset.
10524 `Xresources` | Default X resource values.
10525 `Xservers` | List of remote and local displays to manage.
10526 `Xsession` | Default session script for logins.
10527 `Xsetup_`* | Script to launch applications before the login interface.
10528 `xdm-config` | Global configuration for all displays running on this machine.
10529 `xdm-errors` | Errors generated by the server program.
10530 `xdm-pid` | The process ID of the currently running XDM. |
10531
10532 """]]
10533
10534  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).
10535
10536  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.
10537
10538 #### Xaccess 
10539
10540  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.
10541
10542 #### Xresources 
10543
10544  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.
10545
10546 #### Xservers 
10547
10548  This is a list of the remote displays the chooser should provide as choices.
10549
10550 #### Xsession 
10551
10552  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.
10553
10554 #### Xsetup_* 
10555
10556  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`.
10557
10558 #### xdm-config 
10559
10560  This contains settings in the form of app-defaults that are applicable to every display that this installation manages.
10561
10562 #### xdm-errors 
10563
10564  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.
10565
10566 ### Running a Network Display Server 
10567
10568  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:
10569
10570      
10571
10572     ! SECURITY: do not listen for XDMCP or Chooser requests
10573
10574     ! Comment out this line if you want to manage X terminals with xdm
10575
10576     DisplayManager.requestPort:     0
10577
10578  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.
10579
10580 ### Replacements for XDM 
10581
10582  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.
10583
10584 ----
10585
10586 ## Desktop Environments 
10587
10588  ***Contributed by Valentino Vaschetto. ***
10589
10590  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** .
10591
10592 ### GNOME 
10593
10594 #### About GNOME 
10595
10596    **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.
10597
10598 #### Installing GNOME 
10599
10600    **GNOME**  can be easily installed from a package or from the pkgsrc framework:
10601
10602   To install the  **GNOME**  package from the network, simply type:
10603
10604     # pkg install gnome-desktop
10605
10606   To build  **GNOME**  from source, if you have the pkgsrc tree on your system:      
10607
10608     # cd /usr/pkgsrc/meta-pkgs/gnome
10609
10610     # bmake install clean
10611
10612   Once  **GNOME**  is installed, the X server must be told to start  **GNOME**  instead of a default window manager.
10613
10614   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.
10615
10616 **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:
10617
10618       
10619
10620     % echo "/usr/pkg/bin/gnome-session" > ~/.xinitrc
10621
10622   Next, type `startx`, and the  **GNOME**  desktop environment will be started.
10623
10624 **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** :
10625
10626         
10627
10628     % echo "#!/bin/sh" > ~/.xsession
10629
10630     % echo "/usr/pkg/bin/gnome-session" >> ~/.xsession
10631
10632     % chmod +x ~/.xsession
10633
10634   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** .
10635
10636 #### Anti-aliased Fonts with GNOME 
10637
10638   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).
10639   
10640   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.
10641
10642 ### KDE 
10643
10644 #### About KDE 
10645
10646   **KDE**  is an easy to use contemporary desktop environment. Some of the things that  **KDE**  brings to the user are:
10647
10648 * A beautiful contemporary desktop
10649
10650 * A desktop exhibiting complete network transparency
10651
10652 * An integrated help system allowing for convenient, consistent access to help on the use of the  **KDE**  desktop and its applications
10653
10654 * Consistent look and feel of all  **KDE**  applications
10655
10656 * Standardized menu and toolbars, keybindings, color-schemes, etc.
10657
10658 * Internationalization:  **KDE**  is available in more than 40 languages
10659
10660 * Centralized consisted dialog driven desktop configuration
10661
10662 * A great number of useful  **KDE**  applications
10663
10664   **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/).
10665
10666 #### Installing KDE 
10667
10668  Just as with  **GNOME**  or any other desktop environment, the easiest way to install  **KDE**  is through the pkgsrc framework or from a package:
10669
10670  To install the  **KDE**  4.10 package from the network, simply type:
10671
10672    # pkg install kde-4.10
10673
10674  To build  **KDE**  from source, using the pkgsrc framework:
10675
10676     # cd /usr/pkgsrc/meta-pkgs/kde3
10677
10678     # bmake install clean
10679
10680  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:
10681
10682     % echo "exec startkde" > ~/.xinitrc
10683
10684  Now, whenever the X Window System is invoked with `startx`,  **KDE**  will be the desktop.
10685
10686  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.
10687
10688 #### More Details on KDE 
10689
10690  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.
10691
10692  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.
10693
10694 #### The KDE Display Manager 
10695
10696  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.
10697
10698  To enable  **kdm** , the `ttyv8` entry in `/etc/ttys` has to be adapted. The line should look as follows:
10699   
10700
10701     ttyv8 "/usr/pkg/bin/kdm -nodaemon" xterm on secure
10702
10703     
10704 ### XFce 
10705
10706 #### About XFce 
10707
10708   **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:
10709
10710 * A simple, easy-to-handle desktop
10711
10712 * Fully configurable via mouse, with drag and drop, etc
10713
10714 * Main panel similar to  **CDE** , with menus, applets and applications launchers
10715
10716 * Integrated window manager, file manager, sound manager,  **GNOME**  compliance module, and other things
10717
10718 * Themeable (since it uses GTK+)
10719
10720 * Fast, light and efficient: ideal for older/slower machines or machines with memory limitations
10721
10722 More information on  **XFce**  can be found on the [XFce website](http://www.xfce.org/).
10723
10724 #### Installing XFce 
10725
10726  A binary package for  **XFce**  exists. To install, simply type:
10727
10728     # pkg install xfce
10729
10730 This should install the main xfce4 desktop package, and most of the required components.
10731
10732  Alternatively, to build from source, use the pkgsrc framework:
10733
10734    
10735
10736     # cd /usr/pkgsrc/meta-pkgs/xfce4
10737
10738     # bmake install clean
10739
10740  Now, tell the X server to launch  **XFce**  the next time X is started. Simply type this:
10741
10742     % echo "/usr/pkg/bin/startxfce4" > ~/.xinitrc
10743
10744  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).
10745
10746 <!-- XXX: FreeBSD's handbook has a nice user-oriented section about X applications here. maybe we should have one, too -->
10747
10748 ----
10749
10750 # Configuration and Tuning 
10751
10752 ***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.***
10753
10754 [[!toc  levels=3]]
10755
10756 ##Synopsis 
10757
10758 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.
10759
10760 After reading this chapter, you will know:
10761
10762 * How to efficiently work with file systems and swap partitions.
10763
10764 * The basics of `rc.conf` configuration and `rc.d` startup systems.
10765
10766 * How to configure and test a network card.
10767
10768 * How to configure virtual hosts on your network devices.
10769
10770 * How to use the various configuration files in `/etc`.
10771
10772 * How to tune DragonFly using `sysctl` variables.
10773
10774 * How to tune disk performance and modify kernel limitations.
10775
10776 Before reading this chapter, you should:
10777
10778 * Understand UNIX® and DragonFly basics ([Chapter 3](basics.html)).
10779
10780 * Be familiar with the basics of kernel configuration/compilation ([Chapter 9](kernelconfig.html)).
10781
10782 ## Initial Configuration 
10783
10784 ### Partition Layout 
10785
10786 #### Base Partitions 
10787
10788 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`.
10789 <!-- 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? -->
10790
10791 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.
10792
10793 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.
10794
10795 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.
10796
10797 #### Swap Partition 
10798
10799 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.
10800 <!-- XXX: do we really recommend double the RAM for swap? IMHO the amount of RAM should be more than enough -->
10801
10802 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.
10803
10804 #### Why Partition? 
10805
10806 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`.
10807
10808 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.
10809 <!-- XXX: again, same story about the edges of disks... -->
10810
10811 CategoryHandbook
10812
10813 CategoryHandbook-configuration
10814
10815 ## Core Configuration 
10816
10817 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.
10818
10819 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.
10820
10821 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.
10822
10823 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:
10824
10825 * rc.conf:
10826
10827         hostname="node15.example.com"
10828
10829         network_interfaces="fxp0 lo0"
10830
10831         ifconfig_fxp0="inet 10.1.1.1"
10832
10833   
10834
10835 * rc.conf.site: 
10836
10837         defaultrouter="10.1.1.254"
10838
10839         saver="daemon"
10840
10841         blanktime="100"
10842
10843   
10844
10845 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.
10846
10847 Upgrading the system using `make world` will not overwrite the `rc.conf` file, so system configuration information will not be lost.
10848
10849 CategoryHandbook
10850
10851 CategoryHandbook-configuration
10852
10853 ## Application Configuration 
10854
10855 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.
10856
10857 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.
10858
10859 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.
10860
10861 For example, consider the contents of the directory `/usr/pkg/etc/httpd`:
10862
10863     
10864
10865     total 90
10866
10867     -rw-r--r--  1 root  wheel  -   34K Jan 11 12:04 httpd.conf
10868
10869     -rw-r--r--  1 root  wheel  -   13K Jan 11 12:02 magic
10870
10871     -rw-r--r--  1 root  wheel  -   28K Jan 11 12:02 mime.types
10872
10873     -rw-r--r--  1 root  wheel  -   11K Jan 11 12:02 ssl.conf
10874
10875     
10876     
10877     
10878     
10879     
10880
10881 ## Starting Services 
10882
10883 It is common for a system to host a number of services. These may be started in several different fashions, each having different advantages.
10884
10885 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.
10886
10887 A generic startup script in `/usr/pkg/share/examples/rc.d` looks like:
10888
10889     
10890
10891     #!/bin/sh
10892
10893     echo -n ' FooBar'
10894
10895     
10896
10897     case "$1" in
10898
10899     start)
10900
10901             /usr/pkg/bin/foobar
10902
10903             ;;
10904
10905     stop)
10906
10907             kill -9 `cat /var/run/foobar.pid`
10908
10909             ;;
10910
10911     
10912 *)
10913
10914             echo "Usage: `basename $0` {start|stop}" >&2
10915
10916             exit 64
10917
10918             ;;
10919
10920     esac
10921
10922     
10923
10924     exit 0
10925
10926     
10927
10928 <!-- XXX: I don't think we actually look in /usr/pkg/share/examples/rc.d -->
10929
10930 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:
10931
10932     
10933
10934     # chmod 755 "FooBar.sh"
10935
10936 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.
10937
10938 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.
10939
10940  **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.
10941
10942 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.
10943
10944 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.
10945
10946 CategoryHandbook
10947
10948 CategoryHandbook-configuration
10949
10950 ## Configuring the cron Utility 
10951
10952 <!-- XXX: can't really comment on this. someone please revise it -->
10953
10954 ***Contributed by Tom Rhodes. ***
10955
10956 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.
10957
10958 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.
10959
10960  **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.
10961
10962 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`.
10963
10964 Let us take a look at the `/etc/crontab` file (the system crontab):
10965
10966     
10967
10968     # /etc/crontab - root's crontab for DragonFly
10969
10970     #
10971
10972     #                                                                  (1)
10973
10974     #
10975
10976     SHELL=/bin/sh
10977
10978     PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin                            (2)
10979
10980     HOME=/var/log
10981
10982     #
10983
10984     #
10985
10986     #minute     hour    mday    month   wday    who     command            (3)
10987
10988     #
10989
10990     #
10991
10992     
10993     */5 *       *       *       *       root    /usr/libexec/atrun (4)
10994
10995  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.
10996
10997  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.
10998
10999  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.
11000
11001  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.
11002
11003 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.
11004
11005 ### Installing a Crontab 
11006
11007  **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.
11008
11009 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:
11010
11011     
11012
11013     % crontab crontab-file
11014
11015 In this example, `crontab-file` is the filename of a `crontab` that was previously created.
11016
11017 There is also an option to list installed `crontab` files: just pass the `-l` option to `crontab` and look over the output.
11018
11019 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.
11020
11021 If you later want to remove your user `crontab` completely, use `crontab` with the `-r` option.
11022
11023 ## Using rc under DragonFly 
11024
11025 ***Contributed by Tom Rhodes. ***
11026
11027 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:
11028
11029     
11030
11031     # /etc/rc.d/sshd restart
11032
11033 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`:
11034
11035     natd_enable="YES"
11036
11037 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.
11038
11039 Another way to add services to the automatic startup/shutdown is to type, for example for `natd`,
11040
11041      # rcenable natd
11042
11043 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:
11044
11045     
11046
11047     # /etc/rc.d/sshd forcerestart
11048
11049 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:
11050
11051     
11052
11053     # /etc/rc.d/sshd rcvar
11054
11055     # sshd
11056
11057     $sshd_enable=YES
11058
11059  **Note:** The second line (`# sshd`) is the output from the `rc.d` script, not a `root` prompt.
11060
11061 To determine if a service is running, a `status` option is available. For instance to verify that `sshd` is actually started:
11062
11063     
11064
11065     # /etc/rc.d/sshd status
11066
11067     sshd is running as pid 433.
11068
11069 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.
11070
11071 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.
11072
11073 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:
11074
11075 * `PROVIDE`: Specifies the services this file provides.
11076
11077 * `REQUIRE`: Lists services which are required for this service. This file will run ***after*** the specified services.
11078
11079 * `BEFORE`: Lists services which depend on this service. This file will run ***before*** the specified services.
11080
11081 * 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.
11082
11083   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.
11084
11085 By using this method, an administrator can easily control system services without the hassle of ***runlevels*** like some other UNIX® operating systems.
11086
11087 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.
11088
11089 ### Using DragonFly's rcrun(8) 
11090
11091 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)
11092
11093 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.
11094
11095 The remaining commands are:
11096
11097 [[!table  data="""
11098   **disable**  | Sets the corresponding `_enable` variable in rc.conf(5) to ***NO*** and runs the stop command. 
11099   **enable**   | Sets the corresponding `_enable` variable in rc.conf(5) to ***YES*** and runs the start command. 
11100   **list**  | Shows the status of the specified scripts.  If no argument is specified, the status of all scripts is shown. |
11101
11102 """]]
11103
11104 To enable the [dntpd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dntpd&section=8) service, you can use:
11105
11106      # rcenable dntpd
11107      
11108  
11109
11110 To check if [dntpd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dntpd&section=8) is running you can use the following command:
11111
11112     
11113
11114     # rclist dntpd
11115
11116     rcng_dntpd=stopped
11117
11118 To start [dntpd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dntpd&section=8):
11119
11120     
11121
11122     # rcstart dntpd
11123
11124     Running /etc/rc.d/dntpd start
11125
11126     Starting dntpd.
11127
11128 Restart and stop works the same way:
11129
11130     
11131
11132     # rcrestart dntpd
11133
11134     Stopping dntpd.
11135
11136     Starting dntpd.
11137
11138     
11139
11140     # rcstop dntpd
11141
11142     Stopping dntpd.
11143
11144 If a service is not enabled in `/etc/rc.conf`, but you want it start anyway, execute the following:
11145
11146     
11147
11148     # rcforce dntpd
11149
11150     Running /etc/rc.d/dntpd forcestart
11151
11152     Starting dntpd.
11153
11154 #### Notes 
11155
11156 [[!table  data="""
11157 <tablestyle="width:100%"> [(1)](configtuning-rcng.html#AEN4751) | Previously this was used to define *BSD dependent features.
11158 | |
11159
11160 """]]
11161
11162 ## Setting Up Network Interface Cards 
11163
11164 ***Contributed by Marc Fonvieille. ***
11165
11166 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.
11167
11168 ### Locating the Correct Driver 
11169
11170 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.
11171
11172 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.
11173
11174 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:
11175
11176     
11177
11178     dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38
11179
11180     000ff irq 15 at device 11.0 on pci0
11181
11182     dc0: Ethernet address: 00:a0:cc:da:da:da
11183
11184     miibus0: <MII bus> on dc0
11185
11186     ukphy0: <Generic IEEE 802.3u media interface> on miibus0
11187
11188     ukphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
11189
11190     dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30
11191
11192     000ff irq 11 at device 12.0 on pci0
11193
11194     dc1: Ethernet address: 00:a0:cc:da:da:db
11195
11196     miibus1: <MII bus> on dc1
11197
11198     ukphy1: <Generic IEEE 802.3u media interface> on miibus1
11199
11200     ukphy1:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
11201
11202 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.
11203
11204 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.
11205
11206 ### Configuring the Network Card 
11207
11208 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.
11209
11210 To display the configuration for the network interfaces on your system, enter the following command:
11211
11212     
11213
11214     % ifconfig
11215
11216     dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
11217
11218             inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
11219
11220             ether 00:a0:cc:da:da:da
11221
11222             media: Ethernet autoselect (100baseTX <full-duplex>)
11223
11224             status: active
11225
11226     dc1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
11227
11228             inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
11229
11230             ether 00:a0:cc:da:da:db
11231
11232             media: Ethernet 10baseT/UTP
11233
11234             status: no carrier
11235
11236     lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
11237
11238     lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
11239
11240             inet 127.0.0.1 netmask 0xff000000
11241
11242     tun0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
11243
11244  **Note:** Note that entries concerning IPv6 (`inet6` etc.) were omitted in this example.
11245
11246 In this example, the following devices were displayed:
11247
11248 * `dc0`: The first Ethernet interface
11249
11250 * `dc1`: The second Ethernet interface
11251
11252 * `lp0`: The parallel port interface
11253
11254 * `lo0`: The loopback device
11255
11256 * `tun0`: The tunnel device used by  **ppp** 
11257
11258 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.
11259
11260 In this example, the `dc0` device is up and running. The key indicators are:
11261
11262   1. `UP` means that the card is configured and ready.
11263
11264   1. The card has an Internet (`inet`) address (in this case `192.168.1.3`).
11265
11266   1. It has a valid subnet mask (`netmask`; `0xffffff00` is the same as `255.255.255.0`).
11267
11268   1. It has a valid broadcast address (in this case, `192.168.1.255`).
11269
11270   1. The MAC address of the card (`ether`) is `00:a0:cc:da:da:da`
11271
11272   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.
11273
11274   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.
11275
11276 If the [ifconfig(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=ifconfig&section=8) output had shown something similar to:
11277
11278     
11279
11280     dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
11281
11282                 ether 00:a0:cc:da:da:da
11283
11284 it would indicate the card has not been configured.
11285
11286 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.
11287
11288     
11289
11290     # ifconfig dc0 inet 192.168.1.3 netmask 255.255.255.0
11291
11292 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.
11293
11294 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:
11295
11296     
11297
11298     ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0"
11299
11300     ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP"
11301
11302 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`.
11303
11304 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.
11305
11306 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`.
11307
11308 ### Testing and Troubleshooting 
11309
11310 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.
11311
11312 Once the system has been rebooted, you should test the network interfaces.
11313
11314 #### Testing the Ethernet Card 
11315
11316 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.
11317
11318 First test the local interface:
11319
11320     
11321
11322     % ping -c5 192.168.1.3
11323
11324     PING 192.168.1.3 (192.168.1.3): 56 data bytes
11325
11326     64 bytes from 192.168.1.3: icmp_seq#0 ttl64 time=0.082 ms
11327
11328     64 bytes from 192.168.1.3: icmp_seq#1 ttl64 time=0.074 ms
11329
11330     64 bytes from 192.168.1.3: icmp_seq#2 ttl64 time=0.076 ms
11331
11332     64 bytes from 192.168.1.3: icmp_seq#3 ttl64 time=0.108 ms
11333
11334     64 bytes from 192.168.1.3: icmp_seq#4 ttl64 time=0.076 ms
11335
11336     
11337
11338     --- 192.168.1.3 ping statistics ---
11339
11340     5 packets transmitted, 5 packets received, 0% packet loss
11341
11342     round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms
11343
11344 Now we have to ping another machine on the LAN:
11345
11346     
11347
11348     % ping -c5 192.168.1.2
11349
11350     PING 192.168.1.2 (192.168.1.2): 56 data bytes
11351
11352     64 bytes from 192.168.1.2: icmp_seq#0 ttl64 time=0.726 ms
11353
11354     64 bytes from 192.168.1.2: icmp_seq#1 ttl64 time=0.766 ms
11355
11356     64 bytes from 192.168.1.2: icmp_seq#2 ttl64 time=0.700 ms
11357
11358     64 bytes from 192.168.1.2: icmp_seq#3 ttl64 time=0.747 ms
11359
11360     64 bytes from 192.168.1.2: icmp_seq#4 ttl64 time=0.704 ms
11361
11362     
11363
11364     --- 192.168.1.2 ping statistics ---
11365
11366     5 packets transmitted, 5 packets received, 0% packet loss
11367
11368     round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms
11369
11370 You could also use the machine name instead of `192.168.1.2` if you have set up the `/etc/hosts` file.
11371
11372 #### Troubleshooting 
11373
11374 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.
11375
11376 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.
11377
11378 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.
11379
11380 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.
11381
11382 ***`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].
11383
11384 ***`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.
11385
11386 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.
11387
11388 ## Virtual Hosts 
11389
11390 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.
11391
11392 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`.
11393
11394 An alias entry for the interface `fxp0` looks like:
11395
11396     
11397
11398     ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"
11399
11400 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.
11401
11402 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`).
11403
11404 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`.
11405
11406 The following entries configure the adapter correctly for this arrangement:
11407
11408     
11409
11410      ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0"
11411
11412      ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255"
11413
11414      ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255"
11415
11416      ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255"
11417
11418      ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255"
11419
11420      ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240"
11421
11422      ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255"
11423
11424      ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255"
11425
11426      ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"
11427
11428 CategoryHandbook
11429
11430 CategoryHandbook-configuration
11431
11432 ## Configuration Files 
11433
11434 ### /etc Layout 
11435
11436 There are a number of directories in which configuration information is kept. These include:
11437
11438 [[!table  data="""
11439  `/etc` | Generic system configuration information; data here is system-specific. 
11440  `/etc/defaults` | Default versions of system configuration files. 
11441  `/etc/mail` | Extra [sendmail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sendmail&section=8) configuration, other MTA configuration files. 
11442  `/etc/ppp` | Configuration for both user- and kernel-ppp programs. 
11443  `/etc/namedb` | Default location for [named(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=named&section=8) data. Normally `named.conf` and zone files are stored here. 
11444  `/usr/local/etc` | Configuration files for installed applications. May contain per-application subdirectories. 
11445  `/usr/local/etc/rc.d` | Start/stop scripts for installed applications. 
11446  `/var/db` | Automatically generated system-specific database files, such as the package database, the locate database, and so on |
11447
11448 """]]
11449
11450 ### Hostnames 
11451
11452 #### /etc/resolv.conf 
11453
11454 `/etc/resolv.conf` dictates how DragonFly's resolver accesses the Internet Domain Name System (DNS).
11455
11456 The most common entries to `resolv.conf` are:
11457
11458 [[!table  data="""
11459  `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.
11460  `search` | Search list for hostname lookup. This is normally determined by the domain of the local hostname. 
11461  `domain` | The local domain name. |
11462
11463 """]]
11464
11465 A typical `resolv.conf`:
11466
11467     
11468
11469     search example.com
11470
11471     nameserver 147.11.1.11
11472
11473     nameserver 147.11.100.30
11474
11475  **Note:** Only one of the `search` and `domain` options should be used.
11476
11477 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.
11478
11479 #### /etc/hosts 
11480
11481 `/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.
11482
11483     
11484
11485     #
11486
11487     #
11488
11489     # Host Database
11490
11491     # This file should contain the addresses and aliases
11492
11493     # for local hosts that share this file.
11494
11495     # In the presence of the domain name service or NIS, this file may
11496
11497     # not be consulted at all; see /etc/nsswitch.conf for the resolution order.
11498
11499     #
11500
11501     #
11502
11503     ::1                     localhost localhost.my.domain myname.my.domain
11504
11505     127.0.0.1               localhost localhost.my.domain myname.my.domain
11506
11507     #
11508
11509     # Imaginary network.
11510
11511     #10.0.0.2               myname.my.domain myname
11512
11513     #10.0.0.3               myfriend.my.domain myfriend
11514
11515     #
11516
11517     # According to RFC 1918, you can use the following IP networks for
11518
11519     # private nets which will never be connected to the Internet:
11520
11521     #
11522
11523     #       10.0.0.0        -   10.255.255.255
11524
11525     #       172.16.0.0      -   172.31.255.255
11526
11527     #       192.168.0.0     -   192.168.255.255
11528
11529     #
11530
11531     # In case you want to be able to connect to the Internet, you need
11532
11533     # real official assigned numbers.  PLEASE PLEASE PLEASE do not try
11534
11535     # to invent your own network numbers but instead get one from your
11536
11537     # network provider (if any) or from the Internet Registry (ftp to
11538
11539     # rs.internic.net, directory `/templates').
11540
11541     #
11542
11543 `/etc/hosts` takes on the simple format of:
11544
11545     
11546
11547     [Internet address] [official hostname] [alias1] [alias2] ...
11548
11549 For example:
11550
11551     
11552
11553     10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2
11554
11555 Consult [hosts(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=hosts&section=5) for more information.
11556
11557 ### Log File Configuration 
11558
11559 #### syslog.conf 
11560
11561 `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.
11562
11563     
11564
11565     #
11566
11567     #
11568
11569     #       Spaces ARE valid field separators in this file. However,
11570
11571     #       other *nix-like systems still insist on using tabs as field
11572
11573     #       separators. If you are sharing this file between systems, you
11574
11575     #       may want to use only tabs as field separators here.
11576
11577     #       Consult the syslog.conf(5) manual page.
11578
11579     
11580 *.err;kern.debug;auth.notice;mail.crit          /dev/console
11581
11582     *.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
11583
11584     security.*                                      /var/log/security
11585
11586     mail.info                                       /var/log/maillog
11587
11588     lpr.info                                        /var/log/lpd-errs
11589
11590     cron.*                                          /var/log/cron
11591
11592     
11593 *.err                                           root
11594
11595     *.notice;news.err                               root
11596
11597     *.alert                                         root
11598
11599     *.emerg                                         *
11600
11601     # uncomment this to log all writes to /dev/console to /var/log/console.log
11602
11603     #console.info                                   /var/log/console.log
11604
11605     # uncomment this to enable logging of all log messages to /var/log/all.log
11606
11607     #*.*                                            /var/log/all.log
11608
11609     # uncomment this to enable logging to a remote log host named loghost
11610
11611     #*.*                                            @loghost
11612
11613     # uncomment these if you're running inn
11614
11615     # news.crit                                     /var/log/news/news.crit
11616
11617     # news.err                                      /var/log/news/news.err
11618
11619     # news.notice                                   /var/log/news/news.notice
11620
11621     !startslip
11622
11623     
11624 *.*                                             /var/log/slip.log
11625
11626     !ppp
11627
11628     
11629 *.*                                             /var/log/ppp.log
11630
11631 Consult the [syslog.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=syslog.conf&section=5) manual page for more information.
11632
11633 #### newsyslog.conf 
11634
11635 `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.
11636
11637 `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.
11638
11639     
11640
11641     # configuration file for newsyslog
11642
11643     #
11644
11645     #
11646
11647     # filename          [owner:group]    mode count size when [ZB] [/pid_file] [sig_num]
11648
11649     /var/log/cron                           600  3     100  *     Z
11650
11651     /var/log/amd.log                        644  7     100  *     Z
11652
11653     /var/log/kerberos.log                   644  7     100  *     Z
11654
11655     /var/log/lpd-errs                       644  7     100  *     Z
11656
11657     /var/log/maillog                        644  7     *    @T00  Z
11658
11659     /var/log/sendmail.st                    644  10    *    168   B
11660
11661     /var/log/messages                       644  5     100  *     Z
11662
11663     /var/log/all.log                        600  7     *    @T00  Z
11664
11665     /var/log/slip.log                       600  3     100  *     Z
11666
11667     /var/log/ppp.log                        600  3     100  *     Z
11668
11669     /var/log/security                       600  10    100  *     Z
11670
11671     /var/log/wtmp                           644  3     *    @01T05 B
11672
11673     /var/log/daily.log                      640  7     *    @T00  Z
11674
11675     /var/log/weekly.log                     640  5     1    $W6D0 Z
11676
11677     /var/log/monthly.log                    640  12    *    $M1D0 Z
11678
11679     /var/log/console.log                    640  5     100  *     Z
11680
11681 Consult the [newsyslog(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=newsyslog&section=8) manual page for more information.
11682
11683 ### sysctl.conf 
11684
11685 `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.
11686
11687 A sample `sysctl.conf` turning off logging of fatal signal exits and letting Linux programs know they are really running under DragonFly:
11688
11689     
11690
11691     kern.logsigexit=0       # Do not log fatal signal exits (e.g. sig 11)
11692
11693     compat.linux.osname=DragonFly
11694
11695     compat.linux.osrelease=4.3-STABLE
11696
11697     
11698     
11699     
11700     
11701     
11702 ## Tuning with sysctl 
11703
11704 [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).
11705
11706 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.
11707
11708 To view all readable variables:
11709
11710     
11711
11712     % sysctl -a
11713
11714 To read a particular variable, for example, `kern.maxproc`:
11715
11716     
11717
11718     % sysctl kern.maxproc
11719
11720     kern.maxproc: 1044
11721
11722 To set a particular variable, use the intuitive `***variable***`=`***value***` syntax:
11723
11724     
11725
11726     # sysctl kern.maxfiles=5000
11727
11728     kern.maxfiles: 2088 -< 5000
11729
11730 Settings of sysctl variables are usually either strings, numbers, or booleans (a boolean being `1` for yes or a `0` for no).
11731
11732 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].
11733
11734 ### sysctl(8) Read-only 
11735
11736 ***Contributed by Tom Rhodes. ***
11737
11738 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.
11739
11740 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:
11741
11742     
11743
11744     cbb0: Could not map register memory
11745
11746     device_probe_and_attach: cbb0 attach returned 12
11747
11748 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.
11749
11750 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.
11751
11752 ## Tuning Disks 
11753
11754 ### Sysctl Variables 
11755
11756 #### `vfs.vmiodirenable` 
11757
11758 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.
11759
11760 #### `vfs.write_behind` 
11761
11762 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.
11763
11764 #### `vfs.hirunningspace` 
11765
11766 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.
11767
11768 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.
11769
11770 #### `vm.swap_idle_enabled` 
11771
11772 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.
11773
11774 #### `hw.ata.wc` 
11775
11776 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.
11777
11778 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.
11779
11780 For more information, please see [ata(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=ata&section=4) manual page.
11781
11782 <!-- XXX: add some more sysctls, e.g. relating to AHCI, nata, ... -->
11783
11784 ### Soft Updates 
11785
11786 **Note** that soft updates are only available on UFS.
11787
11788 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:
11789
11790     
11791
11792     # tunefs -n enable /filesystem
11793
11794     # tunefs -n disable /filesystem
11795
11796 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.
11797
11798  **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).
11799
11800 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.
11801
11802 #### More Details about Soft Updates 
11803 <!-- XXX: consider axing this section -->
11804
11805 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.)
11806
11807 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`).
11808
11809 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.
11810
11811 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.
11812
11813 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.
11814
11815 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.
11816
11817 ## Tuning Kernel Limits 
11818
11819 ### File/Process Limits 
11820
11821 #### `kern.maxfiles` 
11822
11823 <!-- XXX: revise this section; someone who knows about it -->
11824
11825 `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.
11826
11827 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.
11828
11829 `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.
11830
11831  **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.
11832
11833 #### `kern.ipc.somaxconn` 
11834
11835 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.
11836
11837 ### Network Limits 
11838
11839 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.
11840
11841 <!-- XXX: mention kern.ipc.mbufs sysctl -->
11842
11843 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.
11844
11845  **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.
11846
11847 #### `net.inet.ip.portrange.*` 
11848
11849 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.
11850
11851 #### TCP Bandwidth Delay Product 
11852 <!-- XXX: Revise this stuff, I'm not familiar with it -->
11853
11854 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.
11855
11856 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).
11857
11858 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.
11859
11860 ## Adding Swap Space 
11861 <!-- XXX: swapcache -->
11862
11863 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.
11864
11865 ### Swap on a New Hard Drive 
11866
11867 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.
11868
11869 ### Swapping over NFS 
11870
11871 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.
11872
11873 ### Swapfiles 
11874
11875 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.
11876
11877  **Example 6-1. Creating a Swapfile** 
11878
11879   1. Be certain that your kernel configuration includes the vnode driver. It is ***not*** in recent versions of `GENERIC`.
11880
11881       
11882
11883          pseudo-device   vn 1   #Vnode driver (turns a file into a device)
11884
11885   
11886
11887   1. Create a swapfile (`/usr/swap0`):
11888
11889       
11890
11891          # dd if=/dev/zero of=/usr/swap0 bs=1024k count=64
11892
11893   
11894
11895   1. Set proper permissions on (`/usr/swap0`):
11896
11897       
11898
11899          # chmod 0600 /usr/swap0
11900
11901   
11902
11903   1. Enable the swap file in `/etc/rc.conf`:
11904
11905       
11906
11907          swapfile="/usr/swap0"   # Set to name of swapfile if aux swapfile desired.
11908
11909   
11910
11911   1. Reboot the machine or to enable the swap file immediately, type:
11912
11913       
11914
11915          # vnconfig -e /dev/vn0b /usr/swap0 swap
11916
11917   
11918
11919 ## Power and Resource Management 
11920
11921 ***Written by Hiten Pandya and Tom Rhodes. ***
11922
11923 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.
11924
11925 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.
11926
11927 ### What Is ACPI? 
11928
11929 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).
11930
11931 ### Shortcomings of Advanced Power Management (APM) 
11932
11933 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.
11934
11935 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.
11936
11937 ***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.
11938
11939 The DragonFly APM driver is documented in the [apm(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=apm&section=4) manual page.
11940
11941 ### Configuring ACPI 
11942
11943 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.
11944
11945  **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.
11946
11947 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:
11948
11949   
11950
11951     # halt -p
11952
11953 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.
11954
11955 ## Using and Debugging DragonFly ACPI 
11956
11957 ***Written by Nate Lawson. With contributions from Peter Schultz and Tom Rhodes. ***
11958
11959 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.
11960
11961 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.
11962
11963 ### Submitting Debugging Information 
11964
11965  **Note:** Before submitting a problem, be sure you are running the latest BIOS version and, if available, embedded controller firmware version.
11966
11967 For those of you that want to submit a problem right away, please send the following information to [bugs](http://leaf.dragonflybsd.org/mailarchive/)
11968
11969 * 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.
11970
11971 * The dmesg output after ***boot `-v`***, including any error messages generated by you exercising the bug.
11972
11973 * dmesg output from ***boot `-v`*** with ACPI disabled, if disabling it helps fix the problem.
11974
11975 * Output from ***sysctl hw.acpi***. This is also a good way of figuring out what features your system offers.
11976
11977 * 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:
11978       
11979
11980       # acpidump -t -d > name-system.asl
11981
11982   
11983
11984   (Substitute your login name for `name` and manufacturer/model for `system`. Example: `njl-FooCo6000.asl`)
11985
11986 ### Background 
11987
11988 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.
11989
11990 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.
11991
11992 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`.
11993
11994 ### Common Problems 
11995
11996 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.
11997
11998 #### Suspend/Resume 
11999
12000 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.
12001
12002 Start by checking `sysctl` `hw.acpi` for the suspend-related items. Here are the results for my Thinkpad:
12003
12004     hw.acpi.supported_sleep_state: S3 S4 S5
12005
12006     hw.acpi.s4bios: 0
12007
12008 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.
12009
12010 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.
12011
12012 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.
12013
12014 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.
12015
12016 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.
12017
12018 <-- XXX: mention sensors somewhere; but not in this section -->
12019
12020 #### System Hangs (temporary or permanent) 
12021
12022 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).
12023
12024 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`.
12025
12026 Your best hope when dealing with interrupt problems is to try disabling APIC support with `hint.apic.0.disabled="1"` in `loader.conf`.
12027
12028 #### Panics 
12029
12030 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.
12031
12032 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.
12033
12034 #### System Powers Up After Suspend or Shutdown 
12035
12036 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.
12037
12038 #### Other Problems 
12039
12040 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.
12041
12042 ### ASL, acpidump, and IASL 
12043 <!-- XXX: IMHO all this crap about fixing your DSDT etc should  be axed -->
12044
12045 The most common problem is the BIOS vendors providing incorrect (or outright buggy!) bytecode. This is usually manifested by kernel console messages like this:
12046
12047     
12048
12049     ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\
12050
12051     (Node 0xc3f6d160), AE_NOT_FOUND
12052
12053 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.
12054
12055 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:
12056
12057     
12058
12059     # iasl your.asl
12060
12061 ### Fixing Your ASL 
12062
12063 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.
12064
12065 Here is a list of common error messages, their cause, and how to fix them:
12066
12067 #### OS dependencies 
12068
12069 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.
12070
12071 #### Missing Return statements 
12072
12073 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.
12074
12075 #### Overriding the Default AML 
12076
12077 After you customize `your.asl`, you will want to compile it, run:
12078    
12079
12080     # iasl your.asl
12081
12082 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.
12083
12084 `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:
12085
12086     
12087
12088     acpi_dsdt_load="YES"
12089
12090     acpi_dsdt_name="/boot/DSDT.aml"
12091
12092 Be sure to copy your `DSDT.aml` to the `/boot` directory.
12093
12094 ### Getting Debugging Output From ACPI 
12095
12096 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.
12097
12098 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:
12099
12100     
12101
12102     # cd /sys/dev/acpica5 && make clean && make ACPI_DEBUG=1
12103
12104 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.
12105
12106     
12107
12108     debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS"
12109
12110     debug.acpi.level="ACPI_LV_ERROR"
12111
12112 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`.
12113
12114 ### References 
12115
12116 More information about ACPI may be found in the following locations:
12117
12118 * 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.)
12119
12120 * The ACPI Mailing List Archives (FreeBSD) http://lists.freebsd.org/pipermail/freebsd-acpi/
12121
12122 * The old ACPI Mailing List Archives (FreeBSD) http://home.jp.FreeBSD.org/mail-list/acpi-jp/
12123
12124 * The ACPI 2.0 Specification http://acpi.info/spec.htm
12125
12126 * DragonFly Manual pages: [acpidump(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=acpidump&section8), [acpiconf(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=acpiconf&section=8), [acpidb(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=acpidb&section=8)
12127
12128 * [DSDT debugging resource](http://www.cpqlinux.com/acpi-howto.html#fix_broken_dsdt). (Uses Compaq as an example but generally useful.)
12129
12130 # The DragonFly virtual kernels 
12131 [[!toc  levels=3]]
12132
12133 ***Obtained from [vkernel(7)](http://leaf.dragonflybsd.org/cgi/web-man?command=vkernel&section=7) written by Sascha Wildner, added by Matthias Schmidt***
12134
12135 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.
12136
12137 The vkernel architecture allows for running DragonFly kernels in userland.
12138
12139 ## Supported devices 
12140
12141 A number of virtual device drivers exist to supplement the virtual kernel.
12142
12143 <!-- XXX: why do they only support 16 devices? is this really true? -->
12144
12145 ### Disk device 
12146
12147 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`.
12148
12149 ### CD-ROM device 
12150
12151 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.
12152
12153 ### Network interface 
12154
12155 The vke driver supports up to 16 virtual network interfaces which are
12156
12157 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.
12158
12159 ## Setup a virtual kernel environment 
12160
12161 A couple of steps are necessary in order to prepare the system to build and run a virtual kernel.
12162
12163 ### Setting up the filesystem 
12164
12165 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`:
12166
12167     
12168
12169     % mkdir /home/var.vkernel
12170     % ln -s /home/var.vkernel /var/vkernel
12171
12172 Next, a filesystem image to be used by the virtual kernel has to be created and populated (assuming world has been built previously):    
12173
12174     # dd if=/dev/zero of=/var/vkernel/rootimg.01 bs=1m count=2048
12175     # vnconfig -c vn0 /var/vkernel/rootimg.01
12176     # disklabel -r -w vn0s0 auto
12177     # disklabel -e vn0s0      # add 'a' partition with fstype `4.2BSD' size could be '*'
12178     # newfs /dev/vn0s0a
12179     # mount /dev/vn0s0a /mnt
12180
12181 If instead of using `vn0` you specify `vn` to `vnconfig`, a new `vn` device will be created and a message saying which `vnX` was created will appear. This effectively lifts the limit of 4 vn devices.
12182
12183 Assuming that you build your world before, you can populate the image now.  If you didn't build your world see [chapter 21](../updating-makeworld.html).
12184
12185     # cd /usr/src
12186     # make installworld DESTDIR=/mnt
12187     # cd etc
12188     # make distribution DESTDIR=/mnt
12189
12190 Create a fstab file to let the vkernel find your image file.
12191
12192     
12193
12194     # echo '/dev/vkd0s0a      /       ufs     rw      1  1' >/mnt/etc/fstab
12195     # echo 'proc              /proc   procfs  rw      0  0' >>/mnt/etc/fstab
12196
12197 Edit `/mnt/etc/ttys` and replace the console entry with the following line and turn off all other gettys.
12198
12199     # console "/usr/libexec/getty Pc"         cons25  on  secure
12200
12201 Then, unmount the disk.
12202
12203     # umount /mnt
12204     # vnconfig -u vn0
12205
12206 ### Compiling the virtual kernel 
12207
12208 In order to compile a virtual kernel use the VKERNEL kernel configuration file residing in `/usr/src/sys/config` (or a configuration file derived thereof):
12209     
12210
12211     # cd /usr/src
12212     # make -DNO_MODULES buildkernel KERNCONF=VKERNEL
12213     # make -DNO_MODULES installkernel KERNCONF=VKERNEL DESTDIR=/var/vkernel
12214
12215 ### Enabling virtual kernel operation 
12216
12217 A special sysctl(8), `vm.vkernel_enable`, must be set to enable vkernel operation:
12218
12219     # sysctl vm.vkernel_enable=1
12220
12221 To make this change permanent, edit `/etc/sysctl.conf`
12222
12223 ## Setup networking 
12224
12225 ### Configuring the network on the host system 
12226
12227 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:
12228
12229     
12230
12231     # kldload if_bridge.ko
12232     # kldload if_tap.ko
12233     # ifconfig bridge0 create
12234     # ifconfig bridge0 addm re0       # assuming re0 is the host's interface
12235     # ifconfig bridge0 up
12236
12237  **Note** : You have to change `re0` to the interface of your host machine.
12238
12239  
12240  
12241  
12242 ## Run a virtual kernel 
12243
12244 Finally, the virtual kernel can be run:
12245
12246     # cd /var/vkernel
12247     # ./boot/kernel/kernel -m 64m -r /var/vkernel/rootimg.01 -I auto:bridge0
12248
12249 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.
12250
12251 # The DragonFly Booting Process 
12252 [[!toc  levels=3]]
12253
12254 ## Synopsis 
12255
12256 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.
12257
12258 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.
12259
12260 After reading this chapter, you will know:
12261
12262 * What the components of the DragonFly bootstrap system are, and how they interact.
12263
12264 * The options you can give to the components in the DragonFly bootstrap to control the boot process.
12265
12266 * The basics of [device.hints(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#device.hints&section5&manpath=FreeBSD+5.2-current).
12267
12268  **x86 Only:** This chapter only describes the boot process for DragonFly running on x86 systems.
12269
12270 ## The Booting Problem 
12271
12272 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?
12273
12274 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***.
12275
12276 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.
12277
12278 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.)
12279
12280 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`.
12281
12282 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.
12283
12284 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.
12285
12286 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.
12287
12288 ----
12289
12290 ## The Boot Manager and Boot Stages 
12291
12292 ### The Boot Manager 
12293
12294 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** .
12295
12296  **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:
12297
12298  **Example 7-1. `boot0` Screenshot** 
12299
12300     
12301
12302     F1 DOS
12303
12304     F2 FreeBSD
12305
12306     F3 Linux
12307
12308     F4 ??
12309
12310     F5 Drive 1
12311
12312     
12313
12314     Default: F2
12315
12316 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:
12317
12318     
12319
12320     # fdisk -B -b /boot/boot0 device
12321
12322 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).
12323
12324  **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:
12325
12326     
12327
12328     other=/dev/hdXY
12329
12330     table=/dev/hdX
12331
12332     loader=/boot/chain.b
12333
12334     label=DragonFly
12335
12336 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.
12337
12338 ### Stage One, /boot/boot1, and Stage Two, /boot/boot2 
12339
12340 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).
12341
12342 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`.
12343
12344 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.
12345
12346 `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`.
12347
12348 `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.
12349
12350 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.
12351
12352  **Example 7-2. boot2 Screenshot** 
12353
12354     
12355
12356     >> DragonFly/i386 BOOT
12357
12358     Default: 0:ad(0,a)/boot/loader
12359
12360     boot:
12361
12362 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):
12363
12364     
12365
12366     # disklabel -B diskslice
12367
12368 where `***diskslice***` is the disk and slice you boot from, such as `ad0s1` for the first slice on the first IDE disk.
12369
12370 ### Stage Three, `/boot/loader` 
12371
12372 The loader is the final stage of the three-stage bootstrap, and is located on the file system, usually as `/boot/loader`.
12373
12374 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.
12375
12376 #### Loader Program Flow 
12377
12378 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.
12379
12380 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.
12381
12382 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.
12383
12384 #### Loader Built-In Commands 
12385
12386 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).
12387
12388 * 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.
12389
12390 * boot [`***-options***`] [`***kernelname***`]: Immediately proceeds to boot the kernel, with the given options, if any, and with the kernel name given, if it is.
12391
12392 *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`.
12393
12394 * help [`***topic***`]: Shows help messages read from `/boot/loader.help`. If the topic given is `index`, then the list of available topics is given.
12395
12396 * 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.
12397
12398 * 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.
12399
12400 * 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.
12401
12402 * lsdev [`-v`]: Lists all of the devices from which it may be possible to load modules. If `-v` is specified, more details are printed.
12403
12404 * lsmod [`-v`]: Displays loaded modules. If `-v` is specified, more details are shown.
12405
12406 * more `***filename***`: Displays the files specified, with a pause at each `LINES` displayed.
12407
12408 * reboot: Immediately reboots the system.
12409
12410 * set `***variable***`, set `***variable***`=`***value***`: Sets the loader's environment variables.
12411
12412 * unload: Removes all loaded modules.
12413
12414 #### Loader Examples 
12415
12416 Here are some practical examples of loader usage:
12417
12418 * To simply boot your usual kernel, but in single-user mode:
12419
12420       
12421
12422           boot -s
12423
12424   
12425
12426 * To unload your usual kernel and modules, and then load just your old (or another) kernel:
12427
12428       
12429
12430           unload
12431
12432           load kernel.old
12433
12434   
12435
12436   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).
12437
12438    **Note:** Use the following to load your usual modules with another kernel:
12439
12440       
12441
12442           unload
12443
12444           set kernel="kernel.old"
12445
12446           boot-conf
12447
12448   
12449
12450 * To load a kernel configuration script (an automated script which does the things you would normally do in the kernel boot-time configurator):
12451
12452       
12453
12454          load -t userconfig_script /boot/kernel.conf
12455
12456   
12457
12458 ----
12459
12460 ## Kernel Interaction During Boot 
12461
12462 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.
12463
12464 ### Kernel Boot Flags 
12465
12466 Here are the more common boot flags:
12467
12468 `-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
12469
12470  **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.
12471
12472 ## Init: Process Control Initialization 
12473
12474 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`.
12475
12476 ### Automatic Reboot Sequence 
12477
12478 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.
12479
12480 ### Single-User Mode 
12481
12482 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`.
12483
12484 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).
12485
12486 If the system `console` is set to `insecure` in `/etc/ttys`, then the system prompts for the `root` password before initiating single-user mode.
12487
12488 ***'Example 7-3. An Insecure Console in `/etc/ttys`***'
12489
12490     
12491
12492     # name  getty                           type    status          comments
12493
12494     #
12495
12496     # If console is marked "insecure", then init will ask for the root password
12497
12498     # when going to single-user mode.
12499
12500     console none                            unknown off insecure
12501
12502  **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`.
12503
12504 ### Multi-User Mode 
12505
12506 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.
12507
12508 #### Resource Configuration (rc) 
12509
12510 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.
12511
12512 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.
12513
12514 ## Shutdown Sequence 
12515
12516 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.
12517
12518 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.
12519
12520  **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.
12521
12522 <!-- this section needs the info about sernos and vfs.mountrootfrom or whatever it's called -->
12523
12524 # Users and Basic Account Management 
12525
12526 ***Contributed by Neil Blakey-Milner. ***
12527
12528 [[!toc  levels=3]]
12529
12530 ## Synopsis 
12531
12532 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.
12533
12534 After reading this chapter, you will know:
12535
12536 * The differences between the various user accounts on a DragonFly system.
12537
12538 * How to add user accounts.
12539
12540 * How to remove user accounts.
12541
12542 * How to change account details, such as the user's full name, or preferred shell.
12543
12544 * 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.
12545
12546 * How to use groups to make account management easier.
12547
12548 Before reading this chapter, you should:
12549
12550 * Understand the basics of UNIX® and DragonFly ([Chapter 3](basics.html)).
12551
12552 ## Introduction 
12553
12554 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.
12555
12556 Every account on a DragonFly system has certain information associated with it to identify the account.
12557
12558 * 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.
12559
12560 * 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.
12561
12562 * 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.
12563
12564 * Login class: Login classes are an extension to the group mechanism that provide additional flexibility when tailoring the system to different users.
12565
12566 * 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.
12567
12568 * 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.
12569
12570 * 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.
12571
12572 * 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.
12573
12574 * 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.
12575
12576 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.
12577
12578 ## The Superuser Account 
12579
12580 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.
12581
12582 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.
12583
12584 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.
12585
12586 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.
12587
12588 ## System Accounts 
12589
12590 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.
12591
12592 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.
12593
12594 `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.
12595
12596 ## User Accounts 
12597
12598 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.
12599
12600 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.
12601
12602 Each user can set up their own environment to accommodate their use of the system, by using alternate shells, editors, key bindings, and language.
12603
12604 ## Modifying Accounts 
12605
12606 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.
12607
12608 [[!table  data="""
12609 Command | Summary 
12610  [adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8) | The recommended command-line application for adding new users. 
12611  [rmuser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rmuser&section=8) | The recommended command-line application for removing users. 
12612  [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1) | A flexible tool to change user database information. 
12613  [passwd(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=passwd&section=1) | The simple command-line tool to change user passwords. 
12614  [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. |
12615
12616 """]]
12617
12618 ### adduser 
12619
12620 [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.
12621
12622 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.
12623
12624  **Example 8-1. Configuring `adduser` and adding a user** 
12625
12626    
12627
12628     # adduser -v
12629
12630     Use option -silent if you don't want to see all warnings and questions.
12631
12632     Check /etc/shells
12633
12634     Check /etc/master.passwd
12635
12636     Check /etc/group
12637
12638     Enter your default shell: csh date no sh tcsh zsh [sh]: zsh
12639
12640     Your default shell is: zsh -&gt; /usr/local/bin/zsh
12641
12642     Enter your default HOME partition: [/home]:
12643
12644     Copy dotfiles from: /usr/share/skel no [/usr/share/skel]:
12645
12646     Send message from file: /etc/adduser.message no
12647
12648     [/etc/adduser.message]: no
12649
12650     Do not send message
12651
12652     Use passwords (y/n) [y]: y
12653
12654     
12655
12656     Write your changes to /etc/adduser.conf? (y/n) [n]: y
12657
12658     
12659
12660     Ok, let's go.
12661
12662     Don't worry about mistakes. I will give you the chance later to correct any input.
12663
12664     Enter username [a-z0-9_-]: jru
12665
12666     Enter full name []: J. Random User
12667
12668     Enter shell csh date no sh tcsh zsh [zsh]:
12669
12670     Enter home directory (full path) [/home/jru]:
12671
12672     Uid [1001]:
12673
12674     Enter login class: default []:
12675
12676     Login group jru [jru]:
12677
12678     Login group is ***jru***. Invite jru into other groups: guest no
12679
12680     [no]: wheel
12681
12682     Enter password []:
12683
12684     Enter password again []:
12685
12686     
12687
12688     Name:         jru
12689
12690     Password: ****
12691
12692     Fullname: J. Random User
12693
12694     Uid:          1001
12695
12696     Gid:          1001 (jru)
12697
12698     Class:
12699
12700     Groups:       jru wheel
12701
12702     HOME:     /home/jru
12703
12704     Shell:        /usr/local/bin/zsh
12705
12706     OK? (y/n) [y]: y
12707
12708     Added user ***jru***
12709
12710     Copy files from /usr/share/skel to /home/jru
12711
12712     Add another user? (y/n) [y]: n
12713
12714     Goodbye!
12715
12716     #
12717
12718 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.)
12719
12720  **Note:** The password you type in is not echoed, nor are asterisks displayed. Make sure you do not mistype the password twice.
12721
12722  **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.
12723
12724 ### rmuser 
12725
12726 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:
12727
12728   1. Removes the user's [crontab(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=crontab&section=1) entry (if any).
12729
12730   1. Removes any [at(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=at&section=1) jobs belonging to the user.
12731
12732   1. Kills all processes owned by the user.
12733
12734   1. Removes the user from the system's local password file.
12735
12736   1. Removes the user's home directory (if it is owned by the user).
12737
12738   1. Removes the incoming mail files belonging to the user from `/var/mail`.
12739
12740   1. Removes all files owned by the user from temporary file storage areas such as `/tmp`.
12741
12742   1. Finally, removes the username from all groups to which it belongs in `/etc/group`.
12743
12744    **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).
12745
12746 [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.
12747
12748 By default, an interactive mode is used, which attempts to make sure you know what you are doing.
12749
12750  **Example 8-2. `rmuser` Interactive Account Removal** 
12751
12752     
12753
12754     # rmuser jru
12755
12756     Matching password entry:
12757
12758     jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
12759
12760     Is this the entry you wish to remove? y
12761
12762     Remove user's home directory (/home/jru)? y
12763
12764     Updating password file, updating databases, done.
12765
12766     Updating group file: trusted (removing group jru -- personal group is empty) done.
12767
12768     Removing user's incoming mail file /var/mail/jru: done.
12769
12770     Removing files belonging to jru from /tmp: done.
12771
12772     Removing files belonging to jru from /var/tmp: done.
12773
12774     Removing files belonging to jru from /var/tmp/vi.recover: done.
12775
12776     #
12777
12778 ### chpass 
12779
12780 [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1) changes user database information such as passwords, shells, and personal information.
12781
12782 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).
12783
12784 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.
12785
12786 ***'Example 8-3. Interactive `chpass` by Superuser***'
12787
12788     
12789
12790     #Changing user database information for jru.
12791
12792     Login: jru
12793
12794     Password: *
12795
12796     Uid [#]: 1001
12797
12798     Gid [# or name]: 1001
12799
12800     Change [month day year]:
12801
12802     Expire [month day year]:
12803
12804     Class:
12805
12806     Home directory: /home/jru
12807
12808     Shell: /usr/local/bin/zsh
12809
12810     Full Name: J. Random User
12811
12812     Office Location:
12813
12814     Office Phone:
12815
12816     Home Phone:
12817
12818     Other information:
12819
12820 The normal user can change only a small subset of this information, and only for themselves.
12821
12822  **Example 8-4. Interactive chpass by Normal User** 
12823
12824     
12825
12826     #Changing user database information for jru.
12827
12828     Shell: /usr/local/bin/zsh
12829
12830     Full Name: J. Random User
12831
12832     Office Location:
12833
12834     Office Phone:
12835
12836     Home Phone:
12837
12838     Other information:
12839
12840  **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].
12841
12842 ### passwd 
12843
12844 [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.
12845
12846  **Note:** To prevent accidental or unauthorized changes, the original password must be entered before a new password can be set.
12847
12848  **Example 8-5. Changing Your Password** 
12849
12850     
12851
12852     % passwd
12853
12854     Changing local password for jru.
12855
12856     Old password:
12857
12858     New password:
12859
12860     Retype new password:
12861
12862     passwd: updating the database...
12863
12864     passwd: done
12865
12866 ***'Example 8-6. Changing Another User's Password as the Superuser***'
12867
12868     
12869
12870     # passwd jru
12871
12872     Changing local password for jru.
12873
12874     New password:
12875
12876     Retype new password:
12877
12878     passwd: updating the database...
12879
12880     passwd: done
12881
12882  **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.
12883
12884 ### pw 
12885
12886 [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.
12887
12888 #### Notes 
12889
12890 [[!table  data="""
12891 <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. |
12892 | | 
12893 """]]
12894
12895 ## Limiting Users 
12896
12897 <!-- XXX: check this section, I got the feeling there might be something outdated in it. I'm not familiar with it -->
12898
12899 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.
12900
12901 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].
12902
12903 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.
12904
12905 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).
12906
12907 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).
12908
12909 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)).
12910
12911 * `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.
12912
12913 * `cputime`: This is the maximum amount of CPU time a user's process may consume. Offending processes will be killed by the kernel.
12914
12915  **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.
12916
12917 * `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.
12918
12919 * `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).
12920
12921 * `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.
12922
12923 * `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.
12924
12925 * `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).
12926
12927 * `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.
12928
12929 * `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.
12930
12931 There are a few other things to remember when setting resource limits. Following are some general tips, suggestions, and miscellaneous comments.
12932
12933 * Processes started at system startup by `/etc/rc` are assigned to the `daemon` login class.
12934
12935 * 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.
12936
12937 * 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.
12938
12939 * 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.
12940
12941 For further information on resource limits and login classes and capabilities in general, please consult the relevant manual pages: [cap_mkdb(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#cap_mkdb&section1), [getrlimit(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=getrlimit&section=2), [login.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=login.conf&section=5).
12942
12943 ## Personalizing Users 
12944
12945 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).
12946
12947 ## Groups 
12948
12949 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.
12950
12951 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.
12952
12953 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:
12954
12955  **Example 8-7. Adding a Group Using pw(8)** 
12956
12957     
12958
12959     # pw groupadd teamtwo
12960
12961     # pw groupshow teamtwo
12962
12963     teamtwo:*:1100:
12964
12965 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.
12966
12967  **Example 8-8. Adding Somebody to a Group Using pw(8)** 
12968
12969     
12970
12971     # pw groupmod teamtwo -M jru
12972
12973     # pw groupshow teamtwo
12974
12975     teamtwo:*:1100:jru
12976
12977 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`.
12978
12979  **Example 8-9. Using id(1) to Determine Group Membership** 
12980
12981     
12982
12983     % id jru
12984
12985     uid#1001(jru) gid1001(jru) groups=1001(jru), 1100(teamtwo)
12986
12987 As you can see, `jru` is a member of the groups `jru` and `teamtwo`.
12988
12989 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.
12990
12991 # Configuring the DragonFly Kernel 
12992
12993 ***Updated and restructured by Jim Mock. Originally contributed by Jake Hamby.***
12994
12995 [[!toc  levels=3]]
12996
12997 ## Synopsis 
12998
12999 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.
13000
13001 After reading this chapter, you will know:
13002
13003 * Why you might need to build a custom kernel.
13004 * How to write a kernel configuration file, or alter an existing configuration file.
13005 * How to use the kernel configuration file to create and build a new kernel.
13006 * How to install the new kernel.
13007 * How to troubleshoot if things go wrong.
13008
13009 ## Why Build a Custom Kernel? 
13010
13011 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.
13012
13013 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.
13014
13015 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.
13016
13017 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:
13018
13019 * 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.
13020
13021 * 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.
13022
13023 * 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.
13024
13025 ## Building and Installing a Custom Kernel 
13026
13027 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.
13028
13029 ### Installing the Source
13030
13031 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.
13032
13033 The preferred way of installing the sources is:
13034
13035     # cd /usr
13036     # make src-create
13037     
13038 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:
13039
13040     # make src-update
13041
13042 ### Your Custom Config File
13043
13044 Next, move to the `config` directory and copy the `GENERIC` configuration file to the name you want to give your kernel. For example:
13045
13046     # cd /usr/src/sys/config
13047     # cp GENERIC MYKERNEL
13048
13049 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.
13050
13051 **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.
13052
13053 For example:
13054
13055     # cd /usr/src/sys/config
13056     # mkdir /root/kernels
13057     # cp GENERIC /root/kernels/MYKERNEL
13058     # ln -s /root/kernels/MYKERNEL
13059
13060 **Note:** You must execute these and all of the following commands under the `root` account or you will get permission denied errors.
13061
13062 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`.
13063
13064 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.
13065
13066 ### Building a Kernel - Full Source Tree
13067
13068 **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.
13069
13070  1. Change to the `/usr/src` directory.
13071
13072      
13073
13074           # cd /usr/src
13075
13076  1. Compile the kernel.
13077
13078           # make buildkernel KERNCONF=MYKERNEL
13079
13080  1. Install the new kernel.     
13081
13082           # make installkernel KERNCONF=MYKERNEL
13083
13084     
13085
13086 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.
13087
13088 ### Building a Kernel - Kernel Source Only
13089
13090 When only the kernel source is installed, you need to change step 2, above, to this:
13091      
13092
13093       # make nativekernel KERNCONF=MYKERNEL
13094
13095 The other steps are the same.
13096
13097 ### Running Your New Kernel
13098
13099 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).
13100
13101 **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.
13102
13103 ## The Configuration File 
13104 <!-- XXX: do we really want to mention all these million config options? -->
13105 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`.
13106
13107 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`.
13108
13109     
13110
13111     #
13112
13113     #
13114
13115     # GENERIC -- Generic kernel configuration file for DragonFly/i386
13116
13117     #
13118
13119     # Check the LINT configuration file in sys/config, for an
13120
13121     # exhaustive list of options.
13122
13123     #
13124
13125     # $DragonFly: src/sys/config/GENERIC,v 1.56 2007/12/26 14:02:36 sephe Exp $
13126
13127 The following are the mandatory keywords required in ***every*** kernel you build:
13128
13129     
13130
13131     machine         i386
13132
13133 This is the machine architecture. It must be `i386` at the moment.  Support for `amd64` will be added in the future.
13134
13135     
13136
13137     cpu          I386_CPU
13138
13139     cpu          I486_CPU
13140
13141     cpu          I586_CPU
13142
13143     cpu          I686_CPU
13144
13145 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.
13146
13147     
13148
13149     ident          GENERIC
13150
13151 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).
13152
13153     
13154
13155     maxusers          0
13156
13157 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.
13158
13159 (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.
13160
13161  **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`].
13162
13163     
13164
13165     # Floating point support - do not disable.
13166
13167     device          npx0     at nexus? port IO_NPX irq 13
13168
13169 `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.
13170
13171     
13172
13173     # Pseudo devices - the number indicates how many units to allocate.
13174
13175     pseudo-device   loop          # Network loopback
13176
13177 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***.
13178
13179 Everything that follows is more or less optional. See the notes underneath or next to each option for more information.
13180
13181     
13182
13183     #makeoptions     DEBUG=-g          #Build kernel with gdb(1) debug symbols
13184
13185 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).
13186
13187     
13188
13189     options          MATH_EMULATE      #Support for x87 emulation
13190
13191 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.
13192
13193  **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.
13194
13195     
13196
13197     options          INET          #InterNETworking
13198
13199 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.
13200
13201     
13202
13203     options          INET6          #IPv6 communications protocols
13204
13205 This enables the IPv6 communication protocols.
13206
13207     
13208
13209     options          FFS          #Berkeley Fast Filesystem
13210
13211     options          FFS_ROOT     #FFS usable as root device [keep this!]
13212
13213 This is the basic hard drive Filesystem. Leave it in if you boot from the hard disk.
13214
13215     
13216
13217     options          UFS_DIRHASH  #Improve performance on big directories
13218
13219 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.
13220
13221     
13222
13223     options          SOFTUPDATES  #Enable FFS Soft Updates support
13224
13225 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.
13226
13227     
13228
13229     options          MFS          #Memory Filesystem
13230
13231     options          MD_ROOT      #MD is a potential root device
13232
13233 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`:
13234
13235     
13236
13237     /dev/ad1s2b     /tmp mfs rw 0 0
13238
13239 Now you simply need to either reboot, or run the command `mount /tmp`.
13240
13241     
13242
13243     options          NFS          #Network Filesystem
13244
13245     options          NFS_ROOT     #NFS usable as root device, NFS required
13246
13247 The network Filesystem. Unless you plan to mount partitions from a UNIX® file server over TCP/IP, you can comment these out.
13248
13249     
13250
13251     options          MSDOSFS      #MSDOS Filesystem
13252
13253 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).
13254
13255     
13256
13257     options          CD9660       #ISO 9660 Filesystem
13258
13259     options          CD9660_ROOT  #CD-ROM usable as root, CD9660 required
13260
13261 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.
13262
13263     
13264
13265     options          PROCFS       #Process filesystem
13266
13267 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. ***
13268
13269     
13270
13271 Compatibility with 4.3BSD. Leave this in; some programs will act strangely if you comment this out.
13272
13273     
13274
13275     options          SCSI_DELAY=5000    #Delay (in ms) before probing SCSI
13276
13277 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.
13278
13279     
13280
13281     options          UCONSOLE            #Allow users to grab the console
13282
13283 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.
13284
13285     
13286
13287     options          USERCONFIG          #boot -c editor
13288
13289 This option allows you to boot the configuration editor from the boot menu.
13290
13291     
13292
13293     options          VISUAL_USERCONFIG   #visual boot -c editor
13294
13295 This option allows you to boot the visual configuration editor from the boot menu.
13296
13297     
13298
13299     options          KTRACE              #ktrace(1) support
13300
13301 This enables kernel process tracing, which is useful in debugging.
13302
13303     
13304
13305     options          SYSVSHM             #SYSV-style shared memory
13306
13307 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.
13308
13309     
13310
13311     options          SYSVSEM             #SYSV-style semaphores
13312
13313 Support for System V semaphores. Less commonly used but only adds a few hundred bytes to the kernel.
13314
13315     
13316
13317     options          SYSVMSG             #SYSV-style message queues
13318
13319 Support for System V messages. Again, only adds a few hundred bytes to the kernel.
13320
13321  **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.
13322
13323     
13324
13325     options         P1003_1B                #Posix P1003_1B real-time extensions
13326
13327     options         _KPOSIX_PRIORITY_SCHEDULING
13328
13329 Real-time extensions added in the 1993 POSIX®. Certain applications in the ports collection use these (such as  **StarOffice™** ).
13330
13331     
13332
13333     options         ICMP_BANDLIM            #Rate limit bad replies
13334
13335 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.
13336
13337     
13338
13339     # To make an SMP kernel, the next two are needed
13340
13341     #options        SMP                     # Symmetric MultiProcessor Kernel
13342
13343     #options        APIC_IO                 # Symmetric (APIC) I/O
13344
13345 The above are both required for SMP support.
13346
13347     
13348
13349     device          isa
13350
13351 All PCs supported by DragonFly have one of these. Do not remove, even if you have no ISA slots. If you have an IBM PS/2 (Micro Channel Architecture), DragonFly provides some limited support at this time. For more information about the MCA support, see `/usr/src/sys/config/LINT`.
13352
13353     
13354
13355     device          eisa
13356
13357 Include this if you have an EISA motherboard. This enables auto-detection and configuration support for all devices on the EISA bus.
13358
13359     
13360
13361     device          pci
13362
13363 Include this if you have a PCI motherboard. This enables auto-detection of PCI cards and gatewaying from the PCI to ISA bus.
13364
13365     
13366
13367     device          agp
13368
13369 Include this if you have an AGP card in the system. This will enable support for AGP, and AGP GART for boards which have these features.
13370
13371     
13372
13373     # Floppy drives
13374
13375     device          fdc0        at isa? port IO_FD1 irq 6 drq 2
13376
13377     device          fd0         at fdc0 drive 0
13378
13379     device          fd1         at fdc0 drive 1
13380
13381 This is the floppy drive controller. `fd0` is the `A:` floppy drive, and `fd1` is the `B:` drive.
13382
13383     
13384
13385     device          ata
13386
13387 This driver supports all ATA and ATAPI devices. You only need one `device ata` line for the kernel to detect all PCI ATA/ATAPI devices on modern machines.
13388
13389     
13390
13391     device          atadisk                 # ATA disk drives
13392
13393 This is needed along with `device ata` for ATA disk drives.
13394
13395     
13396
13397     device          atapicd                 # ATAPI CDROM drives
13398
13399 This is needed along with `device ata` for ATAPI CDROM drives.
13400
13401     
13402
13403     device          atapifd                 # ATAPI floppy drives
13404
13405 This is needed along with `device ata` for ATAPI floppy drives.
13406
13407     
13408
13409     device          atapist                 # ATAPI tape drives
13410
13411 This is needed along with `device ata` for ATAPI tape drives.
13412
13413     
13414
13415     options         ATA_STATIC_ID           #Static device numbering
13416
13417 This makes the controller number static (like the old driver) or else the device numbers are dynamically allocated.
13418
13419     
13420
13421     # ATA and ATAPI devices
13422
13423     device          ata0        at isa? port IO_WD1 irq 14
13424
13425     device          ata1        at isa? port IO_WD2 irq 15
13426
13427 Use the above for older, non-PCI systems.
13428
13429     
13430
13431     # SCSI Controllers
13432
13433     device          ahb        # EISA AHA1742 family
13434
13435     device          ahc        # AHA2940 and onboard AIC7xxx devices
13436
13437     device          amd        # AMD 53C974 (Teckram DC-390(T))
13438
13439     device          dpt        # DPT Smartcache - See LINT for options!
13440
13441     device          isp        # Qlogic family
13442
13443     device          ncr        # NCR/Symbios Logic
13444
13445     device          sym        # NCR/Symbios Logic (newer chipsets)
13446
13447     device          adv0       at isa?
13448
13449     device          adw
13450
13451     device          bt0        at isa?
13452
13453     device          aha0       at isa?
13454
13455     device          aic0       at isa?
13456
13457 SCSI controllers. Comment out any you do not have in your system. If you have an IDE only system, you can remove these altogether.
13458
13459     
13460
13461     # SCSI peripherals
13462
13463     device          scbus      # SCSI bus (required)
13464
13465     device          da         # Direct Access (disks)
13466
13467     device          sa         # Sequential Access (tape etc)
13468
13469     device          cd         # CD
13470
13471     device          pass       # Passthrough device (direct SCSI
13472
13473     access)
13474
13475 SCSI peripherals. Again, comment out any you do not have, or if you have only IDE hardware, you can remove them completely.
13476
13477  **Note:** The USB [umass(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#umass&section4) driver (and a few other drivers) use the SCSI subsystem even though they are not real SCSI devices. Therefore make sure not to remove SCSI support, if any such drivers are included in the kernel configuration.
13478
13479     
13480
13481     # RAID controllers
13482
13483     device          ida        # Compaq Smart RAID
13484
13485     device          amr        # AMI MegaRAID
13486
13487     device          mlx        # Mylex DAC960 family
13488
13489 Supported RAID controllers. If you do not have any of these, you can comment them out or remove them.
13490
13491     
13492
13493     # atkbdc0 controls both the keyboard and the PS/2 mouse
13494
13495     device          atkbdc0    at isa? port IO_KBD
13496
13497 The keyboard controller (`atkbdc`) provides I/O services for the AT keyboard and PS/2 style pointing devices. This controller is required by the keyboard driver (`atkbd`) and the PS/2 pointing device driver (`psm`).
13498
13499     
13500
13501     device          atkbd0     at atkbdc? irq 1
13502
13503 The `atkbd` driver, together with `atkbdc` controller, provides access to the AT 84 keyboard or the AT enhanced keyboard which is connected to the AT keyboard controller.
13504
13505     
13506
13507     device          psm0       at atkbdc? irq 12
13508
13509 Use this device if your mouse plugs into the PS/2 mouse port.
13510
13511     
13512
13513     device          vga0        at isa?
13514
13515 The video card driver.
13516
13517     
13518
13519     # splash screen/screen saver
13520
13521     pseudo-device          splash
13522
13523 Splash screen at start up! Screen savers require this too.
13524
13525     
13526
13527     # syscons is the default console driver, resembling an SCO console
13528
13529     device          sc0          at isa?
13530
13531 `sc0` is the default console driver, which resembles a SCO console. Since most full-screen programs access the console through a terminal database library like `termcap`, it should not matter whether you use this or `vt0`, the `VT220` compatible console driver. When you log in, set your `TERM` variable to `scoansi` if full-screen programs have trouble running under this console.
13532
13533     
13534
13535     # Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver
13536
13537     #device          vt0     at isa?
13538
13539     #options         XSERVER          # support for X server on a vt console
13540
13541     #options         FAT_CURSOR       # start with block cursor
13542
13543     # If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines
13544
13545     #options         PCVT_SCANSET=2   # IBM keyboards are non-std
13546
13547 This is a VT220-compatible console driver, backward compatible to VT100/102. It works well on some laptops which have hardware incompatibilities with `sc0`. Also set your `TERM` variable to `vt100` or `vt220` when you log in. This driver might also prove useful when connecting to a large number of different machines over the network, where `termcap` or `terminfo` entries for the `sc0` device are often not available -- `vt100` should be available on virtually any platform.
13548
13549     
13550
13551     # Power management support (see LINT for more options)
13552
13553     device          apm0     at nexus? disable flags 0x20  # Advanced Power Management
13554
13555 Advanced Power Management support. Useful for laptops.
13556
13557     
13558
13559     # PCCARD (PCMCIA) support
13560
13561     device          card
13562
13563     device          pcic0    at isa? irq 10 port 0x3e0 iomem 0xd0000
13564
13565     device          pcic1    at isa? irq 11 port 0x3e2 iomem 0xd4000 disable
13566
13567 PCMCIA support. You want this if you are using a laptop.
13568
13569     
13570
13571     # Serial (COM) ports
13572
13573     device          sio0     at isa? port IO_COM1 flags 0x10 irq 4
13574
13575     device          sio1     at isa? port IO_COM2 irq 3
13576
13577     device          sio2     at isa? disable port IO_COM3 irq 5
13578
13579     device          sio3     at isa? disable port IO_COM4 irq 9
13580
13581 These are the four serial ports referred to as COM1 through COM4 in the MS-DOS/Windows® world.
13582
13583  **Note:** If you have an internal modem on COM4 and a serial port at COM2, you will have to change the IRQ of the modem to 2 (for obscure technical reasons, IRQ2 # IRQ 9) in order to access it from DragonFly. If you have a multiport serial card, check the manual page for [sio(4)](http://leaf.dragonflybsd.org/cgi/web-man?commandsio&section=4) for more information on the proper values for these lines. Some video cards (notably those based on S3 chips) use IO addresses in the form of `0x*2e8`, and since many cheap serial cards do not fully decode the 16-bit IO address space, they clash with these cards making the COM4 port practically unavailable.
13584
13585 Each serial port is required to have a unique IRQ (unless you are using one of the multiport cards where shared interrupts are supported), so the default IRQs for COM3 and COM4 cannot be used.
13586
13587     
13588
13589     # Parallel port
13590
13591     device          ppc0    at isa? irq 7
13592
13593 This is the ISA-bus parallel port interface.
13594
13595     
13596
13597     device          ppbus      # Parallel port bus (required)
13598
13599 Provides support for the parallel port bus.
13600
13601     
13602
13603     device          lpt        # Printer
13604
13605 Support for parallel port printers.
13606
13607  **Note:** All three of the above are required to enable parallel printer support.
13608
13609     
13610
13611     device          plip       # TCP/IP over parallel
13612
13613 This is the driver for the parallel network interface.
13614
13615     
13616
13617     device          ppi        # Parallel port interface device
13618
13619 The general-purpose I/O (***geek port) + IEEE1284 I/O.
13620
13621     
13622
13623     #device         vpo        # Requires scbus and da
13624
13625 This is for an Iomega Zip drive. It requires `scbus` and `da` support. Best performance is achieved with ports in EPP 1.9 mode.
13626
13627     
13628
13629     # PCI Ethernet NICs.
13630
13631     device          de         # DEC/Intel DC21x4x (Tulip)
13632
13633     device          fxp        # Intel EtherExpress PRO/100B (82557, 82558)
13634
13635     device          tx         # SMC 9432TX (83c170 EPIC)
13636
13637     device          vx         # 3Com 3c590, 3c595 (Vortex)
13638
13639     device          wx         # Intel Gigabit Ethernet Card (Wiseman)
13640
13641 Various PCI network card drivers. Comment out or remove any of these not present in your system.
13642
13643     
13644
13645     # PCI Ethernet NICs that use the common MII bus controller code.
13646
13647     device          miibus     # MII bus support
13648
13649 MII bus support is required for some PCI 10/100 Ethernet NICs, namely those which use MII-compliant transceivers or implement transceiver control interfaces that operate like an MII. Adding `device miibus` to the kernel config pulls in support for the generic miibus API and all of the PHY drivers, including a generic one for PHYs that are not specifically handled by an individual driver.
13650
13651     
13652
13653     device          dc         # DEC/Intel 21143 and various workalikes
13654
13655     device          rl         # RealTek 8129/8139
13656
13657     device          sf         # Adaptec AIC-6915 (Starfire)
13658
13659     device          sis        # Silicon Integrated Systems SiS 900/SiS 7016
13660
13661     device          ste        # Sundance ST201 (D-Link DFE-550TX)
13662
13663     device          tl         # Texas Instruments ThunderLAN
13664
13665     device          vr         # VIA Rhine, Rhine II
13666
13667     device          wb         # Winbond W89C840F
13668
13669     device          xl         # 3Com 3c90x (Boomerang, Cyclone)
13670
13671 Drivers that use the MII bus controller code.
13672
13673     
13674
13675     # ISA Ethernet NICs.
13676
13677     device          ed0    at isa? port 0x280 irq 10 iomem 0xd8000
13678
13679     device          ex
13680
13681     device          ep
13682
13683     # WaveLAN/IEEE 802.11 wireless NICs. Note: the WaveLAN/IEEE really
13684
13685     # exists only as a PCMCIA device, so there is no ISA attachment needed
13686
13687     # and resources will always be dynamically assigned by the pccard code.
13688
13689     device          wi
13690
13691     # Aironet 4500/4800 802.11 wireless NICs. Note: the declaration below will
13692
13693     # work for PCMCIA and PCI cards, as well as ISA cards set to ISA PnP
13694
13695     # mode (the factory default). If you set the switches on your ISA
13696
13697     # card for a manually chosen I/O address and IRQ, you must specify
13698
13699     # those parameters here.
13700
13701     device          an
13702
13703     # The probe order of these is presently determined by i386/isa/isa_compat.c.
13704
13705     device          ie0    at isa? port 0x300 irq 10 iomem 0xd0000
13706
13707     device          fe0    at isa? port 0x300
13708
13709     device          le0    at isa? port 0x300 irq 5 iomem 0xd0000
13710
13711     device          lnc0   at isa? port 0x280 irq 10 drq 0
13712
13713     device          cs0    at isa? port 0x300
13714
13715     device          sn0    at isa? port 0x300 irq 10
13716
13717     # requires PCCARD (PCMCIA) support to be activated
13718
13719     #device         xe0    at isa?
13720
13721 ISA Ethernet drivers. See `/usr/src/sys/config/LINT` for which cards are supported by which driver.
13722
13723     
13724
13725     pseudo-device   ether         # Ethernet support
13726
13727 `ether` is only needed if you have an Ethernet card. It includes generic Ethernet protocol code.
13728
13729     
13730
13731     pseudo-device   sl      1     # Kernel SLIP
13732
13733 `sl` is for SLIP support. This has been almost entirely supplanted by PPP, which is easier to set up, better suited for modem-to-modem connection, and more powerful. The ***number*** after `sl` specifies how many simultaneous SLIP sessions to support.
13734
13735     
13736
13737     pseudo-device   ppp     1     # Kernel PPP
13738
13739 This is for kernel PPP support for dial-up connections. There is also a version of PPP implemented as a userland application that uses `tun` and offers more flexibility and features such as demand dialing. The ***number*** after `ppp` specifies how many simultaneous PPP connections to support. .
13740
13741     
13742
13743     device   tun           # Packet tunnel.
13744
13745 This is used by the userland PPP software. A ***number*** after `tun` specifies the number of simultaneous PPP sessions to support. See the [userppp.html PPP] section of this book for more information.
13746
13747     
13748
13749     pseudo-device   pty           # Pseudo-ttys (telnet etc)
13750
13751 This is a ***pseudo-terminal*** or simulated login port. It is used by incoming `telnet` and `rlogin` sessions, ***xterm***, and some other applications such as ***Emacs***. The ***number*** after `pty` indicates the number of `pty`s to create. If you need more than the default of 16 simultaneous ***xterm*** windows and/or remote logins, be sure to increase this number accordingly, up to a maximum of 256. ***
13752
13753     
13754
13755 Memory disk pseudo-devices.
13756
13757     
13758
13759     pseudo-device   gif     # IPv6 and IPv4 tunneling
13760
13761 This implements IPv6 over IPv4 tunneling, IPv4 over IPv6 tunneling, IPv4 over IPv4 tunneling, and IPv6 over IPv6 tunneling.
13762
13763     
13764
13765     pseudo-device   faith   # IPv6-to-IPv4 relaying (translation)
13766
13767 This pseudo-device captures packets that are sent to it and diverts them to the IPv4/IPv6 translation daemon.
13768
13769     
13770
13771     # The `bpf' device enables the Berkeley Packet Filter.
13772
13773     # Be aware of the administrative consequences of enabling this!
13774
13775     pseudo-device   bpf           # Berkeley packet filter
13776
13777 This is the Berkeley Packet Filter. This pseudo-device allows network interfaces to be placed in promiscuous mode, capturing every packet on a broadcast network (e.g., an Ethernet). These packets can be captured to disk and or examined with the [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#tcpdump&section1) program.
13778
13779  **Note:** The [bpf(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#bpf&section4) device is also used by [dhclient(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dhclient&section=8) to obtain the IP address of the default router (gateway) and so on. If you use DHCP, leave this uncommented.
13780
13781     
13782
13783     # USB support
13784
13785     #device         uhci          # UHCI PCI-&gt;USB interface
13786
13787     #device         ohci          # OHCI PCI-&gt;USB interface
13788
13789     #device         usb           # USB Bus (required)
13790
13791     #device         ugen          # Generic
13792
13793     #device         uhid          # ***Human Interface Devices***
13794
13795     #device         ukbd          # Keyboard
13796
13797     #device         ulpt          # Printer
13798
13799     #device         umass         # Disks/Mass storage - Requires scbus and da
13800
13801     #device         ums           # Mouse
13802
13803     # USB Ethernet, requires mii
13804
13805     #device         aue           # ADMtek USB ethernet
13806
13807     #device         cue           # CATC USB ethernet
13808
13809     #device         kue           # Kawasaki LSI USB ethernet
13810
13811 Support for various USB devices.
13812
13813 For more information and additional devices supported by DragonFly, see `/usr/src/sys/i386/conf/LINT`.
13814
13815 #### Notes 
13816
13817 [[!table  data="""
13818 <tablewidth="100%"> [(1)](kernelconfig-config.html#AEN7414) | The auto-tuning algorithm sets `maxuser` equal to the amount of memory in the system, with a minimum of 32, and a maximum of 384. |
13819 | | 
13820 """]]
13821
13822 ## Device Nodes 
13823
13824 Almost every device in the kernel has a corresponding node entry in the `/dev` directory. These nodes look like regular files, but are actually special entries into the kernel which programs use to access the device. 
13825
13826 These nodes are created automatically once devfs is mounted, which happens manually for the root `/dev` during boot, just after the root mount.
13827
13828 ## If Something Goes Wrong 
13829
13830  **Note:** If you are having trouble building a kernel, make sure to keep a `GENERIC`, or some other kernel that is known to work on hand as a different name that will not get erased on the next build. You cannot rely on `kernel.old` because when installing a new kernel, `kernel.old` is overwritten with the last installed kernel which may be non-functional. Also, as soon as possible, move the working kernel to the proper `kernel` location or commands such as [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ps&section1) will not work properly. The proper command to ***unlock*** the kernel file that `make` installs (in order to move another kernel back permanently) is:
13831
13832      % chflags noschg /boot/kernel
13833      
13834
13835 If you find you cannot do this, you are probably running at a [securelevel(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#securelevel&section8) greater than zero. Edit `kern_securelevel` in `/etc/rc.conf` and set it to `-1`, then reboot. You can change it back to its previous setting when you are happy with your new kernel.
13836
13837 And, if you want to ***lock*** your new kernel into place, or any file for that matter, so that it cannot be moved or tampered with:
13838
13839     
13840
13841     % chflags schg /boot/kernel
13842     
13843
13844 There are five categories of trouble that can occur when building a custom kernel. They are:
13845
13846 * `config` fails: If the [config(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#config&section8) command fails when you give it your kernel description, you have probably made a simple error somewhere. Fortunately, [config(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=config&section=8) will print the line number that it had trouble with, so you can quickly skip to it with ***vi***. For example, if you see `config: line 17: syntax error`. You can skip to the problem in ***vi*** by typing `17G` in command mode. Make sure the keyword is typed correctly, by comparing it to the `GENERIC` kernel or another reference.
13847
13848 * `make` fails: If the `make` command fails, it usually signals an error in your kernel description, but not severe enough for [config(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#config&section8) to catch it. Again, look over your configuration, and if you still cannot resolve the problem, send mail to the [DragonFly Bugs mailing list](http://leaf.dragonflybsd.org/mailarchive/) with your kernel configuration, and it should be diagnosed very quickly.
13849
13850 * Installing the new kernel fails: If the kernel compiled fine, but failed to install (the `make install` or `make installkernel` command failed), the first thing to check is if your system is running at securelevel 1 or higher (see [init(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#init&section8)). The kernel installation tries to remove the immutable flag from your kernel and set the immutable flag on the new one. Since securelevel 1 or higher prevents unsetting the immutable flag for any files on the system, the kernel installation needs to be performed at securelevel 0 or lower.
13851
13852 * The kernel does not boot: If your new kernel does not boot, or fails to recognize your devices, do not panic! Fortunately, DragonFly has an excellent mechanism for recovering from incompatible kernels. Simply choose the kernel you want to boot from at the DragonFly boot loader. You can access this when the system counts down from 10. Hit any key except for the  **Enter**  key, type `unload` and then type `boot ***kernel.old***`, or the filename of any other kernel that will boot properly. When reconfiguring a kernel, it is always a good idea to keep a kernel that is known to work on hand. After booting with a good kernel you can check over your configuration file and try to build it again. One helpful resource is the `/var/log/messages` file which records, among other things, all of the kernel messages from every successful boot. Also, the [dmesg(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#dmesg&section8) command will print the kernel messages from the current boot.
13853
13854 * The kernel works, but [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ps&section1) does not work any more: If you have installed a different version of the kernel from the one that the system utilities have been built with, many system-status commands like [ps(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ps&section=1) and [vmstat(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=vmstat&section=8) will not work any more. You must recompile the `libkvm` library as well as these utilities. This is one reason it is not normally a good idea to use a different version of the kernel from the rest of the operating system.
13855
13856 # Security 
13857 ***Much of this chapter has been taken from the security(7) manual page by Matthew Dillon. ***
13858
13859 [[!toc levels=3]]
13860
13861 ## Synopsis 
13862
13863 This chapter will provide a basic introduction to system security concepts, some general good rules of thumb, and some advanced topics under DragonFly. A lot of the topics covered here can be applied to system and Internet security in general as well. The Internet is no longer a ***friendly*** place in which everyone wants to be your kind neighbor. Securing your system is imperative to protect your data, intellectual property, time, and much more from the hands of hackers and the like.
13864
13865 DragonFly provides an array of utilities and mechanisms to ensure the integrity and security of your system and network.
13866
13867 After reading this chapter, you will know:
13868
13869 * Basic system security concepts, in respect to DragonFly.
13870
13871 * About the various crypt mechanisms available in DragonFly, such as DES and MD5.
13872
13873 * How to set up one-time password authentication.
13874
13875 * How to create firewalls using IPFW.
13876
13877 * How to configure IPsec and create a VPN between DragonFly/Windows® machines.
13878
13879 * How to configure and use  **OpenSSH** , DragonFly's SSH implementation.
13880
13881 Before reading this chapter, you should:
13882
13883 * Understand basic DragonFly and Internet concepts.
13884
13885 CategoryHandbook
13886
13887 Category
13888
13889 ## Introduction 
13890
13891 Security is a function that begins and ends with the system administrator. While all BSD UNIX® multi-user systems have some inherent security, the job of building and maintaining additional security mechanisms to keep those users ***honest*** is probably one of the single largest undertakings of the sysadmin. Machines are only as secure as you make them, and security concerns are ever competing with the human necessity for convenience. UNIX systems, in general, are capable of running a huge number of simultaneous processes and many of these processes operate as servers -- meaning that external entities can connect and talk to them. As yesterday's mini-computers and mainframes become today's desktops, and as computers become networked and internetworked, security becomes an even bigger issue.
13892
13893 Security is best implemented through a layered ***onion*** approach. In a nutshell, what you want to do is to create as many layers of security as are convenient and then carefully monitor the system for intrusions. You do not want to overbuild your security or you will interfere with the detection side, and detection is one of the single most important aspects of any security mechanism. For example, it makes little sense to set the `schg` flags (see [chflags(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#chflags&section1)) on every system binary because while this may temporarily protect the binaries, it prevents an attacker who has broken in from making an easily detectable change that may result in your security mechanisms not detecting the attacker at all.
13894
13895 System security also pertains to dealing with various forms of attack, including attacks that attempt to crash, or otherwise make a system unusable, but do not attempt to compromise the `root` account (***break root***). Security concerns can be split up into several categories:
13896
13897   1. Denial of service attacks.
13898
13899   1. User account compromises.
13900
13901   1. Root compromise through accessible servers.
13902
13903   1. Root compromise via user accounts.
13904
13905   1. Backdoor creation.
13906
13907 A denial of service attack is an action that deprives the machine of needed resources. Typically, DoS attacks are brute-force mechanisms that attempt to crash or otherwise make a machine unusable by overwhelming its servers or network stack. Some DoS attacks try to take advantage of bugs in the networking stack to crash a machine with a single packet. The latter can only be fixed by applying a bug fix to the kernel. Attacks on servers can often be fixed by properly specifying options to limit the load the servers incur on the system under adverse conditions. Brute-force network attacks are harder to deal with. A spoofed-packet attack, for example, is nearly impossible to stop, short of cutting your system off from the Internet. It may not be able to take your machine down, but it can saturate your Internet connection.
13908
13909 A user account compromise is even more common than a DoS attack. Many sysadmins still run standard  **telnetd** ,  **rlogind** ,  **rshd** , and  **ftpd**  servers on their machines. These servers, by default, do not operate over encrypted connections. The result is that if you have any moderate-sized user base, one or more of your users logging into your system from a remote location (which is the most common and convenient way to login to a system) will have his or her password sniffed. The attentive system admin will analyze his remote access logs looking for suspicious source addresses even for successful logins.
13910
13911 One must always assume that once an attacker has access to a user account, the attacker can break `root`. However, the reality is that in a well secured and maintained system, access to a user account does not necessarily give the attacker access to `root`. The distinction is important because without access to `root` the attacker cannot generally hide his tracks and may, at best, be able to do nothing more than mess with the user's files, or crash the machine. User account compromises are very common because users tend not to take the precautions that sysadmins take.
13912
13913 System administrators must keep in mind that there are potentially many ways to break `root` on a machine. The attacker may know the `root` password, the attacker may find a bug in a root-run server and be able to break `root` over a network connection to that server, or the attacker may know of a bug in a suid-root program that allows the attacker to break `root` once he has broken into a user's account. If an attacker has found a way to break `root` on a machine, the attacker may not have a need to install a backdoor. Many of the `root` holes found and closed to date involve a considerable amount of work by the attacker to cleanup after himself, so most attackers install backdoors. A backdoor provides the attacker with a way to easily regain `root` access to the system, but it also gives the smart system administrator a convenient way to detect the intrusion. Making it impossible for an attacker to install a backdoor may actually be detrimental to your security, because it will not close off the hole the attacker found to break in the first place.
13914
13915 Security remedies should always be implemented with a multi-layered ***onion peel*** approach and can be categorized as follows:
13916
13917   1. Securing `root` and staff accounts.
13918
13919   1. Securing `root` -- root-run servers and suid/sgid binaries.
13920
13921   1. Securing user accounts.
13922
13923   1. Securing the password file.
13924
13925   1. Securing the kernel core, raw devices, and filesystems.
13926
13927   1. Quick detection of inappropriate changes made to the system.
13928
13929   1. Paranoia.
13930
13931 The next section of this chapter will cover the above bullet items in greater depth.
13932
13933 CategoryHandbook
13934
13935 CategoryHandbook-security
13936
13937 ## Securing DragonFly 
13938
13939  **Command vs. Protocol:**  Throughout this document, we will use  **bold**  text to refer to a command or application. This is used for instances such as ssh, since it is a protocol as well as command.
13940
13941 The sections that follow will cover the methods of securing your DragonFly system that were mentioned in the [last section](security-intro.html) of this chapter.
13942
13943 ### Securing the root Account and Staff Accounts 
13944
13945 First off, do not bother securing staff accounts if you have not secured the `root` account. Most systems have a password assigned to the `root` account. The first thing you do is assume that the password is ***always*** compromised. This does not mean that you should remove the password. The password is almost always necessary for console access to the machine. What it does mean is that you should not make it possible to use the password outside of the console or possibly even with the [su(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#su&section1) command. For example, make sure that your pty's are specified as being insecure in the `/etc/ttys` file so that direct `root` logins via `telnet` or `rlogin` are disallowed. If using other login services such as  **sshd** , make sure that direct `root` logins are disabled there as well. You can do this by editing your `/etc/ssh/sshd_config` file, and making sure that `PermitRootLogin` is set to `NO`. Consider every access method -- services such as FTP often fall through the cracks. Direct `root` logins should only be allowed via the system console.
13946
13947 Of course, as a sysadmin you have to be able to get to `root`, so we open up a few holes. But we make sure these holes require additional password verification to operate. One way to make `root` accessible is to add appropriate staff accounts to the `wheel` group (in `/etc/group`). The staff members placed in the `wheel` group are allowed to `su` to `root`. You should never give staff members native `wheel` access by putting them in the `wheel` group in their password entry. Staff accounts should be placed in a `staff` group, and then added to the `wheel` group via the `/etc/group` file. Only those staff members who actually need to have `root` access should be placed in the `wheel` group.  While having the `wheel` mechanism is better than having nothing at all, it is not necessarily the safest option.
13948
13949 An indirect way to secure staff accounts, and ultimately `root` access is to use an alternative login access method and do what is known as ***starring*** out the encrypted password for the staff accounts. Using the [vipw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#vipw&section8) command, one can replace each instance of an encrypted password with a single `*` character. This command will update the `/etc/master.passwd` file and user/password database to disable password-authenticated logins.
13950
13951 A staff account entry such as:
13952
13953     
13954
13955     foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
13956
13957 Should be changed to this:
13958
13959     
13960
13961     foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
13962
13963 This change will prevent normal logins from occurring, since the encrypted password will never match `*`. With this done, staff members must use another mechanism to authenticate themselves such as  [ssh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ssh&section=1&manpath=OpenBSD+3.3) using a public/private key pair. When using a public/private key pair with ssh, one must generally secure the machine used to login ***from*** (typically one's workstation). An additional layer of protection can be added to the key pair by password protecting the key pair when creating it with [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ssh-keygen&section=1). Being able to ***star*** out the passwords for staff accounts also guarantees that staff members can only login through secure access methods that you have set up. This forces all staff members to use secure, encrypted connections for all of their sessions, which closes an important hole used by many intruders: sniffing the network from an unrelated, less secure machine.
13964
13965 The more indirect security mechanisms also assume that you are logging in from a more restrictive server to a less restrictive server. For example, if your main box is running all sorts of servers, your workstation should not be running any. In order for your workstation to be reasonably secure you should run as few servers as possible, up to and including no servers at all, and you should run a password-protected screen blanker. Of course, given physical access to a workstation an attacker can break any sort of security you put on it. This is definitely a problem that you should consider, but you should also consider the fact that the vast majority of break-ins occur remotely, over a network, from people who do not have physical access to your workstation or servers.
13966
13967 ### Securing Root-run Servers and SUID/SGID Binaries 
13968
13969 The prudent sysadmin only runs the servers he needs to, no more, no less. Be aware that third party servers are often the most bug-prone. For example, running an old version of  **imapd**  or  **popper**  is like giving a universal `root` ticket out to the entire world. Never run a server that you have not checked out carefully. Many servers do not need to be run as `root`. For example, the  **ntalk** ,  **comsat** , and  **finger**  daemons can be run in special user ***sandboxes***. A sandbox is not perfect, unless you go through a large amount of trouble, but the onion approach to security still stands: If someone is able to break in through a server running in a sandbox, they still have to break out of the sandbox. The more layers the attacker must break through, the lower the likelihood of his success. Root holes have historically been found in virtually every server ever run as `root`, including basic system servers. If you are running a machine through which people only login via  **sshd**  and never login via  **telnetd**  or  **rshd**  or  **rlogind** , then turn off those services!
13970
13971 DragonFly now defaults to running  **ntalkd** ,  **comsat** , and  **finger**  in a sandbox. Another program which may be a candidate for running in a sandbox is [named(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#named&section8). `/etc/defaults/rc.conf` includes the arguments necessary to run  **named**  in a sandbox in a commented-out form. Depending on whether you are installing a new system or upgrading an existing system, the special user accounts used by these sandboxes may not be installed. The prudent sysadmin would research and implement sandboxes for servers whenever possible.
13972
13973 There are a number of other servers that typically do not run in sandboxes:  **sendmail** ,  **popper** ,  **imapd** ,  **ftpd** , and others. There are alternatives to some of these, but installing them may require more work than you are willing to perform (the convenience factor strikes again). You may have to run these servers as `root` and rely on other mechanisms to detect break-ins that might occur through them.
13974
13975 The other big potential `root` holes in a system are the suid-root and sgid binaries installed on the system. Most of these binaries, such as  **rlogin** , reside in `/bin`, `/sbin`, `/usr/bin`, or `/usr/sbin`. While nothing is 100% safe, the system-default suid and sgid binaries can be considered reasonably safe. Still, `root` holes are occasionally found in these binaries. A `root` hole was found in `Xlib` in 1998 that made  **xterm**  (which is typically suid) vulnerable. It is better to be safe than sorry and the prudent sysadmin will restrict suid binaries, that only staff should run, to a special group that only staff can access, and get rid of (`chmod 000`) any suid binaries that nobody uses. A server with no display generally does not need an  **xterm**  binary. Sgid binaries can be almost as dangerous. If an intruder can break an sgid-kmem binary, the intruder might be able to read `/dev/kmem` and thus read the encrypted password file, potentially compromising any passworded account. Alternatively an intruder who breaks group `kmem` can monitor keystrokes sent through pty's, including pty's used by users who login through secure methods. An intruder that breaks the `tty` group can write to almost any user's tty. If a user is running a terminal program or emulator with a keyboard-simulation feature, the intruder can potentially generate a data stream that causes the user's terminal to echo a command, which is then run as that user.
13976
13977 ### Securing User Accounts 
13978
13979 User accounts are usually the most difficult to secure. While you can impose Draconian access restrictions on your staff and ***star*** out their passwords, you may not be able to do so with any general user accounts you might have. If you do have sufficient control, then you may win out and be able to secure the user accounts properly. If not, you simply have to be more vigilant in your monitoring of those accounts. Use of ssh for user accounts is more problematic, due to the extra administration and technical support required, but still a very good solution compared to a crypted password file.
13980
13981 ### Securing the Password File 
13982
13983 The only sure fire way is to `*` out as many passwords as you can and use ssh for access to those accounts. Even though the encrypted password file (`/etc/spwd.db`) can only be read by `root`, it may be possible for an intruder to obtain read access to that file even if the attacker cannot obtain root-write access.
13984
13985 Your security scripts should always check for and report changes to the password file (see the [Checking file integrity](securing-freebsd.html#SECURITY-INTEGRITY) section below).
13986
13987 ### Securing the Kernel Core, Raw Devices, and Filesystems 
13988
13989 If an attacker breaks `root` he can do just about anything, but there are certain conveniences. For example, most modern kernels have a packet sniffing device driver built in. Under DragonFly it is called the `bpf` device. An intruder will commonly attempt to run a packet sniffer on a compromised machine. You do not need to give the intruder the capability and most systems do not have the need for the `bpf` device compiled in.
13990
13991 But even if you turn off the `bpf` device, you still have `/dev/mem` and `/dev/kmem` to worry about. For that matter, the intruder can still write to raw disk devices. Also, there is another kernel feature called the module loader, [kldload(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#kldload&section8). An enterprising intruder can use a KLD module to install his own `bpf` device, or other sniffing device, on a running kernel. To avoid these problems you have to run the kernel at a higher secure level, at least securelevel 1. The securelevel can be set with a `sysctl` on the `kern.securelevel` variable. Once you have set the securelevel to 1, write access to raw devices will be denied and special `chflags` flags, such as `schg`, will be enforced. You must also ensure that the `schg` flag is set on critical startup binaries, directories, and script files -- everything that gets run up to the point where the securelevel is set. This might be overdoing it, and upgrading the system is much more difficult when you operate at a higher secure level. You may compromise and run the system at a higher secure level but not set the `schg` flag for every system file and directory under the sun. Another possibility is to simply mount `/` and `/usr` read-only. It should be noted that being too Draconian in what you attempt to protect may prevent the all-important detection of an intrusion.
13992
13993 ### Checking File Integrity: Binaries, Configuration Files, Etc. 
13994
13995 When it comes right down to it, you can only protect your core system configuration and control files so much before the convenience factor rears its ugly head. For example, using `chflags` to set the `schg` bit on most of the files in `/` and `/usr` is probably counterproductive, because while it may protect the files, it also closes a detection window. The last layer of your security onion is perhaps the most important -- detection. The rest of your security is pretty much useless (or, worse, presents you with a false sense of safety) if you cannot detect potential incursions. Half the job of the onion is to slow down the attacker, rather than stop him, in order to give the detection side of the equation a chance to catch him in the act.
13996
13997 The best way to detect an incursion is to look for modified, missing, or unexpected files. The best way to look for modified files is from another (often centralized) limited-access system. Writing your security scripts on the extra-secure limited-access system makes them mostly invisible to potential attackers, and this is important. In order to take maximum advantage you generally have to give the limited-access box significant access to the other machines in the business, usually either by doing a read-only NFS export of the other machines to the limited-access box, or by setting up ssh key-pairs to allow the limited-access box to ssh to the other machines. Except for its network traffic, NFS is the least visible method -- allowing you to monitor the filesystems on each client box virtually undetected. If your limited-access server is connected to the client boxes through a switch, the NFS method is often the better choice. If your limited-access server is connected to the client boxes through a hub, or through several layers of routing, the NFS method may be too insecure (network-wise) and using ssh may be the better choice even with the audit-trail tracks that ssh lays.
13998
13999 Once you give a limited-access box, at least read access to the client systems it is supposed to monitor, you must write scripts to do the actual monitoring. Given an NFS mount, you can write scripts out of simple system utilities such as [find(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#find&section1) and [md5(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=md5&section=1). It is best to physically md5 the client-box files at least once a day, and to test control files such as those found in `/etc` and `/usr/local/etc` even more often. When mismatches are found, relative to the base md5 information the limited-access machine knows is valid, it should scream at a sysadmin to go check it out. A good security script will also check for inappropriate suid binaries and for new or deleted files on system partitions such as `/` and `/usr`.
14000
14001 When using ssh rather than NFS, writing the security script is much more difficult. You essentially have to `scp` the scripts to the client box in order to run them, making them visible, and for safety you also need to `scp` the binaries (such as find) that those scripts use. The  **ssh**  client on the client box may already be compromised. All in all, using ssh may be necessary when running over insecure links, but it is also a lot harder to deal with.
14002
14003 A good security script will also check for changes to user and staff members access configuration files: `.rhosts`, `.shosts`, `.ssh/authorized_keys` and so forth... files that might fall outside the purview of the `MD5` check.
14004
14005 If you have a huge amount of user disk space, it may take too long to run through every file on those partitions. In this case, setting mount flags to disallow suid binaries and devices on those partitions is a good idea. The `nodev` and `nosuid` options (see [mount(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#mount&section8)) are what you want to look into. You should probably scan them anyway, at least once a week, since the object of this layer is to detect a break-in whether or not the break-in is effective.
14006
14007 Process accounting (see [accton(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#accton&section8)) is a relatively low-overhead feature of the operating system which might help as a post-break-in evaluation mechanism. It is especially useful in tracking down how an intruder has actually broken into a system, assuming the file is still intact after the break-in occurs.
14008
14009 Finally, security scripts should process the log files, and the logs themselves should be generated in as secure a manner as possible -- remote syslog can be very useful. An intruder tries to cover his tracks, and log files are critical to the sysadmin trying to track down the time and method of the initial break-in. One way to keep a permanent record of the log files is to run the system console to a serial port and collect the information on a continuing basis through a secure machine monitoring the consoles.
14010
14011 ### Paranoia 
14012
14013 A little paranoia never hurts. As a rule, a sysadmin can add any number of security features, as long as they do not affect convenience, and can add security features that ***do*** affect convenience with some added thought. Even more importantly, a security administrator should mix it up a bit -- if you use recommendations such as those given by this document verbatim, you give away your methodologies to the prospective attacker who also has access to this document.
14014
14015 ### Denial of Service Attacks 
14016
14017 This section covers Denial of Service attacks. A DoS attack is typically a packet attack. While there is not much you can do about modern spoofed packet attacks that saturate your network, you can generally limit the damage by ensuring that the attacks cannot take down your servers.
14018
14019   1. Limiting server forks.
14020
14021   1. Limiting springboard attacks (ICMP response attacks, ping broadcast, etc.).
14022
14023   1. Kernel Route Cache.
14024
14025 A common DoS attack is against a forking server that attempts to cause the server to eat processes, file descriptors, and memory, until the machine dies.  **inetd**  (see [inetd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#inetd&section8)) has several options to limit this sort of attack. It should be noted that while it is possible to prevent a machine from going down, it is not generally possible to prevent a service from being disrupted by the attack. Read the  **inetd**  manual page carefully and pay specific attention to the `-c`, `-C`, and `-R` options. Note that spoofed-IP attacks will circumvent the `-C` option to  **inetd** , so typically a combination of options must be used. Some standalone servers have self-fork-limitation parameters.
14026
14027  **Sendmail**  has its `-OMaxDaemonChildren` option, which tends to work much better than trying to use sendmail's load limiting options due to the load lag. You should specify a `MaxDaemonChildren` parameter, when you start  **sendmail** , high enough to handle your expected load, but not so high that the computer cannot handle that number of  **sendmails**  without falling on its face. It is also prudent to run sendmail in queued mode (`-ODeliveryMode=queued`) and to run the daemon (`sendmail -bd`) separate from the queue-runs (`sendmail -q15m`). If you still want real-time delivery you can run the queue at a much lower interval, such as `-q1m`, but be sure to specify a reasonable `MaxDaemonChildren` option for ***that*** sendmail to prevent cascade failures.
14028
14029  **Syslogd**  can be attacked directly and it is strongly recommended that you use the `-s` option whenever possible, and the `-a` option otherwise.
14030
14031 You should also be fairly careful with connect-back services such as  **tcpwrapper**  s reverse-identd, which can be attacked directly. You generally do not want to use the reverse-ident feature of  **tcpwrappers**  for this reason.
14032
14033 It is a very good idea to protect internal services from external access by firewalling them off at your border routers. The idea here is to prevent saturation attacks from outside your LAN, not so much to protect internal services from network-based `root` compromise. Always configure an exclusive firewall, i.e., firewall everything ***except*** ports A, B, C, D, and M-Z. This way you can firewall off all of your low ports except for certain specific services such as  **named**  (if you are primary for a zone),  **ntalkd** ,  **sendmail** , and other Internet-accessible services. If you try to configure the firewall the other way -- as an inclusive or permissive firewall, there is a good chance that you will forget to ***close*** a couple of services, or that you will add a new internal service and forget to update the firewall. You can still open up the high-numbered port range on the firewall, to allow permissive-like operation, without compromising your low ports. Also take note that DragonFly allows you to control the range of port numbers used for dynamic binding, via the various `net.inet.ip.portrange` `sysctl`'s (`sysctl -a | fgrep portrange`), which can also ease the complexity of your firewall's configuration. For example, you might use a normal first/last range of 4000 to 5000, and a hiport range of 49152 to 65535, then block off everything under 4000 in your firewall (except for certain specific Internet-accessible ports, of course).
14034
14035 Another common DoS attack is called a springboard attack -- to attack a server in a manner that causes the server to generate responses which overloads the server, the local network, or some other machine. The most common attack of this nature is the ***ICMP ping broadcast attack***. The attacker spoofs ping packets sent to your LAN's broadcast address with the source IP address set to the actual machine they wish to attack. If your border routers are not configured to stomp on ping's to broadcast addresses, your LAN winds up generating sufficient responses to the spoofed source address to saturate the victim, especially when the attacker uses the same trick on several dozen broadcast addresses over several dozen different networks at once. Broadcast attacks of over a hundred and twenty megabits have been measured. A second common springboard attack is against the ICMP error reporting system. By constructing packets that generate ICMP error responses, an attacker can saturate a server's incoming network and cause the server to saturate its outgoing network with ICMP responses. This type of attack can also crash the server by running it out of mbuf's, especially if the server cannot drain the ICMP responses it generates fast enough. The DragonFly kernel has a new kernel compile option called `ICMP_BANDLIM` which limits the effectiveness of these sorts of attacks. The last major class of springboard attacks is related to certain internal  **inetd**  services such as the udp echo service. An attacker simply spoofs a UDP packet with the source address being server A's echo port, and the destination address being server B's echo port, where server A and B are both on your LAN. The two servers then bounce this one packet back and forth between each other. The attacker can overload both servers and their LANs simply by injecting a few packets in this manner. Similar problems exist with the internal  **chargen**  port. A competent sysadmin will turn off all of these inetd-internal test services.
14036
14037 Spoofed packet attacks may also be used to overload the kernel route cache. Refer to the `net.inet.ip.rtexpire`, `rtminexpire`, and `rtmaxcache` `sysctl` parameters. A spoofed packet attack that uses a random source IP will cause the kernel to generate a temporary cached route in the route table, viewable with `netstat -rna | fgrep W3`. These routes typically timeout in 1600 seconds or so. If the kernel detects that the cached route table has gotten too big it will dynamically reduce the `rtexpire` but will never decrease it to less than `rtminexpire`. There are two problems:
14038
14039   1. The kernel does not react quickly enough when a lightly loaded server is suddenly attacked.
14040
14041   1. The `rtminexpire` is not low enough for the kernel to survive a sustained attack.
14042
14043 If your servers are connected to the Internet via a T3 or better, it may be prudent to manually override both `rtexpire` and `rtminexpire` via [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#sysctl&section8). Never set either parameter to zero (unless you want to crash the machine). Setting both parameters to two seconds should be sufficient to protect the route table from attack.
14044
14045 ## DES, MD5, and Crypt 
14046
14047 ***Parts rewritten and updated by Bill Swingle. ***
14048
14049 Every user on a UNIX® system has a password associated with their account. It seems obvious that these passwords need to be known only to the user and the actual operating system. In order to keep these passwords secret, they are encrypted with what is known as a ***one-way hash***, that is, they can only be easily encrypted but not decrypted. In other words, what we told you a moment ago was obvious is not even true: the operating system itself does not ***really*** know the password. It only knows the ***encrypted*** form of the password. The only way to get the ***plain-text*** password is by a brute force search of the space of possible passwords.
14050
14051 Unfortunately the only secure way to encrypt passwords when UNIX came into being was based on DES, the Data Encryption Standard. This was not such a problem for users resident in the US, but since the source code for DES could not be exported outside the US, DragonFly had to find a way to both comply with US law and retain compatibility with all the other UNIX variants that still used DES.
14052
14053 The solution was to divide up the encryption libraries so that US users could install the DES libraries and use DES but international users still had an encryption method that could be exported abroad. This is how DragonFly came to use MD5 as its default encryption method. MD5 is believed to be more secure than DES, so installing DES is offered primarily for compatibility reasons.
14054
14055 ### Recognizing Your Crypt Mechanism 
14056
14057 `libcrypt.a` provides a configurable password authentication hash library. Currently the library supports DES, MD5, Blowfish, SHA256, and SHA512 hash functions. By default DragonFly uses SHA256 to encrypt passwords.
14058
14059 It is pretty easy to identify which encryption method DragonFly is set up to use. Examining the encrypted passwords in the `/etc/master.passwd` file is one way. Passwords encrypted with the MD5 hash are longer than those encrypted with the DES hash and also begin with the characters `$1$`. Passwords starting with `$2a$` are encrypted with the Blowfish hash function. DES password strings do not have any particular identifying characteristics, but they are shorter than MD5 passwords, and are coded in a 64-character alphabet which does not include the `$` character, so a relatively short string which does not begin with a dollar sign is very likely a DES password.
14060
14061 The password format used for new passwords is controlled by the `passwd_format` login capability in `/etc/login.conf`, which takes values of `des`, `md5` or `blf`. See the [login.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#login.conf&amp;section5) manual page for more information about login capabilities.
14062
14063 ## One-time Passwords 
14064
14065 S/Key is a one-time password scheme based on a one-way hash function. DragonFly uses the MD4 hash for compatibility but other systems have used MD5 and DES-MAC. S/Key ia part of the FreeBSD base system, and is also used on a growing number of other operating systems. S/Key is a registered trademark of Bell Communications Research, Inc.
14066
14067 There are three different sorts of passwords which we will discuss below. The first is your usual UNIX® style password; we will call this a ***UNIX password***. The second sort is the one-time password which is generated by the S/Key `key` program or the OPIE [opiekey(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#opiekey&section1) program and accepted by the `keyinit` or [opiepasswd(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=opiepasswd&section=1) programs and the login prompt; we will call this a ***one-time password***. The final sort of password is the secret password which you give to the `key`/`opiekey` programs (and sometimes the `keyinit`/`opiepasswd` programs) which it uses to generate one-time passwords; we will call it a ***secret password*** or just unqualified ***password***.
14068
14069 The secret password does not have anything to do with your UNIX password; they can be the same but this is not recommended. S/Key and OPIE secret passwords are not limited to eight characters like old UNIX passwords[(1)](#FTN.AEN8429), they can be as long as you like. Passwords of six or seven word long phrases are fairly common. For the most part, the S/Key or OPIE system operates completely independently of the UNIX password system.
14070
14071 Besides the password, there are two other pieces of data that are important to S/Key and OPIE. One is what is known as the ***seed*** or ***key***, consisting of two letters and five digits. The other is what is called the ***iteration count***, a number between 1 and 100. S/Key creates the one-time password by concatenating the seed and the secret password, then applying the MD4/MD5 hash as many times as specified by the iteration count and turning the result into six short English words. These six English words are your one-time password. The authentication system (primarily PAM) keeps track of the last one-time password used, and the user is authenticated if the hash of the user-provided password is equal to the previous password. Because a one-way hash is used it is impossible to generate future one-time passwords if a successfully used password is captured; the iteration count is decremented after each successful login to keep the user and the login program in sync. When the iteration count gets down to 1, S/Key and OPIE must be reinitialized.
14072
14073 There are three programs involved in each system which we will discuss below. The `key` and `opiekey` programs accept an iteration count, a seed, and a secret password, and generate a one-time password or a consecutive list of one-time passwords. The `keyinit` and `opiepasswd` programs are used to initialize S/Key and OPIE respectively, and to change passwords, iteration counts, or seeds; they take either a secret passphrase, or an iteration count, seed, and one-time password. The `keyinfo` and `opieinfo` programs examine the relevant credentials files (`/etc/skeykeys` or `/etc/opiekeys`) and print out the invoking user's current iteration count and seed.
14074
14075 There are four different sorts of operations we will cover. The first is using `keyinit` or `opiepasswd` over a secure connection to set up one-time-passwords for the first time, or to change your password or seed. The second operation is using `keyinit` or `opiepasswd` over an insecure connection, in conjunction with `key` or `opiekey` over a secure connection, to do the same. The third is using `key`/`opiekey` to log in over an insecure connection. The fourth is using `key` or `opiekey` to generate a number of keys which can be written down or printed out to carry with you when going to some location without secure connections to anywhere.
14076
14077 ### Secure Connection Initialization 
14078
14079 To initialize S/Key for the first time, change your password, or change your seed while logged in over a secure connection (e.g., on the console of a machine or via  **ssh** ), use the `keyinit` command without any parameters while logged in as yourself:
14080
14081     
14082
14083     % keyinit
14084
14085     Adding unfurl:
14086
14087     Reminder - Only use this method if you are directly connected.
14088
14089     If you are using telnet or rlogin exit with no password and use keyinit -s.
14090
14091     Enter secret password:
14092
14093     Again secret password:
14094
14095     
14096
14097     ID unfurl s/key is 99 to17757
14098
14099     DEFY CLUB PRO NASH LACE SOFT
14100
14101 For OPIE, `opiepasswd` is used instead:
14102
14103     
14104
14105     % opiepasswd -c
14106
14107     [grimreaper] ~ $ opiepasswd -f -c
14108
14109     Adding unfurl:
14110
14111     Only use this method from the console; NEVER from remote. If you are using
14112
14113     telnet, xterm, or a dial-in, type ^C now or exit with no password.
14114
14115     Then run opiepasswd without the -c parameter.
14116
14117     Using MD5 to compute responses.
14118
14119     Enter new secret pass phrase:
14120
14121     Again new secret pass phrase:
14122
14123     ID unfurl OTP key is 499 to4268
14124
14125     MOS MALL GOAT ARM AVID COED
14126
14127 At the Enter new secret pass phrase: or Enter secret password: prompts, you should enter a password or phrase. Remember, this is not the password that you will use to login with, this is used to generate your one-time login keys. The ***ID*** line gives the parameters of your particular instance: your login name, the iteration count, and seed. When logging in the system will remember these parameters and present them back to you so you do not have to remember them. The last line gives the particular one-time password which corresponds to those parameters and your secret password; if you were to re-login immediately, this one-time password is the one you would use.
14128
14129 ### Insecure Connection Initialization 
14130
14131 To initialize or change your secret password over an insecure connection, you will need to already have a secure connection to some place where you can run `key` or `opiekey`; this might be in the form of a desk accessory on a Macintosh®, or a shell prompt on a machine you trust. You will also need to make up an iteration count (100 is probably a good value), and you may make up your own seed or use a randomly-generated one. Over on the insecure connection (to the machine you are initializing), use the `keyinit -s` command:
14132
14133     
14134
14135     % keyinit -s
14136
14137     Updating unfurl:
14138
14139     Old key: to17758
14140
14141     Reminder you need the 6 English words from the key command.
14142
14143     Enter sequence count from 1 to 9999: 100
14144
14145     Enter new key [default to17759]:
14146
14147     s/key 100 to 17759
14148
14149     s/key access password:
14150
14151     s/key access password:CURE MIKE BANE HIM RACY GORE
14152
14153 For OPIE, you need to use `opiepasswd`:
14154
14155     
14156
14157     % opiepasswd
14158
14159     
14160
14161     Updating unfurl:
14162
14163     You need the response from an OTP generator.
14164
14165     Old secret pass phrase:
14166
14167             otp-md5 498 to4268 ext
14168
14169             Response: GAME GAG WELT OUT DOWN CHAT
14170
14171     New secret pass phrase:
14172
14173             otp-md5 499 to4269
14174
14175             Response: LINE PAP MILK NELL BUOY TROY
14176
14177     
14178
14179     ID mark OTP key is 499 gr4269
14180
14181     LINE PAP MILK NELL BUOY TROY
14182
14183 To accept the default seed (which the `keyinit` program confusingly calls a `key`), press  **Return** . Then before entering an access password, move over to your secure connection or S/Key desk accessory, and give it the same parameters:
14184
14185     
14186
14187     % key 100 to17759
14188
14189     Reminder - Do not use this program while logged in via telnet or rlogin.
14190
14191     Enter secret password: &lt;secret password&gt;
14192
14193     CURE MIKE BANE HIM RACY GORE
14194
14195 Or for OPIE:
14196
14197     
14198
14199     % opiekey 498 to4268
14200
14201     Using the MD5 algorithm to compute response.
14202
14203     Reminder: Don't use opiekey from telnet or dial-in sessions.
14204
14205     Enter secret pass phrase:
14206
14207     GAME GAG WELT OUT DOWN CHAT
14208
14209 Now switch back over to the insecure connection, and copy the one-time password generated over to the relevant program.
14210
14211 ### Generating a Single One-time Password 
14212
14213 Once you have initialized S/Key, when you login you will be presented with a prompt like this:
14214
14215     
14216
14217     % telnet example.com
14218
14219     Trying 10.0.0.1...
14220
14221     Connected to example.com
14222
14223     Escape character is '^]'.
14224
14225     
14226
14227     DragonFly/i386 (example.com) (ttypa)
14228
14229     
14230
14231     login: &lt;username&gt;
14232
14233     s/key 97 fw13894
14234
14235     Password:
14236
14237 Or for OPIE:
14238
14239     
14240
14241     % telnet example.com
14242
14243     Trying 10.0.0.1...
14244
14245     Connected to example.com
14246
14247     Escape character is '^]'.
14248
14249     
14250
14251     DragonFly/i386 (example.com) (ttypa)
14252
14253     
14254
14255     login: &lt;username&gt;
14256
14257     otp-md5 498 gr4269 ext
14258
14259     Password:
14260
14261 As a side note, the S/Key and OPIE prompts have a useful feature (not shown here): if you press  **Return**  at the password prompt, the prompter will turn echo on, so you can see what you are typing. This can be extremely useful if you are attempting to type in a password by hand, such as from a printout.
14262
14263 At this point you need to generate your one-time password to answer this login prompt. This must be done on a trusted system that you can run `key` or `opiekey` on. (There are versions of these for DOS, Windows® and Mac OS® as well.) They need both the iteration count and the seed as command line options. You can cut-and-paste these right from the login prompt on the machine that you are logging in to.
14264
14265 On the trusted system:
14266
14267     
14268
14269     % key 97 fw13894
14270
14271     Reminder - Do not use this program while logged in via telnet or rlogin.
14272
14273     Enter secret password:
14274
14275     WELD LIP ACTS ENDS ME HAAG
14276
14277 For OPIE:
14278
14279     
14280
14281     % opiekey 498 to4268
14282
14283     Using the MD5 algorithm to compute response.
14284
14285     Reminder: Don't use opiekey from telnet or dial-in sessions.
14286
14287     Enter secret pass phrase:
14288
14289     GAME GAG WELT OUT DOWN CHAT
14290
14291 Now that you have your one-time password you can continue logging in:
14292
14293     
14294
14295     login: &lt;username&gt;
14296
14297     s/key 97 fw13894
14298
14299     Password: &lt;return to enable echo&gt;
14300
14301     s/key 97 fw13894
14302
14303     Password [echo on]: WELD LIP ACTS ENDS ME HAAG
14304
14305     Last login: Tue Mar 21 11:56:41 from 10.0.0.2 ...
14306
14307 ### Generating Multiple One-time Passwords 
14308
14309 Sometimes you have to go places where you do not have access to a trusted machine or secure connection. In this case, it is possible to use the `key` and `opiekey` commands to generate a number of one-time passwords beforehand to be printed out and taken with you. For example:
14310
14311     
14312
14313     % key -n 5 30 zz99999
14314
14315     Reminder - Do not use this program while logged in via telnet or rlogin.
14316
14317     Enter secret password: &lt;secret password&gt;
14318
14319     26: SODA RUDE LEA LIND BUDD SILT
14320
14321     27: JILT SPY DUTY GLOW COWL ROT
14322
14323     28: THEM OW COLA RUNT BONG SCOT
14324
14325     29: COT MASH BARR BRIM NAN FLAG
14326
14327     30: CAN KNEE CAST NAME FOLK BILK
14328
14329 Or for OPIE:
14330
14331     
14332
14333     % opiekey -n 5 30 zz99999
14334
14335     Using the MD5 algorithm to compute response.
14336
14337     Reminder: Don't use opiekey from telnet or dial-in sessions.
14338
14339     Enter secret pass phrase: &lt;secret password&gt;
14340
14341     26: JOAN BORE FOSS DES NAY QUIT
14342
14343     27: LATE BIAS SLAY FOLK MUCH TRIG
14344
14345     28: SALT TIN ANTI LOON NEAL USE
14346
14347     29: RIO ODIN GO BYE FURY TIC
14348
14349     30: GREW JIVE SAN GIRD BOIL PHI
14350
14351 The `-n 5` requests five keys in sequence, the `30` specifies what the last iteration number should be. Note that these are printed out in ***reverse*** order of eventual use. If you are really paranoid, you might want to write the results down by hand; otherwise you can cut-and-paste into `lpr`. Note that each line shows both the iteration count and the one-time password; you may still find it handy to scratch off passwords as you use them.
14352
14353 ### Restricting Use of UNIX® Passwords 
14354
14355 S/Key can place restrictions on the use of UNIX passwords based on the host name, user name, terminal port, or IP address of a login session. These restrictions can be found in the configuration file `/etc/skey.access`. The [skey.access(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#skey.access&section5) manual page has more information on the complete format of the file and also details some security cautions to be aware of before depending on this file for security.
14356
14357 If there is no `/etc/skey.access` file (this is the default), then all users will be allowed to use UNIX passwords. If the file exists, however, then all users will be required to use S/Key unless explicitly permitted to do otherwise by configuration statements in the `skey.access` file. In all cases, UNIX passwords are permitted on the console.
14358
14359 Here is a sample `skey.access` configuration file which illustrates the three most common sorts of configuration statements:
14360
14361     
14362
14363     permit internet 192.168.0.0 255.255.0.0
14364
14365     permit user fnord
14366
14367     permit port ttyd0
14368
14369 The first line (`permit internet`) allows users whose IP source address (which is vulnerable to spoofing) matches the specified value and mask, to use UNIX passwords. This should not be considered a security mechanism, but rather, a means to remind authorized users that they are using an insecure network and need to use S/Key for authentication.
14370
14371 The second line (`permit user`) allows the specified username, in this case `fnord`, to use UNIX passwords at any time. Generally speaking, this should only be used for people who are either unable to use the `key` program, like those with dumb terminals, or those who are uneducable.
14372
14373 The third line (`permit port`) allows all users logging in on the specified terminal line to use UNIX passwords; this would be used for dial-ups.
14374
14375 Here is a sample `opieaccess` file:
14376
14377     
14378
14379     permit 192.168.0.0 255.255.0.0
14380
14381 This line allows users whose IP source address (which is vulnerable to spoofing) matches the specified value and mask, to use UNIX passwords at any time.
14382
14383 If no rules in `opieaccess` are matched, the default is to deny non-OPIE logins.
14384
14385 #### Notes 
14386
14387 [[!table  data="""
14388 |<tablestyle="width:100%"> [one-time-passwords.html#AEN8429 (1)] | Under DragonFly the standard login password may be up to 128 characters in length. |
14389
14390 """]]
14391
14392 CategoryHandbook
14393
14394 CategoryHandbook-security
14395
14396 ## Firewalls 
14397
14398 ***Contributed by Gary Palmer and Alex Nash. ***
14399
14400 Firewalls are an area of increasing interest for people who are connected to the Internet, and are even finding applications on private networks to provide enhanced security. This section will hopefully explain what firewalls are, how to use them, and how to use the facilities provided in the DragonFly kernel to implement them.
14401
14402  **Note:** People often think that having a firewall between your internal network and the ***Big Bad Internet*** will solve all your security problems. It may help, but a poorly set up firewall system is more of a security risk than not having one at all. A firewall can add another layer of security to your systems, but it cannot stop a really determined cracker from penetrating your internal network. If you let internal security lapse because you believe your firewall to be impenetrable, you have just made the crackers job that much easier.
14403
14404 ### What Is a Firewall? 
14405
14406 There are currently two distinct types of firewalls in common use on the Internet today. The first type is more properly called a ***packet filtering router***. This type of firewall utilizes a multi-homed machine and a set of rules to determine whether to forward or block individual packets. A multi-homed machine is simply a device with multiple network interfaces. The second type, known as a ***proxy server***, relies on daemons to provide authentication and to forward packets, possibly on a multi-homed machine which has kernel packet forwarding disabled.
14407
14408 Sometimes sites combine the two types of firewalls, so that only a certain machine (known as a ***bastion host***) is allowed to send packets through a packet filtering router onto an internal network. Proxy services are run on the bastion host, which are generally more secure than normal authentication mechanisms.
14409
14410 DragonFly comes with a kernel packet filter (known as IPFW), which is what the rest of this section will concentrate on. Proxy servers can be built on DragonFly from third party software, but there is such a variety of proxy servers available that it would be impossible to cover them in this section.
14411
14412 #### Packet Filtering Routers 
14413
14414 A router is a machine which forwards packets between two or more networks. A packet filtering router is programmed to compare each packet to a list of rules before deciding if it should be forwarded or not. Most modern IP routing software includes packet filtering functionality that defaults to forwarding all packets. To enable the filters, you need to define a set of rules.
14415
14416 To decide whether a packet should be passed on, the firewall looks through its set of rules for a rule which matches the contents of the packet's headers. Once a match is found, the rule action is obeyed. The rule action could be to drop the packet, to forward the packet, or even to send an ICMP message back to the originator. Only the first match counts, as the rules are searched in order. Hence, the list of rules can be referred to as a ***rule chain***.
14417
14418 The packet-matching criteria varies depending on the software used, but typically you can specify rules which depend on the source IP address of the packet, the destination IP address, the source port number, the destination port number (for protocols which support ports), or even the packet type (UDP, TCP, ICMP, etc).
14419
14420 #### Proxy Servers 
14421
14422 Proxy servers are machines which have had the normal system daemons ( **telnetd** ,  **ftpd** , etc) replaced with special servers. These servers are called ***proxy servers***, as they normally only allow onward connections to be made. This enables you to run (for example) a proxy  **telnet**  server on your firewall host, and people can  **telnet**  in to your firewall from the outside, go through some authentication mechanism, and then gain access to the internal network (alternatively, proxy servers can be used for signals coming from the internal network and heading out).
14423
14424 Proxy servers are normally more secure than normal servers, and often have a wider variety of authentication mechanisms available, including ***one-shot*** password systems so that even if someone manages to discover what password you used, they will not be able to use it to gain access to your systems as the password expires immediately after the first use. As they do not actually give users access to the host machine, it becomes a lot more difficult for someone to install backdoors around your security system.
14425
14426 Proxy servers often have ways of restricting access further, so that only certain hosts can gain access to the servers. Most will also allow the administrator to specify which users can talk to which destination machines. Again, what facilities are available depends largely on what proxy software you choose.
14427
14428 ### Firewall options in DragonFlyBSD
14429
14430 DragonFlyBSD inherited the IPFW firewall (versions 1 and 2) when it forked from FreeBSD. Pretty soon after though, we imported the new pf packet filter that the OpenBSD developers created from scratch. It is a cleaner code base and is now the recommended solution for firewalling DragonFly. Keep in mind that the PF version in DragonFly is not in sync with OpenBSD's PF code. We have not yet incorporated the improvements made in PF over the last few years, but we have some improvements of our own. IPFW is still and will remain supported for the forseeable future; it has some features not yet available in PF.
14431
14432 A copy of the OpenBSD PF user's guide corresponding to the version of PF in DragonFly can be found in [[PFUsersGuide]].
14433
14434 #### What Does IPFW Allow Me to Do? 
14435
14436 IPFW, the software supplied with DragonFly, is a packet filtering and accounting system which resides in the kernel, and has a user-land control utility, [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8). Together, they allow you to define and query the rules used by the kernel in its routing decisions.
14437
14438 There are two related parts to IPFW. The firewall section performs packet filtering. There is also an IP accounting section which tracks usage of the router, based on rules similar to those used in the firewall section. This allows the administrator to monitor how much traffic the router is getting from a certain machine, or how much WWW traffic it is forwarding, for example.
14439
14440 As a result of the way that IPFW is designed, you can use IPFW on non-router machines to perform packet filtering on incoming and outgoing connections. This is a special case of the more general use of IPFW, and the same commands and techniques should be used in this situation.
14441
14442 #### Enabling IPFW on DragonFly 
14443
14444 As the main part of the IPFW system lives in the kernel, you will need to add one or more options to your kernel configuration file, depending on what facilities you want, and recompile your kernel. See "Reconfiguring your Kernel" ([kernelconfig.html Chapter 9]) for more details on how to recompile your kernel.
14445
14446  **Warning:** IPFW defaults to a policy of `deny ip from any to any`. If you do not add other rules during startup to allow access, ***you will lock yourself out*** of the server upon rebooting into a firewall-enabled kernel. We suggest that you set `firewall_type=open` in your `/etc/rc.conf` file when first enabling this feature, then refining the firewall rules in `/etc/rc.firewall` after you have tested that the new kernel feature works properly. To be on the safe side, you may wish to consider performing the initial firewall configuration from the local console rather than via  **ssh** . Another option is to build a kernel using both the `IPFIREWALL` and `IPFIREWALL_DEFAULT_TO_ACCEPT` options. This will change the default rule of IPFW to `allow ip from any to any` and avoid the possibility of a lockout.
14447
14448 There are currently four kernel configuration options relevant to IPFW:
14449
14450 `options IPFIREWALL`:: Compiles into the kernel the code for packet filtering.`options IPFIREWALL_VERBOSE`:: Enables code to allow logging of packets through [syslogd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#syslogd&section8). Without this option, even if you specify that packets should be logged in the filter rules, nothing will happen.`options IPFIREWALL_VERBOSE_LIMIT=10`:: Limits the number of packets logged through [syslogd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=syslogd&section=8) on a per entry basis. You may wish to use this option in hostile environments in which you want to log firewall activity, but do not want to be open to a denial of service attack via syslog flooding.
14451
14452 When a chain entry reaches the packet limit specified, logging is turned off for that particular entry. To resume logging, you will need to reset the associated counter using the [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8) utility:
14453
14454     
14455
14456     # ipfw zero 4500
14457
14458 Where 4500 is the chain entry you wish to continue logging.`options IPFIREWALL_DEFAULT_TO_ACCEPT`:: This changes the default rule action from ***deny*** to ***allow***. This avoids the possibility of locking yourself out if you happen to boot a kernel with `IPFIREWALL` support but have not configured your firewall yet. It is also very useful if you often use [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8) as a filter for specific problems as they arise. Use with care though, as this opens up the firewall and changes the way it works.
14459
14460 #### Configuring IPFW 
14461
14462 The configuration of the IPFW software is done through the [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8) utility. The syntax for this command looks quite complicated, but it is relatively simple once you understand its structure.
14463
14464 There are currently four different command categories used by the utility: addition/deletion, listing, flushing, and clearing. Addition/deletion is used to build the rules that control how packets are accepted, rejected, and logged. Listing is used to examine the contents of your rule set (otherwise known as the chain) and packet counters (accounting). Flushing is used to remove all entries from the chain. Clearing is used to zero out one or more accounting entries.
14465
14466 ##### Altering the IPFW Rules 
14467
14468 The syntax for this form of the command is:
14469
14470 `ipfw` [-N] command [index] action [log] protocol addresses [options]
14471
14472 There is one valid flag when using this form of the command:
14473
14474 -N:: Resolve addresses and service names in output.
14475
14476 The ***command*** given can be shortened to the shortest unique form. The valid ***commands*** are:
14477
14478 add:: Add an entry to the firewall/accounting rule listdelete:: Delete an entry from the firewall/accounting rule list
14479
14480 Previous versions of IPFW used separate firewall and accounting entries. The present version provides packet accounting with each firewall entry.
14481
14482 If an ***index*** value is supplied, it is used to place the entry at a specific point in the chain. Otherwise, the entry is placed at the end of the chain at an index 100 greater than the last chain entry (this does not include the default policy, rule 65535, deny).
14483
14484 The `log` option causes matching rules to be output to the system console if the kernel was compiled with `IPFIREWALL_VERBOSE`.
14485
14486 Valid ***actions*** are:
14487
14488 reject:: Drop the packet, and send an ICMP host or port unreachable (as appropriate) packet to the source.allow:: Pass the packet on as normal. (aliases: `pass`, `permit`, and `accept`)deny:: Drop the packet. The source is not notified via an ICMP message (thus it appears that the packet never arrived at the destination).count:: Update packet counters but do not allow/deny the packet based on this rule. The search continues with the next chain entry.
14489
14490 Each ***action*** will be recognized by the shortest unambiguous prefix.
14491
14492 The ***protocols*** which can be specified are:
14493
14494 all:: Matches any IP packeticmp:: Matches ICMP packetstcp:: Matches TCP packetsudp:: Matches UDP packets
14495
14496 The ***address*** specification is:
14497
14498 from `***address/mask***` [`***port***`] to `***address/mask***` [`***port***`] [via `***interface***`]
14499
14500 You can only specify `***port***` in conjunction with ***protocols*** which support ports (UDP and TCP).
14501
14502 The `via` is optional and may specify the IP address or domain name of a local IP interface, or an interface name (e.g. `ed0`) to match only packets coming through this interface. Interface unit numbers can be specified with an optional wildcard. For example, `ppp*` would match all kernel PPP interfaces.
14503
14504 The syntax used to specify an `***address/mask***` is:
14505
14506     
14507
14508     `***address***`
14509
14510  or
14511
14512     
14513
14514     `***address***`/`***mask-bits***`
14515
14516  or
14517
14518     
14519
14520     `***address***`:`***mask-pattern***`
14521
14522 A valid hostname may be specified in place of the IP address. ' **mask-bits** ' is a decimal number representing how many bits in the address mask should be set. e.g. specifying `192.216.222.1/24` will create a mask which will allow any address in a class C subnet (in this case, `192.216.222`) to be matched. ' **mask-pattern** ' is an IP address which will be logically AND'ed with the address given. The keyword `any` may be used to specify ***any IP address***.
14523
14524 The port numbers to be blocked are specified as:
14525
14526 `***port***` [,`***port***` [,`***port***` [...]]]
14527
14528  to specify either a single port or a list of ports, or
14529
14530 `***port***`-`***port***`
14531
14532  to specify a range of ports. You may also combine a single range with a list, but the range must always be specified first.
14533
14534 The ***options*** available are:
14535
14536 frag:: Matches if the packet is not the first fragment of the datagram.in:: Matches if the packet is on the way in.out:: Matches if the packet is on the way out.ipoptions `***spec***`:: Matches if the IP header contains the comma separated list of options specified in `***spec***`. The supported IP options are: `ssrr` (strict source route), `lsrr` (loose source route), `rr` (record packet route), and `ts` (time stamp). The absence of a particular option may be specified with a leading `!`.established:: Matches if the packet is part of an already established TCP connection (i.e. it has the RST or ACK bits set). You can optimize the performance of the firewall by placing ***established*** rules early in the chain.setup:: Matches if the packet is an attempt to establish a TCP connection (the SYN bit is set but the ACK bit is not).tcpflags `***flags***`:: Matches if the TCP header contains the comma separated list of `***flags***`. The supported flags are `fin`, `syn`, `rst`, `psh`, `ack`, and `urg`. The absence of a particular flag may be indicated by a leading `!`.icmptypes `***types***`:: Matches if the ICMP type is present in the list `***types***`. The list may be specified as any combination of ranges and/or individual types separated by commas. Commonly used ICMP types are: `0` echo reply (ping reply), `3` destination unreachable, `5` redirect, `8` echo request (ping request), and `11` time exceeded (used to indicate TTL expiration as with [traceroute(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#traceroute&section8)).
14537
14538 ##### Listing the IPFW Rules 
14539
14540 The syntax for this form of the command is:
14541
14542 `ipfw` [-a] [-c] [-d] [-e] [-t] [-N] [-S] list
14543
14544 There are seven valid flags when using this form of the command:
14545
14546 -a:: While listing, show counter values. This option is the only way to see accounting counters.-c:: List rules in compact form.-d:: Show dynamic rules in addition to static rules.-e:: If `-d` was specified, also show expired dynamic rules.-t:: Display the last match times for each chain entry. The time listing is incompatible with the input syntax used by the [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8) utility.-N:: Attempt to resolve given addresses and service names.-S:: Show the set each rule belongs to. If this flag is not specified, disabled rules will not be listed.
14547
14548 ##### Flushing the IPFW Rules 
14549
14550 The syntax for flushing the chain is:
14551
14552 `ipfw` flush
14553
14554 This causes all entries in the firewall chain to be removed except the fixed default policy enforced by the kernel (index 65535). Use caution when flushing rules; the default deny policy will leave your system cut off from the network until allow entries are added to the chain.
14555
14556 ##### Clearing the IPFW Packet Counters 
14557
14558 The syntax for clearing one or more packet counters is:
14559
14560 `ipfw` zero [`***index***`]
14561
14562 When used without an `***index***` argument, all packet counters are cleared. If an `***index***` is supplied, the clearing operation only affects a specific chain entry.
14563
14564 #### Example Commands for  **ipfw**  
14565
14566 This command will deny all packets from the host `evil.crackers.org` to the telnet port of the host `nice.people.org`:
14567
14568     
14569
14570     # ipfw add deny tcp from evil.crackers.org to nice.people.org 23
14571
14572 The next example denies and logs any TCP traffic from the entire `crackers.org` network (a class C) to the `nice.people.org` machine (any port).
14573
14574     
14575
14576     # ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org
14577
14578 If you do not want people sending X sessions to your internal network (a subnet of a class C), the following command will do the necessary filtering:
14579
14580     
14581
14582     # ipfw add deny tcp from any to my.org/28 6000 setup
14583
14584 To see the accounting records:
14585
14586     
14587
14588     # ipfw -a list
14589
14590  or in the short form
14591
14592     
14593
14594     # ipfw -a l
14595
14596 You can also see the last time a chain entry was matched with:
14597
14598     
14599
14600     # ipfw -at l
14601
14602 #### Building a Packet Filtering Firewall 
14603
14604  **Note:** The following suggestions are just that: suggestions. The requirements of each firewall are different and we cannot tell you how to build a firewall to meet your particular requirements.
14605
14606 When initially setting up your firewall, unless you have a test bench setup where you can configure your firewall host in a controlled environment, it is strongly recommend you use the logging version of the commands and enable logging in the kernel. This will allow you to quickly identify problem areas and cure them without too much disruption. Even after the initial setup phase is complete, I recommend using the logging for `deny' as it allows tracing of possible attacks and also modification of the firewall rules if your requirements alter.
14607
14608  **Note:** If you use the logging versions of the `accept` command, be aware that it can generate ***large*** amounts of log data. One log entry will be generated for every packet that passes through the firewall, so large FTP/http transfers, etc, will really slow the system down. It also increases the latencies on those packets as it requires more work to be done by the kernel before the packet can be passed on.  **syslogd**  will also start using up a lot more processor time as it logs all the extra data to disk, and it could quite easily fill the partition `/var/log` is located on.
14609
14610 You should enable your firewall from `/etc/rc.conf.local` or `/etc/rc.conf`. The associated manual page explains which knobs to fiddle and lists some preset firewall configurations. If you do not use a preset configuration, `ipfw list` will output the current ruleset into a file that you can pass to `rc.conf`. If you do not use `/etc/rc.conf.local` or `/etc/rc.conf` to enable your firewall, it is important to make sure your firewall is enabled before any IP interfaces are configured.
14611
14612 The next problem is what your firewall should actually ***do***! This is largely dependent on what access to your network you want to allow from the outside, and how much access to the outside world you want to allow from the inside. Some general rules are:
14613
14614 * Block all incoming access to ports below 1024 for TCP. This is where most of the security sensitive services are, like finger, SMTP (mail) and telnet.
14615
14616 * Block ***all*** incoming UDP traffic. There are very few useful services that travel over UDP, and what useful traffic there is, is normally a security threat (e.g. Suns RPC and NFS protocols). This has its disadvantages also, since UDP is a connectionless protocol, denying incoming UDP traffic also blocks the replies to outgoing UDP traffic. This can cause a problem for people (on the inside) using external archie (prospero) servers. If you want to allow access to archie, you will have to allow packets coming from ports 191 and 1525 to any internal UDP port through the firewall.  **ntp**  is another service you may consider allowing through, which comes from port 123.
14617
14618 * Block traffic to port 6000 from the outside. Port 6000 is the port used for access to X11 servers, and can be a security threat (especially if people are in the habit of doing `xhost +` on their workstations). X11 can actually use a range of ports starting at 6000, the upper limit being how many X displays you can run on the machine. The upper limit as defined by RFC 1700 (Assigned Numbers) is 6063.
14619
14620 * Check what ports any internal servers use (e.g. SQL servers, etc). It is probably a good idea to block those as well, as they normally fall outside the 1-1024 range specified above.
14621
14622 Another checklist for firewall configuration is available from CERT at http://www.cert.org/tech_tips/packet_filtering.html
14623
14624 As stated above, these are only ***guidelines***. You will have to decide what filter rules you want to use on your firewall yourself. We cannot accept ANY responsibility if someone breaks into your network, even if you follow the advice given above.
14625
14626 #### IPFW Overhead and Optimization 
14627
14628 Many people want to know how much overhead IPFW adds to a system. The answer to this depends mostly on your rule set and processor speed. For most applications dealing with Ethernet and small rule sets, the answer is ***negligible***. For those of you that need actual measurements to satisfy your curiosity, read on.
14629
14630 The following measurements were made using FreeBSD 2.2.5-STABLE on a 486-66. (While IPFW has changed slightly in later releases of DragonFly, it still performs with similar speed.) IPFW was modified to measure the time spent within the `ip_fw_chk` routine, displaying the results to the console every 1000 packets.
14631
14632 Two rule sets, each with 1000 rules, were tested. The first set was designed to demonstrate a worst case scenario by repeating the rule:
14633
14634     
14635
14636     # ipfw add deny tcp from any to any 55555
14637
14638 This demonstrates a worst case scenario by causing most of IPFW's packet check routine to be executed before finally deciding that the packet does not match the rule (by virtue of the port number). Following the 999th iteration of this rule was an `allow ip from any to any`.
14639
14640 The second set of rules were designed to abort the rule check quickly:
14641
14642     
14643
14644     # ipfw add deny ip from 1.2.3.4 to 1.2.3.4
14645
14646 The non-matching source IP address for the above rule causes these rules to be skipped very quickly. As before, the 1000th rule was an `allow ip from any to any`.
14647
14648 The per-packet processing overhead in the former case was approximately 2.703 ms/packet, or roughly 2.7 microseconds per rule. Thus the theoretical packet processing limit with these rules is around 370 packets per second. Assuming 10 Mbps Ethernet and a ~1500 byte packet size, we would only be able to achieve 55.5% bandwidth utilization.
14649
14650 For the latter case each packet was processed in approximately 1.172 ms, or roughly 1.2 microseconds per rule. The theoretical packet processing limit here would be about 853 packets per second, which could consume 10 Mbps Ethernet bandwidth.
14651
14652 The excessive number of rules tested and the nature of those rules do not provide a real-world scenario -- they were used only to generate the timing information presented here. Here are a few things to keep in mind when building an efficient rule set:
14653
14654 * Place an `established` rule early on to handle the majority of TCP traffic. Do not put any `allow tcp` statements before this rule.
14655
14656 * Place heavily triggered rules earlier in the rule set than those rarely used (***without changing the permissiveness of the firewall***, of course). You can see which rules are used most often by examining the packet counting statistics with `ipfw -a l`.
14657
14658 CategoryHandbook
14659
14660 CategoryHandbook-security
14661
14662 ## OpenSSL 
14663
14664 [OpenSSL](http://www.openssl.org/) provides a general-purpose cryptography library, as well as the Secure Sockets Layer v2/v3 (SSLv2/SSLv3) and Transport Layer Security v1 (TLSv1) network security protocols.
14665
14666 However, one of the algorithms (specifically IDEA) included in OpenSSL is protected by patents in the USA and elsewhere, and is not available for unrestricted use. IDEA is included in the OpenSSL sources in DragonFly, but it is not built by default. If you wish to use it, and you comply with the license terms, enable the `MAKE_IDEA` switch in `/etc/make.conf` and rebuild your sources using `make world`.
14667
14668 Today, the RSA algorithm is free for use in USA and other countries. In the past it was protected by a patent.
14669
14670 ## VPN over IPsec 
14671
14672 <!-- XXX: someone revise this and add words about pf. I've no clue about this stuff -->
14673
14674 ***Written by Nik Clayton. ***
14675
14676 Creating a VPN between two networks, separated by the Internet, using DragonFly gateways.
14677
14678 ### Understanding IPsec 
14679
14680 ***Written by Hiten M. Pandya. ***
14681
14682 This section will guide you through the process of setting up IPsec, and to use it in an environment which consists of DragonFly and  **Microsoft® Windows® 2000/XP**  machines, to make them communicate securely. In order to set up IPsec, it is necessary that you are familiar with the concepts of building a custom kernel (see [kernelconfig.html Chapter 9]).
14683
14684 ***IPsec*** is a protocol which sits on top of the Internet Protocol (IP) layer. It allows two or more hosts to communicate in a secure manner (hence the name). The DragonFly IPsec ***network stack*** is based on the [KAME](http://www.kame.net/) implementation, which has support for both protocol families, IPv4 and IPv6.
14685
14686 IPsec consists of two sub-protocols:
14687
14688 * ***Encapsulated Security Payload (ESP)***, protects the IP packet data from third party interference, by encrypting the contents using symmetric cryptography algorithms (like Blowfish, 3DES).
14689
14690 * ***Authentication Header (AH)***, protects the IP packet header from third party interference and spoofing, by computing a cryptographic checksum and hashing the IP packet header fields with a secure hashing function. This is then followed by an additional header that contains the hash, to allow the information in the packet to be authenticated.
14691
14692 ESP and AH can either be used together or separately, depending on the environment.
14693
14694 IPsec can either be used to directly encrypt the traffic between two hosts (known as ***Transport Mode***); or to build ***virtual tunnels*** between two subnets, which could be used for secure communication between two corporate networks (known as ***Tunnel Mode***). The latter is more commonly known as a ***Virtual Private Network (VPN)***. The [ipsec(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipsec&section4) manual page should be consulted for detailed information on the IPsec subsystem in DragonFly.
14695
14696 To add IPsec support to your kernel, add the following options to your kernel configuration file:
14697
14698     
14699
14700     options   IPSEC        #IP security
14701
14702     options   IPSEC_ESP    #IP security (crypto; define w/ IPSEC)
14703
14704     
14705
14706 If IPsec debugging support is desired, the following kernel option should also be added:
14707
14708     
14709
14710     options   IPSEC_DEBUG  #debug for IP security
14711
14712     
14713
14714 ### The Problem 
14715
14716 There's no standard for what constitutes a VPN. VPNs can be implemented using a number of different technologies, each of which have their own strengths and weaknesses. This article presents a number of scenarios, and strategies for implementing a VPN for each scenario.
14717
14718 ### Scenario #1: Two networks, connected to the Internet, to behave as one 
14719
14720 This is the scenario that caused me to first investigating VPNs. The premise is as follows:
14721
14722 * You have at least two sites
14723
14724 * Both sites are using IP internally
14725
14726 * Both sites are connected to the Internet, through a gateway that is running DragonFly.
14727
14728 * The gateway on each network has at least one public IP address.
14729
14730 * The internal addresses of the two networks can be public or private IP addresses, it doesn't matter. You can be running NAT on the gateway machine if necessary.
14731
14732 * The internal IP addresses of the two networks ***do not collide***. While I expect it is theoretically possible to use a combination of VPN technology and NAT to get this to work, I expect it to be a configuration nightmare.
14733
14734 If you find that you are trying to connect two networks, both of which, internally, use the same private IP address range (e.g., both of them use `192.168.1.x`), then one of the networks will have to be renumbered.
14735
14736 The network topology might look something like this:
14737
14738 security/ipsec-network.png
14739
14740 Notice the two public IP addresses. I'll use the letters to refer to them in the rest of this article. Anywhere you see those letters in this article, replace them with your own public IP addresses. Note also that internally, the two gateway machines have .1 IP addresses, and that the two networks have different private IP addresses (`192.168.1.x` and `192.168.2.x` respectively). All the machines on the private networks have been configured to use the `.1` machine as their default gateway.
14741
14742 The intention is that, from a network point of view, each network should view the machines on the other network as though they were directly attached the same router -- albeit a slightly slow router with an occasional tendency to drop packets.
14743
14744 This means that (for example), machine `192.168.1.20` should be able to run
14745
14746     
14747
14748     ping 192.168.2.34
14749
14750 and have it work, transparently. Windows machines should be able to see the machines on the other network, browse file shares, and so on, in exactly the same way that they can browse machines on the local network.
14751
14752 And the whole thing has to be secure. This means that traffic between the two networks has to be encrypted.
14753
14754 Creating a VPN between these two networks is a multi-step process. The stages are as follows:
14755
14756   1. Create a ***virtual*** network link between the two networks, across the Internet. Test it, using tools like [ping(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ping&section8), to make sure it works.
14757
14758   1. Apply security policies to ensure that traffic between the two networks is transparently encrypted and decrypted as necessary. Test this, using tools like [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#tcpdump&section1), to ensure that traffic is encrypted.
14759
14760   1. Configure additional software on the DragonFly gateways, to allow Windows machines to see one another across the VPN.
14761
14762 #### Step 1: Creating and testing a ***virtual*** network link 
14763
14764 Suppose that you were logged in to the gateway machine on network #1 (with public IP address `A.B.C.D`, private IP address `192.168.1.1`), and you ran `ping 192.168.2.1`, which is the private address of the machine with IP address `W.X.Y.Z`. What needs to happen in order for this to work?
14765
14766   1. The gateway machine needs to know how to reach `192.168.2.1`. In other words, it needs to have a route to `192.168.2.1`.
14767
14768   1. Private IP addresses, such as those in the `192.168.x` range are not supposed to appear on the Internet at large. Instead, each packet you send to `192.168.2.1` will need to be wrapped up inside another packet. This packet will need to appear to be from `A.B.C.D`, and it will have to be sent to `W.X.Y.Z`. This process is called ***encapsulation***.
14769
14770   1. Once this packet arrives at `W.X.Y.Z` it will need to ***unencapsulated***, and delivered to `192.168.2.1`.
14771
14772 You can think of this as requiring a ***tunnel*** between the two networks. The two ***tunnel mouths*** are the IP addresses `A.B.C.D` and `W.X.Y.Z`, and the tunnel must be told the addresses of the private IP addresses that will be allowed to pass through it. The tunnel is used to transfer traffic with private IP addresses across the public Internet.
14773
14774 This tunnel is created by using the generic interface, or `gif` devices on DragonFly. As you can imagine, the `gif` interface on each gateway host must be configured with four IP addresses; two for the public IP addresses, and two for the private IP addresses.
14775
14776 Support for the gif device must be compiled in to the DragonFly kernel on both machines. You can do this by adding the line:
14777
14778     
14779
14780     pseudo-device gif
14781
14782 to the kernel configuration files on both machines, and then compile, install, and reboot as normal.
14783
14784 Configuring the tunnel is a two step process. First the tunnel must be told what the outside (or public) IP addresses are, using [gifconfig(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#gifconfig&section8). Then the private IP addresses must be configured using [ifconfig(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=ifconfig&section=8).
14785
14786 On the gateway machine on network #1 you would run the following two commands to configure the tunnel.
14787
14788     
14789
14790     gifconfig gif0 A.B.C.D W.X.Y.Z
14791
14792     ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff
14793
14794     
14795
14796 On the other gateway machine you run the same commands, but with the order of the IP addresses reversed.
14797
14798     
14799
14800     gifconfig gif0 W.X.Y.Z A.B.C.D
14801
14802     ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff
14803
14804     
14805
14806 You can then run:
14807
14808     
14809
14810     gifconfig gif0
14811
14812 to see the configuration. For example, on the network #1 gateway, you would see this:
14813
14814     
14815
14816     # gifconfig gif0
14817
14818     gif0: flags=8011&lt;UP,POINTTOPOINT,MULTICAST&gt; mtu 1280
14819
14820     inet 192.168.1.1 --&gt; 192.168.2.1 netmask 0xffffffff
14821
14822     physical address inet A.B.C.D --&gt; W.X.Y.Z
14823
14824     
14825
14826 As you can see, a tunnel has been created between the physical addresses `A.B.C.D` and `W.X.Y.Z`, and the traffic allowed through the tunnel is that between `192.168.1.1` and `192.168.2.1`.
14827
14828 This will also have added an entry to the routing table on both machines, which you can examine with the command `netstat -rn`. This output is from the gateway host on network #1.
14829
14830     
14831
14832     # netstat -rn
14833
14834     Routing tables
14835
14836     
14837
14838     Internet:
14839
14840     Destination      Gateway       Flags    Refs    Use    Netif  Expire
14841
14842     ...
14843
14844     192.168.2.1      192.168.1.1   UH        0        0    gif0
14845
14846     ...
14847
14848     
14849
14850 As the ***Flags*** value indicates, this is a host route, which means that each gateway knows how to reach the other gateway, but they do not know how to reach the rest of their respective networks. That problem will be fixed shortly.
14851
14852 It is likely that you are running a firewall on both machines. This will need to be circumvented for your VPN traffic. You might want to allow all traffic between both networks, or you might want to include firewall rules that protect both ends of the VPN from one another.
14853
14854 It greatly simplifies testing if you configure the firewall to allow all traffic through the VPN. You can always tighten things up later. If you are using [ipfw(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ipfw&section8) on the gateway machines then a command like
14855
14856     
14857
14858     ipfw add 1 allow ip from any to any via gif0
14859
14860 will allow all traffic between the two end points of the VPN, without affecting your other firewall rules. Obviously you will need to run this command on both gateway hosts.
14861
14862 This is sufficient to allow each gateway machine to ping the other. On `192.168.1.1`, you should be able to run
14863
14864     
14865
14866     ping 192.168.2.1
14867
14868 and get a response, and you should be able to do the same thing on the other gateway machine.
14869
14870 However, you will not be able to reach internal machines on either network yet. This is because of the routing -- although the gateway machines know how to reach one another, they do not know how to reach the network behind each one.
14871
14872 To solve this problem you must add a static route on each gateway machine. The command to do this on the first gateway would be:
14873
14874     
14875
14876     route add 192.168.2.0 192.168.2.1 netmask 0xffffff00
14877
14878     
14879
14880 This says ***In order to reach the hosts on the network `192.168.2.0`, send the packets to the host `192.168.2.1`***. You will need to run a similar command on the other gateway, but with the `192.168.1.x` addresses instead.
14881
14882 IP traffic from hosts on one network will now be able to reach hosts on the other network.
14883
14884 That has now created two thirds of a VPN between the two networks, in as much as it is ***virtual*** and it is a ***network***. It is not private yet. You can test this using [ping(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ping&section8) and [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=tcpdump&section=1). Log in to the gateway host and run
14885
14886     
14887
14888     tcpdump dst host 192.168.2.1
14889
14890 In another log in session on the same host run
14891
14892     
14893
14894     ping 192.168.2.1
14895
14896 You will see output that looks something like this:
14897
14898     
14899
14900     16:10:24.018080 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
14901
14902     16:10:24.018109 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
14903
14904     16:10:25.018814 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
14905
14906     16:10:25.018847 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
14907
14908     16:10:26.028896 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
14909
14910     16:10:26.029112 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
14911
14912     
14913
14914 As you can see, the ICMP messages are going back and forth unencrypted. If you had used the `-s` parameter to [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#tcpdump&section1) to grab more bytes of data from the packets you would see more information.
14915
14916 Obviously this is unacceptable. The next section will discuss securing the link between the two networks so that it all traffic is automatically encrypted.
14917
14918  **Summary:** 
14919
14920 * Configure both kernels with ***pseudo-device gif***.
14921
14922 * Edit `/etc/rc.conf` on gateway host #1 and add the following lines (replacing IP addresses as necessary).
14923
14924       
14925
14926       gifconfig_gif0="A.B.C.D W.X.Y.Z"
14927
14928       ifconfig_gif0="inet 192.168.1.1 192.168.2.1 netmask 0xffffffff"
14929
14930       static_routes="vpn"
14931
14932       route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00"
14933
14934   
14935
14936 * Edit your firewall script (`/etc/rc.firewall`, or similar) on both hosts, and add
14937
14938       
14939
14940       ipfw add 1 allow ip from any to any via gif0
14941
14942   
14943
14944 * Make similar changes to `/etc/rc.conf` on gateway host #2, reversing the order of IP addresses.
14945
14946 #### Step 2: Securing the link 
14947
14948 To secure the link we will be using IPsec. IPsec provides a mechanism for two hosts to agree on an encryption key, and to then use this key in order to encrypt data between the two hosts.
14949
14950 The are two areas of configuration to be considered here.
14951
14952   1. There must be a mechanism for two hosts to agree on the encryption mechanism to use. Once two hosts have agreed on this mechanism there is said to be a ***security association*** between them.
14953
14954   1. There must be a mechanism for specifying which traffic should be encrypted. Obviously, you don't want to encrypt all your outgoing traffic -- you only want to encrypt the traffic that is part of the VPN. The rules that you put in place to determine what traffic will be encrypted are called ***security policies***.
14955
14956 Security associations and security policies are both maintained by the kernel, and can be modified by userland programs. However, before you can do this you must configure the kernel to support IPsec and the Encapsulated Security Payload (ESP) protocol. This is done by configuring a kernel with:
14957
14958     
14959
14960     options IPSEC
14961
14962     options IPSEC_ESP
14963
14964     
14965
14966 and recompiling, reinstalling, and rebooting. As before you will need to do this to the kernels on both of the gateway hosts.
14967
14968 You have two choices when it comes to setting up security associations. You can configure them by hand between two hosts, which entails choosing the encryption algorithm, encryption keys, and so forth, or you can use daemons that implement the Internet Key Exchange protocol (IKE) to do this for you.
14969
14970 I recommend the latter. Apart from anything else, it is easier to set up.
14971
14972 Editing and displaying security policies is carried out using [setkey(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#setkey&section8). By analogy, `setkey` is to the kernel's security policy tables as [route(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=route&section=8) is to the kernel's routing tables. `setkey` can also display the current security associations, and to continue the analogy further, is akin to `netstat -r` in that respect.
14973
14974 There are a number of choices for daemons to manage security associations with DragonFly. This article will describe how to use one of these, racoon. racoon is in the FreeBSD ports collection, in the security/ category, and is installed in the usual way.
14975
14976 racoon must be run on both gateway hosts. On each host it is configured with the IP address of the other end of the VPN, and a secret key (which you choose, and must be the same on both gateways).
14977
14978 The two daemons then contact one another, confirm that they are who they say they are (by using the secret key that you configured). The daemons then generate a new secret key, and use this to encrypt the traffic over the VPN. They periodically change this secret, so that even if an attacker were to crack one of the keys (which is as theoretically close to unfeasible as it gets) it won't do them much good -- by the time they've cracked the key the two daemons have chosen another one.
14979
14980 racoon's configuration is stored in `${PREFIX}/etc/racoon`. You should find a configuration file there, which should not need to be changed too much. The other component of racoon's configuration, which you will need to change, is the ***pre-shared key***.
14981
14982 The default racoon configuration expects to find this in the file `${PREFIX}/etc/racoon/psk.txt`. It is important to note that the pre-shared key is ***not*** the key that will be used to encrypt your traffic across the VPN link, it is simply a token that allows the key management daemons to trust one another.
14983
14984 `psk.txt` contains a line for each remote site you are dealing with. In this example, where there are two sites, each `psk.txt` file will contain one line (because each end of the VPN is only dealing with one other end).
14985
14986 On gateway host #1 this line should look like this:
14987
14988     
14989
14990     W.X.Y.Z            secret
14991
14992 That is, the ***public*** IP address of the remote end, whitespace, and a text string that provides the secret. Obviously, you shouldn't use ***secret*** as your key -- the normal rules for choosing a password apply.
14993
14994 On gateway host #2 the line would look like this
14995
14996     
14997
14998     A.B.C.D            secret
14999
15000 That is, the public IP address of the remote end, and the same secret key. `psk.txt` must be mode `0600` (i.e., only read/write to `root`) before racoon will run.
15001
15002 You must run racoon on both gateway machines. You will also need to add some firewall rules to allow the IKE traffic, which is carried over UDP to the ISAKMP (Internet Security Association Key Management Protocol) port. Again, this should be fairly early in your firewall ruleset.
15003
15004     
15005
15006     ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
15007
15008     ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
15009
15010     
15011
15012 Once racoon is running you can try pinging one gateway host from the other. The connection is still not encrypted, but racoon will then set up the security associations between the two hosts -- this might take a moment, and you may see this as a short delay before the ping commands start responding.
15013
15014 Once the security association has been set up you can view it using [setkey(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#setkey&section8). Run
15015
15016     
15017
15018     setkey -D
15019
15020 on either host to view the security association information.
15021
15022 That's one half of the problem. They other half is setting your security policies.
15023
15024 To create a sensible security policy, let's review what's been set up so far. This discussions hold for both ends of the link.
15025
15026 Each IP packet that you send out has a header that contains data about the packet. The header includes the IP addresses of both the source and destination. As we already know, private IP addresses, such as the `192.168.x.y` range are not supposed to appear on the public Internet. Instead, they must first be encapsulated inside another packet. This packet must have the public source and destination IP addresses substituted for the private addresses.
15027
15028 So if your outgoing packet started looking like this:
15029
15030 security/ipsec-out-pkt.png
15031
15032 Then it will be encapsulated inside another packet, looking something like this:
15033
15034 security/ipsec-encap-pkt.png
15035
15036 This encapsulation is carried out by the `gif` device. As you can see, the packet now has real IP addresses on the outside, and our original packet has been wrapped up as data inside the packet that will be put out on the Internet.
15037
15038 Obviously, we want all traffic between the VPNs to be encrypted. You might try putting this in to words, as:
15039
15040 ***If a packet leaves from `A.B.C.D`, and it is destined for `W.X.Y.Z`, then encrypt it, using the necessary security associations.***
15041
15042 ***If a packet arrives from `W.X.Y.Z`, and it is destined for `A.B.C.D`, then decrypt it, using the necessary security associations.***
15043
15044 That's close, but not quite right. If you did this, all traffic to and from `W.X.Y.Z`, even traffic that was not part of the VPN, would be encrypted. That's not quite what you want. The correct policy is as follows
15045
15046 ***If a packet leaves from `A.B.C.D`, and that packet is encapsulating another packet, and it is destined for `W.X.Y.Z`, then encrypt it, using the necessary security associations.***
15047
15048 ***If a packet arrives from `W.X.Y.Z`, and that packet is encapsulating another packet, and it is destined for `A.B.C.D`, then encrypt it, using the necessary security associations.***
15049
15050 A subtle change, but a necessary one.
15051
15052 Security policies are also set using [setkey(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#setkey&section8). [setkey(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=setkey&section=8) features a configuration language for defining the policy. You can either enter configuration instructions via stdin, or you can use the `-f` option to specify a filename that contains configuration instructions.
15053
15054 The configuration on gateway host #1 (which has the public IP address `A.B.C.D`) to force all outbound traffic to `W.X.Y.Z` to be encrypted is:
15055
15056     
15057
15058     spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;
15059
15060     
15061
15062 Put these commands in a file (e.g., `/etc/ipsec.conf`) and then run
15063
15064     
15065
15066     # setkey -f /etc/ipsec.conf
15067
15068 `spdadd` tells [setkey(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#setkey&section8) that we want to add a rule to the secure policy database. The rest of this line specifies which packets will match this policy. `A.B.C.D/32` and `W.X.Y.Z/32` are the IP addresses and netmasks that identify the network or hosts that this policy will apply to. In this case, we want it to apply to traffic between these two hosts. `ipencap` tells the kernel that this policy should only apply to packets that encapsulate other packets. `-P out` says that this policy applies to outgoing packets, and `ipsec` says that the packet will be secured.
15069
15070 The second line specifies how this packet will be encrypted. `esp` is the protocol that will be used, while `tunnel` indicates that the packet will be further encapsulated in an IPsec packet. The repeated use of `A.B.C.D` and `W.X.Y.Z` is used to select the security association to use, and the final `require` mandates that packets must be encrypted if they match this rule.
15071
15072 This rule only matches outgoing packets. You will need a similar rule to match incoming packets.
15073
15074     
15075
15076     spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;
15077
15078 Note the `in` instead of `out` in this case, and the necessary reversal of the IP addresses.
15079
15080 The other gateway host (which has the public IP address `W.X.Y.Z`) will need similar rules.
15081
15082     
15083
15084     spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;
15085
15086            spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;
15087
15088 Finally, you need to add firewall rules to allow ESP and IPENCAP packets back and forth. These rules will need to be added to both hosts.
15089
15090     
15091
15092     ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
15093
15094     ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
15095
15096     ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
15097
15098     ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
15099
15100     
15101
15102 Because the rules are symmetric you can use the same rules on each gateway host.
15103
15104 Outgoing packets will now look something like this:
15105
15106 security/ipsec-crypt-pkt.png
15107
15108 When they are received by the far end of the VPN they will first be decrypted (using the security associations that have been negotiated by racoon). Then they will enter the `gif` interface, which will unwrap the second layer, until you are left with the innermost packet, which can then travel in to the inner network.
15109
15110 You can check the security using the same [ping(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#ping&section8) test from earlier. First, log in to the `A.B.C.D` gateway machine, and run:
15111
15112     
15113
15114     tcpdump dst host 192.168.2.1
15115
15116 In another log in session on the same host run
15117
15118     
15119
15120     ping 192.168.2.1
15121
15122 This time you should see output like the following:
15123
15124     
15125
15126     XXX tcpdump output
15127
15128 Now, as you can see, [tcpdump(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#tcpdump&section1) shows the ESP packets. If you try to examine them with the `-s` option you will see (apparently) gibberish, because of the encryption.
15129
15130 Congratulations. You have just set up a VPN between two remote sites.
15131
15132  **Summary** 
15133
15134 * Configure both kernels with:
15135
15136       
15137
15138       options IPSEC
15139
15140       options IPSEC_ESP
15141
15142   
15143
15144 * Install [`security/racoon`](http://pkgsrc.se/security/racoon). Edit `${PREFIX}/etc/racoon/psk.txt` on both gateway hosts, adding an entry for the remote host's IP address and a secret key that they both know. Make sure this file is mode 0600.
15145
15146 * Add the following lines to `/etc/rc.conf` on each host:
15147
15148       
15149
15150       ipsec_enable="YES"
15151
15152       ipsec_file="/etc/ipsec.conf"
15153
15154   
15155
15156 * Create an `/etc/ipsec.conf` on each host that contains the necessary spdadd lines. On gateway host #1 this would be:
15157
15158       
15159
15160       spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec
15161
15162         esp/tunnel/A.B.C.D-W.X.Y.Z/require;
15163
15164       spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec
15165
15166         esp/tunnel/W.X.Y.Z-A.B.C.D/require;
15167
15168   
15169
15170   On gateway host #2 this would be:
15171
15172       
15173
15174       spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec
15175
15176         esp/tunnel/W.X.Y.Z-A.B.C.D/require;
15177
15178       spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec
15179
15180         esp/tunnel/A.B.C.D-W.X.Y.Z/require;
15181
15182   
15183
15184 * Add firewall rules to allow IKE, ESP, and IPENCAP traffic to both hosts:
15185
15186       
15187
15188       ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
15189
15190       ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
15191
15192       ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
15193
15194       ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
15195
15196       ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
15197
15198       ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
15199
15200   
15201
15202 The previous two steps should suffice to get the VPN up and running. Machines on each network will be able to refer to one another using IP addresses, and all traffic across the link will be automatically and securely encrypted.
15203
15204 ----
15205
15206 ## OpenSSH 
15207
15208 ***Contributed by Chern Lee. ***
15209
15210  **OpenSSH**  is a set of network connectivity tools used to access remote machines securely. It can be used as a direct replacement for `rlogin`, `rsh`, `rcp`, and `telnet`. Additionally, any other TCP/IP connections can be tunneled/forwarded securely through SSH.  **OpenSSH**  encrypts all traffic to effectively eliminate eavesdropping, connection hijacking, and other network-level attacks.
15211
15212  **OpenSSH**  is maintained by the OpenBSD project, and is based upon SSH v1.2.12 with all the recent bug fixes and updates. It is compatible with both SSH protocols 1 and 2.
15213
15214 ### Advantages of Using OpenSSH 
15215
15216 Normally, when using [telnet(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#telnet&section1) or [rlogin(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=rlogin&section=1), data is sent over the network in an clear, un-encrypted form. Network sniffers anywhere in between the client and server can steal your user/password information or data transferred in your session.  **OpenSSH**  offers a variety of authentication and encryption methods to prevent this from happening.
15217
15218 ### Enabling sshd 
15219
15220 Be sure to make the following addition to your `rc.conf` file:
15221
15222     
15223
15224     sshd_enable="YES"
15225
15226 This will load [sshd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#sshd&section8&manpath=OpenBSD+3.3), the daemon program for  **OpenSSH** , the next time your system initializes. Alternatively, you can simply run directly the  **sshd**  daemon by typing `rcstart sshd` on the command line.
15227
15228 ### SSH Client 
15229
15230 The [ssh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh&section1&manpath=OpenBSD+3.3) utility works similarly to [rlogin(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=rlogin&section=1).
15231
15232     
15233
15234     # ssh user@example.com
15235
15236     Host key not found from the list of known hosts.
15237
15238     Are you sure you want to continue connecting (yes/no)? yes
15239
15240     Host 'example.com' added to the list of known hosts.
15241
15242     user@example.com's password: *******
15243
15244 The login will continue just as it would have if a session was created using `rlogin` or `telnet`. SSH utilizes a key fingerprint system for verifying the authenticity of the server when the client connects. The user is prompted to enter `yes` only when connecting for the first time. Future attempts to login are all verified against the saved fingerprint key. The SSH client will alert you if the saved fingerprint differs from the received fingerprint on future login attempts. The fingerprints are saved in `~/.ssh/known_hosts`, or `~/.ssh/known_hosts2` for SSH v2 fingerprints.
15245
15246 By default,  **OpenSSH**  servers are configured to accept both SSH v1 and SSH v2 connections. The client, however, can choose between the two. Version 2 is known to be more robust and secure than its predecessor.
15247
15248 The [ssh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh&section1&manpath=OpenBSD+3.3) command can be forced to use either protocol by passing it the `-1` or `-2` argument for v1 and v2, respectively.
15249
15250 ### Secure Copy 
15251
15252 The [scp(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#scp&section1&manpath=OpenBSD+3.3) command works similarly to [rcp(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=rcp&section=1); it copies a file to or from a remote machine, except in a secure fashion.
15253
15254     
15255
15256     #  scp user@example.com:/COPYRIGHT COPYRIGHT
15257
15258     user@example.com's password: *******
15259
15260     COPYRIGHT            100% |*****************************|  4735
15261
15262     00:00
15263
15264     #
15265
15266 Since the fingerprint was already saved for this host in the previous example, it is verified when using [scp(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#scp&section1&manpath=OpenBSD+3.3) here.
15267
15268 The arguments passed to [scp(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#scp&section1&manpath=OpenBSD+3.3) are similar to [cp(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=cp&section=1), with the file or files in the first argument, and the destination in the second. Since the file is fetched over the network, through SSH, one or more of the file arguments takes on the form `user@host:<path_to_remote_file>`. The `user@` part is optional. If omitted, it will default to the same username as you are currently logged in as, unless configured otherwise.
15269
15270 ### Configuration 
15271
15272 The system-wide configuration files for both the  **OpenSSH**  daemon and client reside within the `/etc/ssh` directory.
15273
15274 `ssh_config` configures the client settings, while `sshd_config` configures the daemon.
15275
15276 Additionally, the `sshd_program` (`/usr/sbin/sshd` by default), and `sshd_flags` `rc.conf` options can provide more levels of configuration.
15277
15278 Each user can have a personal configuration file in `~/.ssh/config`. The file can configure various client options, and can include host-specific options. With the following configuration file, a user could type `ssh shell` which would be equivalent to `ssh -X user@shell.example.com`.
15279
15280     
15281
15282     Host shell
15283
15284      Hostname shell.example.com
15285
15286      Username user
15287
15288      Protocol 2
15289
15290      ForwardX11 yes
15291
15292 ### ssh-keygen 
15293
15294 Instead of using passwords, [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-keygen&section1&manpath=OpenBSD+3.3) can be used to generate RSA keys to authenticate a user:
15295
15296     
15297
15298     % ssh-keygen -t rsa1
15299
15300     Initializing random number generator...
15301
15302     Generating p:  .++ (distance 66)
15303
15304     Generating q:  ..............................++ (distance 498)
15305
15306     Computing the keys...
15307
15308     Key generation complete.
15309
15310     Enter file in which to save the key (/home/user/.ssh/identity):
15311
15312     Enter passphrase:
15313
15314     Enter the same passphrase again:
15315
15316     Your identification has been saved in /home/user/.ssh/identity.
15317
15318     ...
15319
15320 [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-keygen&section1&manpath=OpenBSD+3.3) will create a public and private key pair for use in authentication. The private key is stored in `~/.ssh/identity`, whereas the public key is stored in `~/.ssh/identity.pub`. The public key must be placed in `~/.ssh/authorized_keys` of the remote machine in order for the setup to work.
15321
15322 This will allow connection to the remote machine based upon RSA authentication instead of passwords.
15323
15324  **Note:** The `-t rsa1` option will create RSA keys for use by SSH protocol version 1. If you want to use RSA keys with the SSH protocol version 2, you have to use the command `ssh-keygen -t rsa`.
15325
15326 If a passphrase is used in [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-keygen&section1&manpath=OpenBSD+3.3), the user will be prompted for a password each time in order to use the private key.
15327
15328 A SSH protocol version 2 DSA key can be created for the same purpose by using the `ssh-keygen -t dsa` command. This will create a public/private DSA key for use in SSH protocol version 2 sessions only. The public key is stored in `~/.ssh/id_dsa.pub`, while the private key is in `~/.ssh/id_dsa`.
15329
15330 DSA public keys are also placed in `~/.ssh/authorized_keys` on the remote machine.
15331
15332 [ssh-agent(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-agent&section1&manpath=OpenBSD+3.3) and [ssh-add(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=ssh-add&section=1&manpath=OpenBSD+3.3) are utilities used in managing multiple passworded private keys.
15333
15334  **Warning:** The various options and files can be different according to the  **OpenSSH**  version you have on your system, to avoid problems you should consult the [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-keygen&section1&manpath=OpenBSD+3.3) manual page.
15335
15336 ### SSH Tunneling 
15337
15338  **OpenSSH**  has the ability to create a tunnel to encapsulate another protocol in an encrypted session.
15339
15340 The following command tells [ssh(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh&section1&manpath=OpenBSD+3.3) to create a tunnel for  **telnet** :
15341
15342     
15343
15344     % ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com
15345
15346     %
15347
15348 The `ssh` command is used with the following options:
15349
15350 `-2`
15351
15352  :: Forces `ssh` to use version 2 of the protocol. (Do not use if you are working with older SSH servers)
15353
15354 `-N`
15355
15356  :: Indicates no command, or tunnel only. If omitted, `ssh` would initiate a normal session.
15357
15358 `-f`
15359
15360  :: Forces `ssh` to run in the background.
15361
15362 `-L`
15363
15364  :: Indicates a local tunnel in `***localport:remotehost:remoteport***` fashion.
15365
15366 `user@foo.example.com`
15367
15368  :: The remote SSH server.
15369
15370 An SSH tunnel works by creating a listen socket on `localhost` on the specified port. It then forwards any connection received on the local host/port via the SSH connection to the specified remote host and port.
15371
15372 In the example, port `***5023***` on `localhost` is being forwarded to port `***23***` on `localhost` of the remote machine. Since `***23***` is  **telnet** , this would create a secure  **telnet**  session through an SSH tunnel.
15373
15374 This can be used to wrap any number of insecure TCP protocols such as SMTP, POP3, FTP, etc.
15375
15376  **Example 10-1. Using SSH to Create a Secure Tunnel for SMTP** 
15377
15378     
15379
15380     % ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com
15381
15382     user@mailserver.example.com's password: *****
15383
15384     % telnet localhost 5025
15385
15386     Trying 127.0.0.1...
15387
15388     Connected to localhost.
15389
15390     Escape character is '^]'.
15391
15392     220 mailserver.example.com ESMTP
15393
15394 This can be used in conjunction with an [ssh-keygen(1)](http://leaf.dragonflybsd.org/cgi/web-man?command#ssh-keygen&section1&manpath=OpenBSD+3.3) and additional user accounts to create a more seamless/hassle-free SSH tunneling environment. Keys can be used in place of typing a password, and the tunnels can be run as a separate user.
15395
15396 #### Practical SSH Tunneling Examples 
15397
15398 ##### Secure Access of a POP3 Server 
15399
15400 At work, there is an SSH server that accepts connections from the outside. On the same office network resides a mail server running a POP3 server. The network, or network path between your home and office may or may not be completely trustable. Because of this, you need to check your e-mail in a secure manner. The solution is to create an SSH connection to your office's SSH server, and tunnel through to the mail server.
15401
15402     
15403
15404     % ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com
15405
15406     user@ssh-server.example.com's password: ******
15407
15408 When the tunnel is up and running, you can point your mail client to send POP3 requests to `localhost` port 2110. A connection here will be forwarded securely across the tunnel to `mail.example.com`.
15409
15410 ##### Bypassing a Draconian Firewall 
15411
15412 Some network administrators impose extremely draconian firewall rules, filtering not only incoming connections, but outgoing connections. You may be only given access to contact remote machines on ports 22 and 80 for SSH and web surfing.
15413
15414 You may wish to access another (perhaps non-work related) service, such as an Ogg Vorbis server to stream music. If this Ogg Vorbis server is streaming on some other port than 22 or 80, you will not be able to access it.
15415
15416 The solution is to create an SSH connection to a machine outside of your network's firewall, and use it to tunnel to the Ogg Vorbis server.
15417
15418     
15419
15420     % ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org
15421
15422     user@unfirewalled-system.example.org's password: *******
15423
15424 Your streaming client can now be pointed to `localhost` port 8888, which will be forwarded over to `music.example.com` port 8000, successfully evading the firewall.
15425
15426  ***Contributed by Matteo Riondato. Updated for DragonFly by Dario Banno.***
15427
15428  [[!toc levels=3]]
15429
15430 ## Synopsis 
15431
15432  This chapter will provide an explanation of what DragonFly jails are and how to use them. Jails, sometimes referred to as an enhanced replacement of chroot environments, are a very powerful tool for system administrators, but their basic usage can also be useful for advanced users.
15433
15434  After reading this chapter, you will know:
15435
15436 * What a jail is, and what purpose it may serve in DragonFly installations.
15437
15438 * How to build, start, and stop a jail.
15439
15440 * The basics of jail administration, both from inside and outside the jail.
15441 ***
15442
15443  Other sources of useful information about jails are:
15444
15445 * The [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) manual page. This is the full reference of the jail utility -- the administrative tool which can be used in DragonFly to start, stop, and control DragonFly jails.
15446
15447 * The mailing lists and their archives. The archives of the DragonFly general questions mailing list and other mailing lists hosted by the DragonFly list server already contain a wealth of material for jails. It should always be engaging to search the archives, or post a new question to the [users mailing list](mailto:users@lists.dragonflybsd.org).
15448 ***
15449   ***
15450
15451 For information on how to setup a jail, see: [Setting up a jail](http://www.youtube.com/watch?v=s4_dJjfwtR4)
15452
15453 ----
15454
15455 ## Terms Related to Jails 
15456
15457  To facilitate better understanding of parts of the DragonFly system related to jails, their internals and the way they interact with the rest of DragonFly, the following terms are used further in this chapter:
15458
15459  ***[chroot(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=8) (command)***
15460
15461   A system call of DragonFly, which changes the root directory of a process and all its descendants.
15462
15463 ***
15464
15465  ***[chroot(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=2) (environment)***
15466
15467   The environment of processes running in a “chroot”. This includes resources such as the part of the file system which is visible, user and group IDs which are available, network interfaces and other IPC mechanisms, etc.
15468
15469 ***
15470
15471 *** [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) (command)***
15472
15473   The system administration utility which allows launching of processes within a jail environment.
15474
15475 ***
15476
15477  ***host (system, process, user, etc.)***
15478
15479   The controlling system of a jail environment. The host system has access to all the hardware resources available, and can control processes both outside of and inside a jail environment. One of the important differences of the host system from a jail is that the limitations which apply to superuser processes inside a jail are not enforced for processes of the host system.
15480
15481 ***
15482
15483  ***hosted (system, process, user, etc.)***
15484
15485   A process, user or other entity, whose access to resources is restricted by a DragonFly jail.
15486
15487 ----
15488
15489 ## Introduction 
15490
15491  Since system administration is a difficult and perplexing task, many powerful tools were developed to make life easier for the administrator. These tools mostly provide enhancements of some sort to the way systems are installed, configured and maintained. Part of the tasks which an administrator is expected to do is to properly configure the security of a system, so that it can continue serving its real purpose, without allowing security violations.
15492 ***
15493
15494  One of the tools which can be used to enhance the security of a DragonFly system are jails. The jail feature was written by Poul-Henning Kamp <phk@freebsd.org> for R&D Associates [[http://www.rndassociates.com/]] who contributed it to FreeBSD 4.X. Support for multiple IPs and IPv6 were introduced in DragonFly 1.7. Their development still goes on, enhancing their usefulness, performance, reliability, and security.
15495
15496 ## What is a Jail 
15497
15498  BSD-like operating systems have had [chroot(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=2) since the time of 4.2BSD. The [chroot(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=8) utility can be used to change the root directory of a set of processes, creating a safe environment, separate from the rest of the system. Processes created in the chrooted environment can not access files or resources outside of it. For that reason, compromising a service running in a chrooted environment should not allow the attacker to compromise the entire system. The chroot(8) utility is good for easy tasks, which do not require a lot of flexibility or complex and advanced features. Since the inception of the chroot concept, however, many ways have been found to escape from a chrooted environment and, although they have been fixed in modern versions of the DragonFly kernel, it was clear that chroot(2) was not the ideal solution for securing services. A new subsystem had to be implemented.
15499
15500  This is one of the main reasons why ***jails*** were developed.
15501
15502  Jails improve on the concept of the traditional [chroot(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=2) environment, in several ways. In a traditional [chroot(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=2) environment, processes are only limited in the part of the file system they can access. The rest of the system resources (like the set of system users, the running processes, or the networking subsystem) are shared by the chrooted processes and the processes of the host system. Jails expand this model by virtualizing not only access to the file system, but also the set of users, the networking subsystem of the DragonFly kernel and a few other things. A more complete set of fine-grained controls available for tuning the access of a jailed environment is described in Section 12.5.
15503 ***
15504
15505  A jail is characterized by four elements:
15506
15507 * A directory subtree -- the starting point from which a jail is entered. Once inside the jail, a process is not permitted to escape outside of this subtree. Traditional security issues which plagued the original chroot(2) design will not affect DragonFly jails.
15508
15509 * A hostname -- the hostname which will be used within the jail. Jails are mainly used for hosting network services, therefore having a descriptive hostname for each jail can really help the system administrator.
15510
15511 * An IP address -- this will be assigned to the jail and cannot be changed in any way during the jail's life span. The IP address of a jail is usually an alias address for an existing network interface, but this is not strictly necessary.
15512
15513 * A command -- the path name of an executable to run inside the jail. This is relative to the root directory of the jail environment, and may vary a lot, depending on the type of the specific jail environment.
15514 ***
15515
15516  Apart from these, jails can have their own set of users and their own root user. Naturally, the powers of the root user are limited within the jail environment and, from the point of view of the host system, the jail root user is not an omnipotent user. In addition, the root user of a jail is not allowed to perform critical operations to the system outside of the associated jail(8) environment. More information about capabilities and restrictions of the root user will be discussed in Section 12.5 below.
15517
15518 ----
15519
15520 ## Creating and Controlling Jails 
15521
15522  Some administrators divide jails into the following two types: ***complete*** jails, which resemble a real DragonFly system, and ***service*** jails, dedicated to one application or service, possibly running with privileges. This is only a conceptual division and the process of building a jail is not affected by it. The [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) manual page is quite clear about the procedure for building a jail:
15523
15524      
15525
15526     # setenv D /here/is/the/jail
15527     # mkdir -p $D                                     (1)
15528     # cd /usr/src
15529     # make installworld DESTDIR=$D                    (2)
15530     # cd etc 
15531     # make distribution DESTDIR=$D -DNO_MAKEDEV_RUN   (3)
15532     # cd $D
15533     # ln -sf dev/null kernel
15534     # mount_devfs -o jail $D/dev
15535     #
15536
15537   **(1)** 
15538
15539   Selecting a location for a jail is the best starting point. This is where the jail will physically reside within the file system of the jail's host. A good choice can be ***/usr/jail/jailname***, where jailname is the hostname identifying the jail. The ***/usr/*** file system usually has enough space for the jail file system, which for ***complete*** jails is, essentially, a replication of every file present in a default installation of the DragonFly base system.
15540 ***
15541
15542   **(2)** 
15543
15544   This command will populate the directory subtree chosen as jail's physical location on the file system with the necessary binaries, libraries, manual pages and so on. Everything is done in the typical DragonFly style -- first everything is built/compiled, then installed to the destination path.
15545 ***
15546
15547  **(3)**
15548
15549   The distribution target for make installs every needed configuration file. In simple words, it installs every installable file of ***/usr/src/etc/*** to the ***/etc*** directory of the jail environment: ***$D/etc/***.
15550
15551 ***
15552
15553  Once a jail is installed, it can be started by using the [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) utility. The [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) utility takes four mandatory arguments which are described in the Section 12.3.1. Other arguments may be specified too, e.g., to run the jailed process with the credentials of a specific user. The command argument depends on the type of the jail; for a virtual system, ***/etc/rc*** is a good choice, since it will replicate the startup sequence of a real DragonFly system. For a service jail, it depends on the service or application that will run within the jail.
15554
15555  Jails are often started at boot time and the DragonFly rc mechanism provides an easy way to do this.
15556
15557 ***
15558  A list of the jails which are enabled to start at boot time should be added to the [rc.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.conf&section=5) file:
15559
15560      
15561
15562     jail_enable="YES"   # Set to NO to disable starting of any jails
15563     jail_list="www"     # Space separated list of names of jails
15564     #
15565
15566 ***
15567
15568  For each jail listed in ***jail_list***, a group of [rc.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.conf&section=5) settings, which describe the particular jail, should be added:
15569
15570      
15571
15572     jail_www_rootdir="/usr/jail/www"     # jail's root directory
15573     jail_www_hostname="www.example.org"  # jail's hostname
15574     jail_www_ip="192.168.0.10"           # jail's IP address
15575     #
15576
15577  The default startup of jails configured in [rc.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.conf&section=5), will run the ***/etc/rc*** script of the jail, which assumes the jail is a complete virtual system. For service jails, the default startup command of the jail should be changed, by setting the ***jail_jailname_exec_start*** option appropriately.
15578
15579    **Note:**  For a full list of available options, please see the [rc.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc.conf&section=5) manual page.
15580
15581  The ***/etc/rc.d/jail*** script can be used to start or stop a jail by hand, if an entry for it exists in ***rc.conf***:
15582
15583     # /etc/rc.d/jail start www
15584     # /etc/rc.d/jail stop www
15585
15586 ***
15587
15588  A clean way to shut down a [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) is not available at the moment. This is because commands normally used to accomplish a clean system shutdown cannot be used inside a jail. The best way to shut down a jail is to run the following command from within the jail itself or using the [jexec(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jexec&section=8) utility from outside the jail:
15589
15590      
15591
15592     # sh /etc/rc.shutdown
15593
15594  More information about this can be found in the [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) manual page.
15595
15596 ----
15597
15598 ## Fine Tuning and Administration 
15599
15600  There are several options which can be set for any jail, and various ways of combining a host DragonFly system with jails, to produce higher level applications. This section presents some of the options available for tuning the behavior and security restrictions implemented by a jail installation.
15601
15602 ## System tools for jail tuning in DragonFly 
15603
15604  Fine tuning of a jail's configuration is mostly done by setting [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8) variables. A special subtree of sysctl exists as a basis for organizing all the relevant options: the ***securityjail**** hierarchy of DragonFly kernel options. Here is a list of the main jail-related sysctls, complete with their default value. Names should be self-explanatory, but for more information about them, please refer to the [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) and [sysctl(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sysctl&section=8) manual pages.
15605
15606 * jail.set_hostname_allowed: 1
15607
15608 * jail.socket_unixiproute_only: 1
15609
15610 * jail.sysvipc_allowed: 0
15611
15612 * jail.enforce_statfs: 2
15613
15614 * jail.allow_raw_sockets: 0
15615
15616 * jail.chflags_allowed: 0
15617
15618 * jail.jailed: 0
15619
15620 These variables can be used by the system administrator of the host system to add or remove some of the limitations imposed by default on the root user. Note that there are some limitations which cannot be removed. The root user is not allowed to mount or unmount file systems from within a [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8). The root inside a jail may not set firewall rules or do many other administrative tasks which require modifications of in-kernel data, such as setting the securelevel of the kernel.
15621
15622 ***
15623
15624  The base system of DragonFly contains a basic set of tools for viewing information about the active jails, and attaching to a jail to run administrative commands. The [jls(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jls&section=8) and [jexec(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jexec&section=8) commands are part of the base DragonFly system, and can be used to perform the following simple tasks:
15625
15626  * Print a list of active jails and their corresponding jail identifier (JID), IP address, hostname and path.
15627
15628  * Attach to a running jail, from its host system, and run a command inside the jail or perform administrative tasks inside the jail itself. This is especially useful when the root user wants to cleanly shut down a jail. The [jexec(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jexec&section=8) utility can also be used to start a shell in a jail to do administration in it; for example:
15629
15630        
15631
15632           # jexec 1 tcsh
15633
15634 ***This Page is under constructions. New software are being added regularly.***
15635 **Follow the links below to see how to make corresponding software work on DragonFly**
15636
15637 [[!toc levels=3 ]]
15638
15639 ## Servers
15640 [[SSHserver]]
15641
15642 [FTP Server](http://www.dragonflybsd.org/docs/newhandbook/FTP/)
15643
15644 ## Installing flash player on firefox.
15645
15646 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
15647
15648 ### Configure Linux Support
15649
15650     # echo "linux_load=yes" >> /boot/loader.conf
15651     # echo "linux_enable=yes" >> /etc/rc.conf
15652     # echo "proc  /compat/linux/proc  linprocfs  rw  0  0" >> /etc/fstab
15653
15654 **Reboot DragonFly** ( not necessarry but easier for new users )  so that Linux Emulation is loaded to the kernel and configured correctly.
15655
15656 ### Install multimedia/libflashsupport from pkgsrc. 
15657
15658     # cd /usr/pkgsrc/multimedia/libflashsupport
15659     # bmake package
15660
15661 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.
15662
15663     # pkg_info |grep suse
15664     suse_openssl-10.0nb5 Linux compatibility package for OpenSSL
15665     suse_gtk2-10.0nb4   Linux compatibility package for GTK+-2.x
15666     suse_gtk-10.0nb2    Linux compatibility package for GTK+-1.x
15667     suse_libjpeg-10.0nb2 Linux compatibility package for JPEG
15668     suse_base-10.0nb5   Linux compatibility package
15669     suse_slang-10.0nb3  Linux compatibility package for S-Lang
15670     suse_locale-10.0nb2 Linux compatibility package with locale files
15671     suse_fontconfig-10.0nb6 Linux compatibility package for fontconfig
15672     suse_libtiff-10.0nb4 Linux compatibility package for TIFF
15673     suse_openmotif-10.0nb2 Linux compatibility package for OpenMotif
15674     suse_libpng-10.0nb4 Linux compatibility package for PNG
15675     suse_libcups-10.0nb4 Linux compatibility package for CUPS
15676     suse_gdk-pixbuf-10.0nb3 Linux compatibility package for gdk-pixbuf
15677     suse_expat-10.0nb2  Linux compatibility package for expat
15678     suse_vmware-10.0nb2 Linux compatibility package to help run VMware
15679     suse_libxml2-10.0nb2 Linux compatibility package for libxml2
15680     suse_compat-10.0nb3 Linux compatibility package with old shared libraries
15681     suse_x11-10.0nb4    Linux compatibility package for X11
15682     suse_glx-10.0nb4    Linux compatibility package for OpenGL/Mesa
15683     suse_freetype2-10.0nb5 Linux compatibility package for freetype-2.x
15684     suse_aspell-10.0nb2 Linux compatibility package for aspell
15685     suse-10.0nb4        SUSE-based Linux binary emulation environment
15686
15687 ### Install www/nspluginwrapper 
15688
15689 This will allow DragonFly to use the Linux Binary Flash Plugin
15690
15691     # cd /usr/pkgsrc/www/nspluginwrapper
15692     # bmake package
15693
15694 ### Install multimedia/ns-flash
15695
15696 This is the Linux Flash Plugin itself.
15697
15698     # cd /usr/pkgsrc/multimedia/ns-flash
15699     # bmake NO_CHECKSUM=yes package
15700
15701 You can check if the Flash plugin is installed right by.
15702
15703     # /usr/pkg/bin/nspluginwrapper --list
15704     /usr/pkg/lib/netscape/plugins/npwrapper.libflashplayer.so
15705       Original plugin: /usr/pkg/lib/netscape/plugins/libflashplayer.so
15706       Wrapper version string: 1.2.2
15707     /usr/pkg/lib/netscape/plugins/npwrapper.libflashplayer.so
15708       Original plugin: /usr/pkg/lib/netscape/plugins/libflashplayer.so
15709       Wrapper version string: 1.2.2
15710
15711 Don't worry if it is listed twice as above.
15712
15713 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).
15714
15715 You can watch Streaming Flash now.
15716
15717 ## Chapter 18 Serial Communications 
15718 [[!toc  levels=3]]
15719
15720 ***Reorganized, and parts rewritten by Ivailo Mladenov. ***
15721
15722 ## Synopsis 
15723
15724 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.
15725
15726 After reading this chapter, you will know:
15727
15728 * How to connect terminals to your DragonFly system.
15729
15730 * How to use a modem to dial out to remote hosts.
15731
15732 * How to allow remote users to login to your system with a modem.
15733
15734 * How to boot your system from a serial console.
15735
15736 Before reading this chapter, you should:
15737
15738 * Know how to configure and install a new kernel ([kernelconfig.html Chapter 10]).
15739
15740 * Understand UNIX permissions and processes ([basics.html Chapter 3]).
15741
15742 * Have access to the technical manual for the serial hardware (modem or multi-port card) that you would like to use with DragonFly.
15743
15744 ***
15745
15746 ## 18.1 Introduction 
15747
15748 ### 18.1.1 Terminology 
15749
15750 bps:: Bits per Second -- the rate at which data is transmitted;
15751
15752 DTE:: Data Terminal Equipment -- for example, your computer;
15753
15754 DCE:: Data Communications Equipment -- your modem;
15755
15756 RS-232:: EIA standard for hardware serial communications.
15757
15758 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).
15759
15760 ### 18.1.2 Cables and Ports 
15761
15762 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.
15763
15764 #### 18.1.2.1 Cables 
15765
15766 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.
15767
15768 ##### 18.1.2.1.1 Null-modem Cables 
15769
15770 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.
15771
15772 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.
15773
15774 [[!table  data="""
15775 | Signal | Pin # |  | Pin # | Signal 
15776  SG | 7 | connects to | 7 | SG 
15777  TxD | 2 | connects to | 3 | RxD 
15778  RxD | 3 | connects to | 2 | TxD 
15779  RTS | 4 | connects to | 5 | CTS 
15780  CTS | 5 | connects to | 4 | RTS 
15781  DTR | 20 | connects to | 6 | DSR 
15782  DCD | 8 |  | 6 | DSR 
15783  DSR | 6 | connects to | 20 | DTR |
15784
15785 """]]
15786
15787  **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.
15788
15789 ##### 18.1.2.1.2 Standard RS-232C Cables 
15790
15791 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.
15792
15793 #### 18.1.2.2 Ports 
15794
15795 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.
15796
15797 ##### 18.1.2.2.1 Kinds of Ports 
15798
15799 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.
15800
15801 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.
15802
15803 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.
15804
15805 ##### 18.1.2.2.2 Port Names 
15806
15807 In DragonFly, you access each serial port through an entry in the `/dev` directory. There are two different kinds of entries:
15808
15809 * 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.
15810
15811 * 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.
15812
15813 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.
15814
15815 ### 18.1.3 Kernel Configuration 
15816
15817 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.
15818
15819 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`.
15820
15821  **Tip:** To view just the messages that have the word `sio`, use the command:
15822
15823     
15824
15825     # /sbin/dmesg | grep 'sio'
15826
15827 For example, on a system with four serial ports, these are the serial-port specific kernel boot messages:
15828
15829     
15830
15831     sio0 at 0x3f8-0x3ff irq 4 on isa
15832
15833     sio0: type 16550A
15834
15835     sio1 at 0x2f8-0x2ff irq 3 on isa
15836
15837     sio1: type 16550A
15838
15839     sio2 at 0x3e8-0x3ef irq 5 on isa
15840
15841     sio2: type 16550A
15842
15843     sio3 at 0x2e8-0x2ef irq 9 on isa
15844
15845     sio3: type 16550A
15846
15847 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].
15848
15849 The relevant device lines for your kernel configuration file would look like this:
15850
15851     
15852
15853     device              sio0    at isa? port IO_COM1 irq 4
15854
15855     device              sio1    at isa? port IO_COM2 irq 3
15856
15857     device              sio2    at isa? port IO_COM3 irq 5
15858
15859     device              sio3    at isa? port IO_COM4 irq 9
15860
15861  **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).
15862
15863 ### 18.1.4 Device Special Files 
15864
15865 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.
15866
15867 ### 18.1.5 Serial Port Configuration 
15868
15869 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
15870
15871     
15872
15873     # stty -a -f /dev/ttyd1
15874
15875 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:
15876
15877     
15878
15879     # stty -f /dev/ttyid5 clocal cs8 ixon ixoff
15880
15881 System-wide initialization of the serial devices is controlled in `/etc/rc.serial`. This file affects the default settings of serial devices.
15882
15883 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:
15884
15885     
15886
15887     # stty -f /dev/ttyld5 57600
15888
15889 Now, an application that opens `ttyd5` and tries to change the speed of the port will be stuck with 57600 bps.
15890
15891 Naturally, you should make the initial state and lock state devices writable only by the `root` account.
15892
15893 ***
15894
15895 ## 18.2 Terminals 
15896
15897 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.
15898
15899 ### 18.2.1 Uses and Types of Terminals 
15900
15901 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.
15902
15903 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.
15904
15905 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.
15906
15907 For DragonFly, there are three kinds of terminals:
15908
15909 * [ Dumb terminals](term.html#TERM-DUMB)
15910
15911 * [ PCs acting as terminals](term.html#TERM-PCS)
15912
15913 * [ X terminals](term.html#TERM-X)
15914
15915 #### 18.2.1.1 Dumb Terminals 
15916
15917 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.
15918
15919 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.
15920
15921 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.
15922
15923 #### 18.2.1.2 PCs Acting as Terminals 
15924
15925 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.
15926
15927 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.
15928
15929 #### 18.2.1.3 X Terminals 
15930
15931 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.
15932
15933 We introduce X terminals just for the sake of completeness. However, this chapter does ***not*** cover setup, configuration, or use of X terminals.
15934
15935 ### 18.2.2 Configuration 
15936
15937 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.
15938
15939 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.
15940
15941 Thus, to configure terminals for your DragonFly system the following steps should be taken as `root`:
15942
15943   1. Add a line to `/etc/ttys` for the entry in the `/dev` directory for the serial port if it is not already there.
15944
15945   1. Specify that `/usr/libexec/getty` be run on the port, and specify the appropriate `***getty***` type from the `/etc/gettytab` file.
15946
15947   1. Specify the default terminal type.
15948
15949   1. Set the port to ***on.***
15950
15951   1. Specify whether the port should be ***secure.***
15952
15953   1. Force `init` to reread the `/etc/ttys` file.
15954
15955 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.
15956
15957 #### 18.2.2.1 Adding an Entry to `/etc/ttys` 
15958
15959 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`).
15960
15961 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.
15962
15963  **Example 17-1. Adding Terminal Entries to `/etc/ttys`** 
15964
15965 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:
15966
15967     
15968
15969     ttyd1./imagelib/callouts/1.png  "/usr/libexec/getty std.38400"./imagelib/callouts/2.png  wy50./imagelib/callouts/3.png  on./imagelib/callouts/4.png  insecure./imagelib/callouts/5.png
15970
15971     ttyd5   "/usr/libexec/getty std.19200"  vt100  on  insecure
15972
15973     
15974
15975 [ ./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.
15976
15977 #### 18.2.2.2 Force `init` to Reread `/etc/ttys` 
15978
15979 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:
15980
15981     
15982
15983     # kill -HUP 1
15984
15985  **Note:** `init` is always the first process run on a system, therefore it will always have PID 1.
15986
15987 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.
15988
15989 ### 18.2.3 Troubleshooting Your Connection 
15990
15991 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.
15992
15993 #### 18.2.3.1 No Login Prompt Appears 
15994
15995 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.
15996
15997 Make sure the cable is connected firmly to both the terminal and the DragonFly computer. Make sure it is the right kind of cable.
15998
15999 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.
16000
16001 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:
16002
16003     
16004
16005     # ps -axww|grep getty
16006
16007 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`:
16008
16009     
16010
16011     22189  d1  Is+    0:00.03 /usr/libexec/getty std.38400 ttyd1
16012
16013 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.
16014
16015 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.
16016
16017 #### 18.2.3.2 If Garbage Appears Instead of a Login Prompt 
16018
16019 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`.
16020
16021 #### 18.2.3.3 Characters Appear Doubled, the Password Appears When Typed 
16022
16023 Switch the terminal (or the terminal emulation software) from ***half duplex*** or ***local echo*** to ***full duplex.***
16024
16025 ***
16026
16027 ## 18.3 Dial-in Service 
16028
16029 Configuring your DragonFly system for dial-in service is very similar to connecting terminals except that you are dealing with modems instead of terminals.
16030
16031 ### 18.3.1 External vs. Internal Modems 
16032
16033 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.
16034
16035 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.
16036
16037 #### 18.3.1.1 Modems and Cables 
16038
16039 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:
16040
16041 * Transmitted Data (SD)
16042
16043 * Received Data (RD)
16044
16045 * Request to Send (RTS)
16046
16047 * Clear to Send (CTS)
16048
16049 * Data Set Ready (DSR)
16050
16051 * Data Terminal Ready (DTR)
16052
16053 * Carrier Detect (CD)
16054
16055 * Signal Ground (SG)
16056
16057 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.
16058
16059 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.
16060
16061 ### 18.3.2 Serial Interface Considerations 
16062
16063 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.
16064
16065 ### 18.3.3 Quick Overview 
16066
16067 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:
16068
16069     
16070
16071      4850 ??  I      0:00.09 /usr/libexec/getty V19200 ttyd0
16072
16073 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.
16074
16075 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.
16076
16077 ### 18.3.4 Configuration Files 
16078
16079 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.
16080
16081 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.
16082
16083 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.
16084
16085 This section will try to give balanced configuration information, but is biased towards having the modem's data rate follow the connection rate.
16086
16087 #### 18.3.4.1 `/etc/gettytab` 
16088
16089 `/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.
16090
16091 ##### 18.3.4.1.1 Locked-speed Config 
16092
16093 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`.
16094
16095 ##### 18.3.4.1.2 Matching-speed Config 
16096
16097 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.
16098
16099     
16100
16101     #
16102
16103     # Fast dialup terminals, 2400/1200/300 rotary (can start either way)
16104
16105     #
16106
16107     D2400|d2400|Fast-Dial-2400:\
16108
16109             :nx#D1200:tc2400-baud:
16110
16111     3|D1200|Fast-Dial-1200:\
16112
16113             :nx#D300:tc1200-baud:
16114
16115     5|D300|Fast-Dial-300:\
16116
16117             :nx#D2400:tc300-baud:
16118
16119 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:
16120
16121     
16122
16123     #
16124
16125     # Additions for a V.32bis Modem
16126
16127     #
16128
16129     um|V300|High Speed Modem at 300,8-bit:\
16130
16131             :nx#V19200:tcstd.300:
16132
16133     un|V1200|High Speed Modem at 1200,8-bit:\
16134
16135             :nx#V300:tcstd.1200:
16136
16137     uo|V2400|High Speed Modem at 2400,8-bit:\
16138
16139             :nx#V1200:tcstd.2400:
16140
16141     up|V9600|High Speed Modem at 9600,8-bit:\
16142
16143             :nx#V2400:tcstd.9600:
16144
16145     uq|V19200|High Speed Modem at 19200,8-bit:\
16146
16147             :nx#V9600:tcstd.19200:
16148
16149 This will result in 8-bit, no parity connections.
16150
16151 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.
16152
16153 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:
16154
16155     
16156
16157     #
16158
16159     # Additions for a V.32bis or V.34 Modem
16160
16161     # Starting at 57.6 Kbps
16162
16163     #
16164
16165     vm|VH300|Very High Speed Modem at 300,8-bit:\
16166
16167             :nx#VH57600:tcstd.300:
16168
16169     vn|VH1200|Very High Speed Modem at 1200,8-bit:\
16170
16171             :nx#VH300:tcstd.1200:
16172
16173     vo|VH2400|Very High Speed Modem at 2400,8-bit:\
16174
16175             :nx#VH1200:tcstd.2400:
16176
16177     vp|VH9600|Very High Speed Modem at 9600,8-bit:\
16178
16179             :nx#VH2400:tcstd.9600:
16180
16181     vq|VH57600|Very High Speed Modem at 57600,8-bit:\
16182
16183             :nx#VH9600:tcstd.57600:
16184
16185 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.
16186
16187 #### 18.3.4.2 `/etc/ttys` 
16188
16189 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:
16190
16191     
16192
16193     ttyd0   "/usr/libexec/getty `***xxx***`"   dialup on
16194
16195 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).
16196
16197 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.
16198
16199 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
16200
16201     
16202
16203     # kill -HUP 1
16204
16205  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`.
16206
16207 ##### 18.3.4.2.1 Locked-speed Config 
16208
16209 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:
16210
16211     
16212
16213     ttyd0   "/usr/libexec/getty std.19200"   dialup on
16214
16215 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`.
16216
16217 ##### 18.3.4.2.2 Matching-speed Config 
16218
16219 In a matching-speed configuration, your `ttys` entry needs to reference the appropriate beginning ***auto-baud*** (sic) entry in `/etc/gettytab`. For example, if you added the above suggested entry for a matching-speed modem that starts at 19.2 Kbps (the `gettytab` entry containing the `V19200` starting point), your `ttys` entry might look like this:
16220
16221     
16222
16223     ttyd0   "/usr/libexec/getty V19200"   dialup on
16224
16225 #### 18.3.4.3 `/etc/rc.serial` 
16226
16227 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.
16228
16229 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`:
16230
16231     
16232
16233     # Serial port initial configuration
16234
16235     stty -f /dev/ttyid1 crtscts
16236
16237     stty -f /dev/cuaia1 crtscts
16238
16239 ### 18.3.5 Modem Settings 
16240
16241 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:
16242
16243 * CD asserted when connected
16244
16245 * DTR asserted for operation; dropping DTR hangs up line and resets modem
16246
16247 * CTS transmitted data flow control
16248
16249 * Disable XON/XOFF flow control
16250
16251 * RTS received data flow control
16252
16253 * Quiet mode (no result codes)
16254
16255 * No command echo
16256
16257 Please read the documentation for your modem to find out what commands and/or DIP switch settings you need to give it.
16258
16259 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:
16260
16261     
16262
16263     ATZ
16264
16265     AT&amp;C1&amp;D2&amp;H1&amp;I0&amp;R2&amp;W
16266
16267 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.
16268
16269 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:
16270
16271 * Switch 1: UP -- DTR Normal
16272
16273 * Switch 2: N/A (Verbal Result Codes/Numeric Result Codes)
16274
16275 * Switch 3: UP -- Suppress Result Codes
16276
16277 * Switch 4: DOWN -- No echo, offline commands
16278
16279 * Switch 5: UP -- Auto Answer
16280
16281 * Switch 6: UP -- Carrier Detect Normal
16282
16283 * Switch 7: UP -- Load NVRAM Defaults
16284
16285 * Switch 8: N/A (Smart Mode/Dumb Mode)
16286
16287 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.
16288
16289 #### 18.3.5.1 Locked-speed Config 
16290
16291 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:
16292
16293     
16294
16295     ATZ
16296
16297     AT&amp;B1&amp;W
16298
16299 #### 18.3.5.2 Matching-speed Config 
16300
16301 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:
16302     
16303
16304     ATZ
16305
16306     AT&amp;B2&amp;W
16307
16308 #### 18.3.5.3 Checking the Modem's Configuration 
16309
16310 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`.
16311
16312 If you have a different brand of modem, check your modem's manual to see how to double-check your modem's configuration parameters.
16313
16314 ### 18.3.6 Troubleshooting 
16315
16316 Here are a few steps you can follow to check out the dial-up modem on your system.
16317
16318 #### 18.3.6.1 Checking Out the DragonFly System 
16319
16320 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.
16321
16322 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:
16323
16324     
16325
16326       114 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd0
16327
16328       115 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd1
16329
16330 If you see something different, like this:
16331
16332     
16333
16334       114 d0  I      0:00.10 /usr/libexec/getty V19200 ttyd0
16335
16336 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.
16337
16338 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.
16339
16340 #### 18.3.6.2 Try Dialing In 
16341
16342 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).
16343
16344 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).
16345
16346 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.
16347
16348 ***
16349 ## 18.4 Dial-out Service 
16350
16351 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.
16352
16353 This is useful to log onto a BBS.
16354
16355 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.
16356
16357 ### 18.4.1 My Stock Hayes Modem Is Not Supported, What Can I Do? 
16358
16359 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.
16360
16361 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`).
16362
16363 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`.
16364
16365  **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.
16366
16367 Edit the line `#define HAYES 0` to `#define HAYES 1`. Then `make` and `make install`. Everything works nicely after that.
16368
16369 ### 18.4.2 How Am I Expected to Enter These AT Commands? 
16370
16371 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:
16372
16373     
16374
16375     cuaa0:dv#/dev/cuaa0:br#19200:panone
16376
16377 Use the highest bps rate your modem supports in the br capability. Then, type `tip cuaa0` and you will be connected to your modem.
16378
16379 Or use `cu` as `root` with the following command:
16380
16381     
16382
16383     # cu -l`***line***` -s`***speed***`
16384
16385 `***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.
16386
16387 ### 18.4.3 The `@` Sign for the pn Capability Does Not Work! 
16388
16389 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:
16390
16391     
16392
16393     pn=\@
16394
16395 ### 18.4.4 How Can I Dial a Phone Number on the Command Line? 
16396
16397 Put what is called a ***generic*** entry in your `/etc/remote` file. For example:
16398
16399     
16400
16401     tip115200|Dial any phone number at 115200 bps:\
16402
16403             :dv#/dev/cuaa0:br#115200:athayes:pa=none:du:
16404
16405     tip57600|Dial any phone number at 57600 bps:\
16406
16407             :dv#/dev/cuaa0:br#57600:athayes:pa=none:du:
16408
16409 Then you can do things like:
16410
16411     
16412
16413     # tip -115200 5551234
16414
16415 If you prefer `cu` over `tip`, use a generic `cu` entry:
16416
16417     
16418
16419     cu115200|Use cu to dial any number at 115200bps:\
16420
16421             :dv#/dev/cuaa1:br#57600:athayes:pa=none:du:
16422
16423 and type:
16424
16425     
16426
16427     # cu 5551234 -s 115200
16428
16429 ### 18.4.5 Do I Have to Type in the bps Rate Every Time I Do That? 
16430
16431 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.
16432
16433 ### 18.4.6 I Access a Number of Hosts Through a Terminal Server 
16434
16435 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`:
16436
16437     
16438
16439     pain|pain.deep13.com|Forrester's machine:\
16440
16441             :cm#CONNECT pain\n:tcdeep13:
16442
16443     muffin|muffin.deep13.com|Frank's machine:\
16444
16445             :cm#CONNECT muffin\n:tcdeep13:
16446
16447     deep13:Gizmonics Institute terminal server:\
16448
16449             :dv#/dev/cuaa2:br#38400:athayes:du:pa=none:pn=5551234:
16450
16451 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.
16452
16453 ### 18.4.7 Can Tip Try More Than One Line for Each Site? 
16454
16455 This is often a problem where a university has several modem lines and several thousand students trying to use them.
16456
16457 Make an entry for your university in `/etc/remote` and use `@` for the `pn` capability:
16458
16459     
16460
16461     big-university:\
16462
16463             :pn#\@:tcdialout
16464
16465     dialout:\
16466
16467             :dv#/dev/cuaa3:br#9600:atcourier:du:pa=none:
16468
16469 Then, list the phone numbers for the university in `/etc/phones`:
16470
16471     
16472
16473     big-university 5551111
16474
16475     big-university 5551112
16476
16477     big-university 5551113
16478
16479     big-university 5551114
16480
16481 `tip` will try each one in the listed order, then give up. If you want to keep retrying, run `tip` in a while loop.
16482
16483 ### 18.4.8 Why Do I Have to Hit  **Ctrl** + **P**  Twice to Send  **Ctrl** + **P**  Once? 
16484
16485  **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.***
16486
16487 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.
16488
16489 You can have the force character be whatever you want by specifying the following in your `$HOME/.tiprc` file:
16490
16491     
16492
16493     force=&lt;single-char&gt;
16494
16495 ### 18.4.9 Suddenly Everything I Type Is in Upper Case?? 
16496
16497 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.
16498
16499 Here is a sample .tiprc file perfect for  **Emacs**  users who need to type  **Ctrl** + **2**  and  **Ctrl** + **A**  a lot:
16500
16501     
16502
16503     force=^^
16504
16505     raisechar=^^
16506
16507 The ^^ is  **Shift** + **Ctrl** + **6** .
16508
16509 ### 18.4.10 How Can I Do File Transfers with `tip`? 
16510
16511 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:
16512
16513 `~p` local-file [remote-file]
16514
16515 `~t` remote-file [local-file]
16516
16517 There is no error checking, so you probably should use another protocol, like zmodem.
16518
16519 ### 18.4.11 How Can I Run zmodem with `tip`? 
16520
16521 To receive files, start the sending program on the remote end. Then, type `~C rz` to begin receiving them locally.
16522
16523 To send files, start the receiving program on the remote end. Then, type `~C sz `***files****** to send them to the remote system.
16524
16525 ***
16526
16527 ## 18.5 Setting Up the Serial Console 
16528
16529 ### 18.5.1 Introduction 
16530
16531 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.
16532
16533 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.
16534
16535 In order to set up the serial console you must configure the boot block code, the boot loader code and the kernel.
16536
16537 ### 18.5.2 Serial Console Configuration, Terse Version 
16538
16539 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].
16540
16541   1. Connect the serial port. The serial console will be on COM1.
16542
16543   1. `echo -h &gt; /boot.config` to enable the serial console for the boot loader and kernel.
16544
16545   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.
16546
16547   1. `shutdown -r now` will reboot the system with the serial console.
16548
16549 ### 18.5.3 Serial Console Configuration 
16550
16551   1. Prepare a serial cable.
16552
16553   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.
16554
16555   1. Unplug your keyboard.
16556
16557   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.
16558
16559   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.)
16560
16561   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.
16562
16563    **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.
16564
16565    **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.
16566
16567   1. Plug a dumb terminal into `COM1` (`sio0`).
16568
16569   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.)
16570
16571   1. Make sure the configuration file of your kernel has appropriate flags set for `COM1` (`sio0`).
16572
16573   Relevant flags are:
16574
16575   `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.
16576
16577   Example:
16578
16579       
16580
16581       device sio0 at isa? port IO_COM1 flags 0x10 irq 4
16582
16583   
16584
16585   See the [sio(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#sio&section4) manual page for more details.
16586
16587   If the flags were not set, you need to run UserConfig (on a different console) or recompile the kernel.
16588
16589   1. Create `boot.config` in the root directory of the `a` partition on the boot drive.
16590
16591   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:
16592
16593   `-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.
16594
16595    **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.
16596
16597   Use either the `-P` option to select the console automatically, or the `-h` option to activate the serial console.
16598
16599   You may include other options described in [boot(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#boot&section8) as well.
16600
16601   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.
16602
16603   1. Boot the machine.
16604
16605   When you start your DragonFly box, the boot blocks will echo the contents of `/boot.config` to the console. For example:
16606
16607       
16608
16609       /boot.config: -P
16610
16611       Keyboard: no
16612
16613   
16614
16615   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`.
16616
16617   || Options || Message goes to ||
16618
16619   || none || internal console ||
16620
16621   || `-h` || serial console ||
16622
16623   || `-D` || serial and internal consoles ||
16624
16625   || `-Dh` || serial and internal consoles ||
16626
16627   || `-P`, keyboard present || internal console ||
16628
16629   || `-P`, keyboard absent || serial console ||
16630
16631   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.
16632
16633   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:
16634
16635       
16636
16637       &gt;&gt; DragonFly/i386 BOOT
16638
16639       Default: 0:ad(0,a)/boot/loader
16640
16641       boot:
16642
16643   
16644
16645   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.
16646
16647   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.
16648
16649 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].
16650
16651 ### 18.5.4 Summary 
16652
16653 Here is the summary of various settings discussed in this section and the console eventually selected.
16654
16655 #### 18.5.4.1 Case 1: You Set the Flags to 0x10 for `sio0` 
16656
16657     
16658
16659     device sio0 at isa? port IO_COM1 flags 0x10 irq 4
16660
16661 [[!table  data="""
16662 | Options in /boot.config | Console during boot blocks | Console during boot loader | Console in kernel 
16663  nothing | internal | internal | internal 
16664  `-h` | serial | serial | serial 
16665  `-D` | serial and internal | internal | internal 
16666  `-Dh` | serial and internal | serial | serial 
16667  `-P`, keyboard present | internal | internal | internal 
16668  `-P`, keyboard absent | serial and internal | serial | serial |
16669
16670 """]]
16671
16672 #### 18.5.4.2 Case 2: You Set the Flags to 0x30 for sio0 
16673
16674     
16675
16676     device sio0 at isa? port IO_COM1 flags 0x30 irq 4
16677
16678 [[!table  data="""
16679 | Options in /boot.config | Console during boot blocks | Console during boot loader | Console in kernel 
16680  nothing | internal | internal | serial 
16681  `-h` | serial | serial | serial 
16682  `-D` | serial and internal | internal | serial 
16683  `-Dh` | serial and internal | serial | serial 
16684  `-P`, keyboard present | internal | internal | serial 
16685  `-P`, keyboard absent | serial and internal | serial | serial |
16686
16687 """]]
16688
16689 ### 18.5.5 Tips for the Serial Console 
16690
16691 #### 18.5.5.1 Setting a Faster Serial Port Speed 
16692
16693 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:
16694
16695     
16696
16697     BOOT_COMCONSOLE_SPEED=19200
16698
16699 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:
16700
16701     
16702
16703     options CONSPEED=19200
16704
16705 #### 18.5.5.2 Using Serial Port Other Than `sio0` for the Console 
16706
16707 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.
16708
16709   1. Get the kernel source.
16710
16711   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.
16712
16713   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:
16714
16715       
16716
16717       device sio1 at isa? port IO_COM2 flags 0x10 irq 3
16718
16719   
16720
16721   or
16722
16723       
16724
16725       device sio1 at isa? port IO_COM2 flags 0x30 irq 3
16726
16727   
16728
16729   The console flags for the other serial ports should not be set.
16730
16731   1. Recompile and install the boot blocks and the boot loader:
16732
16733       
16734
16735       # cd /sys/boot
16736
16737       # make
16738
16739       # make install
16740
16741   
16742
16743   1. Rebuild and install the kernel.
16744
16745   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.
16746
16747 #### 18.5.5.3 Entering the DDB Debugger from the Serial Line 
16748
16749 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:
16750
16751     
16752
16753     options BREAK_TO_DEBUGGER
16754
16755     options DDB
16756
16757 #### 18.5.5.4 Getting a Login Prompt on the Serial Console 
16758
16759 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.
16760
16761 Open the file `/etc/ttys` with an editor and locate the lines:
16762
16763     
16764
16765     ttyd0 "/usr/libexec/getty std.9600" unknown off secure
16766
16767     ttyd1 "/usr/libexec/getty std.9600" unknown off secure
16768
16769     ttyd2 "/usr/libexec/getty std.9600" unknown off secure
16770
16771     ttyd3 "/usr/libexec/getty std.9600" unknown off secure
16772
16773 `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`.
16774
16775 You may also want to change the terminal type from `unknown` to the actual type of your serial terminal.
16776
16777 After editing the file, you must `kill -HUP 1` to make this change take effect.
16778
16779 ### 18.5.6 Changing Console from the Boot Loader 
16780
16781 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.
16782
16783 #### 18.5.6.1 Setting Up the Serial Console 
16784
16785 You can easily specify the boot loader and the kernel to use the serial console by writing just one line in `/boot/loader.rc`:
16786
16787     
16788
16789     set console=comconsole
16790
16791 This will take effect regardless of the settings in the boot block discussed in the previous section.
16792
16793 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.
16794
16795 Likewise, you can specify the internal console as:
16796
16797     
16798
16799     set console=vidconsole
16800
16801 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.
16802
16803 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:
16804
16805     
16806
16807     include /boot/loader.4th
16808
16809     start
16810
16811 Then, create `/boot/loader.conf.local` and put the following line there.
16812
16813     
16814
16815     console=comconsole
16816
16817 or
16818
16819     
16820
16821     console=vidconsole
16822
16823  **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.
16824
16825 #### 18.5.6.2 Using a Serial Port Other Than `sio0` for the Console 
16826
16827 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].
16828
16829 ### 18.5.7 Caveats 
16830
16831 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.***
16832