No commit message specified.
[ikiwiki.git] / nmatavka / index.mdwn
1
2 ## Disk Slices, Partitions and local UNIX file systems 
3
4 Here we describe how disks are subdivided.
5
6 <!-- XXX: mention serno stuff -->
7
8 ### Slices 
9
10 A disk can be subdivided in slices.
11
12 Slices are named `s0`, `s1` and so on.
13
14 For example the disk `ad6` can contain the slice `ad6s3`.
15
16 DragonFly support two schemes for slices, MBR and GPT, either of them will manage all slices on a disk:
17
18 * 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.
19
20 * 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).
21
22 ### Partitions 
23
24 Partitions are contained in slices.
25
26 Partitions are named `a`, `b` and so on.
27
28 DragonFly support 16 partitions per slice, that is `a` through `p`.
29
30 For example the partition `ad6s3a` is contained in the slice `ad6s3`.
31
32 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):
33
34 * [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.
35
36 * [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.
37
38 ### Local UNIX file systems 
39
40 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.
41
42 DragonFly support two local UNIX file systems, UFS and HAMMER:
43
44 * 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.
45
46 * [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.
47
48 ### Typical disk layout 
49
50 From the above we see the following typical disk layout scenarios:
51
52 * 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.
53
54 * 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.
55
56 * 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).
57
58 ### HAMMER Note 
59
60 [HAMMER(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=HAMMER&amp;section5)
61
62 is a rather new file system, under active development.
63
64 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 .
65
66 All major features except the mirroring are quite well tested as-of the 2.2.1 release.
67
68 You should evaluate if HAMMER is suitable for your needs.
69 <!-- XXX: mention disk and memory requirements for efficient hammer use -->
70
71 Examples of ongoing development includes:
72
73 * 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).
74
75 * Multi master mirroring. For now only one mirror master is supported, but multiple mirror targets, called slaves, are already supported.
76
77 * Support for shrinking existing HAMMER file systems.  The HAMMER design is prepared for this, utility just have to be written to support it.
78 <!-- XXX: is this still accurate? Do we really want to mention it here? -->
79
80 ### HAMMER Features 
81
82 [HAMMER(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=HAMMER&amp;section5) has several advanced features not found in UFS:
83
84 * Large file systems:  Up to 1 million TB, also called 1 Exabyte is supported.
85
86 * 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.
87
88 * 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.
89
90 * 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.
91
92 * 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). 
93
94 * 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.
95
96 * 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.
97
98 More info on HAMMER can be found [here](http://www.dragonflybsd.org/hammer/index.html).
99
100 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.
101
102 <!-- XXX: mention swapcache, and also how to configure and use it (somewhere else, probably) -->
103
104 ### Adding a Disk 
105
106 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.
107
108 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 
109 [disklabel64(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel64&amp;section8).
110
111 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).
112
113 <!-- XXX: mention that disklabel64 is default now -->
114     
115
116     # gpt -v create ad6
117
118     ...
119
120     # gpt add -s1 ad6
121
122     ad6s0
123
124     # gpt add ad6
125
126     ad6s1
127
128     # gpt show ad6
129
130     ...
131
132 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.
133
134     
135
136     # disklabel64 -rw ad6s1 auto
137
138     # disklabel64 -e ad6s1          # edit label to add partitions as needed
139
140 ### disklabel 
141 <!-- XXX: what is all this fuzz about dangerously dedicated? -->
142
143 For [disklabel(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel&amp;section8) labels some partitions have certain conventions associated with them.
144
145 [[!table  data="""
146 <tablestyle="width:100%"> Partition | Convention 
147 <tablestyle="width:100%"> `a` | Normally contains the root file system 
148  `b` | Normally contains swap space 
149  `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.
150  `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`. |
151
152 """]]
153
154 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.
155
156 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.
157
158 <!-- XXX: gpt allows for way more than 4 partitions... let's remove this stuff above -->
159
160 ***Dangerously dedicated*** physical drives are accessed as slice 0.
161
162 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.
163
164 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).
165
166 <!-- XXX: here would probably be the right place to talk about serno -->
167
168 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).
169
170 <!-- XXX: later talk also about devfs, definitely not here though. also, devfs rules -->
171
172 [Example 3-2](disk-organization.html#BASICS-CONCEPT-DISK-MODEL) shows a conceptual model of the disk layout that should help make things clearer.
173
174 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.
175
176 ***'Table 3-1. Disk Device Codes***'
177
178 [[!table  data="""
179 <tablestyle="width:100%"> Code | Meaning 
180 <tablestyle="width:100%"> `ad` | ATAPI (IDE) disk 
181  `da` | SCSI direct access disk 
182  `acd` | ATAPI (IDE) CDROM 
183  `cd` | SCSI CDROM 
184  `vn` | Virtual disk
185  `fd` | Floppy disk |
186
187 """]]
188
189 ***'Example 3-1. Sample Disk, Slice, and Partition Names***'
190
191 [[!table  data="""
192 <tablestyle="width:100%"> Name | Meaning 
193 <tablestyle="width:100%"> `ad0s1a` | The first partition (`a`) on the first slice (`s1`) on the first IDE disk (`ad0`). 
194  `da1s2e` | The fifth partition (`e`) on the second slice (`s2`) on the second SCSI disk (`da1`). |
195
196 """]]
197
198 ***'Example 3-2. Conceptual Model of a Disk***'
199
200 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.
201
202 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.
203
204 <!-- XXX: image -->
205
206 ## Mounting and Unmounting File Systems 
207
208 The file system is best visualized as a tree, rooted at `/`.
209
210 The directories, e.g. `/dev` and `/usr`, in the root directory are branches,
211
212 which may have their own branches, such as `/usr/local`, and so on.
213
214 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.
215
216 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.
217
218 ### The fstab File 
219
220 During the [boot process](boot.html), file systems listed in `/etc/fstab` are automatically mounted (unless they are listed with the `noauto` option).
221
222 The `/etc/fstab` file contains a list of lines of the following format:
223   
224
225     device       mount-point   fstype     options      dumpfreq     passno
226
227 These parameters have the following meaning:
228
229 * `device`: A device name (which should exist), as explained [here](disks-naming.html).
230
231 * `mount-point`: A directory (which should exist), on which to mount the file system.
232
233 * `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`.
234
235 * `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.
236
237 * `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.
238
239 * `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.
240
241 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.
242
243 ### The mount Command 
244
245 The [mount(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mount&section8) command is what is ultimately used to mount file systems.
246
247 In its most basic form, you use:
248
249     
250
251     # mount device mountpoint
252
253 Or, if `mountpoint` is specified in `/etc/fstab`, just:
254
255     
256
257     # mount mountpoint
258
259 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:
260
261  **Mount Options** 
262
263 * `-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.
264
265 * `-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.
266
267 * `-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.
268
269 * `-r`: Mount the file system read-only. This is identical to using the `rdonly` argument to the `-o` option.
270
271 * `-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.
272
273 * `-u`: Update mount options on the file system.
274
275 * `-v`: Be verbose.
276
277 * `-w`: Mount the file system read-write.
278
279 The `-o` option takes a comma-separated list of the options, including the following:
280
281 * `nodev:` Do not interpret special devices on the file system. This is a useful security option.
282
283 * `noexec`: Do not allow execution of binaries on this file system. This is also a useful security option.
284
285 * `nosuid`: Do not interpret setuid or setgid flags on the file system. This is also a useful security option.
286
287 ### The umount Command 
288
289 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.
290
291 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.
292
293 `-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.
294
295
296
297
298 ================
299 [[!toc  levels=6]]
300
301 # Chapter 1 Introduction 
302
303 ***Restructured, reorganized, and parts rewritten by Jim Mock. ***
304
305 ## Synopsis 
306
307 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.
308
309 After reading this chapter, you will know:
310
311 * how DragonFly relates to other computer operating systems;
312
313 * the history of the DragonFly Project;
314
315 * the goals of the DragonFly Project;
316
317 * the basics of the DragonFly open-source development model; and of course:
318
319 * where the name ***DragonFly*** comes from.
320
321 ----
322
323 ## Welcome to DragonFly! 
324
325 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.
326
327 ### What Can DragonFly Do? 
328
329 <!-- Cutout of "features". This is outdated bullshit -->
330
331 Work on BSD-flavor Unix systems running on PC compatible hardware started as a fork of the 4.4BSD-Lite release from Computer Systems Research Group (CSRG) at the University of California at Berkeley.  One of the variants that became quite popular became known later as FreeBSD.  DragonFly BSD started out as a fork and continuation of FreeBSD 4.8. 
332
333 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. 
334
335 As many of the commercial giants struggle to field PC operating systems with such features, performance and reliability, DragonFly can offer them ***now***!
336
337 For example the `Hammer` filesystem, the default in DragonFly BSD, is the most powerful and reliable filesystem available on any operating system.
338
339 The applications to which DragonFly can be put are truly limited only by your own imagination. From software development to factory automation, inventory control to azimuth correction of remote satellite antennae; if it can be done with a commercial UNIX product, it is more than likely that you can do it with DragonFly, too! DragonFly also benefits significantly from literally thousands of high-quality applications developed by research centres and universities around the world, often available at little to no cost. Commercial applications are also available and appearing in greater numbers every day.
340
341 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:
342
343 The robust TCP/IP networking built into DragonFly renders it an ideal platform for a variety of Internet services such as:
344
345 * FTP servers
346
347 * World Wide Web servers (standard or secure [SSL])
348
349 * Firewalls and NAT (***IP masquerading***) gateways
350
351 * Electronic Mail servers
352
353 * USENET News or Bulletin Board Systems
354
355 * And more...
356
357 With DragonFly, you can install on almost any PC, from older 32 bit computers running 386 or Pentium chips, to modern 64 bit Intel Core or AMD X64 desktop CPUs, and even up to and including high end Xeon CPUs.  All of these CPUs share a common ancestry and instruction set, going back to the original Intel 80386 CPU, the first fully 32-bit desktop CPU for "IBM PC compatible" computers.
358
359 Here are some of the fields where people are using Dragonfly BSD, and the reasons that they find that DragonFly BSD fits their needs:
360
361 * ***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!
362
363 * ***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.
364
365 * ***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.
366
367 * ***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.
368
369 * ***Software Development:*** The basic DragonFly system comes with a full complement of development tools including the renowned GNU C/C++ compiler and debugger.
370
371 DragonFly is available via anonymous FTP or GIT. Please see [Appendix A](mirrors.html) for more information about obtaining DragonFly.
372
373 For more help on installing, see the appropriate sections of this handbook.
374
375 ----
376
377 ## About the DragonFly Project 
378
379 The following section provides some background information on the project, including a brief history, project goals, and the development model of the project.
380
381 ### A Brief History of DragonFly 
382
383 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.
384
385 ### DragonFly Project Goals 
386
387 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.
388
389 ### The DragonFly Development Model 
390
391 ***Written by Justin Sherrill. ***
392
393 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.
394
395 Source for DragonFly is kept in [git](http://www.git.org/), available with each DragonFly install. The primary [git repository](http://gitweb.dragonflybsd.org/?p=dragonfly.git;a=summary) resides on a machine in California, USA. Documentation on obtaining the DragonFly source is available elsewhere in this book. The best way of getting changes made to the DragonFly source is to mail the [submit](http://www.dragonflybsd.org/mailinglists/) mailing list. Including desired source code changes (unified diff format is best) is the most useful format. A certain number of developers have access to commit changes to the DragonFly source, and can do so after review on that list. The DragonFly development model is loose; changes to the code are generally peer-reviewed and added when any objections have been corrected. There is no formal entry/rejection process, though final say on all code submissions goes to Matt Dillon, as originator of this project.
396
397 ### The Current DragonFly Release 
398
399 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.
400
401 ### DragonFly Origin 
402 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.
403
404 ## Updating the System 
405
406 ### Supported methods
407
408 The only **supported** method of upgrading DragonFly BSD is by building from source code. The supported upgrade process includes going from the *previous release* to *latest release*.
409
410 ### Getting the source code
411
412 There is a Makefile in /usr which will ease the task of retrieving the source tree; it needs to be run as root:
413
414     % cd /usr
415     % make src-create
416      [...]
417
418 This will check out (download) the source tree to `/usr/src` and switch to the master branch. For the stable branch, you need to check it out with the following command (remember to replace the *DragonFly_RELEASE_3_0* with the appropriate branch name for the release needed).
419
420     % cd /usr/src
421     % git checkout DragonFly_RELEASE_3_0
422
423 To see the available remote branches:
424
425     # cd /usr/src 
426     # git pull
427     # git branch -r
428
429 The leading edge (development trunk) version of the system will be the "master".
430
431 ### Build and upgrade process
432
433 The build process requires some time to build all the userland programs and the DragonFly BSD kernel. Once built, the next step is to install everything and make the upgrade target. No configuration files in */etc* are changed by this process. More details can be found in **[build(7)](http://leaf.dragonflybsd.org/cgi/web-man?command=build&section=ANY)** manpage. 
434
435     % cd /usr/src
436     % make buildworld
437     % make buildkernel
438     % make installkernel
439     % make installworld
440     % make upgrade
441     (reboot)
442
443 **Note:** You may use a concurrent build if you have a SMP (a machine with several cores or CPUs). You may specify *-j x* parameter to make where x is the number of CPUs + 1.  If you run DragonFly 2.12 or higher the kernel will auto-detect the number of CPUs your computer has and activate them all if possible. To find out how many CPUs your computer has:
444
445     % sysctl hw.ncpu
446     hw.ncpu: 2
447
448 An explanation of each step follows.
449
450 * <u>*make buildworld*</u> : This command builds all userland programs; it is the most time-consuming step of the process.  Some programs may be discarded from the build process.  For more information, see **[make.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=make.conf&section=ANY)** manpage. 
451
452 * <u>*make buildkernel*</u> : This builds the kernell by default, it uses the config file for your architecture. You may also specify a different kernel configuration file using `KERNCONF=<configfile>`. For more information, see **[make.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=make.conf&section=ANY)** manpage.
453
454 * <u>*make installkernel*</u> This installs the kernel using the config file for your architecture; again, `KERNCONF=<configfile>` can be used to specify which one to install.
455
456 * <u>*make installworld*</u> : This copies all the files built in the buildworld step (i.e. everything that is not the kernel) to their proper places in the file system.
457
458 * <u>*make upgrade*</u> : This cleans out any files made unnecessary by this upgrade.
459
460 * (reboot) : Reboot the computer to load the new kernel and use the new files installed as part of this process.
461
462 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.
463
464 Additional upgrading instructions can be found in */usr/src/UPDATING* in the source tree. They can also be found online, **[here](http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/master:/UPDATING)**
465
466 # DragonFly BSD Quick Start
467
468 This QuickStart is part of the [[NewHandbook|/docs/newhandbook/]].
469
470 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.
471
472
473 ## Some Unix and BSD Fundamentals
474
475 If you have used another Unix flavour, another BSD, or Linux before, you may need to spend some time learning the differences between DragonFly and the system you are experienced in.  If you have never used any flavor of Unix, BSD or otherwise, and have only used Windows before, please be prepared for a lengthy period of learning.
476
477 If you already know your way around a Unix filesystem, and already know what the `/etc` folder is, how to use `vi` or `vim` to edit a file, how to use a shell like `tcsh` or `bash`, how to configure that shell, or change what shell you're using, how `su` and `sudo` work, and what a `root` account is, the rest of this page may be enough to orient you to your surroundings.
478
479 You should understand everything in the [[Unix Basics|/docs/newhandbook/UnixBasics/]] section before you proceed with trying to use your new system.
480
481 ## Disk layout of a New Dragonfly BSD System using the HAMMER filesystem
482
483 If you chose to install on the HAMMER file system during installation you will be left with a system with the following disk configuration:
484
485     # df -h
486     Filesystem                Size   Used  Avail Capacity  Mounted on
487     ROOT                      288G    12G   276G     4%    /
488     devfs                     1.0K   1.0K     0B   100%    /dev
489     /dev/serno/9VMBWDM1.s1a   756M   138M   558M    20%    /boot
490     /pfs/@@-1:00001           288G    12G   276G     4%    /var
491     /pfs/@@-1:00002           288G    12G   276G     4%    /tmp
492     /pfs/@@-1:00003           288G    12G   276G     4%    /usr
493     /pfs/@@-1:00004           288G    12G   276G     4%    /home
494     /pfs/@@-1:00005           288G    12G   276G     4%    /usr/obj
495     /pfs/@@-1:00006           288G    12G   276G     4%    /var/crash
496     /pfs/@@-1:00007           288G    12G   276G     4%    /var/tmp
497     procfs                    4.0K   4.0K     0B   100%    /proc
498
499 In this example
500
501 * `/dev/serno/9VMBWDM1` is the hard disk specified with serial number,
502 * `/dev/serno/9VMBWDM1.s1` is the first slice on the hard disk.
503
504 The disk label looks as follows:
505
506     # disklabel /dev/serno/9VMBWDM1.s1
507
508     # /dev/serno/9VMBWDM1.s1:
509     #
510     # Informational fields calculated from the above
511     # All byte equivalent offsets must be aligned
512     #
513     # boot space:    1044992 bytes
514     # data space:  312567643 blocks # 305241.84 MB (320069266944 bytes)
515     #
516     # NOTE: If the partition data base looks odd it may be
517     #       physically aligned instead of slice-aligned
518     #
519     diskid: e67030af-d2af-11df-b588-01138fad54f5
520     label:
521     boot2 data base:      0x000000001000
522     partitions data base: 0x000000100200
523     partitions data stop: 0x004a85ad7000
524     backup label:         0x004a85ad7000
525     total size:           0x004a85ad8200    # 305242.84 MB
526     alignment: 4096
527     display block size: 1024        # for partition display only
528
529     16 partitions:
530     #          size     offset    fstype   fsuuid
531       a:     786432          0    4.2BSD    #     768.000MB
532       b:    8388608     786432      swap    #    8192.000MB
533       d:  303392600    9175040    HAMMER    #  296281.836MB
534       a-stor_uuid: eb1c8aac-d2af-11df-b588-01138fad54f5
535       b-stor_uuid: eb1c8aec-d2af-11df-b588-01138fad54f5
536       d-stor_uuid: eb1c8b21-d2af-11df-b588-01138fad54f5
537
538
539 The slice has 3 partitions:
540
541 * `a` - for `/boot`
542 * `b` - for swap
543 * `d` - for `/`, a HAMMER file system labeled ROOT
544
545 When you create a HAMMER file system, you must give it a label.  Here, the installer labelled it as "ROOT" and mounted it as
546
547     ROOT                      288G    12G   276G     4%    /
548
549 A PFS is a Pseudo File System inside a HAMMER file system. The HAMMER file system in which the PFSes are created is referred to as the root file system. You should not confuse the "root" file system with the label "ROOT": the label can be anything. The installer labeled it as ROOT because it is mounted at `/`.
550
551 Now inside the root HAMMER file system you find the installer created 7 PFSes from the `df -h` output above, let us see how they are mounted in `/etc/fstab`:
552
553     # cat /etc/fstab
554
555     # Device                Mountpoint      FStype  Options         Dump    Pass#
556     /dev/serno/9VMBWDM1.s1a         /boot           ufs     rw      1       1
557     /dev/serno/9VMBWDM1.s1b         none            swap    sw      0       0
558     /dev/serno/9VMBWDM1.s1d         /               hammer  rw      1       1
559     /pfs/var                /var            null    rw              0       0
560     /pfs/tmp                /tmp            null    rw              0       0
561     /pfs/usr                /usr            null    rw              0       0
562     /pfs/home               /home           null    rw              0       0
563     /pfs/usr.obj    /usr/obj                null    rw              0       0
564     /pfs/var.crash  /var/crash              null    rw              0       0
565     /pfs/var.tmp    /var/tmp                null    rw              0       0
566     proc                    /proc           procfs  rw              0       0
567
568
569 The PFSes are mounted using a NULL mount because they are also HAMMER file systems. You can read more on NULL mounts at the [mount_null(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mount_null&section=8) manpage.
570
571 You don't need to specify a size for the PFSes like you do for logical volumes inside a volume group for LVM. All the free space in the root HAMMER file system is available to all the PFSes; it can be seen in the `df -h` output above that the free space is the same for all PFSes and the root HAMMER file system.
572
573 If you look in `/var`
574
575     # cd /var/
576     # ls
577     account   backups   caps   cron    empty   log   msgs   run   spool   yp  at        
578     cache     crash     db     games   lib     mail  preserve   rwho  tmp
579
580 you will find the above directories.
581
582 If you look at the status of one of the PFSes, e.g. `/usr` you will see `/var/hammer` is the default snapshot directory.
583
584     # hammer pfs-status /usr/
585     /usr/   PFS #3 {
586         sync-beg-tid=0x0000000000000001
587         sync-end-tid=0x0000000117ac6270
588         shared-uuid=f33e318e-d2af-11df-b588-01138fad54f5
589         unique-uuid=f33e31cb-d2af-11df-b588-01138fad54f5
590         label=""
591         prune-min=00:00:00
592         operating as a MASTER
593         snapshots directory defaults to /var/hammer/<pfs>
594     }
595
596 At installation time, it will be seen that there is no "hammer" directory in `/var`. The reason for this is that no snapshots have yet been taken. You can verify this by checking the snapshots available for `/usr`
597
598     # hammer snapls /usr
599     Snapshots on /usr       PFS #3
600     Transaction ID          Timestamp               Note
601
602 Snapshots will appear automatically each night as the system performs housekeeping on the Hammer filesystem.  For a new volume, an immediate snapshot can be taken by running the command 'hammer cleanup'.  Among other activities, it will take a snapshot of the filesystem.
603
604     # sudo hammer cleanup
605     cleanup /                    - HAMMER UPGRADE: Creating snapshots
606             Creating snapshots in /var/hammer/root
607      handle PFS #0 using /var/hammer/root
608                snapshots - run
609                    prune - run
610                rebalance - run..
611                  reblock - run....
612                   recopy - run....
613     cleanup /var                 - HAMMER UPGRADE: Creating snapshots
614     [...]
615     cleanup /tmp                 - HAMMER UPGRADE: Creating snapshots
616     [...]
617     cleanup /usr                 - HAMMER UPGRADE: Creating snapshots
618     [...]
619     cleanup /home                - HAMMER UPGRADE: Creating snapshots
620     [...]
621     cleanup /usr/obj             - HAMMER UPGRADE: Creating snapshots
622     [...]
623     cleanup /var/crash           - HAMMER UPGRADE: Creating snapshots
624     [...]
625     cleanup /var/tmp             - HAMMER UPGRADE: Creating snapshots
626     [...]
627     cleanup /var/isos            - HAMMER UPGRADE: Creating snapshots
628     [...]
629
630 No snapshots were taken for `/tmp`, `/usr/obj` and `/var/tmp`. This is because the PFSes are flagged as `nohistory`. HAMMER tracks history for all files in a PFS.  Naturally, this consumes disk space until  history is pruned, at which point the available disk space will stabilise. To prevent temporary files on the mentioned PFSes (e.g., object files, crash dumps) from consuming disk space, the PFSes are marked as `nohistory`.
631
632 After performing nightly housekeeping, a new directory called *hammer* will be found in `/var` with the following sub directories:
633
634     # cd hammer/
635     # ls -l
636     total 0
637     drwxr-xr-x  1 root  wheel  0 Oct 13 11:51 home
638     drwxr-xr-x  1 root  wheel  0 Oct 13 11:42 root
639     drwxr-xr-x  1 root  wheel  0 Oct 13 11:43 tmp
640     drwxr-xr-x  1 root  wheel  0 Oct 13 11:51 usr
641     drwxr-xr-x  1 root  wheel  0 Oct 13 11:54 var
642
643
644 Looking inside `/var/hammer/usr`, one finds:
645
646     # cd usr/
647     # ls -l
648     total 0
649     drwxr-xr-x  1 root  wheel   0 Oct 13 11:54 obj
650     lrwxr-xr-x  1 root  wheel  25 Oct 13 11:43 snap-20101013-1143 -> /usr/@@0x0000000117ac6cb0
651
652
653 We have a symlink pointing to the snapshot transaction ID shown below.
654
655     # hammer snapls /usr
656     Snapshots on /usr       PFS #3
657     Transaction ID          Timestamp               Note
658     0x0000000117ac6cb0      2010-10-13 11:43:04 IST -
659     #
660
661 You can read more about snapshots, prune, reblance, reblock, recopy etc from [hammer(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=hammer&section=8).  Make especially sure to look under the heading "cleanup [filesystem ...]".
662
663 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/)
664
665 In order to correctly map hard disk sernos to device names you can use the 'devattr' command.
666
667     # udevd
668     # devattr -d "ad*" -p serno
669     Device ad4:
670             serno = Z2AD9WN4
671     Device ad4s1:
672     Device ad4s1d:
673
674     Device ad5:
675             serno = 9VMRFDSY
676     Device ad5s1:
677     Device ad5s1d:
678
679     Device ad3:
680             serno = Z2AD9WLW
681     Device ad3s1:
682     Device ad3s1a:
683     Device ad3s1b:
684     Device ad3s1d:
685
686 Or if your disks are 'da', just change it as appropiate.
687
688 ## Configuring and Starting the SSH Server
689
690 Described in detail [[here|/docs/newhandbook/sshserver/]]
691
692 ## Software/Programs and Configuration Files Location 
693
694 DragonFly default installation contains the base software/programs from the DragonFly project itself and additional software from other sources. 
695
696 The base system binary software programs are located in the folders 
697
698     /bin    /sbin
699     /usr/bin   /usr/sbin
700
701 The configuration files for the base system can be found in `/etc`. Third-party programs use `/usr/local/etc`.
702
703 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.
704
705 ## Installing Third-party Software
706
707 For an in-depth description about dealing with packaging systems, see the [[dports howto|/docs/howtos/HowToDPorts/]] . Note that although DragonFly BSD has several older package managers (like `pkgin`), as of 2014 the most modern binary package installation system is `pkg`.
708
709 ### Using pkg
710
711 Read [[dports howto|/docs/howtos/HowToDPorts/]] then for some errata, read [[this|http://lists.dragonflybsd.org/pipermail/users/2013-November/090339.html]].
712
713 You can look at the help and the man page for the pkg tool like this:
714
715 `pkg help install`
716
717 Example: Read man page for pkg-install
718
719 `man pkg-install`
720
721 ### Installing an X.org desktop X11 environment and XFCE desktop
722
723 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.
724
725 `(obsolete)`
726 Slightly out of date instructions on installing a GUI (X desktop) environment  are in the [new handbook](http://www.dragonflybsd.org/docs/newhandbook/X/).
727
728 # UNIX Basics 
729
730 ***Rewritten by Chris Shumway. ***
731
732
733 ## Synopsis 
734
735 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.
736
737 After reading this chapter, you will know:
738
739 * How to use the ***virtual consoles*** of DragonFly.
740
741 * How UNIX file permissions work along with understanding file flags in DragonFly.
742
743 * The default DragonFly file system layout.
744
745 * The DragonFly disk organization.
746
747 * How to mount and unmount file systems.
748
749 * What processes, daemons, and signals are.
750
751 * What a shell is, and how to change your default login environment.
752
753 * How to use basic text editors.
754
755 * What devices and device nodes are.
756
757 * What binary format is used under DragonFly.
758
759 * How to read manual pages for more information.
760
761 ## Virtual Consoles and Terminals 
762
763 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.
764
765 <!-- XXX: also mention vesa.ko and other modes for the vt, but maybe somewhere else -->
766
767 ### The Console 
768
769 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:
770
771     Additional ABI support:.
772     Starting cron.
773     Local package initialization:.
774     Additional TCP options:.
775     
776     Wed Feb 18 17:53:48 GMT 2009
777     
778     DragonFly/i386 (Amnesiac) (ttyv0)
779
780     login: 
781
782 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:
783
784     DragonFly/i386 (Amnesiac) (ttyv0)
785
786 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:
787
788     login:
789
790 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.
791
792 ### Logging into DragonFly 
793
794 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.
795
796 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: 
797
798     login:
799
800 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>:
801     
802
803     login: john
804     Password:
805
806 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.
807
808 ### Multiple Consoles 
809
810 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.
811
812 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.
813
814 ### The /etc/ttys File 
815
816 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.
817
818 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`:
819     
820
821     # name  getty                           type    status          comments
822     #
823     ttyv0   "/usr/libexec/getty Pc"         cons25  on  secure
824     # Virtual terminals
825     ttyv1   "/usr/libexec/getty Pc"         cons25  on  secure
826     ttyv2   "/usr/libexec/getty Pc"         cons25  on  secure
827     ttyv3   "/usr/libexec/getty Pc"         cons25  on  secure
828     ttyv4   "/usr/libexec/getty Pc"         cons25  on  secure
829     ttyv5   "/usr/libexec/getty Pc"         cons25  on  secure
830     ttyv6   "/usr/libexec/getty Pc"         cons25  on  secure
831     ttyv7   "/usr/libexec/getty Pc"         cons25  on  secure
832     ttyv8   "/usr/pkg/xorg/bin/xdm -nodaemon"  xterm   off secure
833
834 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.
835
836 ### Single User Mode Console 
837
838 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`:
839
840     
841
842     # name  getty                           type    status          comments
843     #
844     # If console is marked "insecure", then init will ask for the root password
845     # when going to single-user mode.
846     console none                            unknown off secure
847
848  **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.
849
850 #### Notes 
851
852 [[!table  data="""
853 <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. 
854  [ (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. 
855  [ (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. |
856
857 """]]
858
859 ## Permissions 
860
861 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.
862
863 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:
864
865 [[!table  data="""
866 |<tablestyle="width:100%"> Value | Permission | Directory Listing 
867 <tablestyle="width:100%"> 0 | No read, no write, no execute | `---` 
868  1 | No read, no write, execute | `--x` 
869  2 | No read, write, no execute | `-w-` 
870  3 | No read, write, execute | `-wx` 
871  4 | Read, no write, no execute | `r--` 
872  5 | Read, no write, execute | `r-x` 
873  6 | Read, write, no execute | `rw-` 
874  7 | Read, write, execute | `rwx` |
875
876 """]]
877
878 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:
879
880     % ls -l
881     total 530
882     -rw-r--r--  1 root  wheel     512 Sep  5 12:31 myfile
883     -rw-r--r--  1 root  wheel     512 Sep  5 12:31 otherfile
884     -rw-r--r--  1 root  wheel    7680 Sep  5 12:31 email.txt
885     ...
886
887 Here is how the first column of `ls -l` is broken up:    
888
889     -rw-r--r--
890
891 <!-- XXX: Check all these http:// links to see if they are broken -->
892
893 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.
894
895 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.
896
897 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).
898
899 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.
900
901 ### Symbolic Permissions 
902
903 ***Contributed by Tom Rhodes.***
904
905 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:
906
907 [[!table  data="""
908 <tablestyle="width:100%"> Option | Letter | Represents 
909 <tablestyle="width:100%"> (who) | u | User 
910  (who) | g | Group owner 
911  (who) | o | Other 
912  (who) | a | All (***world***) 
913  (action) | + | Adding permissions 
914  (action) | - | Removing permissions 
915  (action) | = | Explicitly set permissions 
916  (permissions) | r | Read 
917  (permissions) | w | Write 
918  (permissions) | x | Execute 
919  (permissions) | t | Sticky bit 
920  (permissions) | s | Set UID or GID |
921
922 """]]
923
924 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`:
925
926     
927
928     % chmod go=FILE
929
930 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:
931
932     
933
934     % chmod go-w,a+x FILE
935
936 ### DragonFly File Flags 
937
938 ***Contributed by Tom Rhodes.***
939
940 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:
941
942     
943
944     # chflags sunlink file1
945
946 And to disable the system undeletable flag, simply issue the previous command with ***no*** in front of the `sunlink`. Observe:
947
948     
949
950     # chflags nosunlink file1
951
952 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:
953
954     
955
956     # ls -lo file1
957
958 The output should look like the following:
959
960     
961
962     -rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 file1
963
964 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.
965
966 ## Directory Structure 
967
968 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.
969
970 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).
971
972 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.
973
974 [[!table  data="""
975 <tablestyle="width:100%">Directory | Description 
976 <tablestyle="width:100%">  `/` | Root directory of the file system. 
977  `/bin/` | User utilities fundamental to both single-user and multi-user environments. 
978  `/boot/` | Programs and configuration files used during operating system bootstrap. 
979  `/boot/defaults/` | Default bootstrapping configuration files; see [loader.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=loader.conf&section5). 
980  `/dev/` | Device nodes; see [intro(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=intro&section4). 
981  `/etc/` | System configuration files and scripts. 
982  `/etc/defaults/` | Default system configuration files; see [rc(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rc&section8). 
983  `/etc/mail/` | Configuration files for mail transport agents such as [sendmail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sendmail&section8). 
984  `/etc/namedb/` | `named` configuration files; see [named(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=named&section8). 
985  `/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). 
986  `/etc/ppp/` | `ppp` configuration files; see [ppp(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=ppp&section8). 
987  `/mnt/` | Empty directory commonly used by system administrators as a temporary mount point. 
988  `/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). 
989  `/root/` | Home directory for the `root` account. 
990  `/sbin/` | System programs and administration utilities fundamental to both single-user and multi-user environments. 
991  `/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). 
992  `/usr/` | The majority of user utilities and applications. 
993  `/usr/bin/` | Common utilities, programming tools, and applications. 
994  `/usr/include/` | Standard C include files. 
995  `/usr/lib/` | Archive libraries. 
996  `/usr/libdata/` | Miscellaneous utility data files. 
997  `/usr/libexec/` | System daemons &amp; system utilities (executed by other programs). 
998  `/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`. 
999  `/usr/obj/` | Architecture-specific target tree produced by building the `/usr/src` tree. 
1000  `/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`. 
1001  `/usr/pkg/xorg/` | Xorg distribution executables, libraries, etc (optional). 
1002  `/usr/pkgsrc` | The pkgsrc tree for installing packages (optional). 
1003  `/usr/sbin/` | System daemons &amp; system utilities (executed by users). 
1004  `/usr/share/` | Architecture-independent files. 
1005  `/usr/src/` | BSD and/or local source files. 
1006  `/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). 
1007  `/var/log/` | Miscellaneous system log files. 
1008  `/var/mail/` | User mailbox files. 
1009  `/var/spool/` | Miscellaneous printer and mail system spooling directories. 
1010  `/var/tmp/` | Temporary files. The files are usually preserved across a system reboot, unless `/var` is a memory-based file system. 
1011  `/var/yp` | NIS maps. |
1012
1013 """]]
1014
1015 ## Disk Organization 
1016
1017 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.
1018
1019 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.
1020
1021 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`.
1022
1023 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.
1024
1025 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 `\`.
1026
1027 DragonFly does not use drive letters, or other drive names in the path. You would not write `c:/foo/bar/readme.txt` on DragonFly.
1028
1029 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.
1030
1031 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`).
1032
1033 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:
1034
1035 <!-- XXX: image -->
1036
1037 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:
1038
1039 <!-- XXX: image -->
1040
1041 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.
1042
1043 If `B` had been mounted on `A2` then the diagram would look like this:
1044
1045 <!-- XXX: image -->
1046
1047 and the paths would be `/A2/B1` and `/A2/B2` respectively.
1048
1049 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:
1050
1051 <!-- XXX: image -->
1052
1053 Or `C` could be mounted directly on to the `A` file system, under the `A1` directory:
1054
1055 <!-- XXX: image -->
1056
1057 If you are familiar with MS-DOS, this is similar, although not identical, to the `join` command.
1058
1059 ## Choosing File System Layout 
1060
1061 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.
1062
1063 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.
1064
1065  **Benefits of Multiple File Systems** 
1066
1067 * 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.
1068
1069 * 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.
1070
1071 * 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.
1072
1073  **Benefit of a Single File System** 
1074
1075 * 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.
1076 <!-- XXX: what about hammer? -->
1077
1078 ## Disk Slices, Partitions and local UNIX file systems 
1079
1080 Here we describe how disks are subdivided.
1081
1082 <!-- XXX: mention serno stuff -->
1083
1084 ### Slices 
1085
1086 A disk can be subdivided in slices.
1087
1088 Slices are named `s0`, `s1` and so on.
1089
1090 For example the disk `ad6` can contain the slice `ad6s3`.
1091
1092 DragonFly support two schemes for slices, MBR and GPT, either of them will manage all slices on a disk:
1093
1094 * 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.
1095
1096 * 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).
1097
1098 ### Partitions 
1099
1100 Partitions are contained in slices.
1101
1102 Partitions are named `a`, `b` and so on.
1103
1104 DragonFly support 16 partitions per slice, that is `a` through `p`.
1105
1106 For example the partition `ad6s3a` is contained in the slice `ad6s3`.
1107
1108 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):
1109
1110 * [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.
1111
1112 * [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.
1113
1114 ### Local UNIX file systems 
1115
1116 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.
1117
1118 DragonFly support two local UNIX file systems, UFS and HAMMER:
1119
1120 * 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.
1121
1122 * [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.
1123
1124 ### Typical disk layout 
1125
1126 From the above we see the following typical disk layout scenarios:
1127
1128 * 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.
1129
1130 * 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.
1131
1132 * 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).
1133
1134 ### HAMMER Note 
1135
1136 [HAMMER(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=HAMMER&amp;section5)
1137
1138 is a rather new file system, under active development.
1139
1140 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 .
1141
1142 All major features except the mirroring are quite well tested as-of the 2.2.1 release.
1143
1144 You should evaluate if HAMMER is suitable for your needs.
1145 <!-- XXX: mention disk and memory requirements for efficient hammer use -->
1146
1147 Examples of ongoing development includes:
1148
1149 * 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).
1150
1151 * Multi master mirroring. For now only one mirror master is supported, but multiple mirror targets, called slaves, are already supported.
1152
1153 * Support for shrinking existing HAMMER file systems.  The HAMMER design is prepared for this, utility just have to be written to support it.
1154 <!-- XXX: is this still accurate? Do we really want to mention it here? -->
1155
1156 ### HAMMER Features 
1157
1158 [HAMMER(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=HAMMER&amp;section5) has several advanced features not found in UFS:
1159
1160 * Large file systems:  Up to 1 million TB, also called 1 Exabyte is supported.
1161
1162 * 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.
1163
1164 * 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.
1165
1166 * 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.
1167
1168 * 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). 
1169
1170 * 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.
1171
1172 * 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.
1173
1174 More info on HAMMER can be found [here](http://www.dragonflybsd.org/hammer/index.html).
1175
1176 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.
1177
1178 <!-- XXX: mention swapcache, and also how to configure and use it (somewhere else, probably) -->
1179
1180 ### Adding a Disk 
1181
1182 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.
1183
1184 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 
1185 [disklabel64(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel64&amp;section8).
1186
1187 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).
1188
1189 <!-- XXX: mention that disklabel64 is default now -->
1190     
1191
1192     # gpt -v create ad6
1193
1194     ...
1195
1196     # gpt add -s1 ad6
1197
1198     ad6s0
1199
1200     # gpt add ad6
1201
1202     ad6s1
1203
1204     # gpt show ad6
1205
1206     ...
1207
1208 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.
1209
1210     
1211
1212     # disklabel64 -rw ad6s1 auto
1213
1214     # disklabel64 -e ad6s1          # edit label to add partitions as needed
1215
1216 ### disklabel 
1217 <!-- XXX: what is all this fuzz about dangerously dedicated? -->
1218
1219 For [disklabel(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=disklabel&amp;section8) labels some partitions have certain conventions associated with them.
1220
1221 [[!table  data="""
1222 <tablestyle="width:100%"> Partition | Convention 
1223 <tablestyle="width:100%"> `a` | Normally contains the root file system 
1224  `b` | Normally contains swap space 
1225  `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.
1226  `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`. |
1227
1228 """]]
1229
1230 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.
1231
1232 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.
1233
1234 <!-- XXX: gpt allows for way more than 4 partitions... let's remove this stuff above -->
1235
1236 ***Dangerously dedicated*** physical drives are accessed as slice 0.
1237
1238 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.
1239
1240 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).
1241
1242 <!-- XXX: here would probably be the right place to talk about serno -->
1243
1244 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).
1245
1246 <!-- XXX: later talk also about devfs, definitely not here though. also, devfs rules -->
1247
1248 [Example 3-2](disk-organization.html#BASICS-CONCEPT-DISK-MODEL) shows a conceptual model of the disk layout that should help make things clearer.
1249
1250 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.
1251
1252 ***'Table 3-1. Disk Device Codes***'
1253
1254 [[!table  data="""
1255 <tablestyle="width:100%"> Code | Meaning 
1256 <tablestyle="width:100%"> `ad` | ATAPI (IDE) disk 
1257  `da` | SCSI direct access disk 
1258  `acd` | ATAPI (IDE) CDROM 
1259  `cd` | SCSI CDROM 
1260  `vn` | Virtual disk
1261  `fd` | Floppy disk |
1262
1263 """]]
1264
1265 ***'Example 3-1. Sample Disk, Slice, and Partition Names***'
1266
1267 [[!table  data="""
1268 <tablestyle="width:100%"> Name | Meaning 
1269 <tablestyle="width:100%"> `ad0s1a` | The first partition (`a`) on the first slice (`s1`) on the first IDE disk (`ad0`). 
1270  `da1s2e` | The fifth partition (`e`) on the second slice (`s2`) on the second SCSI disk (`da1`). |
1271
1272 """]]
1273
1274 ***'Example 3-2. Conceptual Model of a Disk***'
1275
1276 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.
1277
1278 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.
1279
1280 <!-- XXX: image -->
1281
1282 ## Mounting and Unmounting File Systems 
1283
1284 The file system is best visualized as a tree, rooted at `/`.
1285
1286 The directories, e.g. `/dev` and `/usr`, in the root directory are branches,
1287
1288 which may have their own branches, such as `/usr/local`, and so on.
1289
1290 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.
1291
1292 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.
1293
1294 ### The fstab File 
1295
1296 During the [boot process](boot.html), file systems listed in `/etc/fstab` are automatically mounted (unless they are listed with the `noauto` option).
1297
1298 The `/etc/fstab` file contains a list of lines of the following format:
1299   
1300
1301     device       mount-point   fstype     options      dumpfreq     passno
1302
1303 These parameters have the following meaning:
1304
1305 * `device`: A device name (which should exist), as explained [here](disks-naming.html).
1306
1307 * `mount-point`: A directory (which should exist), on which to mount the file system.
1308
1309 * `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`.
1310
1311 * `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.
1312
1313 * `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.
1314
1315 * `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.
1316
1317 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.
1318
1319 ### The mount Command 
1320
1321 The [mount(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=mount&section8) command is what is ultimately used to mount file systems.
1322
1323 In its most basic form, you use:
1324
1325     
1326
1327     # mount device mountpoint
1328
1329 Or, if `mountpoint` is specified in `/etc/fstab`, just:
1330
1331     
1332
1333     # mount mountpoint
1334
1335 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:
1336
1337  **Mount Options** 
1338
1339 * `-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.
1340
1341 * `-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.
1342
1343 * `-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.
1344
1345 * `-r`: Mount the file system read-only. This is identical to using the `rdonly` argument to the `-o` option.
1346
1347 * `-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.
1348
1349 * `-u`: Update mount options on the file system.
1350
1351 * `-v`: Be verbose.
1352
1353 * `-w`: Mount the file system read-write.
1354
1355 The `-o` option takes a comma-separated list of the options, including the following:
1356
1357 * `nodev:` Do not interpret special devices on the file system. This is a useful security option.
1358
1359 * `noexec`: Do not allow execution of binaries on this file system. This is also a useful security option.
1360
1361 * `nosuid`: Do not interpret setuid or setgid flags on the file system. This is also a useful security option.
1362
1363 ### The umount Command 
1364
1365 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.
1366
1367 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.
1368
1369 `-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.
1370
1371 ## Processes 
1372
1373 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.
1374
1375 <!-- XXX: talk about LWPs and threads? -->
1376
1377 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.
1378
1379 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.
1380
1381 By default, `ps` only shows you the commands that are running and are owned by you. For example:
1382
1383     
1384
1385     % ps
1386
1387       PID  TT  STAT      TIME COMMAND
1388       298  p0  Ss     0:01.10 tcsh
1389      7078  p0  S      2:40.88 xemacs mdoc.xsl (xemacs-21.1.14)
1390     37393  p0  I      0:03.11 xemacs freebsd.dsl (xemacs-21.1.14)
1391     48630  p0  S      2:50.89 /usr/local/lib/netscape-linux/navigator-linux-4.77.bi
1392     48730  p0  IW     0:00.00 (dns helper) (navigator-linux-)
1393     72210  p0  R+     0:00.00 ps
1394       390  p1  Is     0:01.14 tcsh
1395      7059  p2  Is+    1:36.18 /usr/local/bin/mutt -y
1396      6688  p3  IWs    0:00.00 tcsh
1397     10735  p4  IWs    0:00.00 tcsh
1398     20256  p5  IWs    0:00.00 tcsh
1399       262  v0  IWs    0:00.00 -tcsh (tcsh)
1400       270  v0  IW+    0:00.00 /bin/sh /usr/X11R6/bin/startx -- -bpp 16
1401       280  v0  IW+    0:00.00 xinit /home/nik/.xinitrc -- -bpp 16
1402       284  v0  IW     0:00.00 /bin/sh /home/nik/.xinitrc
1403       285  v0  S      0:38.45 /usr/X11R6/bin/sawfish
1404
1405 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.
1406
1407 [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.
1408
1409 The output from [top(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=top&section1) is similar. A sample session looks like this:
1410
1411     
1412
1413     % top
1414     last pid: 72257;  load averages:  0.13,  0.09,  0.03    up 0+13:38:33  22:39:10
1415     47 processes:  1 running, 46 sleeping
1416     CPU states: 12.6% user,  0.0% nice,  7.8% system,  0.0% interrupt, 79.7% idle
1417     Mem: 36M Active, 5256K Inact, 13M Wired, 6312K Cache, 15M Buf, 408K Free
1418     Swap: 256M Total, 38M Used, 217M Free, 15% Inuse
1419     
1420
1421       PID USERNAME PRI NICE  SIZE    RES STATE    TIME   WCPU    CPU COMMAND
1422     72257 nik       28   0  1960K  1044K RUN      0:00 14.86%  1.42% top
1423      7078 nik        2   0 15280K 10960K select   2:54  0.88%  0.88% xemacs-21.1.14
1424       281 nik        2   0 18636K  7112K select   5:36  0.73%  0.73% XF86_SVGA
1425       296 nik        2   0  3240K  1644K select   0:12  0.05%  0.05% xterm
1426     48630 nik        2   0 29816K  9148K select   3:18  0.00%  0.00% navigator-linu
1427       175 root       2   0   924K   252K select   1:41  0.00%  0.00% syslogd
1428      7059 nik        2   0  7260K  4644K poll     1:38  0.00%  0.00% mutt
1429     ...
1430
1431 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.
1432
1433 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.
1434
1435 [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.
1436
1437 ## Daemons, Signals, and Killing Processes 
1438
1439 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.
1440
1441 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.
1442
1443 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.
1444
1445 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.
1446
1447 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.
1448
1449 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.
1450
1451 `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).
1452
1453 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.
1454
1455 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.
1456
1457 Signals are sent using the [kill(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=kill&section=1) command, as this example shows.
1458
1459  **Sending a Signal to a Process** 
1460
1461 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`.
1462
1463   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).
1464
1465       
1466
1467         % ps -ax | grep inetd
1468
1469         198  ??  IWs    0:00.00 inetd -wW
1470
1471   
1472
1473   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.
1474
1475   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.
1476
1477       
1478
1479         % su
1480
1481         Password:
1482
1483         # /bin/kill -s HUP 198
1484
1485   
1486
1487   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`.
1488
1489 **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.
1490
1491 Sending other signals is very similar, just substitute `TERM` or `KILL` in the command line as necessary.
1492
1493  **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** .
1494
1495  
1496  
1497  
1498  
1499  
1500 ## Shells 
1501
1502 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`.
1503
1504 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.
1505
1506 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** ]`.
1507
1508 The shell would print out `rm foo[BEEP].bar`.
1509
1510 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.
1511
1512 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:
1513
1514 [[!table  data="""
1515 <tablestyle="width:100%"> Variable | Description 
1516 <tablestyle="width:100%"> `USER` | Current logged in user's name. 
1517  `PATH` | Colon separated list of directories to search for binaries. 
1518  `DISPLAY` | Network name of the X11 display to connect to, if available. 
1519  `SHELL` | The current shell. 
1520  `TERM` | The name of the user's terminal. Used to determine the capabilities of the terminal. 
1521  `TERMCAP` | Database entry of the terminal escape codes to perform various terminal functions. 
1522  `OSTYPE` | Type of operating system. e.g., DragonFly. 
1523  `MACHTYPE` | The CPU architecture that the system is running on. 
1524  `EDITOR` | The user's preferred text editor. 
1525  `PAGER` | The user's preferred text pager. 
1526  `MANPATH` | Colon separated list of directories to search for manual pages. |
1527
1528 """]]
1529
1530 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`:
1531     
1532
1533     % setenv EDITOR /usr/pkg/bin/emacs
1534
1535 Under Bourne shells:
1536    
1537
1538     % export EDITOR="/usr/pkg/bin/emacs"
1539
1540 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`.
1541
1542 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.
1543
1544 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.
1545
1546 ### Changing Your Shell 
1547
1548 <!-- XXX: does chsh still exist? chpass will do, too -->
1549
1550 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.
1551
1552 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:
1553
1554     
1555
1556     % chsh -s /usr/pkg/bin/bash
1557
1558  **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.
1559
1560 For example, if you installed `bash` by hand and placed it into `/usr/local/bin`, you would want to:
1561
1562     
1563
1564     # echo "/usr/local/bin/bash" >> /etc/shells
1565
1566 Then rerun `chsh`.
1567
1568 ## Text Editors 
1569
1570 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.
1571
1572 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.
1573
1574 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.
1575
1576 ## Devices and Device Nodes 
1577
1578 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`.
1579
1580 For example, `acd0` is the first IDE CDROM drive, while `kbd0` represents the keyboard.
1581
1582 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.
1583
1584 The device nodes in the `/dev` directory are created and destroyed automatically on DragonFly >= 2.4, by means of the device file system (devfs).
1585
1586 ## Binary Formats 
1587
1588 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®:
1589
1590 * [a.out(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=a.out&amp;section=5)
1591
1592   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.
1593
1594 * <u>COFF</u>
1595
1596   The SVR3 object format. The header now comprises a section table, so you can have more than just .text, .data, and .bss sections.
1597
1598 * [elf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=elf&amp;section=5)
1599
1600   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.
1601
1602 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.
1603
1604 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.
1605
1606 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.
1607
1608 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.
1609
1610 <!-- XXX: do we really need all this bullshit about file formats? -->
1611
1612 ## For More Information 
1613
1614 ### Manual Pages 
1615
1616 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:
1617
1618     % man command
1619
1620 `command` is the name of the command you wish to learn about. For example, to learn more about `ls` command type:
1621
1622     % man ls
1623
1624 The online manual is divided up into numbered sections:
1625
1626   1. User commands.
1627   1. System calls and error numbers.
1628   1. Functions in the C libraries.
1629   1. Device drivers.
1630   1. File formats.
1631   1. Games and other diversions.
1632   1. Miscellaneous information.
1633   1. System maintenance and operation commands.
1634   1. Kernel internals.
1635
1636 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:
1637     
1638
1639     % man 1 chmod
1640
1641 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.
1642
1643 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:
1644
1645    
1646
1647     % man -k mail
1648
1649 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.
1650
1651 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:    
1652
1653     % cd /usr/bin
1654     % man -f *
1655
1656 or
1657    
1658
1659     % cd /usr/bin
1660     % whatis *
1661
1662 which does the same thing.
1663
1664 ### GNU Info Files 
1665
1666 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:
1667
1668     % info
1669
1670 For a brief introduction, type `h`. For a quick command reference, type `?`.
1671
1672 # DPorts and pkgng
1673
1674 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.
1675
1676 The __pkgng__ tool called "pkg" is a modern and fast binary package manager.  It was developed for FreeBSD, but PC-BSD used it in production first, followed soon after by DragonFly.  In the future, it will be the only binary package manager on FreeBSD, just as DPorts is currently the only port manager.
1677
1678 __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.
1679
1680 ## Getting started with pkgng
1681
1682 DragonFly daily snapshots and Releases (starting with 3.4) come with __pkgng__ already installed.  Upgrades from earlier releases, however, will not have it.  If the "pkg" program is missing on the system for any reason, it can be quickly bootstrapped without having to build it from source.
1683
1684 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:
1685
1686     # cd /usr
1687     # make dports-create
1688     # rm -rf /usr/pkg
1689     # pkg upgrade
1690     # rehash
1691
1692 Since you may need to manually edit the configuration file `/usr/local/etc/pkg.conf`, here is the
1693 usual command to edit it using the vi editor:
1694
1695      # vi /usr/local/etc/pkg.conf
1696
1697 Before using consult the man page (`man pkg`) and then try these examples:
1698
1699     # pkg search editors
1700     # pkg install vim
1701
1702
1703 To bootstrap __pkgng__ with a download on a very old version of DragonFly that is still using `pkgsrc` run:
1704
1705     # make pkg-bootstrap
1706     # rehash
1707     # pkg-static install -y pkg
1708     # rehash
1709
1710 Note that this step is unnecessary for any newly installed release from DragonFly 3.4 onwards.
1711
1712 ## Configuring pkgng
1713
1714 Older versions of pkgng saved their configuration at /usr/local/etc/pkg.conf; this file made reference to a PACKAGESITE.  pkgng will still work based on this file, but will output errors:
1715
1716     # pkg update
1717     pkg: PACKAGESITE in pkg.conf is deprecated. Please create a repository configuration file
1718     Updating repository catalogue
1719     pkg: Warning: use of http:// URL scheme with SRV records is deprecated: switch to pkg+http://
1720
1721 Listen to the errors: hash out the packagesite line, save the file, and move on.  This can be done with vi:
1722
1723     # vi /usr/local/etc/pkg.conf
1724
1725 There will be two lines in the file like this:
1726
1727     # Default Dports package server (California)
1728     PACKAGESITE: http://mirror-master.dragonflybsd.org/dports/${ABI}/LATEST
1729
1730 Hash out the offending line:
1731
1732     # Default Dports package server (California)
1733     # PACKAGESITE: http://mirror-master.dragonflybsd.org/dports/${ABI}/LATEST
1734
1735 Note that, as of time of writing, there are two working package repositories:
1736
1737     # Default Dports package server (California)
1738     # PACKAGESITE: http://mirror-master.dragonflybsd.org/dports/${ABI}/LATEST
1739     
1740     # European mirrors
1741     [...]
1742     #PACKAGESITE: http://dfly.schlundtech.de/dports/${ABI}/LATEST
1743
1744 Test their performance---we will be using the fastest one.  This may, or may not, be the one closest to you (the California site for the New World, the German site for the Old World).
1745
1746     # ping schlundtech.de
1747     PING schlundtech.de (85.236.36.90): 56 data bytes
1748     64 bytes from 85.236.36.90: icmp_seq=0 ttl=49 time=101.433 ms
1749     64 bytes from 85.236.36.90: icmp_seq=1 ttl=49 time=59.177 ms
1750     64 bytes from 85.236.36.90: icmp_seq=2 ttl=49 time=79.550 ms
1751     64 bytes from 85.236.36.90: icmp_seq=3 ttl=49 time=88.268 ms
1752     64 bytes from 85.236.36.90: icmp_seq=4 ttl=49 time=120.060 ms
1753     [...]
1754     --- schlundtech.de ping statistics ---
1755     20 packets transmitted, 19 packets received, 5.0% packet loss
1756     round-trip min/avg/max/stddev = 49.555/96.064/186.662/33.559 ms
1757     # ping mirror-master.dragonflybsd.org
1758     PING avalon.dragonflybsd.org (199.233.90.72): 56 data bytes
1759     64 bytes from 199.233.90.72: icmp_seq=0 ttl=47 time=208.013 ms
1760     64 bytes from 199.233.90.72: icmp_seq=1 ttl=47 time=256.441 ms
1761     64 bytes from 199.233.90.72: icmp_seq=2 ttl=47 time=281.436 ms
1762     64 bytes from 199.233.90.72: icmp_seq=3 ttl=47 time=281.103 ms
1763     64 bytes from 199.233.90.72: icmp_seq=4 ttl=47 time=285.440 ms
1764     [...]
1765     --- avalon.dragonflybsd.org ping statistics ---
1766     19 packets transmitted, 19 packets received, 0.0% packet loss
1767     round-trip min/avg/max/stddev = 208.013/264.017/334.180/31.549 ms
1768
1769 Now, navigate to `/usr/local/etc/pkg/repos/` and rename one of the configuration file samples you find there.  Edit the one you renamed:
1770
1771     # cd /usr/local/etc/pkg/repos/
1772     # ls
1773     df-latest.conf.sample       df-releases.conf.sample
1774     # cp -v df-latest.conf.sample df-latest.conf
1775     df-latest.conf.sample -> df-latest.conf
1776     # chmod -v 644 df-latest.conf
1777     df-latest.conf
1778     # vim df-latest.conf
1779
1780 Enable whichever server was faster (Avalon is American, SchlundTech is German):
1781
1782     Avalon: {
1783         url             : http://mirror-master.dragonflybsd.org/dports/${ABI}/LATEST,
1784         [...]
1785         enabled         : no
1786     }
1787     SchlundTech: {
1788         url             : http://dfly.schlundtech.de/dports/${ABI}/LATEST,
1789         enabled         : yes
1790     }
1791
1792 ## Basic pkgng Operations
1793
1794 Usage information for __pkgng__ is available in the pkg(8) manual page, or by running `pkg` without additional arguments.
1795
1796 Each __pkgng__ command argument is documented in a command-specific manual page. To read the manual page for `pkg install`, for example, run either:
1797
1798     # pkg help install
1799     # man pkg-install
1800
1801 ## Obtaining Information About Installed Packages with pkgng
1802
1803 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:
1804
1805     # pkg info packagename
1806
1807 For example, to see which version of __pkgng__ is installed on the system, run:
1808
1809     # pkg info pkg
1810     pkg-1.0.12                   New generation package manager
1811
1812 ## Installing and Removing Packages with pkgng
1813
1814 In general, most DragonFly users will install binary packages by typing:
1815
1816     # pkg install <packagename>
1817
1818 For example, to install curl:
1819
1820     # pkg install curl
1821
1822     Updating repository catalogue
1823     Repository catalogue is up-to-date, no need to fetch fresh copy
1824     The following packages will be installed:
1825     
1826         Installing ca_root_nss: 3.13.5
1827         Installing curl: 7.24.0
1828     
1829     The installation will require 4 MB more space
1830     
1831     1 MB to be downloaded
1832     
1833     Proceed with installing packages [y/N]: y
1834     ca_root_nss-3.13.5.txz           100%    255KB   255.1KB/s  255.1KB/s   00:00
1835     curl-7.24.0.txz                  100%   1108KB     1.1MB/s    1.1MB/s   00:00
1836     Checking integrity... done
1837     Installing ca_root_nss-3.13.5... done
1838     Installing curl-7.24.0... done
1839
1840 The new package and any additional packages that were installed as dependencies can be seen in the installed packages list:
1841
1842     # pkg info
1843     ca_root_nss-3.13.5    The root certificate bundle from the Mozilla Project
1844     curl-7.24.0           Non-interactive tool to get files from FTP, GOPHER, HTTP(S) servers
1845     pkg-1.0.12            New generation package manager
1846
1847 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:
1848
1849     # pkg delete curl
1850     The following packages will be deleted:
1851     
1852         curl-7.24.0_1
1853     
1854     The deletion will free 3 MB
1855     
1856     Proceed with deleting packages [y/N]: y
1857     Deleting curl-7.24.0_1... done
1858
1859 ## Upgrading Installed Packages with pkgng
1860
1861 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.
1862
1863 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:
1864
1865     # pkg upgrade
1866     Updating repository catalogue
1867     repo.txz            100%    297KB   296.5KB/s   296.5KB/s   00:00
1868     The following packages will be upgraded:
1869     
1870     Upgrading curl: 7.24.0 -> 7.24.0_1
1871     
1872     1 MB to be downloaded
1873     
1874     Proceed with upgrading packages [y/N]: y
1875     curl-7.24.0_1.txz   100%    1108KB  1.1MB/s       1.1MB/s   00:00
1876     Checking integrity... done
1877     Upgrading curl from 7.24.0 to 7.24.0_1... done
1878
1879 ## Auditing Installed Packages with pkgng
1880
1881 Occasionally, software vulnerabilities may be discovered in software within DPorts. __pkgng__ includes built-in auditing. To audit the software installed on the system, type:
1882
1883     # pkg audit -F
1884
1885 # Advanced pkgng Operations
1886
1887 ## Automatically Removing Leaf Dependencies with pkgng
1888
1889 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:
1890
1891     # pkg autoremove
1892     Packages to be autoremoved:
1893         ca_root_nss-3.13.5
1894     
1895     The autoremoval will free 723 kB
1896     
1897     Proceed with autoremoval of packages [y/N]: y
1898     Deinstalling ca_root_nss-3.13.5... done
1899
1900 ## Backing Up the pkgng Package Database
1901
1902 __pkgng__ includes its own package database backup mechanism. To manually back up the package database contents, type:
1903
1904     # pkg backup -d <pkgng.db>
1905
1906 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).
1907
1908 To restore the contents of a previous package database backup, run:
1909
1910     # pkg backup -r </path/to/pkgng.db>
1911
1912 ## Removing Stale pkgng Packages
1913
1914 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.
1915
1916 To remove the outdated binary packages, type:
1917
1918     # pkg clean
1919
1920 ##Modifying pkgng Package Metadata
1921
1922 __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:
1923
1924     # pkg set -o <category/oldport>:<category/newport>
1925
1926 For example, to change the package origin for the above example, type:
1927
1928     # pkg set -o lang/php5:lang/php53
1929
1930 As another example, to update lang/ruby18 to lang/ruby19, type:
1931
1932     # pkg set -o lang/ruby18:lang/ruby19
1933
1934 As a final example, to change the origin of the libglut shared libraries from graphics/libglut to graphics/freeglut, type:
1935
1936     # pkg set -o graphics/libglut:graphics/freeglut
1937
1938 _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:
1939
1940     # pkg install -Rf graphics/freeglut
1941
1942 # Building DPorts from source
1943
1944 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:
1945
1946 * The port is new and there's no pre-binary available yet
1947 * The pre-built binaries use the default options and the user needs a package built with a different set of options
1948 * Testing FreeBSD port in order to patch them and submit to DPorts
1949 * The user just prefers building from source
1950
1951 ## Installing DPorts tree
1952
1953 DragonFly 3.4 or later is the minimum version that can build DPorts from source.
1954
1955 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:
1956
1957     # cd /usr
1958     # make dports-create-shallow
1959
1960 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:
1961
1962     # cd /usr
1963     # make dports-download
1964
1965 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:
1966
1967     # cd /usr/dports/devel/git
1968     # make install
1969     # cd /usr
1970     # rm -rf /usr/dports
1971     # make dports-create-shallow
1972
1973 The git repository is hosted on the [github account of John Marino](https://github.com/jrmarino/DPorts/#readme).
1974
1975 ## Final thoughts
1976
1977 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.
1978
1979 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.
1980
1981 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.
1982
1983 ## More reading
1984 * How fix/add broken ports: [[docs/howtos/fixdports]]
1985 * [Trick: How to get i386-only software via dports](http://leaf.dragonflybsd.org/mailarchive/users/2013-06/msg00023.html)
1986
1987 # Disclaimer 
1988
1989 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.
1990
1991 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: 
1992
1993 [http://www.dragonflybsd.org/docs/howtos/HowToDPorts/](http://www.dragonflybsd.org/docs/howtos/HowToDPorts/)
1994
1995 ----
1996
1997 # pkgsrc on DragonFly
1998
1999 DragonFly uses a specially crafted Makefile in /usr and a git mirror
2000 of the official pkgsrc repository to make pkgsrc distribution more user-friendly.
2001
2002 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.
2003
2004
2005
2006
2007 ## Overview 
2008
2009 ### History 
2010 [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.
2011
2012 ### Overview
2013
2014 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.
2015
2016 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.
2017
2018  **Binary Package Benefits** 
2019
2020 * A compressed package tarball is typically smaller than the compressed tarball containing the source code for the application.
2021
2022 * 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.
2023
2024 * Packages do not require any understanding of the process involved in compiling software on DragonFly.
2025
2026
2027 **Pkgsrc source Benefits** 
2028
2029
2030 * 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.
2031
2032 * 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.
2033
2034 * The licensing conditions of some software distributions forbid binary distribution. They must be distributed as source code.
2035
2036 * 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.
2037
2038 * If you have local patches, you will need the source in order to apply them.
2039
2040 * 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.
2041
2042 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.
2043
2044  **Warning:** Before installing any application, you should check http://www.pkgsrc.org/ for security issues related to your application.
2045
2046 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.
2047
2048 **Note:** Binary packages and source packages are effectively the same software and can be manipulated with the same pkg_* tools.  
2049
2050 ## Installing pkgsrc 
2051
2052 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.  
2053
2054 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.
2055
2056 This downloads the stable version of the pkgsrc tree from the default mirror, if you didn't set GITHOST. As root:
2057
2058     # cd /usr
2059     # make pkgsrc-create
2060
2061 to fetch the intial pkgsrc repository from the net, or
2062
2063     # cd /usr
2064     # make pkgsrc-update
2065
2066 to update.
2067
2068 **Note**: If your DragonFly install is not up to date, you might have ended up with an old release of the pkgsrc tree.
2069
2070     # cd /usr/pkgsrc
2071     # git branch
2072
2073 will show what release you are on. See Tracking the stable branch for more information.
2074
2075 ### Tracking the stable branch
2076
2077 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.
2078
2079 To see the available remote branches:
2080
2081     # cd /usr/pkgsrc 
2082     # git pull
2083     # git branch -r
2084
2085 To create a local branch, tracking the remote quarterly release:
2086
2087     # cd /usr/pkgsrc 
2088     # git branch pkgsrc-2010Q4 origin/pkgsrc-2010Q4
2089
2090 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.
2091
2092 After adding a new branch, it can be downloaded with:
2093
2094     # cd /usr/pkgsrc 
2095     # git checkout pkgsrc-2010Q4
2096     # git pull
2097
2098 ## Dealing with pkgsrc packages
2099
2100 The following section explains how to find, install and remove pkgsrc packages.
2101
2102 ### Finding Your Application 
2103
2104 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:
2105
2106 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.
2107
2108     # pkg_search fvwm
2109     fvwm-2.4.20nb1          Newer version of X11 Virtual window manager
2110     fvwm-2.5.24             Development version of X11 Virtual window manager
2111     fvwm-themes-0.6.2nb8    Configuration framework for fvwm2 with samples
2112     fvwm-wharf-1.0nb1       Copy of AfterStep's Wharf compatible with fvwm2
2113     fvwm1-1.24rnb1          Virtual window manager for X
2114
2115     # pkg_search -v fvwm-2.5
2116     Name    : fvwm-2.5.24-50
2117     Dir     : wm/fvwm-devel                                     
2118     Desc    : Development version of X11 Virtual window manager 
2119     URL     : any                                               
2120     Deps    : perl>#5.0 gettext-lib>0.14.5 [...]
2121
2122 Its also possible to issue the command
2123
2124     # cd /usr/pkgsrc/
2125     # bmake search key='package you are looking for'
2126
2127 from the `/usr/pkgsrc` directory.
2128
2129 It's also possible to browse website that show all the available pkgsrc packages, such as [http://pkgsrc.se/](http://pkgsrc.se) .
2130
2131 ### Installing applications
2132
2133 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.  
2134
2135 The `bin-install` target on DragonFly (with pkgsrc from 2011/02/07 and later) will do just that:
2136
2137     # cd /usr/pkgsrc/misc/screen
2138     # bmake bin-install clean
2139
2140 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.
2141
2142 ### Installing applications, source only
2143
2144 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.
2145
2146     # cd /usr/pkgsrc/misc/screen
2147     # bmake install clean
2148
2149 To find out the options that can affect how a program is built:
2150
2151     # bmake show-options
2152
2153 To change options:
2154
2155     # bmake PKG_OPTIONS.<package_name>="-option1 option2" install clean
2156
2157 Listing an option enables it.  Listing an option with a "-" before it disables the option.
2158
2159 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`:
2160
2161      . PKG_OPTIONS.<package_name>=-option1 option2
2162     
2163 ### Installing applications, binary only
2164
2165 Binary packages can be installed using *pkg_radd*:
2166
2167     # pkg_radd screen
2168
2169 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.
2170
2171 You can manually set `BINPKG_BASE` and use *pkg_add* to get the same effect, using a different server.
2172
2173     # setenv BINPKG_BASE http://mirror-master.dragonflybsd.org/packages
2174     # pkg_add screen
2175
2176
2177 #### Issues with pre-built packages
2178
2179 * The default remote repository for binary packages tracks quarterly pkgsrc releases, so your local install of pkgsrc should be the same quarterly release.
2180 * 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.
2181 * 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.
2182
2183
2184 ### List all installed applications 
2185
2186 To obtain a list of all the packages that are installed on your system:
2187
2188     # pkg_info
2189
2190 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:
2191
2192     # pkg_info | grep xorg
2193
2194 ### Removing packages
2195
2196 If a program was installed as a package:
2197
2198     # pkg_delete packagename
2199
2200 If a package was installed from the source files, you can also change to the directory they were installed from and issue the command:
2201
2202     # bmake deinstall
2203
2204 Note that these methods are effectively interchangeable.  Either will work whether the package was originally installed from source or binary.
2205
2206 #### Remove associated files needed for building a package 
2207
2208 To remove the work file from building a package, and the package's dependencies:
2209
2210     # bmake clean clean-depends
2211
2212 This can be combined with other steps:
2213
2214     # bmake install clean clean-depends
2215
2216 ## Upgrading packages 
2217
2218 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.
2219
2220 ### Update pkgsrc system packages
2221
2222 **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. 
2223
2224     # cd /usr/pkgsrc/devel/bmake
2225     or
2226     # cd /usr/pkgsrc/pkgtools/pkg_install
2227     or 
2228     # cd /usr/pkgsrc/pkgtools/bootstrap-mk-files
2229     
2230     # env USE_DESTDIR=yes bmake package
2231     # bmake clean-depends clean
2232
2233 And go to the packages directory and install the binary package with
2234
2235     # cd /usr/pkgsrc/packages/All
2236     # pkg_add -u <pkg_name> (i.e. the name of the .tgz file).
2237
2238
2239 ### bmake replace
2240 Performed in the `/usr/pkgsrc` directory that correlates with the installed package, the software is first built and then replaced.
2241
2242     # cd /usr/pkgsrc/chat/ircII
2243     # bmake replace
2244
2245 ### pkg_rolling-replace
2246
2247 *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.
2248
2249     # cd /usr && make pkgsrc-update
2250     # pkg_rolling-replace -u
2251
2252 ### pkgin
2253
2254 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.
2255
2256     # pkgin update
2257     # pkgin full-upgrade 
2258
2259 ### pkg_chk
2260
2261 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.
2262
2263     # pkg_chk -g  # make initial list of installed packages
2264     # pkg_chk -r  # remove all packages that are not up to date and packages that depend on them
2265     # pkg_chk -a  # install all missing packages (use binary packages, this is the default)
2266     # pkg_chk -as # install all missing packages (build from source)
2267
2268 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. 
2269
2270 ### pkg_add -u
2271
2272 Point at a local or online binary archive location to download and update packages.
2273
2274 ### rpkgmanager
2275
2276 This requires that you've set up rpkgmanager first. Read more about rpkgmanager [[here|docs/howtos/rpkgmanager/]].
2277
2278     # yes | rpkgmanager.rb
2279
2280 ## Start pkgsrc applications on system startup
2281
2282 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:
2283
2284     RCD_SCRIPTS_DIR=/etc/rc.d
2285     PKG_RCD_SCRIPTS=YES
2286
2287 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`.
2288
2289 Many other options can be set in this file; see `/usr/pkgsrc/mk/defaults/mk.conf` for examples.
2290
2291 ## Miscellaneous topics
2292
2293 ### Post-installation Activities 
2294
2295 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.
2296  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:
2297
2298 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
2299
2300     # pkg_info -L foopackage-1.0.0 | less
2301
2302 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
2303
2304     # pkg_info | grep -i foopackage
2305
2306 will find all the installed packages that have *foopackage* in the package name. Replace *foopackage* in your command line as necessary.
2307
2308 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
2309
2310     # pkg_info foopackage-1.0.0
2311
2312 A `WWW:` line, if present, should provide a URL for the application's web site.
2313
2314 ### Dealing with Broken Packages 
2315
2316 If you come across a package that does not work for you, there are a few things you can do, including:
2317
2318   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!
2319
2320   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/) .
2321
2322   1. Grab a pre-built package from an [[mirror|mirrors]] site near you. 
2323
2324 ### What is WIP? 
2325
2326 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.
2327
2328 ### Links
2329
2330 * More information: The pkgsrc guide [http://www.netbsd.org/Documentation/pkgsrc/](http://www.netbsd.org/Documentation/pkgsrc/)
2331
2332 * Web interface for searching packages: [http://www.pkgsrc.se](http://www.pkgsrc.se)
2333
2334 * Ways to upgrade packages [http://wiki-static.aydogan.net/How_to_upgrade_packages](http://wiki-static.aydogan.net/How_to_upgrade_packages)
2335
2336 * 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'.
2337
2338 * The #pkgsrc IRC channel on Freenode
2339
2340 * The #dragonflybsd IRC channel on EFnet
2341
2342 # The X Window System 
2343 ***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***
2344
2345
2346
2347 ## Synopsis 
2348
2349 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. 
2350
2351 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.
2352
2353 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.
2354
2355 You may find the FreeBSD X Configuration instructions apply exactly and unchanged in DragonFly BSD.
2356 They are found [[here|http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/x-config.html]]
2357
2358 ## Understanding X 
2359
2360 ### What is X.Org
2361
2362 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.
2363
2364 ### The Window Manager and the Desktop Environment
2365
2366 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.
2367
2368 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.
2369
2370 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.
2371
2372 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.  
2373
2374 If you are brand new and don't know what to do, select the XFCE4 desktop and follow those instructions.
2375 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".
2376
2377 Note that XFCE4 and Gnome and KDE do not require you to install any window manager as they include one automatically.
2378
2379 ## Installing X
2380
2381 **X.org**  is currently available in the DragonFly dports collection.
2382
2383 To install:
2384
2385     pkg install xorg-7.7
2386
2387 By the time you read this, it might be a newer version of xorg than 7.7, you can also try this general command:
2388
2389     pkg install xorg
2390
2391 ## Configuring X
2392
2393 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:
2394
2395     hald_enable ="YES"
2396     dbus_enable= "YES" 
2397
2398 Also see below about enabling `moused` in rc.conf, which may be required for you to see your mouse pointer in X.
2399
2400 As of version 7.3, Xorg can often work without any configuration file by simply typing at prompt:
2401
2402     
2403
2404     % startx
2405
2406 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.
2407
2408 Configuration of X11 is a multi-step process. The first step is to build an initial configuration file. As the super user, simply run:
2409    
2410
2411     # Xorg -configure
2412
2413 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.
2414
2415 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:
2416
2417    
2418
2419     # Xorg -config xorg.conf.new -retro
2420
2421 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.
2422
2423 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.
2424
2425 **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`:
2426
2427         # rcenable moused
2428
2429 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`.
2430
2431     
2432
2433 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).
2434
2435 ## The X Display Manager 
2436
2437  ***Contributed by Seth Kingsley.***
2438
2439 ### Overview 
2440
2441  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.
2442
2443  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.
2444
2445 ### Using XDM 
2446
2447  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:
2448
2449      
2450
2451     ttyv8   "/usr/pkg/bin/xdm -nodaemon"  xterm   off secure
2452
2453  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.
2454
2455 ### Configuring XDM 
2456
2457  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:
2458
2459 [[!table  data="""
2460 <tablestyle="width:100%">  **File**  |  **Description**
2461 <tablestyle="width:100%"> `Xaccess` | Client authorization ruleset.
2462 `Xresources` | Default X resource values.
2463 `Xservers` | List of remote and local displays to manage.
2464 `Xsession` | Default session script for logins.
2465 `Xsetup_`* | Script to launch applications before the login interface.
2466 `xdm-config` | Global configuration for all displays running on this machine.
2467 `xdm-errors` | Errors generated by the server program.
2468 `xdm-pid` | The process ID of the currently running XDM. |
2469
2470 """]]
2471
2472  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).
2473
2474  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.
2475
2476 #### Xaccess 
2477
2478  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.
2479
2480 #### Xresources 
2481
2482  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.
2483
2484 #### Xservers 
2485
2486  This is a list of the remote displays the chooser should provide as choices.
2487
2488 #### Xsession 
2489
2490  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.
2491
2492 #### Xsetup_* 
2493
2494  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`.
2495
2496 #### xdm-config 
2497
2498  This contains settings in the form of app-defaults that are applicable to every display that this installation manages.
2499
2500 #### xdm-errors 
2501
2502  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.
2503
2504 ### Running a Network Display Server 
2505
2506  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:
2507
2508      
2509
2510     ! SECURITY: do not listen for XDMCP or Chooser requests
2511
2512     ! Comment out this line if you want to manage X terminals with xdm
2513
2514     DisplayManager.requestPort:     0
2515
2516  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.
2517
2518 ### Replacements for XDM 
2519
2520  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.
2521
2522 ----
2523
2524 ## Desktop Environments 
2525
2526  ***Contributed by Valentino Vaschetto. ***
2527
2528  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** .
2529
2530 ### GNOME 
2531
2532 #### About GNOME 
2533
2534    **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.
2535
2536 #### Installing GNOME 
2537
2538    **GNOME**  can be easily installed from a package or from the pkgsrc framework:
2539
2540   To install the  **GNOME**  package from the network, simply type:
2541
2542     # pkg install gnome-desktop
2543
2544   To build  **GNOME**  from source, if you have the pkgsrc tree on your system:      
2545
2546     # cd /usr/pkgsrc/meta-pkgs/gnome
2547
2548     # bmake install clean
2549
2550   Once  **GNOME**  is installed, the X server must be told to start  **GNOME**  instead of a default window manager.
2551
2552   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.
2553
2554 **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:
2555
2556       
2557
2558     % echo "/usr/pkg/bin/gnome-session" > ~/.xinitrc
2559
2560   Next, type `startx`, and the  **GNOME**  desktop environment will be started.
2561
2562 **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** :
2563
2564         
2565
2566     % echo "#!/bin/sh" > ~/.xsession
2567
2568     % echo "/usr/pkg/bin/gnome-session" >> ~/.xsession
2569
2570     % chmod +x ~/.xsession
2571
2572   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** .
2573
2574 #### Anti-aliased Fonts with GNOME 
2575
2576   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).
2577   
2578   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.
2579
2580 ### KDE 
2581
2582 #### About KDE 
2583
2584   **KDE**  is an easy to use contemporary desktop environment. Some of the things that  **KDE**  brings to the user are:
2585
2586 * A beautiful contemporary desktop
2587
2588 * A desktop exhibiting complete network transparency
2589
2590 * An integrated help system allowing for convenient, consistent access to help on the use of the  **KDE**  desktop and its applications
2591
2592 * Consistent look and feel of all  **KDE**  applications
2593
2594 * Standardized menu and toolbars, keybindings, color-schemes, etc.
2595
2596 * Internationalization:  **KDE**  is available in more than 40 languages
2597
2598 * Centralized consisted dialog driven desktop configuration
2599
2600 * A great number of useful  **KDE**  applications
2601
2602   **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/).
2603
2604 #### Installing KDE 
2605
2606  Just as with  **GNOME**  or any other desktop environment, the easiest way to install  **KDE**  is through the pkgsrc framework or from a package:
2607
2608  To install the  **KDE**  4.10 package from the network, simply type:
2609
2610    # pkg install kde-4.10
2611
2612  To build  **KDE**  from source, using the pkgsrc framework:
2613
2614     # cd /usr/pkgsrc/meta-pkgs/kde3
2615
2616     # bmake install clean
2617
2618  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:
2619
2620     % echo "exec startkde" > ~/.xinitrc
2621
2622  Now, whenever the X Window System is invoked with `startx`,  **KDE**  will be the desktop.
2623
2624  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.
2625
2626 #### More Details on KDE 
2627
2628  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.
2629
2630  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.
2631
2632 #### The KDE Display Manager 
2633
2634  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.
2635
2636  To enable  **kdm** , the `ttyv8` entry in `/etc/ttys` has to be adapted. The line should look as follows:
2637   
2638
2639     ttyv8 "/usr/pkg/bin/kdm -nodaemon" xterm on secure
2640
2641     
2642 ### XFce 
2643
2644 #### About XFce 
2645
2646   **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:
2647
2648 * A simple, easy-to-handle desktop
2649
2650 * Fully configurable via mouse, with drag and drop, etc
2651
2652 * Main panel similar to  **CDE** , with menus, applets and applications launchers
2653
2654 * Integrated window manager, file manager, sound manager,  **GNOME**  compliance module, and other things
2655
2656 * Themeable (since it uses GTK+)
2657
2658 * Fast, light and efficient: ideal for older/slower machines or machines with memory limitations
2659
2660 More information on  **XFce**  can be found on the [XFce website](http://www.xfce.org/).
2661
2662 #### Installing XFce 
2663
2664  A binary package for  **XFce**  exists. To install, simply type:
2665
2666     # pkg install xfce
2667
2668 This should install the main xfce4 desktop package, and most of the required components.
2669
2670  Alternatively, to build from source, use the pkgsrc framework:
2671
2672    
2673
2674     # cd /usr/pkgsrc/meta-pkgs/xfce4
2675
2676     # bmake install clean
2677
2678  Now, tell the X server to launch  **XFce**  the next time X is started. Simply type this:
2679
2680     % echo "/usr/pkg/bin/startxfce4" > ~/.xinitrc
2681
2682  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).
2683
2684 <!-- XXX: FreeBSD's handbook has a nice user-oriented section about X applications here. maybe we should have one, too -->
2685
2686 ----
2687
2688 # Configuration and Tuning 
2689
2690 ***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.***
2691
2692
2693
2694 ##Synopsis 
2695
2696 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.
2697
2698 After reading this chapter, you will know:
2699
2700 * How to efficiently work with file systems and swap partitions.
2701
2702 * The basics of `rc.conf` configuration and `rc.d` startup systems.
2703
2704 * How to configure and test a network card.
2705
2706 * How to configure virtual hosts on your network devices.
2707
2708 * How to use the various configuration files in `/etc`.
2709
2710 * How to tune DragonFly using `sysctl` variables.
2711
2712 * How to tune disk performance and modify kernel limitations.
2713
2714 Before reading this chapter, you should:
2715
2716 * Understand UNIX® and DragonFly basics ([Chapter 3](basics.html)).
2717
2718 * Be familiar with the basics of kernel configuration/compilation ([Chapter 9](kernelconfig.html)).
2719
2720 ## Initial Configuration 
2721
2722 ### Partition Layout 
2723
2724 #### Base Partitions 
2725
2726 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`.
2727 <!-- 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? -->
2728
2729 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.
2730
2731 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.
2732
2733 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.
2734
2735 #### Swap Partition 
2736
2737 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.
2738 <!-- XXX: do we really recommend double the RAM for swap? IMHO the amount of RAM should be more than enough -->
2739
2740 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.
2741
2742 #### Why Partition? 
2743
2744 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`.
2745
2746 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.
2747 <!-- XXX: again, same story about the edges of disks... -->
2748
2749 CategoryHandbook
2750
2751 CategoryHandbook-configuration
2752
2753 ## Core Configuration 
2754
2755 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.
2756
2757 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.
2758
2759 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.
2760
2761 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:
2762
2763 * rc.conf:
2764
2765         hostname="node15.example.com"
2766
2767         network_interfaces="fxp0 lo0"
2768
2769         ifconfig_fxp0="inet 10.1.1.1"
2770
2771   
2772
2773 * rc.conf.site: 
2774
2775         defaultrouter="10.1.1.254"
2776
2777         saver="daemon"
2778
2779         blanktime="100"
2780
2781   
2782
2783 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.
2784
2785 Upgrading the system using `make world` will not overwrite the `rc.conf` file, so system configuration information will not be lost.
2786
2787 CategoryHandbook
2788
2789 CategoryHandbook-configuration
2790
2791 ## Application Configuration 
2792
2793 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.
2794
2795 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.
2796
2797 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.
2798
2799 For example, consider the contents of the directory `/usr/pkg/etc/httpd`:
2800
2801     
2802
2803     total 90
2804
2805     -rw-r--r--  1 root  wheel  -   34K Jan 11 12:04 httpd.conf
2806
2807     -rw-r--r--  1 root  wheel  -   13K Jan 11 12:02 magic
2808
2809     -rw-r--r--  1 root  wheel  -   28K Jan 11 12:02 mime.types
2810
2811     -rw-r--r--  1 root  wheel  -   11K Jan 11 12:02 ssl.conf
2812
2813     
2814     
2815     
2816     
2817     
2818
2819 ## Starting Services 
2820
2821 It is common for a system to host a number of services. These may be started in several different fashions, each having different advantages.
2822
2823 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.
2824
2825 A generic startup script in `/usr/pkg/share/examples/rc.d` looks like:
2826
2827     
2828
2829     #!/bin/sh
2830
2831     echo -n ' FooBar'
2832
2833     
2834
2835     case "$1" in
2836
2837     start)
2838
2839             /usr/pkg/bin/foobar
2840
2841             ;;
2842
2843     stop)
2844
2845             kill -9 `cat /var/run/foobar.pid`
2846
2847             ;;
2848
2849     
2850 *)
2851
2852             echo "Usage: `basename $0` {start|stop}" >&2
2853
2854             exit 64
2855
2856             ;;
2857
2858     esac
2859
2860     
2861
2862     exit 0
2863
2864     
2865
2866 <!-- XXX: I don't think we actually look in /usr/pkg/share/examples/rc.d -->
2867
2868 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:
2869
2870     
2871
2872     # chmod 755 "FooBar.sh"
2873
2874 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.
2875
2876 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.
2877
2878  **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.
2879
2880 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.
2881
2882 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.
2883
2884 CategoryHandbook
2885
2886 CategoryHandbook-configuration
2887
2888 ## Configuring the cron Utility 
2889
2890 <!-- XXX: can't really comment on this. someone please revise it -->
2891
2892 ***Contributed by Tom Rhodes. ***
2893
2894 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.
2895
2896 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.
2897
2898  **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.
2899
2900 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`.
2901
2902 Let us take a look at the `/etc/crontab` file (the system crontab):
2903
2904     
2905
2906     # /etc/crontab - root's crontab for DragonFly
2907
2908     #
2909
2910     #                                                                  (1)
2911
2912     #
2913
2914     SHELL=/bin/sh
2915
2916     PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin                            (2)
2917
2918     HOME=/var/log
2919
2920     #
2921
2922     #
2923
2924     #minute     hour    mday    month   wday    who     command            (3)
2925
2926     #
2927
2928     #
2929
2930     
2931     */5 *       *       *       *       root    /usr/libexec/atrun (4)
2932
2933  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.
2934
2935  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.
2936
2937  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.
2938
2939  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.
2940
2941 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.
2942
2943 ### Installing a Crontab 
2944
2945  **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.
2946
2947 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:
2948
2949     
2950
2951     % crontab crontab-file
2952
2953 In this example, `crontab-file` is the filename of a `crontab` that was previously created.
2954
2955 There is also an option to list installed `crontab` files: just pass the `-l` option to `crontab` and look over the output.
2956
2957 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.
2958
2959 If you later want to remove your user `crontab` completely, use `crontab` with the `-r` option.
2960
2961 ## Using rc under DragonFly 
2962
2963 ***Contributed by Tom Rhodes. ***
2964
2965 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:
2966
2967     
2968
2969     # /etc/rc.d/sshd restart
2970
2971 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`:
2972
2973     natd_enable="YES"
2974
2975 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.
2976
2977 Another way to add services to the automatic startup/shutdown is to type, for example for `natd`,
2978
2979      # rcenable natd
2980
2981 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:
2982
2983     
2984
2985     # /etc/rc.d/sshd forcerestart
2986
2987 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:
2988
2989     
2990
2991     # /etc/rc.d/sshd rcvar
2992
2993     # sshd
2994
2995     $sshd_enable=YES
2996
2997  **Note:** The second line (`# sshd`) is the output from the `rc.d` script, not a `root` prompt.
2998
2999 To determine if a service is running, a `status` option is available. For instance to verify that `sshd` is actually started:
3000
3001     
3002
3003     # /etc/rc.d/sshd status
3004
3005     sshd is running as pid 433.
3006
3007 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.
3008
3009 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.
3010
3011 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:
3012
3013 * `PROVIDE`: Specifies the services this file provides.
3014
3015 * `REQUIRE`: Lists services which are required for this service. This file will run ***after*** the specified services.
3016
3017 * `BEFORE`: Lists services which depend on this service. This file will run ***before*** the specified services.
3018
3019 * 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.
3020
3021   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.
3022
3023 By using this method, an administrator can easily control system services without the hassle of ***runlevels*** like some other UNIX® operating systems.
3024
3025 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.
3026
3027 ### Using DragonFly's rcrun(8) 
3028
3029 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)
3030
3031 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.
3032
3033 The remaining commands are:
3034
3035 [[!table  data="""
3036   **disable**  | Sets the corresponding `_enable` variable in rc.conf(5) to ***NO*** and runs the stop command. 
3037   **enable**   | Sets the corresponding `_enable` variable in rc.conf(5) to ***YES*** and runs the start command. 
3038   **list**  | Shows the status of the specified scripts.  If no argument is specified, the status of all scripts is shown. |
3039
3040 """]]
3041
3042 To enable the [dntpd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dntpd&section=8) service, you can use:
3043
3044      # rcenable dntpd
3045      
3046  
3047
3048 To check if [dntpd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dntpd&section=8) is running you can use the following command:
3049
3050     
3051
3052     # rclist dntpd
3053
3054     rcng_dntpd=stopped
3055
3056 To start [dntpd(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=dntpd&section=8):
3057
3058     
3059
3060     # rcstart dntpd
3061
3062     Running /etc/rc.d/dntpd start
3063
3064     Starting dntpd.
3065
3066 Restart and stop works the same way:
3067
3068     
3069
3070     # rcrestart dntpd
3071
3072     Stopping dntpd.
3073
3074     Starting dntpd.
3075
3076     
3077
3078     # rcstop dntpd
3079
3080     Stopping dntpd.
3081
3082 If a service is not enabled in `/etc/rc.conf`, but you want it start anyway, execute the following:
3083
3084     
3085
3086     # rcforce dntpd
3087
3088     Running /etc/rc.d/dntpd forcestart
3089
3090     Starting dntpd.
3091
3092 #### Notes 
3093
3094 [[!table  data="""
3095 <tablestyle="width:100%"> [(1)](configtuning-rcng.html#AEN4751) | Previously this was used to define *BSD dependent features.
3096 | |
3097
3098 """]]
3099
3100 ## Setting Up Network Interface Cards 
3101
3102 ***Contributed by Marc Fonvieille. ***
3103
3104 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.
3105
3106 ### Locating the Correct Driver 
3107
3108 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.
3109
3110 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.
3111
3112 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:
3113
3114     
3115
3116     dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38
3117
3118     000ff irq 15 at device 11.0 on pci0
3119
3120     dc0: Ethernet address: 00:a0:cc:da:da:da
3121
3122     miibus0: <MII bus> on dc0
3123
3124     ukphy0: <Generic IEEE 802.3u media interface> on miibus0
3125
3126     ukphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
3127
3128     dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30
3129
3130     000ff irq 11 at device 12.0 on pci0
3131
3132     dc1: Ethernet address: 00:a0:cc:da:da:db
3133
3134     miibus1: <MII bus> on dc1
3135
3136     ukphy1: <Generic IEEE 802.3u media interface> on miibus1
3137
3138     ukphy1:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
3139
3140 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.
3141
3142 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.
3143
3144 ### Configuring the Network Card 
3145
3146 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.
3147
3148 To display the configuration for the network interfaces on your system, enter the following command:
3149
3150     
3151
3152     % ifconfig
3153
3154     dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
3155
3156             inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
3157
3158             ether 00:a0:cc:da:da:da
3159
3160             media: Ethernet autoselect (100baseTX <full-duplex>)
3161
3162             status: active
3163
3164     dc1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
3165
3166             inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
3167
3168             ether 00:a0:cc:da:da:db
3169
3170             media: Ethernet 10baseT/UTP
3171
3172             status: no carrier
3173
3174     lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
3175
3176     lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
3177
3178             inet 127.0.0.1 netmask 0xff000000
3179
3180     tun0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
3181
3182  **Note:** Note that entries concerning IPv6 (`inet6` etc.) were omitted in this example.
3183
3184 In this example, the following devices were displayed:
3185
3186 * `dc0`: The first Ethernet interface
3187
3188 * `dc1`: The second Ethernet interface
3189
3190 * `lp0`: The parallel port interface
3191
3192 * `lo0`: The loopback device
3193
3194 * `tun0`: The tunnel device used by  **ppp** 
3195
3196 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.
3197
3198 In this example, the `dc0` device is up and running. The key indicators are:
3199
3200   1. `UP` means that the card is configured and ready.
3201
3202   1. The card has an Internet (`inet`) address (in this case `192.168.1.3`).
3203
3204   1. It has a valid subnet mask (`netmask`; `0xffffff00` is the same as `255.255.255.0`).
3205
3206   1. It has a valid broadcast address (in this case, `192.168.1.255`).
3207
3208   1. The MAC address of the card (`ether`) is `00:a0:cc:da:da:da`
3209
3210   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.
3211
3212   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.
3213
3214 If the [ifconfig(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=ifconfig&section=8) output had shown something similar to:
3215
3216     
3217
3218     dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
3219
3220                 ether 00:a0:cc:da:da:da
3221
3222 it would indicate the card has not been configured.
3223
3224 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.
3225
3226     
3227
3228     # ifconfig dc0 inet 192.168.1.3 netmask 255.255.255.0
3229
3230 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.
3231
3232 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:
3233
3234     
3235
3236     ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0"
3237
3238     ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP"
3239
3240 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`.
3241
3242 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.
3243
3244 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`.
3245
3246 ### Testing and Troubleshooting 
3247
3248 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.
3249
3250 Once the system has been rebooted, you should test the network interfaces.
3251
3252 #### Testing the Ethernet Card 
3253
3254 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.
3255
3256 First test the local interface:
3257
3258     
3259
3260     % ping -c5 192.168.1.3
3261
3262     PING 192.168.1.3 (192.168.1.3): 56 data bytes
3263
3264     64 bytes from 192.168.1.3: icmp_seq#0 ttl64 time=0.082 ms
3265
3266     64 bytes from 192.168.1.3: icmp_seq#1 ttl64 time=0.074 ms
3267
3268     64 bytes from 192.168.1.3: icmp_seq#2 ttl64 time=0.076 ms
3269
3270     64 bytes from 192.168.1.3: icmp_seq#3 ttl64 time=0.108 ms
3271
3272     64 bytes from 192.168.1.3: icmp_seq#4 ttl64 time=0.076 ms
3273
3274     
3275
3276     --- 192.168.1.3 ping statistics ---
3277
3278     5 packets transmitted, 5 packets received, 0% packet loss
3279
3280     round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms
3281
3282 Now we have to ping another machine on the LAN:
3283
3284     
3285
3286     % ping -c5 192.168.1.2
3287
3288     PING 192.168.1.2 (192.168.1.2): 56 data bytes
3289
3290     64 bytes from 192.168.1.2: icmp_seq#0 ttl64 time=0.726 ms
3291
3292     64 bytes from 192.168.1.2: icmp_seq#1 ttl64 time=0.766 ms
3293
3294     64 bytes from 192.168.1.2: icmp_seq#2 ttl64 time=0.700 ms
3295
3296     64 bytes from 192.168.1.2: icmp_seq#3 ttl64 time=0.747 ms
3297
3298     64 bytes from 192.168.1.2: icmp_seq#4 ttl64 time=0.704 ms
3299
3300     
3301
3302     --- 192.168.1.2 ping statistics ---
3303
3304     5 packets transmitted, 5 packets received, 0% packet loss
3305
3306     round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms
3307
3308 You could also use the machine name instead of `192.168.1.2` if you have set up the `/etc/hosts` file.
3309
3310 #### Troubleshooting 
3311
3312 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.
3313
3314 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.
3315
3316 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.
3317
3318 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.
3319
3320 ***`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].
3321
3322 ***`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.
3323
3324 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.
3325
3326 ## Virtual Hosts 
3327
3328 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.
3329
3330 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`.
3331
3332 An alias entry for the interface `fxp0` looks like:
3333
3334     
3335
3336     ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"
3337
3338 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.
3339
3340 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`).
3341
3342 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`.
3343
3344 The following entries configure the adapter correctly for this arrangement:
3345
3346     
3347
3348      ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0"
3349
3350      ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255"
3351
3352      ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255"
3353
3354      ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255"
3355
3356      ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255"
3357
3358      ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240"
3359
3360      ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255"
3361
3362      ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255"
3363
3364      ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"
3365
3366 CategoryHandbook
3367
3368 CategoryHandbook-configuration
3369
3370 ## Configuration Files 
3371
3372 ### /etc Layout 
3373
3374 There are a number of directories in which configuration information is kept. These include:
3375
3376 [[!table  data="""
3377  `/etc` | Generic system configuration information; data here is system-specific. 
3378  `/etc/defaults` | Default versions of system configuration files. 
3379  `/etc/mail` | Extra [sendmail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=sendmail&section=8) configuration, other MTA configuration files. 
3380  `/etc/ppp` | Configuration for both user- and kernel-ppp programs. 
3381  `/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. 
3382  `/usr/local/etc` | Configuration files for installed applications. May contain per-application subdirectories. 
3383  `/usr/local/etc/rc.d` | Start/stop scripts for installed applications. 
3384  `/var/db` | Automatically generated system-specific database files, such as the package database, the locate database, and so on |
3385
3386 """]]
3387
3388 ### Hostnames 
3389
3390 #### /etc/resolv.conf 
3391
3392 `/etc/resolv.conf` dictates how DragonFly's resolver accesses the Internet Domain Name System (DNS).
3393
3394 The most common entries to `resolv.conf` are:
3395
3396 [[!table  data="""
3397  `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.
3398  `search` | Search list for hostname lookup. This is normally determined by the domain of the local hostname. 
3399  `domain` | The local domain name. |
3400
3401 """]]
3402
3403 A typical `resolv.conf`:
3404
3405     
3406
3407     search example.com
3408
3409     nameserver 147.11.1.11
3410
3411     nameserver 147.11.100.30
3412
3413  **Note:** Only one of the `search` and `domain` options should be used.
3414
3415 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.
3416
3417 #### /etc/hosts 
3418
3419 `/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.
3420
3421     
3422
3423     #
3424
3425     #
3426
3427     # Host Database
3428
3429     # This file should contain the addresses and aliases
3430
3431     # for local hosts that share this file.
3432
3433     # In the presence of the domain name service or NIS, this file may
3434
3435     # not be consulted at all; see /etc/nsswitch.conf for the resolution order.
3436
3437     #
3438
3439     #
3440
3441     ::1                     localhost localhost.my.domain myname.my.domain
3442
3443     127.0.0.1               localhost localhost.my.domain myname.my.domain
3444
3445     #
3446
3447     # Imaginary network.
3448
3449     #10.0.0.2               myname.my.domain myname
3450
3451     #10.0.0.3               myfriend.my.domain myfriend
3452
3453     #
3454
3455     # According to RFC 1918, you can use the following IP networks for
3456
3457     # private nets which will never be connected to the Internet:
3458
3459     #
3460
3461     #       10.0.0.0        -   10.255.255.255
3462
3463     #       172.16.0.0      -   172.31.255.255
3464
3465     #       192.168.0.0     -   192.168.255.255
3466
3467     #
3468
3469     # In case you want to be able to connect to the Internet, you need
3470
3471     # real official assigned numbers.  PLEASE PLEASE PLEASE do not try
3472
3473     # to invent your own network numbers but instead get one from your
3474
3475     # network provider (if any) or from the Internet Registry (ftp to
3476
3477     # rs.internic.net, directory `/templates').
3478
3479     #
3480
3481 `/etc/hosts` takes on the simple format of:
3482
3483     
3484
3485     [Internet address] [official hostname] [alias1] [alias2] ...
3486
3487 For example:
3488
3489     
3490
3491     10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2
3492
3493 Consult [hosts(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=hosts&section=5) for more information.
3494
3495 ### Log File Configuration 
3496
3497 #### syslog.conf 
3498
3499 `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.
3500
3501     
3502
3503     #
3504
3505     #
3506
3507     #       Spaces ARE valid field separators in this file. However,
3508
3509     #       other *nix-like systems still insist on using tabs as field
3510
3511     #       separators. If you are sharing this file between systems, you
3512
3513     #       may want to use only tabs as field separators here.
3514
3515     #       Consult the syslog.conf(5) manual page.
3516
3517     
3518 *.err;kern.debug;auth.notice;mail.crit          /dev/console
3519
3520     *.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
3521
3522     security.*                                      /var/log/security
3523
3524     mail.info                                       /var/log/maillog
3525
3526     lpr.info                                        /var/log/lpd-errs
3527
3528     cron.*                                          /var/log/cron
3529
3530     
3531 *.err                                           root
3532
3533     *.notice;news.err                               root
3534
3535     *.alert                                         root
3536
3537     *.emerg                                         *
3538
3539     # uncomment this to log all writes to /dev/console to /var/log/console.log
3540
3541     #console.info                                   /var/log/console.log
3542
3543     # uncomment this to enable logging of all log messages to /var/log/all.log
3544
3545     #*.*                                            /var/log/all.log
3546
3547     # uncomment this to enable logging to a remote log host named loghost
3548
3549     #*.*                                            @loghost
3550
3551     # uncomment these if you're running inn
3552
3553     # news.crit                                     /var/log/news/news.crit
3554
3555     # news.err                                      /var/log/news/news.err
3556
3557     # news.notice                                   /var/log/news/news.notice
3558
3559     !startslip
3560
3561     
3562 *.*                                             /var/log/slip.log
3563
3564     !ppp
3565
3566     
3567 *.*                                             /var/log/ppp.log
3568
3569 Consult the [syslog.conf(5)](http://leaf.dragonflybsd.org/cgi/web-man?command=syslog.conf&section=5) manual page for more information.
3570
3571 #### newsyslog.conf 
3572
3573 `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.
3574
3575 `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.
3576
3577     
3578
3579     # configuration file for newsyslog
3580
3581     #
3582
3583     #
3584
3585     # filename          [owner:group]    mode count size when [ZB] [/pid_file] [sig_num]
3586
3587     /var/log/cron                           600  3     100  *     Z
3588
3589     /var/log/amd.log                        644  7     100  *     Z
3590
3591     /var/log/kerberos.log                   644  7     100  *     Z
3592
3593     /var/log/lpd-errs                       644  7     100  *     Z
3594
3595     /var/log/maillog                        644  7     *    @T00  Z
3596
3597     /var/log/sendmail.st                    644  10    *    168   B
3598
3599     /var/log/messages                       644  5     100  *     Z
3600
3601     /var/log/all.log                        600  7     *    @T00  Z
3602
3603     /var/log/slip.log                       600  3     100  *     Z
3604
3605     /var/log/ppp.log                        600  3     100  *     Z
3606
3607     /var/log/security                       600  10    100  *     Z
3608
3609     /var/log/wtmp                           644  3     *    @01T05 B
3610
3611     /var/log/daily.log                      640  7     *    @T00  Z
3612
3613     /var/log/weekly.log                     640  5     1    $W6D0 Z
3614
3615     /var/log/monthly.log                    640  12    *    $M1D0 Z
3616
3617     /var/log/console.log                    640  5     100  *     Z
3618
3619 Consult the [newsyslog(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=newsyslog&section=8) manual page for more information.
3620
3621 ### sysctl.conf 
3622
3623 `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.
3624
3625 A sample `sysctl.conf` turning off logging of fatal signal exits and letting Linux programs know they are really running under DragonFly:
3626
3627     
3628
3629     kern.logsigexit=0       # Do not log fatal signal exits (e.g. sig 11)
3630
3631     compat.linux.osname=DragonFly
3632
3633     compat.linux.osrelease=4.3-STABLE
3634
3635     
3636     
3637     
3638     
3639     
3640 ## Tuning with sysctl 
3641
3642 [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).
3643
3644 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.
3645
3646 To view all readable variables:
3647
3648     
3649
3650     % sysctl -a
3651
3652 To read a particular variable, for example, `kern.maxproc`:
3653
3654     
3655
3656     % sysctl kern.maxproc
3657
3658     kern.maxproc: 1044
3659
3660 To set a particular variable, use the intuitive `***variable***`=`***value***` syntax:
3661
3662     
3663
3664     # sysctl kern.maxfiles=5000
3665
3666     kern.maxfiles: 2088 -< 5000
3667
3668 Settings of sysctl variables are usually either strings, numbers, or booleans (a boolean being `1` for yes or a `0` for no).
3669
3670 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].
3671
3672 ### sysctl(8) Read-only 
3673
3674 ***Contributed by Tom Rhodes. ***
3675
3676 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.
3677
3678 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:
3679
3680     
3681
3682     cbb0: Could not map register memory
3683
3684     device_probe_and_attach: cbb0 attach returned 12
3685
3686 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.
3687
3688 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.
3689
3690 ## Tuning Disks 
3691
3692 ### Sysctl Variables 
3693
3694 #### `vfs.vmiodirenable` 
3695
3696 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.
3697
3698 #### `vfs.write_behind` 
3699
3700 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.
3701
3702 #### `vfs.hirunningspace` 
3703
3704 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.
3705
3706 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.
3707
3708 #### `vm.swap_idle_enabled` 
3709
3710 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.
3711
3712 #### `hw.ata.wc` 
3713
3714 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.
3715
3716 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.
3717
3718 For more information, please see [ata(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=ata&section=4) manual page.
3719
3720 <!-- XXX: add some more sysctls, e.g. relating to AHCI, nata, ... -->
3721
3722 ### Soft Updates 
3723
3724 **Note** that soft updates are only available on UFS.
3725
3726 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:
3727
3728     
3729
3730     # tunefs -n enable /filesystem
3731
3732     # tunefs -n disable /filesystem
3733
3734 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.
3735
3736  **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).
3737
3738 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.
3739
3740 #### More Details about Soft Updates 
3741 <!-- XXX: consider axing this section -->
3742
3743 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.)
3744
3745 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`).
3746
3747 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.
3748
3749 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.
3750
3751 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.
3752
3753 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.
3754
3755 ## Tuning Kernel Limits 
3756
3757 ### File/Process Limits 
3758
3759 #### `kern.maxfiles` 
3760
3761 <!-- XXX: revise this section; someone who knows about it -->
3762
3763 `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.
3764
3765 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.
3766
3767 `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.
3768
3769  **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.
3770
3771 #### `kern.ipc.somaxconn` 
3772
3773 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.
3774
3775 ### Network Limits 
3776
3777 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.
3778
3779 <!-- XXX: mention kern.ipc.mbufs sysctl -->
3780
3781 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.
3782
3783  **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.
3784
3785 #### `net.inet.ip.portrange.*` 
3786
3787 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.
3788
3789 #### TCP Bandwidth Delay Product 
3790 <!-- XXX: Revise this stuff, I'm not familiar with it -->
3791
3792 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.
3793
3794 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).
3795
3796 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.
3797
3798 ## Adding Swap Space 
3799 <!-- XXX: swapcache -->
3800
3801 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.
3802
3803 ### Swap on a New Hard Drive 
3804
3805 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.
3806
3807 ### Swapping over NFS 
3808
3809 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.
3810
3811 ### Swapfiles 
3812
3813 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.
3814
3815  **Example 6-1. Creating a Swapfile** 
3816
3817   1. Be certain that your kernel configuration includes the vnode driver. It is ***not*** in recent versions of `GENERIC`.
3818
3819       
3820
3821          pseudo-device   vn 1   #Vnode driver (turns a file into a device)
3822
3823   
3824
3825   1. Create a swapfile (`/usr/swap0`):
3826
3827       
3828
3829          # dd if=/dev/zero of=/usr/swap0 bs=1024k count=64
3830
3831   
3832
3833   1. Set proper permissions on (`/usr/swap0`):
3834
3835       
3836
3837          # chmod 0600 /usr/swap0
3838
3839   
3840
3841   1. Enable the swap file in `/etc/rc.conf`:
3842
3843       
3844
3845          swapfile="/usr/swap0"   # Set to name of swapfile if aux swapfile desired.
3846
3847   
3848
3849   1. Reboot the machine or to enable the swap file immediately, type:
3850
3851       
3852
3853          # vnconfig -e /dev/vn0b /usr/swap0 swap
3854
3855   
3856
3857 ## Power and Resource Management 
3858
3859 ***Written by Hiten Pandya and Tom Rhodes. ***
3860
3861 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.
3862
3863 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.
3864
3865 ### What Is ACPI? 
3866
3867 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).
3868
3869 ### Shortcomings of Advanced Power Management (APM) 
3870
3871 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.
3872
3873 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.
3874
3875 ***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.
3876
3877 The DragonFly APM driver is documented in the [apm(4)](http://leaf.dragonflybsd.org/cgi/web-man?command=apm&section=4) manual page.
3878
3879 ### Configuring ACPI 
3880
3881 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.
3882
3883  **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.
3884
3885 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:
3886
3887   
3888
3889     # halt -p
3890
3891 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.
3892
3893 ## Using and Debugging DragonFly ACPI 
3894
3895 ***Written by Nate Lawson. With contributions from Peter Schultz and Tom Rhodes. ***
3896
3897 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.
3898
3899 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.
3900
3901 ### Submitting Debugging Information 
3902
3903  **Note:** Before submitting a problem, be sure you are running the latest BIOS version and, if available, embedded controller firmware version.
3904
3905 For those of you that want to submit a problem right away, please send the following information to [bugs](http://leaf.dragonflybsd.org/mailarchive/)
3906
3907 * 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.
3908
3909 * The dmesg output after ***boot `-v`***, including any error messages generated by you exercising the bug.
3910
3911 * dmesg output from ***boot `-v`*** with ACPI disabled, if disabling it helps fix the problem.
3912
3913 * Output from ***sysctl hw.acpi***. This is also a good way of figuring out what features your system offers.
3914
3915 * 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:
3916       
3917
3918       # acpidump -t -d > name-system.asl
3919
3920   
3921
3922   (Substitute your login name for `name` and manufacturer/model for `system`. Example: `njl-FooCo6000.asl`)
3923
3924 ### Background 
3925
3926 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.
3927
3928 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.
3929
3930 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`.
3931
3932 ### Common Problems 
3933
3934 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.
3935
3936 #### Suspend/Resume 
3937
3938 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.
3939
3940 Start by checking `sysctl` `hw.acpi` for the suspend-related items. Here are the results for my Thinkpad:
3941
3942     hw.acpi.supported_sleep_state: S3 S4 S5
3943
3944     hw.acpi.s4bios: 0
3945
3946 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.
3947
3948 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.
3949
3950 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.
3951
3952 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.
3953
3954 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.
3955
3956 <-- XXX: mention sensors somewhere; but not in this section -->
3957
3958 #### System Hangs (temporary or permanent) 
3959
3960 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).
3961
3962 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`.
3963
3964 Your best hope when dealing with interrupt problems is to try disabling APIC support with `hint.apic.0.disabled="1"` in `loader.conf`.
3965
3966 #### Panics 
3967
3968 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.
3969
3970 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.
3971
3972 #### System Powers Up After Suspend or Shutdown 
3973
3974 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.
3975
3976 #### Other Problems 
3977
3978 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.
3979
3980 ### ASL, acpidump, and IASL 
3981 <!-- XXX: IMHO all this crap about fixing your DSDT etc should  be axed -->
3982
3983 The most common problem is the BIOS vendors providing incorrect (or outright buggy!) bytecode. This is usually manifested by kernel console messages like this:
3984
3985     
3986
3987     ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\
3988
3989     (Node 0xc3f6d160), AE_NOT_FOUND
3990
3991 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.
3992
3993 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:
3994
3995     
3996
3997     # iasl your.asl
3998
3999 ### Fixing Your ASL 
4000
4001 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.
4002
4003 Here is a list of common error messages, their cause, and how to fix them:
4004
4005 #### OS dependencies 
4006
4007 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.
4008
4009 #### Missing Return statements 
4010
4011 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.
4012
4013 #### Overriding the Default AML 
4014
4015 After you customize `your.asl`, you will want to compile it, run:
4016    
4017
4018     # iasl your.asl
4019
4020 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.
4021
4022 `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:
4023
4024     
4025
4026     acpi_dsdt_load="YES"
4027
4028     acpi_dsdt_name="/boot/DSDT.aml"
4029
4030 Be sure to copy your `DSDT.aml` to the `/boot` directory.
4031
4032 ### Getting Debugging Output From ACPI 
4033
4034 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.
4035
4036 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:
4037
4038     
4039
4040     # cd /sys/dev/acpica5 && make clean && make ACPI_DEBUG=1
4041
4042 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.
4043
4044     
4045
4046     debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS"
4047
4048     debug.acpi.level="ACPI_LV_ERROR"
4049
4050 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`.
4051
4052 ### References 
4053
4054 More information about ACPI may be found in the following locations:
4055
4056 * 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.)
4057
4058 * The ACPI Mailing List Archives (FreeBSD) http://lists.freebsd.org/pipermail/freebsd-acpi/
4059
4060 * The old ACPI Mailing List Archives (FreeBSD) http://home.jp.FreeBSD.org/mail-list/acpi-jp/
4061
4062 * The ACPI 2.0 Specification http://acpi.info/spec.htm
4063
4064 * 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)
4065
4066 * [DSDT debugging resource](http://www.cpqlinux.com/acpi-howto.html#fix_broken_dsdt). (Uses Compaq as an example but generally useful.)
4067
4068 # The DragonFly virtual kernels 
4069
4070
4071 ***Obtained from [vkernel(7)](http://leaf.dragonflybsd.org/cgi/web-man?command=vkernel&section=7) written by Sascha Wildner, added by Matthias Schmidt***
4072
4073 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.
4074
4075 The vkernel architecture allows for running DragonFly kernels in userland.
4076
4077 ## Supported devices 
4078
4079 A number of virtual device drivers exist to supplement the virtual kernel.
4080
4081 <!-- XXX: why do they only support 16 devices? is this really true? -->
4082
4083 ### Disk device 
4084
4085 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`.
4086
4087 ### CD-ROM device 
4088
4089 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.
4090
4091 ### Network interface 
4092
4093 The vke driver supports up to 16 virtual network interfaces which are
4094
4095 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.
4096
4097 ## Setup a virtual kernel environment 
4098
4099 A couple of steps are necessary in order to prepare the system to build and run a virtual kernel.
4100
4101 ### Setting up the filesystem 
4102
4103 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`:
4104
4105     
4106
4107     % mkdir /home/var.vkernel
4108     % ln -s /home/var.vkernel /var/vkernel
4109
4110 Next, a filesystem image to be used by the virtual kernel has to be created and populated (assuming world has been built previously):    
4111
4112     # dd if=/dev/zero of=/var/vkernel/rootimg.01 bs=1m count=2048
4113     # vnconfig -c vn0 /var/vkernel/rootimg.01
4114     # disklabel -r -w vn0s0 auto
4115     # disklabel -e vn0s0      # add 'a' partition with fstype `4.2BSD' size could be '*'
4116     # newfs /dev/vn0s0a
4117     # mount /dev/vn0s0a /mnt
4118
4119 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.
4120
4121 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).
4122
4123     # cd /usr/src
4124     # make installworld DESTDIR=/mnt
4125     # cd etc
4126     # make distribution DESTDIR=/mnt
4127
4128 Create a fstab file to let the vkernel find your image file.
4129
4130     
4131
4132     # echo '/dev/vkd0s0a      /       ufs     rw      1  1' >/mnt/etc/fstab
4133     # echo 'proc              /proc   procfs  rw      0  0' >>/mnt/etc/fstab
4134
4135 Edit `/mnt/etc/ttys` and replace the console entry with the following line and turn off all other gettys.
4136
4137     # console "/usr/libexec/getty Pc"         cons25  on  secure
4138
4139 Then, unmount the disk.
4140
4141     # umount /mnt
4142     # vnconfig -u vn0
4143
4144 ### Compiling the virtual kernel 
4145
4146 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):
4147     
4148
4149     # cd /usr/src
4150     # make -DNO_MODULES buildkernel KERNCONF=VKERNEL
4151     # make -DNO_MODULES installkernel KERNCONF=VKERNEL DESTDIR=/var/vkernel
4152
4153 ### Enabling virtual kernel operation 
4154
4155 A special sysctl(8), `vm.vkernel_enable`, must be set to enable vkernel operation:
4156
4157     # sysctl vm.vkernel_enable=1
4158
4159 To make this change permanent, edit `/etc/sysctl.conf`
4160
4161 ## Setup networking 
4162
4163 ### Configuring the network on the host system 
4164
4165 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:
4166
4167     
4168
4169     # kldload if_bridge.ko
4170     # kldload if_tap.ko
4171     # ifconfig bridge0 create
4172     # ifconfig bridge0 addm re0       # assuming re0 is the host's interface
4173     # ifconfig bridge0 up
4174
4175  **Note** : You have to change `re0` to the interface of your host machine.
4176
4177  
4178  
4179  
4180 ## Run a virtual kernel 
4181
4182 Finally, the virtual kernel can be run:
4183
4184     # cd /var/vkernel
4185     # ./boot/kernel/kernel -m 64m -r /var/vkernel/rootimg.01 -I auto:bridge0
4186
4187 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.
4188
4189
4190 # The DragonFly Booting Process 
4191
4192
4193 ## Synopsis 
4194
4195 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.
4196
4197 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.
4198
4199 After reading this chapter, you will know:
4200
4201 * What the components of the DragonFly bootstrap system are, and how they interact.
4202
4203 * The options you can give to the components in the DragonFly bootstrap to control the boot process.
4204
4205 * The basics of [device.hints(5)](http://leaf.dragonflybsd.org/cgi/web-man?command#device.hints&section5&manpath=FreeBSD+5.2-current).
4206
4207  **x86 Only:** This chapter only describes the boot process for DragonFly running on x86 systems.
4208
4209 ## The Booting Problem 
4210
4211 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?
4212
4213 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***.
4214
4215 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.
4216
4217 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.)
4218
4219 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`.
4220
4221 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.
4222
4223 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.
4224
4225 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.
4226
4227 ----
4228
4229 ## The Boot Manager and Boot Stages 
4230
4231 ### The Boot Manager 
4232
4233 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** .
4234
4235  **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:
4236
4237  **Example 7-1. `boot0` Screenshot** 
4238
4239     
4240
4241     F1 DOS
4242
4243     F2 FreeBSD
4244
4245     F3 Linux
4246
4247     F4 ??
4248
4249     F5 Drive 1
4250
4251     
4252
4253     Default: F2
4254
4255 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:
4256
4257     
4258
4259     # fdisk -B -b /boot/boot0 device
4260
4261 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).
4262
4263  **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:
4264
4265     
4266
4267     other=/dev/hdXY
4268
4269     table=/dev/hdX
4270
4271     loader=/boot/chain.b
4272
4273     label=DragonFly
4274
4275 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.
4276
4277 ### Stage One, /boot/boot1, and Stage Two, /boot/boot2 
4278
4279 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).
4280
4281 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`.
4282
4283 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.
4284
4285 `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`.
4286
4287 `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.
4288
4289 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.
4290
4291  **Example 7-2. boot2 Screenshot** 
4292
4293     
4294
4295     >> DragonFly/i386 BOOT
4296
4297     Default: 0:ad(0,a)/boot/loader
4298
4299     boot:
4300
4301 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):
4302
4303     
4304
4305     # disklabel -B diskslice
4306
4307 where `***diskslice***` is the disk and slice you boot from, such as `ad0s1` for the first slice on the first IDE disk.
4308
4309 ### Stage Three, `/boot/loader` 
4310
4311 The loader is the final stage of the three-stage bootstrap, and is located on the file system, usually as `/boot/loader`.
4312
4313 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.
4314
4315 #### Loader Program Flow 
4316
4317 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.
4318
4319 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.
4320
4321 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.
4322
4323 #### Loader Built-In Commands 
4324
4325 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).
4326
4327 * 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.
4328
4329 * boot [`***-options***`] [`***kernelname***`]: Immediately proceeds to boot the kernel, with the given options, if any, and with the kernel name given, if it is.
4330
4331 *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`.
4332
4333 * help [`***topic***`]: Shows help messages read from `/boot/loader.help`. If the topic given is `index`, then the list of available topics is given.
4334
4335 * 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.
4336
4337 * 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.
4338
4339 * 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.
4340
4341 * lsdev [`-v`]: Lists all of the devices from which it may be possible to load modules. If `-v` is specified, more details are printed.
4342
4343 * lsmod [`-v`]: Displays loaded modules. If `-v` is specified, more details are shown.
4344
4345 * more `***filename***`: Displays the files specified, with a pause at each `LINES` displayed.
4346
4347 * reboot: Immediately reboots the system.
4348
4349 * set `***variable***`, set `***variable***`=`***value***`: Sets the loader's environment variables.
4350
4351 * unload: Removes all loaded modules.
4352
4353 #### Loader Examples 
4354
4355 Here are some practical examples of loader usage:
4356
4357 * To simply boot your usual kernel, but in single-user mode:
4358
4359       
4360
4361           boot -s
4362
4363   
4364
4365 * To unload your usual kernel and modules, and then load just your old (or another) kernel:
4366
4367       
4368
4369           unload
4370
4371           load kernel.old
4372
4373   
4374
4375   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).
4376
4377    **Note:** Use the following to load your usual modules with another kernel:
4378
4379       
4380
4381           unload
4382
4383           set kernel="kernel.old"
4384
4385           boot-conf
4386
4387   
4388
4389 * To load a kernel configuration script (an automated script which does the things you would normally do in the kernel boot-time configurator):
4390
4391       
4392
4393          load -t userconfig_script /boot/kernel.conf
4394
4395   
4396
4397 ----
4398
4399 ## Kernel Interaction During Boot 
4400
4401 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.
4402
4403 ### Kernel Boot Flags 
4404
4405 Here are the more common boot flags:
4406
4407 `-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
4408
4409  **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.
4410
4411 ## Init: Process Control Initialization 
4412
4413 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`.
4414
4415 ### Automatic Reboot Sequence 
4416
4417 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.
4418
4419 ### Single-User Mode 
4420
4421 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`.
4422
4423 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).
4424
4425 If the system `console` is set to `insecure` in `/etc/ttys`, then the system prompts for the `root` password before initiating single-user mode.
4426
4427 ***'Example 7-3. An Insecure Console in `/etc/ttys`***'
4428
4429     
4430
4431     # name  getty                           type    status          comments
4432
4433     #
4434
4435     # If console is marked "insecure", then init will ask for the root password
4436
4437     # when going to single-user mode.
4438
4439     console none                            unknown off insecure
4440
4441  **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`.
4442
4443 ### Multi-User Mode 
4444
4445 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.
4446
4447 #### Resource Configuration (rc) 
4448
4449 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.
4450
4451 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.
4452
4453 ## Shutdown Sequence 
4454
4455 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.
4456
4457 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.
4458
4459  **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.
4460
4461 <!-- this section needs the info about sernos and vfs.mountrootfrom or whatever it's called -->
4462
4463 # Users and Basic Account Management 
4464
4465 ***Contributed by Neil Blakey-Milner. ***
4466
4467
4468 ## Synopsis 
4469
4470 Unix, including DragonFly BSD is, as previously explained, a multi-user, multi-tasking system.  It is therefore possible, and in fact very common, to have a situation where many users are logged on to one computer, and every one of these users is running many different jobs.  Although only one user can physically sit at the computer and use the monitor, keyboard, and mouse connected thereto, others can get their work done by logging  in through the network.
4471
4472 After reading this chapter, you will know:
4473
4474 * The differences between the various user accounts on a DragonFly system.
4475
4476 * How to add user accounts.
4477
4478 * How to remove user accounts.
4479
4480 * How to change account details, such as the user's full name, or preferred shell.
4481
4482 * 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.
4483
4484 * How to use groups to make account management easier.
4485
4486 Before reading this chapter, you should:
4487
4488 * Understand the basics of UNIX® and DragonFly ([Chapter 3](basics.html)).
4489
4490 ## Introduction 
4491
4492 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.
4493
4494 Every account on a DragonFly system has certain information associated with it to identify the account.
4495
4496 * 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.
4497
4498 * 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.
4499
4500 * 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.
4501
4502 * Login class: Login classes are an extension to the group mechanism that provide additional flexibility when tailoring the system to different users.
4503
4504 * 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.
4505
4506 * 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.
4507
4508 * 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.
4509
4510 * 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.
4511
4512 * 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.
4513
4514 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.
4515
4516 ## The Superuser Account 
4517
4518 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.
4519
4520 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.
4521
4522 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.
4523
4524 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.
4525
4526 ## System Accounts 
4527
4528 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.
4529
4530 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.
4531
4532 `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.
4533
4534 ## User Accounts 
4535
4536 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.
4537
4538 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.
4539
4540 Each user can set up their own environment to accommodate their use of the system, by using alternate shells, editors, key bindings, and language.
4541
4542 ## Modifying Accounts 
4543
4544 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.
4545
4546 [[!table  data="""
4547 Command | Summary 
4548  [adduser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=adduser&section=8) | The recommended command-line application for adding new users. 
4549  [rmuser(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=rmuser&section=8) | The recommended command-line application for removing users. 
4550  [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1) | A flexible tool to change user database information. 
4551  [passwd(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=passwd&section=1) | The simple command-line tool to change user passwords. 
4552  [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. |
4553
4554 """]]
4555
4556 ### adduser 
4557
4558 [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.
4559
4560 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.
4561
4562  **Example 8-1. Configuring `adduser` and adding a user** 
4563
4564    
4565
4566     # adduser -v
4567
4568     Use option -silent if you don't want to see all warnings and questions.
4569
4570     Check /etc/shells
4571
4572     Check /etc/master.passwd
4573
4574     Check /etc/group
4575
4576     Enter your default shell: csh date no sh tcsh zsh [sh]: zsh
4577
4578     Your default shell is: zsh -&gt; /usr/local/bin/zsh
4579
4580     Enter your default HOME partition: [/home]:
4581
4582     Copy dotfiles from: /usr/share/skel no [/usr/share/skel]:
4583
4584     Send message from file: /etc/adduser.message no
4585
4586     [/etc/adduser.message]: no
4587
4588     Do not send message
4589
4590     Use passwords (y/n) [y]: y
4591
4592     
4593
4594     Write your changes to /etc/adduser.conf? (y/n) [n]: y
4595
4596     
4597
4598     Ok, let's go.
4599
4600     Don't worry about mistakes. I will give you the chance later to correct any input.
4601
4602     Enter username [a-z0-9_-]: jru
4603
4604     Enter full name []: J. Random User
4605
4606     Enter shell csh date no sh tcsh zsh [zsh]:
4607
4608     Enter home directory (full path) [/home/jru]:
4609
4610     Uid [1001]:
4611
4612     Enter login class: default []:
4613
4614     Login group jru [jru]:
4615
4616     Login group is ***jru***. Invite jru into other groups: guest no
4617
4618     [no]: wheel
4619
4620     Enter password []:
4621
4622     Enter password again []:
4623
4624     
4625
4626     Name:         jru
4627
4628     Password: ****
4629
4630     Fullname: J. Random User
4631
4632     Uid:          1001
4633
4634     Gid:          1001 (jru)
4635
4636     Class:
4637
4638     Groups:       jru wheel
4639
4640     HOME:     /home/jru
4641
4642     Shell:        /usr/local/bin/zsh
4643
4644     OK? (y/n) [y]: y
4645
4646     Added user ***jru***
4647
4648     Copy files from /usr/share/skel to /home/jru
4649
4650     Add another user? (y/n) [y]: n
4651
4652     Goodbye!
4653
4654     #
4655
4656 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.)
4657
4658  **Note:** The password you type in is not echoed, nor are asterisks displayed. Make sure you do not mistype the password twice.
4659
4660  **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.
4661
4662 ### rmuser 
4663
4664 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:
4665
4666   1. Removes the user's [crontab(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=crontab&section=1) entry (if any).
4667
4668   1. Removes any [at(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=at&section=1) jobs belonging to the user.
4669
4670   1. Kills all processes owned by the user.
4671
4672   1. Removes the user from the system's local password file.
4673
4674   1. Removes the user's home directory (if it is owned by the user).
4675
4676   1. Removes the incoming mail files belonging to the user from `/var/mail`.
4677
4678   1. Removes all files owned by the user from temporary file storage areas such as `/tmp`.
4679
4680   1. Finally, removes the username from all groups to which it belongs in `/etc/group`.
4681
4682    **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).
4683
4684 [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.
4685
4686 By default, an interactive mode is used, which attempts to make sure you know what you are doing.
4687
4688  **Example 8-2. `rmuser` Interactive Account Removal** 
4689
4690     
4691
4692     # rmuser jru
4693
4694     Matching password entry:
4695
4696     jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
4697
4698     Is this the entry you wish to remove? y
4699
4700     Remove user's home directory (/home/jru)? y
4701
4702     Updating password file, updating databases, done.
4703
4704     Updating group file: trusted (removing group jru -- personal group is empty) done.
4705
4706     Removing user's incoming mail file /var/mail/jru: done.
4707
4708     Removing files belonging to jru from /tmp: done.
4709
4710     Removing files belonging to jru from /var/tmp: done.
4711
4712     Removing files belonging to jru from /var/tmp/vi.recover: done.
4713
4714     #
4715
4716 ### chpass 
4717
4718 [chpass(1)](http://leaf.dragonflybsd.org/cgi/web-man?command=chpass&section=1) changes user database information such as passwords, shells, and personal information.
4719
4720 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).
4721
4722 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.
4723
4724 ***'Example 8-3. Interactive `chpass` by Superuser***'
4725
4726     
4727
4728     #Changing user database information for jru.
4729
4730     Login: jru
4731
4732     Password: *
4733
4734     Uid [#]: 1001
4735
4736     Gid [# or name]: 1001
4737
4738     Change [month day year]:
4739
4740     Expire [month day year]:
4741
4742     Class:
4743
4744     Home directory: /home/jru
4745
4746     Shell: /usr/local/bin/zsh
4747
4748     Full Name: J. Random User
4749
4750     Office Location:
4751
4752     Office Phone:
4753
4754     Home Phone:
4755
4756     Other information:
4757
4758 The normal user can change only a small subset of this information, and only for themselves.
4759
4760  **Example 8-4. Interactive chpass by Normal User** 
4761
4762     
4763
4764     #Changing user database information for jru.
4765
4766     Shell: /usr/local/bin/zsh
4767
4768     Full Name: J. Random User
4769
4770     Office Location:
4771
4772     Office Phone:
4773
4774     Home Phone:
4775
4776     Other information:
4777
4778  **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].
4779
4780 ### passwd 
4781
4782 [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.
4783
4784  **Note:** To prevent accidental or unauthorized changes, the original password must be entered before a new password can be set.
4785
4786  **Example 8-5. Changing Your Password** 
4787
4788     
4789
4790     % passwd
4791
4792     Changing local password for jru.
4793
4794     Old password:
4795
4796     New password:
4797
4798     Retype new password:
4799
4800     passwd: updating the database...
4801
4802     passwd: done
4803
4804 ***'Example 8-6. Changing Another User's Password as the Superuser***'
4805
4806     
4807
4808     # passwd jru
4809
4810     Changing local password for jru.
4811
4812     New password:
4813
4814     Retype new password:
4815
4816     passwd: updating the database...
4817
4818     passwd: done
4819
4820  **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.
4821
4822 ### pw 
4823
4824 [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.
4825
4826 #### Notes 
4827
4828 [[!table  data="""
4829 <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. |
4830 | | 
4831 """]]
4832
4833 ## Limiting Users 
4834
4835 <!-- XXX: check this section, I got the feeling there might be something outdated in it. I'm not familiar with it -->
4836
4837 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.
4838
4839 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].
4840
4841 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.
4842
4843 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).
4844
4845 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).
4846
4847 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)).
4848
4849 * `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.
4850
4851 * `cputime`: This is the maximum amount of CPU time a user's process may consume. Offending processes will be killed by the kernel.
4852
4853  **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.
4854
4855 * `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.
4856
4857 * `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).
4858
4859 * `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.
4860
4861 * `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.
4862
4863 * `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).
4864
4865 * `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.
4866
4867 * `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.
4868
4869 There are a few other things to remember when setting resource limits. Following are some general tips, suggestions, and miscellaneous comments.
4870
4871 * Processes started at system startup by `/etc/rc` are assigned to the `daemon` login class.
4872
4873 * 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.
4874
4875 * 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.
4876
4877 * 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.
4878
4879 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).
4880
4881 ## Personalizing Users 
4882
4883 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).
4884
4885 ## Groups 
4886
4887 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.
4888
4889 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.
4890
4891 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:
4892
4893  **Example 8-7. Adding a Group Using pw(8)** 
4894
4895     
4896
4897     # pw groupadd teamtwo
4898
4899     # pw groupshow teamtwo
4900
4901     teamtwo:*:1100:
4902
4903 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.
4904
4905  **Example 8-8. Adding Somebody to a Group Using pw(8)** 
4906
4907     
4908
4909     # pw groupmod teamtwo -M jru
4910
4911     # pw groupshow teamtwo
4912
4913     teamtwo:*:1100:jru
4914
4915 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`.
4916
4917  **Example 8-9. Using id(1) to Determine Group Membership** 
4918
4919     
4920
4921     % id jru
4922
4923     uid#1001(jru) gid1001(jru) groups=1001(jru), 1100(teamtwo)
4924
4925 As you can see, `jru` is a member of the groups `jru` and `teamtwo`.
4926
4927 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.
4928
4929 #SSH Server on DragonFly
4930
4931 The best way to log in to a Unix machine across the network is with a program known as ssh.
4932
4933 If you try to ssh to a newly installed dfly from another system you will get this error
4934
4935     $ ssh root@172.16.50.62
4936     ssh: connect to host 172.16.50.62 port 22: Connection refused
4937
4938 This is because sshd is not up and running on dfly.
4939 At this point if you check /etc/ssh you will only have the following files
4940
4941     # ls /etc/ssh
4942     blacklist.DSA-1024      blacklist.RSA-2048      ssh_config
4943     blacklist.DSA-2048      blacklist.RSA-4096      sshd_config
4944     blacklist.RSA-1024      moduli
4945
4946 You don't have any SSH host keys generated for the system yet!
4947
4948 When you start sshd for the first time it is best to start it through the <b>"/etc/rc.d/sshd"</b> script which will automatically generate the host keys. For this to work right you need to do the following steps (these steps are not essential for DragonFly 2.8.2 since sshd is already enabled in rc.conf)
4949
4950 1) Enable sshd in rc.conf
4951
4952     #echo "sshd_enable=yes" >> /etc/rc.conf
4953
4954 2) Start the sshd server using the rc script
4955
4956     # /etc/rc.d/sshd start
4957     Generating public/private rsa1 key pair.
4958     Your identification has been saved in /etc/ssh/ssh_host_key.
4959     Your public key has been saved in /etc/ssh/ssh_host_key.pub.
4960     The key fingerprint is:
4961     ........
4962     Generating public/private dsa key pair.
4963     Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
4964     Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
4965     The key fingerprint is:
4966     ........
4967     Starting sshd.
4968
4969 Now if you go back and look in /etc/ssh you will find the SSH host key files too.
4970
4971     # ls /etc/ssh
4972     blacklist.DSA-1024      moduli                  ssh_host_key.pub
4973     blacklist.DSA-2048      ssh_config              ssh_host_rsa_key
4974     blacklist.RSA-1024      ssh_host_dsa_key        ssh_host_rsa_key.pub
4975     blacklist.RSA-2048      ssh_host_dsa_key.pub    sshd_config
4976     blacklist.RSA-4096      ssh_host_key
4977
4978 At this point if you try to ssh to the dfly you will get the following error
4979
4980     $ ssh sgeorge@172.16.50.62
4981     The authenticity of host '172.16.50.62 (172.16.50.62)' can't be established.
4982     RSA key fingerprint is 46:77:28:c2:70:86:93:1a:23:32:5f:01:2c:80:de:de.
4983     Are you sure you want to continue connecting (yes/no)? yes
4984     Warning: Permanently added '172.16.50.62' (RSA) to the list of known hosts.
4985     Permission denied (publickey).
4986
4987 This is because of the following configuration option in the default **"/etc/ssh/sshd_config"** file.
4988
4989     # To disable tunneled clear text passwords, change to no here!
4990     # We disable cleartext passwords by default
4991     PasswordAuthentication no
4992
4993 Change it to
4994
4995     PasswordAuthentication yes
4996
4997 and reload **sshd** configuration
4998
4999     # /etc/rc.d/sshd reload
5000     Reloading sshd config files.
5001
5002 Nowyou can login to the dragonfly system as a normal user.
5003
5004     $ ssh sgeorge@172.16.50.62
5005     sgeorge at 172.16.50.62's password:
5006     Last login: Tue Oct 19 04:17:47 2010
5007     Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
5008             The Regents of the University of California.  All rights reserved.
5009
5010     DragonFly v2.7.3.1283.gfa568-DEVELOPMENT (GENERIC.MP) #3: Thu Oct 14 12:01:24 IST 2010
5011
5012     ....
5013
5014 But if you try to login by SSH as root you will get the following error.
5015
5016     $ ssh root at 172.16.50.62
5017     root at 172.16.50.62's password:
5018     Permission denied, please try again.
5019
5020 If you investigate the log of the dragonfly system <b>"/var/log/auth.log"</b> you will find a line similar to
5021
5022     Oct 19 07:29:36 dfly-vmsrv sshd[17269]: Failed password for root from 172.16.2.0 port 56447 ssh2
5023
5024 even if you typed the right password for root.
5025
5026 It is because of the following configuration option in the default **"/etc/ssh/sshd_config"** file
5027
5028     # only allow root logins via public key pair
5029     PermitRootLogin without-password
5030
5031 which allowes only SSH key based authentication as root.
5032
5033 If you change it to
5034
5035     PermitRootLogin yes
5036
5037 and reload **sshd** configuration
5038
5039     # /etc/rc.d/sshd reload
5040     Reloading sshd config files.
5041
5042 you can login as **root**
5043
5044     $ ssh root@172.16.50.62
5045     root at 172.16.50.62's password:
5046     Last login: Fri Oct  8 12:22:40 2010
5047     Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
5048             The Regents of the University of California.  All rights reserved.
5049
5050     DragonFly v2.7.3.1283.gfa568-DEVELOPMENT (GENERIC.MP) #3: Thu Oct 14 12:01:24 IST 2010
5051
5052     Welcome to DragonFly!
5053     ......
5054
5055 Now in the **"/var/log/auth.log" ** you will find a line similar to
5056
5057     Oct 19 07:30:32 dfly-vmsrv sshd[17894]: Accepted password for root from 172.16.2.0 port 56468 ssh2
5058
5059 ##WARNING :
5060 ** It is not advisable to allow Root Login with password especially if your System is connected to the Internet unless you use Very Strong Passwords. You could be a victim of [ssh password based brute force attacks](http://en.wikipedia.org/wiki/Password_cracking#Brute_force_attack). If you are victim of one such attack you can find entries like the following in your** ****"/var/log/auth.log file"****.
5061
5062     Oct 18 18:54:54 cross sshd[9783]: Invalid user maryse from 218.248.26.6
5063     Oct 18 18:54:54 cross sshd[9781]: input_userauth_request: invalid user maryse
5064     Oct 18 18:54:54 cross sshd[9783]: Failed password for invalid user maryse from 218.248.26.6 port 34847 ssh2
5065     Oct 18 18:54:54 cross sshd[9781]: Received disconnect from 218.248.26.6: 11: Bye Bye
5066     Oct 18 18:54:55 cross sshd[27641]: Invalid user may from 218.248.26.6
5067     Oct 18 18:54:55 cross sshd[3450]: input_userauth_request: invalid user may
5068     Oct 18 18:54:55 cross sshd[27641]: Failed password for invalid user may from 218.248.26.6 port 34876 ssh2
5069     Oct 18 18:54:55 cross sshd[3450]: Received disconnect from 218.248.26.6: 11: Bye Bye
5070     Oct 18 18:54:56 cross sshd[8423]: Invalid user admin from 218.248.26.6
5071     Oct 18 18:54:56 cross sshd[3131]: input_userauth_request: invalid user admin
5072     Oct 18 18:54:56 cross sshd[8423]: Failed password for invalid user admin from 218.248.26.6 port 34905 ssh2
5073     Oct 18 18:54:56 cross sshd[3131]: Received disconnect from 218.248.26.6: 11: Bye Bye
5074     Oct 18 18:54:57 cross sshd[7373]: Invalid user admin from 218.248.26.6
5075     Oct 18 18:54:57 cross sshd[28059]: input_userauth_request: invalid user admin
5076     Oct 18 18:54:57 cross sshd[7373]: Failed password for invalid user admin from 218.248.26.6 port 34930 ssh2
5077     Oct 18 18:54:57 cross sshd[28059]: Received disconnect from 218.248.26.6: 11: Bye Bye
5078     Oct 18 18:54:58 cross sshd[12081]: Invalid user admin from 218.248.26.6
5079     Oct 18 18:54:58 cross sshd[22416]: input_userauth_request: invalid user admin
5080     Oct 18 18:54:58 cross sshd[12081]: Failed password for invalid user admin from 218.248.26.6 port 34958 ssh2
5081     Oct 18 18:54:58 cross sshd[22416]: Received disconnect from 218.248.26.6: 11: Bye Bye
5082
5083 #SSH Server on DragonFly
5084
5085 Unix, including DragonFly BSD is, as previously explained, a multi-user, multi-tasking system.  It is therefore possible, and in fact very common, to have a situation where many users are logged on to one computer, and every one of these users is running many different jobs.  Although only one user can physically sit at the computer and use the monitor, keyboard, and mouse connected thereto, others can log in through the network.
5086
5087 This document is very detailed so that a new user can be familiar with the environment.
5088
5089 If you try to ssh to a newly installed dfly from another system you will get this error
5090
5091     $ ssh root@172.16.50.62
5092     ssh: connect to host 172.16.50.62 port 22: Connection refused
5093
5094 This is because sshd is not up and running on dfly.
5095 At this point if you check /etc/ssh you will only have the following files
5096
5097     # ls /etc/ssh
5098     blacklist.DSA-1024      blacklist.RSA-2048      ssh_config
5099     blacklist.DSA-2048      blacklist.RSA-4096      sshd_config
5100     blacklist.RSA-1024      moduli
5101
5102 You don't have any SSH host keys generated for the system yet!
5103
5104 When you start sshd for the first time it is best to start it through the <b>"/etc/rc.d/sshd"</b> script which will automatically generate the host keys. For this to work right you need to do the following steps (these steps are not essential for DragonFly 2.8.2 since sshd is already enabled in rc.conf)
5105
5106 1) Enable sshd in rc.conf
5107
5108     #echo "sshd_enable=yes" >> /etc/rc.conf
5109
5110 2) Start the sshd server using the rc script
5111
5112     # /etc/rc.d/sshd start
5113     Generating public/private rsa1 key pair.
5114     Your identification has been saved in /etc/ssh/ssh_host_key.
5115     Your public key has been saved in /etc/ssh/ssh_host_key.pub.
5116     The key fingerprint is:
5117     ........
5118     Generating public/private dsa key pair.
5119     Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
5120     Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
5121     The key fingerprint is:
5122     ........
5123     Starting sshd.
5124
5125 Now if you go back and look in /etc/ssh you will find the SSH host key files too.
5126
5127     # ls /etc/ssh
5128     blacklist.DSA-1024      moduli                  ssh_host_key.pub
5129     blacklist.DSA-2048      ssh_config              ssh_host_rsa_key
5130     blacklist.RSA-1024      ssh_host_dsa_key        ssh_host_rsa_key.pub
5131     blacklist.RSA-2048      ssh_host_dsa_key.pub    sshd_config
5132     blacklist.RSA-4096      ssh_host_key
5133
5134 At this point if you try to ssh to the dfly you will get the following error
5135
5136     $ ssh sgeorge@172.16.50.62
5137     The authenticity of host '172.16.50.62 (172.16.50.62)' can't be established.
5138     RSA key fingerprint is 46:77:28:c2:70:86:93:1a:23:32:5f:01:2c:80:de:de.
5139     Are you sure you want to continue connecting (yes/no)? yes
5140     Warning: Permanently added '172.16.50.62' (RSA) to the list of known hosts.
5141     Permission denied (publickey).
5142
5143 This is because of the following configuration option in the default **"/etc/ssh/sshd_config"** file.
5144
5145     # To disable tunneled clear text passwords, change to no here!
5146     # We disable cleartext passwords by default
5147     PasswordAuthentication no
5148
5149 Change it to
5150
5151     PasswordAuthentication yes
5152
5153 and reload **sshd** configuration
5154
5155     # /etc/rc.d/sshd reload
5156     Reloading sshd config files.
5157
5158 Nowyou can login to the dragonfly system as a normal user.
5159
5160     $ ssh sgeorge@172.16.50.62
5161     sgeorge at 172.16.50.62's password:
5162     Last login: Tue Oct 19 04:17:47 2010
5163     Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
5164             The Regents of the University of California.  All rights reserved.
5165
5166     DragonFly v2.7.3.1283.gfa568-DEVELOPMENT (GENERIC.MP) #3: Thu Oct 14 12:01:24 IST 2010
5167
5168     ....
5169
5170 But if you try to login by SSH as root you will get the following error.
5171
5172     $ ssh root at 172.16.50.62
5173     root at 172.16.50.62's password:
5174     Permission denied, please try again.
5175
5176 If you investigate the log of the dragonfly system <b>"/var/log/auth.log"</b> you will find a line similar to
5177
5178     Oct 19 07:29:36 dfly-vmsrv sshd[17269]: Failed password for root from 172.16.2.0 port 56447 ssh2
5179
5180 even if you typed the right password for root.
5181
5182 It is because of the following configuration option in the default **"/etc/ssh/sshd_config"** file
5183
5184     # only allow root logins via public key pair
5185     PermitRootLogin without-password
5186
5187 which allowes only SSH key based authentication as root.
5188
5189 If you change it to
5190
5191     PermitRootLogin yes
5192
5193 and reload **sshd** configuration
5194
5195     # /etc/rc.d/sshd reload
5196     Reloading sshd config files.
5197
5198 you can login as **root**
5199
5200     $ ssh root@172.16.50.62
5201     root at 172.16.50.62's password:
5202     Last login: Fri Oct  8 12:22:40 2010
5203     Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
5204             The Regents of the University of California.  All rights reserved.
5205
5206     DragonFly v2.7.3.1283.gfa568-DEVELOPMENT (GENERIC.MP) #3: Thu Oct 14 12:01:24 IST 2010
5207
5208     Welcome to DragonFly!
5209     ......
5210
5211 Now in the **"/var/log/auth.log" ** you will find a line similar to
5212
5213     Oct 19 07:30:32 dfly-vmsrv sshd[17894]: Accepted password for root from 172.16.2.0 port 56468 ssh2
5214
5215 ##WARNING :
5216 ** It is not advisable to allow Root Login with password especially if your System is connected to the Internet unless you use Very Strong Passwords. You could be a victim of [ssh password based brute force attacks](http://en.wikipedia.org/wiki/Password_cracking#Brute_force_attack). If you are victim of one such attack you can find entries like the following in your** ****"/var/log/auth.log file"****.
5217
5218     Oct 18 18:54:54 cross sshd[9783]: Invalid user maryse from 218.248.26.6
5219     Oct 18 18:54:54 cross sshd[9781]: input_userauth_request: invalid user maryse
5220     Oct 18 18:54:54 cross sshd[9783]: Failed password for invalid user maryse from 218.248.26.6 port 34847 ssh2
5221     Oct 18 18:54:54 cross sshd[9781]: Received disconnect from 218.248.26.6: 11: Bye Bye
5222     Oct 18 18:54:55 cross sshd[27641]: Invalid user may from 218.248.26.6
5223     Oct 18 18:54:55 cross sshd[3450]: input_userauth_request: invalid user may
5224     Oct 18 18:54:55 cross sshd[27641]: Failed password for invalid user may from 218.248.26.6 port 34876 ssh2
5225     Oct 18 18:54:55 cross sshd[3450]: Received disconnect from 218.248.26.6: 11: Bye Bye
5226     Oct 18 18:54:56 cross sshd[8423]: Invalid user admin from 218.248.26.6
5227     Oct 18 18:54:56 cross sshd[3131]: input_userauth_request: invalid user admin
5228     Oct 18 18:54:56 cross sshd[8423]: Failed password for invalid user admin from 218.248.26.6 port 34905 ssh2
5229     Oct 18 18:54:56 cross sshd[3131]: Received disconnect from 218.248.26.6: 11: Bye Bye
5230     Oct 18 18:54:57 cross sshd[7373]: Invalid user admin from 218.248.26.6
5231     Oct 18 18:54:57 cross sshd[28059]: input_userauth_request: invalid user admin
5232     Oct 18 18:54:57 cross sshd[7373]: Failed password for invalid user admin from 218.248.26.6 port 34930 ssh2
5233     Oct 18 18:54:57 cross sshd[28059]: Received disconnect from 218.248.26.6: 11: Bye Bye
5234     Oct 18 18:54:58 cross sshd[12081]: Invalid user admin from 218.248.26.6
5235     Oct 18 18:54:58 cross sshd[22416]: input_userauth_request: invalid user admin
5236     Oct 18 18:54:58 cross sshd[12081]: Failed password for invalid user admin from 218.248.26.6 port 34958 ssh2
5237     Oct 18 18:54:58 cross sshd[22416]: Received disconnect from 218.248.26.6: 11: Bye Bye
5238
5239 # Configuring the DragonFly Kernel 
5240
5241 ***Updated and restructured by Jim Mock. Originally contributed by Jake Hamby.***
5242
5243
5244 ## Synopsis 
5245
5246 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.
5247
5248 After reading this chapter, you will know:
5249
5250 * Why you might need to build a custom kernel.
5251 * How to write a kernel configuration file, or alter an existing configuration file.
5252 * How to use the kernel configuration file to create and build a new kernel.
5253 * How to install the new kernel.
5254 * How to troubleshoot if things go wrong.
5255
5256 ## Why Build a Custom Kernel? 
5257
5258 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.
5259
5260 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.
5261
5262 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.
5263
5264 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:
5265
5266 * 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.
5267
5268 * 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.
5269
5270 * 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.
5271
5272 ## Building and Installing a Custom Kernel 
5273
5274 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.
5275
5276 ### Installing the Source
5277
5278 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.
5279
5280 The preferred way of installing the sources is:
5281
5282     # cd /usr
5283     # make src-create
5284     
5285 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:
5286
5287     # make src-update
5288
5289 ### Your Custom Config File
5290
5291 Next, move to the `config` directory and copy the `GENERIC` configuration file to the name you want to give your kernel. For example:
5292
5293     # cd /usr/src/sys/config
5294     # cp GENERIC MYKERNEL
5295
5296 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.
5297
5298 **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.
5299
5300 For example:
5301
5302     # cd /usr/src/sys/config
5303     # mkdir /root/kernels
5304     # cp GENERIC /root/kernels/MYKERNEL
5305     # ln -s /root/kernels/MYKERNEL
5306
5307 **Note:** You must execute these and all of the following commands under the `root` account or you will get permission denied errors.
5308
5309 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`.
5310
5311 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.
5312
5313 ### Building a Kernel - Full Source Tree
5314
5315 **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.
5316
5317  1. Change to the `/usr/src` directory.
5318
5319      
5320
5321           # cd /usr/src
5322
5323  1. Compile the kernel.
5324
5325           # make buildkernel KERNCONF=MYKERNEL
5326
5327  1. Install the new kernel.     
5328
5329           # make installkernel KERNCONF=MYKERNEL
5330
5331     
5332
5333 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.
5334
5335 ### Building a Kernel - Kernel Source Only
5336
5337 When only the kernel source is installed, you need to change step 2, above, to this:
5338      
5339
5340       # make nativekernel KERNCONF=MYKERNEL
5341
5342 The other steps are the same.
5343
5344 ### Running Your New Kernel
5345
5346 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).
5347
5348 **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.
5349
5350 ## The Configuration File 
5351 <!-- XXX: do we really want to mention all these million config options? -->
5352
5353 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`.
5354
5355 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`.
5356
5357     
5358
5359     #
5360
5361     #
5362
5363     # GENERIC -- Generic kernel configuration file for DragonFly/i386
5364
5365     #
5366
5367     # Check the LINT configuration file in sys/config, for an
5368
5369     # exhaustive list of options.
5370
5371     #
5372
5373     # $DragonFly: src/sys/config/GENERIC,v 1.56 2007/12/26 14:02:36 sephe Exp $
5374
5375 The following are the mandatory keywords required in ***every*** kernel you build:
5376
5377     
5378
5379     machine         i386
5380
5381 This is the machine architecture. It must be `i386` at the moment.  Support for `amd64` will be added in the future.
5382
5383     
5384
5385     cpu          I386_CPU
5386
5387     cpu          I486_CPU
5388
5389     cpu          I586_CPU
5390
5391     cpu          I686_CPU
5392
5393 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.
5394
5395     
5396
5397     ident          GENERIC
5398
5399 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).
5400
5401     
5402
5403     maxusers          0
5404
5405 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.
5406
5407 (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.
5408
5409  **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`].
5410
5411     
5412
5413     # Floating point support - do not disable.
5414
5415     device          npx0     at nexus? port IO_NPX irq 13
5416
5417 `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.
5418
5419     
5420
5421     # Pseudo devices - the number indicates how many units to allocate.
5422
5423     pseudo-device   loop          # Network loopback
5424
5425 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***.
5426
5427 Everything that follows is more or less optional. See the notes underneath or next to each option for more information.
5428
5429     
5430
5431     #makeoptions     DEBUG=-g          #Build kernel with gdb(1) debug symbols
5432
5433 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).
5434
5435     
5436
5437     options          MATH_EMULATE      #Support for x87 emulation
5438
5439 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.
5440
5441  **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.
5442
5443     
5444
5445     options          INET          #InterNETworking
5446
5447 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.
5448
5449     
5450
5451     options          INET6          #IPv6 communications protocols
5452
5453 This enables the IPv6 communication protocols.
5454
5455     
5456
5457     options          FFS          #Berkeley Fast Filesystem
5458
5459     options          FFS_ROOT     #FFS usable as root device [keep this!]
5460
5461 This is the basic hard drive Filesystem. Leave it in if you boot from the hard disk.
5462
5463     
5464
5465     options          UFS_DIRHASH  #Improve performance on big directories
5466
5467 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.
5468
5469     
5470
5471     options          SOFTUPDATES  #Enable FFS Soft Updates support
5472
5473 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.
5474
5475     
5476
5477     options          MFS          #Memory Filesystem
5478
5479     options          MD_ROOT      #MD is a potential root device
5480
5481 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`:
5482
5483     
5484
5485     /dev/ad1s2b     /tmp mfs rw 0 0
5486
5487 Now you simply need to either reboot, or run the command `mount /tmp`.
5488
5489     
5490
5491     options          NFS          #Network Filesystem
5492
5493     options          NFS_ROOT     #NFS usable as root device, NFS required
5494
5495 The network Filesystem. Unless you plan to mount partitions from a UNIX® file server over TCP/IP, you can comment these out.
5496
5497     
5498
5499     options          MSDOSFS      #MSDOS Filesystem
5500
5501 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).
5502
5503     
5504
5505     options          CD9660       #ISO 9660 Filesystem
5506
5507     options          CD9660_ROOT  #CD-ROM usable as root, CD9660 required
5508
5509 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.
5510
5511     
5512
5513     options          PROCFS       #Process filesystem
5514
5515 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. ***
5516
5517     
5518
5519 Compatibility with 4.3BSD. Leave this in; some programs will act strangely if you comment this out.
5520
5521     
5522
5523     options          SCSI_DELAY=5000    #Delay (in ms) before probing SCSI
5524
5525 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.
5526
5527     
5528
5529     options          UCONSOLE            #Allow users to grab the console
5530
5531 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.
5532
5533     
5534
5535     options          USERCONFIG          #boot -c editor
5536
5537 This option allows you to boot the configuration editor from the boot menu.
5538
5539     
5540
5541     options          VISUAL_USERCONFIG   #visual boot -c editor
5542
5543 This option allows you to boot the visual configuration editor from the boot menu.
5544
5545     
5546
5547     options          KTRACE              #ktrace(1) support
5548
5549 This enables kernel process tracing, which is useful in debugging.
5550
5551     
5552
5553     options          SYSVSHM             #SYSV-style shared memory
5554
5555 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.
5556
5557     
5558
5559     options          SYSVSEM             #SYSV-style semaphores
5560
5561 Support for System V semaphores. Less commonly used but only adds a few hundred bytes to the kernel.
5562
5563     
5564
5565     options          SYSVMSG             #SYSV-style message queues
5566
5567 Support for System V messages. Again, only adds a few hundred bytes to the kernel.
5568
5569  **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.
5570
5571     
5572
5573     options         P1003_1B                #Posix P1003_1B real-time extensions
5574
5575     options         _KPOSIX_PRIORITY_SCHEDULING
5576
5577 Real-time extensions added in the 1993 POSIX®. Certain applications in the ports collection use these (such as  **StarOffice™** ).
5578
5579     
5580
5581     options         ICMP_BANDLIM            #Rate limit bad replies
5582
5583 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.
5584
5585     
5586
5587     # To make an SMP kernel, the next two are needed
5588
5589     #options        SMP                     # Symmetric MultiProcessor Kernel
5590
5591     #options        APIC_IO                 # Symmetric (APIC) I/O
5592
5593 The above are both required for SMP support.
5594
5595     
5596
5597     device          isa
5598
5599 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`.
5600
5601     
5602
5603     device          eisa
5604
5605 Include this if you have an EISA motherboard. This enables auto-detection and configuration support for all devices on the EISA bus.
5606
5607     
5608
5609     device          pci
5610
5611 Include this if you have a PCI motherboard. This enables auto-detection of PCI cards and gatewaying from the PCI to ISA bus.
5612
5613     
5614
5615     device          agp
5616
5617 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.
5618
5619     
5620
5621     # Floppy drives
5622
5623     device          fdc0        at isa? port IO_FD1 irq 6 drq 2
5624
5625     device          fd0         at fdc0 drive 0
5626
5627     device          fd1         at fdc0 drive 1
5628
5629 This is the floppy drive controller. `fd0` is the `A:` floppy drive, and `fd1` is the `B:` drive.
5630
5631     
5632
5633     device          ata
5634
5635 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.
5636
5637     
5638
5639     device          atadisk                 # ATA disk drives
5640
5641 This is needed along with `device ata` for ATA disk drives.
5642
5643     
5644
5645     device          atapicd                 # ATAPI CDROM drives
5646
5647 This is needed along with `device ata` for ATAPI CDROM drives.
5648
5649     
5650
5651     device          atapifd                 # ATAPI floppy drives
5652
5653 This is needed along with `device ata` for ATAPI floppy drives.
5654
5655     
5656
5657     device          atapist                 # ATAPI tape drives
5658
5659 This is needed along with `device ata` for ATAPI tape drives.
5660
5661     
5662
5663     options         ATA_STATIC_ID           #Static device numbering
5664
5665 This makes the controller number static (like the old driver) or else the device numbers are dynamically allocated.
5666
5667     
5668
5669     # ATA and ATAPI devices
5670
5671     device          ata0        at isa? port IO_WD1 irq 14
5672
5673     device          ata1        at isa? port IO_WD2 irq 15
5674
5675 Use the above for older, non-PCI systems.
5676
5677     
5678
5679     # SCSI Controllers
5680
5681     device          ahb        # EISA AHA1742 family
5682
5683     device          ahc        # AHA2940 and onboard AIC7xxx devices
5684
5685     device          amd        # AMD 53C974 (Teckram DC-390(T))
5686
5687     device          dpt        # DPT Smartcache - See LINT for options!
5688
5689     device          isp        # Qlogic family
5690
5691     device          ncr        # NCR/Symbios Logic
5692
5693     device          sym        # NCR/Symbios Logic (newer chipsets)
5694
5695     device          adv0       at isa?
5696
5697     device          adw
5698
5699     device          bt0        at isa?
5700
5701     device          aha0       at isa?
5702
5703     device          aic0       at isa?
5704
5705 SCSI controllers. Comment out any you do not have in your system. If you have an IDE only system, you can remove these altogether.
5706
5707     
5708
5709     # SCSI peripherals
5710
5711     device          scbus      # SCSI bus (required)
5712
5713     device          da         # Direct Access (disks)
5714
5715     device          sa         # Sequential Access (tape etc)
5716
5717     device          cd         # CD
5718
5719     device          pass       # Passthrough device (direct SCSI
5720
5721     access)
5722
5723 SCSI peripherals. Again, comment out any you do not have, or if you have only IDE hardware, you can remove them completely.
5724
5725  **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.
5726
5727     
5728
5729     # RAID controllers
5730
5731     device          ida        # Compaq Smart RAID
5732
5733     device          amr        # AMI MegaRAID
5734
5735     device          mlx        # Mylex DAC960 family
5736
5737 Supported RAID controllers. If you do not have any of these, you can comment them out or remove them.
5738
5739     
5740
5741     # atkbdc0 controls both the keyboard and the PS/2 mouse
5742
5743     device          atkbdc0    at isa? port IO_KBD
5744
5745 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`).
5746
5747     
5748
5749     device          atkbd0     at atkbdc? irq 1
5750
5751 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.
5752
5753     
5754
5755     device          psm0       at atkbdc? irq 12
5756
5757 Use this device if your mouse plugs into the PS/2 mouse port.
5758
5759     
5760
5761     device          vga0        at isa?
5762
5763 The video card driver.
5764
5765     
5766
5767     # splash screen/screen saver
5768
5769     pseudo-device          splash
5770
5771 Splash screen at start up! Screen savers require this too.
5772
5773     
5774
5775     # syscons is the default console driver, resembling an SCO console
5776
5777     device          sc0          at isa?
5778
5779 `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.
5780
5781     
5782
5783     # Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver
5784
5785     #device          vt0     at isa?
5786
5787     #options         XSERVER          # support for X server on a vt console
5788
5789     #options         FAT_CURSOR       # start with block cursor
5790
5791     # If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines
5792
5793     #options         PCVT_SCANSET=2   # IBM keyboards are non-std
5794
5795 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.
5796
5797     
5798
5799     # Power management support (see LINT for more options)
5800
5801     device          apm0     at nexus? disable flags 0x20  # Advanced Power Management
5802
5803 Advanced Power Management support. Useful for laptops.
5804
5805     
5806
5807     # PCCARD (PCMCIA) support
5808
5809     device          card
5810
5811     device          pcic0    at isa? irq 10 port 0x3e0 iomem 0xd0000
5812
5813     device          pcic1    at isa? irq 11 port 0x3e2 iomem 0xd4000 disable
5814
5815 PCMCIA support. You want this if you are using a laptop.
5816
5817     
5818
5819     # Serial (COM) ports
5820
5821     device          sio0     at isa? port IO_COM1 flags 0x10 irq 4
5822
5823     device          sio1     at isa? port IO_COM2 irq 3
5824
5825     device          sio2     at isa? disable port IO_COM3 irq 5
5826
5827     device          sio3     at isa? disable port IO_COM4 irq 9
5828
5829 These are the four serial ports referred to as COM1 through COM4 in the MS-DOS/Windows® world.
5830
5831  **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.
5832
5833 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.
5834
5835     
5836
5837     # Parallel port
5838
5839     device          ppc0    at isa? irq 7
5840
5841 This is the ISA-bus parallel port interface.
5842
5843     
5844
5845     device          ppbus      # Parallel port bus (required)
5846
5847 Provides support for the parallel port bus.
5848
5849     
5850
5851     device          lpt        # Printer
5852
5853 Support for parallel port printers.
5854
5855  **Note:** All three of the above are required to enable parallel printer support.
5856
5857     
5858
5859     device          plip       # TCP/IP over parallel
5860
5861 This is the driver for the parallel network interface.
5862
5863     
5864
5865     device          ppi        # Parallel port interface device
5866
5867 The general-purpose I/O (***geek port) + IEEE1284 I/O.
5868
5869     
5870
5871     #device         vpo        # Requires scbus and da
5872
5873 This is for an Iomega Zip drive. It requires `scbus` and `da` support. Best performance is achieved with ports in EPP 1.9 mode.
5874
5875     
5876
5877     # PCI Ethernet NICs.
5878
5879     device          de         # DEC/Intel DC21x4x (Tulip)
5880
5881     device          fxp        # Intel EtherExpress PRO/100B (82557, 82558)
5882
5883     device          tx         # SMC 9432TX (83c170 EPIC)
5884
5885     device          vx         # 3Com 3c590, 3c595 (Vortex)
5886
5887     device          wx         # Intel Gigabit Ethernet Card (Wiseman)
5888
5889 Various PCI network card drivers. Comment out or remove any of these not present in your system.
5890
5891     
5892
5893     # PCI Ethernet NICs that use the common MII bus controller code.
5894
5895     device          miibus     # MII bus support
5896
5897 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.
5898
5899     
5900
5901     device          dc         # DEC/Intel 21143 and various workalikes
5902
5903     device          rl         # RealTek 8129/8139
5904
5905     device          sf         # Adaptec AIC-6915 (Starfire)
5906
5907     device          sis        # Silicon Integrated Systems SiS 900/SiS 7016
5908
5909     device          ste        # Sundance ST201 (D-Link DFE-550TX)
5910
5911     device          tl         # Texas Instruments ThunderLAN
5912
5913     device          vr         # VIA Rhine, Rhine II
5914
5915     device          wb         # Winbond W89C840F
5916
5917     device          xl         # 3Com 3c90x (Boomerang, Cyclone)
5918
5919 Drivers that use the MII bus controller code.
5920
5921     
5922
5923     # ISA Ethernet NICs.
5924
5925     device          ed0    at isa? port 0x280 irq 10 iomem 0xd8000
5926
5927     device          ex
5928
5929     device          ep
5930
5931     # WaveLAN/IEEE 802.11 wireless NICs. Note: the WaveLAN/IEEE really
5932
5933     # exists only as a PCMCIA device, so there is no ISA attachment needed
5934
5935     # and resources will always be dynamically assigned by the pccard code.
5936
5937     device          wi
5938
5939     # Aironet 4500/4800 802.11 wireless NICs. Note: the declaration below will
5940
5941     # work for PCMCIA and PCI cards, as well as ISA cards set to ISA PnP
5942
5943     # mode (the factory default). If you set the switches on your ISA
5944
5945     # card for a manually chosen I/O address and IRQ, you must specify
5946
5947     # those parameters here.
5948
5949     device          an
5950
5951     # The probe order of these is presently determined by i386/isa/isa_compat.c.
5952
5953     device          ie0    at isa? port 0x300 irq 10 iomem 0xd0000
5954
5955     device          fe0    at isa? port 0x300
5956
5957     device          le0    at isa? port 0x300 irq 5 iomem 0xd0000
5958
5959     device          lnc0   at isa? port 0x280 irq 10 drq 0
5960
5961     device          cs0    at isa? port 0x300
5962
5963     device          sn0    at isa? port 0x300 irq 10
5964
5965     # requires PCCARD (PCMCIA) support to be activated
5966
5967     #device         xe0    at isa?
5968
5969 ISA Ethernet drivers. See `/usr/src/sys/config/LINT` for which cards are supported by which driver.
5970
5971     
5972
5973     pseudo-device   ether         # Ethernet support
5974
5975 `ether` is only needed if you have an Ethernet card. It includes generic Ethernet protocol code.
5976
5977     
5978
5979     pseudo-device   sl      1     # Kernel SLIP
5980
5981 `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.
5982
5983     
5984
5985     pseudo-device   ppp     1     # Kernel PPP
5986
5987 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. .
5988
5989     
5990
5991     device   tun           # Packet tunnel.
5992
5993 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.
5994
5995     
5996
5997     pseudo-device   pty           # Pseudo-ttys (telnet etc)
5998
5999 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. ***
6000
6001     
6002
6003 Memory disk pseudo-devices.
6004
6005     
6006
6007     pseudo-device   gif     # IPv6 and IPv4 tunneling
6008
6009 This implements IPv6 over IPv4 tunneling, IPv4 over IPv6 tunneling, IPv4 over IPv4 tunneling, and IPv6 over IPv6 tunneling.
6010
6011     
6012
6013     pseudo-device   faith   # IPv6-to-IPv4 relaying (translation)
6014
6015 This pseudo-device captures packets that are sent to it and diverts them to the IPv4/IPv6 translation daemon.
6016
6017     
6018
6019     # The `bpf' device enables the Berkeley Packet Filter.
6020
6021     # Be aware of the administrative consequences of enabling this!
6022
6023     pseudo-device   bpf           # Berkeley packet filter
6024
6025 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.
6026
6027  **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.
6028
6029     
6030
6031     # USB support
6032
6033     #device         uhci          # UHCI PCI-&gt;USB interface
6034
6035     #device         ohci          # OHCI PCI-&gt;USB interface
6036
6037     #device         usb           # USB Bus (required)
6038
6039     #device         ugen          # Generic
6040
6041     #device         uhid          # ***Human Interface Devices***
6042
6043     #device         ukbd          # Keyboard
6044
6045     #device         ulpt          # Printer
6046
6047     #device         umass         # Disks/Mass storage - Requires scbus and da
6048
6049     #device         ums           # Mouse
6050
6051     # USB Ethernet, requires mii
6052
6053     #device         aue           # ADMtek USB ethernet
6054
6055     #device         cue           # CATC USB ethernet
6056
6057     #device         kue           # Kawasaki LSI USB ethernet
6058
6059 Support for various USB devices.
6060
6061 For more information and additional devices supported by DragonFly, see `/usr/src/sys/i386/conf/LINT`.
6062
6063 #### Notes 
6064
6065 [[!table  data="""
6066 <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. |
6067 | | 
6068 """]]
6069
6070 ## Device Nodes 
6071
6072 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. 
6073
6074 These nodes are created automatically once devfs is mounted, which happens manually for the root `/dev` during boot, just after the root mount.
6075
6076 ## If Something Goes Wrong 
6077
6078  **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:
6079
6080      % chflags noschg /boot/kernel
6081      
6082
6083 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.
6084
6085 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:
6086
6087     
6088
6089     % chflags schg /boot/kernel
6090     
6091
6092 There are five categories of trouble that can occur when building a custom kernel. They are:
6093
6094 * `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.
6095
6096 * `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.
6097
6098 * 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.
6099
6100 * 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.
6101
6102 * 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.
6103
6104 # Security 
6105 ***Much of this chapter has been taken from the security(7) manual page by Matthew Dillon. ***
6106
6107 ## Synopsis 
6108
6109 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.
6110
6111 DragonFly provides an array of utilities and mechanisms to ensure the integrity and security of your system and network.
6112
6113 After reading this chapter, you will know:
6114
6115 * Basic system security concepts, in respect to DragonFly.
6116
6117 * About the various crypt mechanisms available in DragonFly, such as DES and MD5.
6118
6119 * How to set up one-time password authentication.
6120
6121 * How to create firewalls using IPFW.
6122
6123 * How to configure IPsec and create a VPN between DragonFly/Windows® machines.
6124
6125 * How to configure and use  **OpenSSH** , DragonFly's SSH implementation.
6126
6127 Before reading this chapter, you should:
6128
6129 * Understand basic DragonFly and Internet concepts.
6130
6131 CategoryHandbook
6132
6133 Category
6134
6135 ## Introduction 
6136
6137 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.
6138
6139 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.
6140
6141 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:
6142
6143   1. Denial of service attacks.
6144
6145   1. User account compromises.
6146
6147   1. Root compromise through accessible servers.
6148
6149   1. Root compromise via user accounts.
6150
6151   1. Backdoor creation.
6152
6153 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.
6154
6155 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.
6156
6157 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.
6158
6159 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.
6160
6161 Security remedies should always be implemented with a multi-layered ***onion peel*** approach and can be categorized as follows:
6162
6163   1. Securing `root` and staff accounts.
6164
6165   1. Securing `root` -- root-run servers and suid/sgid binaries.
6166
6167   1. Securing user accounts.
6168
6169   1. Securing the password file.
6170
6171   1. Securing the kernel core, raw devices, and filesystems.
6172
6173   1. Quick detection of inappropriate changes made to the system.
6174
6175   1. Paranoia.
6176
6177 The next section of this chapter will cover the above bullet items in greater depth.
6178
6179 CategoryHandbook
6180
6181 CategoryHandbook-security
6182
6183 ## Securing DragonFly 
6184
6185  **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.
6186
6187 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.
6188
6189 ### Securing the root Account and Staff Accounts 
6190
6191 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.
6192
6193 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.
6194
6195 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.
6196
6197 A staff account entry such as:
6198
6199     
6200
6201     foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
6202
6203 Should be changed to this:
6204
6205     
6206
6207     foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh
6208
6209 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.
6210
6211 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.
6212
6213 ### Securing Root-run Servers and SUID/SGID Binaries 
6214
6215 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!
6216
6217 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.
6218
6219 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.
6220
6221 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.
6222
6223 ### Securing User Accounts 
6224
6225 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.
6226
6227 ### Securing the Password File 
6228
6229 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.
6230
6231 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).
6232
6233 ### Securing the Kernel Core, Raw Devices, and Filesystems 
6234
6235 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.
6236
6237 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.
6238
6239 ### Checking File Integrity: Binaries, Configuration Files, Etc. 
6240
6241 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.
6242
6243 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.
6244
6245 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`.
6246
6247 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.
6248
6249 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.
6250
6251 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.
6252
6253 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.
6254
6255 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.
6256
6257 ### Paranoia 
6258
6259 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.
6260
6261 ### Denial of Service Attacks 
6262
6263 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.
6264
6265   1. Limiting server forks.
6266
6267   1. Limiting springboard attacks (ICMP response attacks, ping broadcast, etc.).
6268
6269   1. Kernel Route Cache.
6270
6271 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.
6272
6273  **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.
6274
6275  **Syslogd**  can be attacked directly and it is strongly recommended that you use the `-s` option whenever possible, and the `-a` option otherwise.
6276
6277 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.
6278
6279 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).
6280
6281 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.
6282
6283 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:
6284
6285   1. The kernel does not react quickly enough when a lightly loaded server is suddenly attacked.
6286
6287   1. The `rtminexpire` is not low enough for the kernel to survive a sustained attack.
6288
6289 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.
6290
6291 ## DES, MD5, and Crypt 
6292
6293 ***Parts rewritten and updated by Bill Swingle. ***
6294
6295 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.
6296
6297 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.
6298
6299 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.
6300
6301 ### Recognizing Your Crypt Mechanism 
6302
6303 `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.
6304
6305 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.
6306
6307 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.
6308
6309 ## One-time Passwords 
6310
6311 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.
6312
6313 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***.
6314
6315 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.
6316
6317 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.
6318
6319 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.
6320
6321 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.
6322
6323 ### Secure Connection Initialization 
6324
6325 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:
6326
6327     
6328
6329     % keyinit
6330
6331     Adding unfurl:
6332
6333     Reminder - Only use this method if you are directly connected.
6334
6335     If you are using telnet or rlogin exit with no password and use keyinit -s.
6336
6337     Enter secret password:
6338
6339     Again secret password:
6340
6341     
6342
6343     ID unfurl s/key is 99 to17757
6344
6345     DEFY CLUB PRO NASH LACE SOFT
6346
6347 For OPIE, `opiepasswd` is used instead:
6348
6349     
6350
6351     % opiepasswd -c
6352
6353     [grimreaper] ~ $ opiepasswd -f -c
6354
6355     Adding unfurl:
6356
6357     Only use this method from the console; NEVER from remote. If you are using
6358
6359     telnet, xterm, or a dial-in, type ^C now or exit with no password.
6360
6361     Then run opiepasswd without the -c parameter.
6362
6363     Using MD5 to compute responses.
6364
6365     Enter new secret pass phrase:
6366
6367     Again new secret pass phrase:
6368
6369     ID unfurl OTP key is 499 to4268
6370
6371     MOS MALL GOAT ARM AVID COED
6372
6373 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.
6374
6375 ### Insecure Connection Initialization 
6376
6377 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:
6378
6379     
6380
6381     % keyinit -s
6382
6383     Updating unfurl:
6384
6385     Old key: to17758
6386
6387     Reminder you need the 6 English words from the key command.
6388
6389     Enter sequence count from 1 to 9999: 100
6390
6391     Enter new key [default to17759]:
6392
6393     s/key 100 to 17759
6394
6395     s/key access password:
6396
6397     s/key access password:CURE MIKE BANE HIM RACY GORE
6398
6399 For OPIE, you need to use `opiepasswd`:
6400
6401     
6402
6403     % opiepasswd
6404
6405     
6406
6407     Updating unfurl:
6408
6409     You need the response from an OTP generator.
6410
6411     Old secret pass phrase:
6412
6413             otp-md5 498 to4268 ext
6414
6415             Response: GAME GAG WELT OUT DOWN CHAT
6416
6417     New secret pass phrase:
6418
6419             otp-md5 499 to4269
6420
6421             Response: LINE PAP MILK NELL BUOY TROY
6422
6423     
6424
6425     ID mark OTP key is 499 gr4269
6426
6427     LINE PAP MILK NELL BUOY TROY
6428
6429 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:
6430
6431     
6432
6433     % key 100 to17759
6434
6435     Reminder - Do not use this program while logged in via telnet or rlogin.
6436
6437     Enter secret password: &lt;secret password&gt;
6438
6439     CURE MIKE BANE HIM RACY GORE
6440
6441 Or for OPIE:
6442
6443     
6444
6445     % opiekey 498 to4268
6446
6447     Using the MD5 algorithm to compute response.
6448
6449     Reminder: Don't use opiekey from telnet or dial-in sessions.
6450
6451     Enter secret pass phrase:
6452
6453     GAME GAG WELT OUT DOWN CHAT
6454
6455 Now switch back over to the insecure connection, and copy the one-time password generated over to the relevant program.
6456
6457 ### Generating a Single One-time Password 
6458
6459 Once you have initialized S/Key, when you login you will be presented with a prompt like this:
6460
6461     
6462
6463     % telnet example.com
6464
6465     Trying 10.0.0.1...
6466
6467     Connected to example.com
6468
6469     Escape character is '^]'.
6470
6471     
6472
6473     DragonFly/i386 (example.com) (ttypa)
6474
6475     
6476
6477     login: &lt;username&gt;
6478
6479     s/key 97 fw13894
6480
6481     Password:
6482
6483 Or for OPIE:
6484
6485     
6486
6487     % telnet example.com
6488
6489     Trying 10.0.0.1...
6490
6491     Connected to example.com
6492
6493     Escape character is '^]'.
6494
6495     
6496
6497     DragonFly/i386 (example.com) (ttypa)
6498
6499     
6500
6501     login: &lt;username&gt;
6502
6503     otp-md5 498 gr4269 ext
6504
6505     Password:
6506
6507 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.
6508
6509 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.
6510
6511 On the trusted system:
6512
6513     
6514
6515     % key 97 fw13894
6516
6517     Reminder - Do not use this program while logged in via telnet or rlogin.
6518
6519     Enter secret password:
6520
6521     WELD LIP ACTS ENDS ME HAAG
6522
6523 For OPIE:
6524
6525     
6526
6527     % opiekey 498 to4268
6528
6529     Using the MD5 algorithm to compute response.
6530
6531     Reminder: Don't use opiekey from telnet or dial-in sessions.
6532
6533     Enter secret pass phrase:
6534
6535     GAME GAG WELT OUT DOWN CHAT
6536
6537 Now that you have your one-time password you can continue logging in:
6538
6539     
6540
6541     login: &lt;username&gt;
6542
6543     s/key 97 fw13894
6544
6545     Password: &lt;return to enable echo&gt;
6546
6547     s/key 97 fw13894
6548
6549     Password [echo on]: WELD LIP ACTS ENDS ME HAAG
6550
6551     Last login: Tue Mar 21 11:56:41 from 10.0.0.2 ...
6552
6553 ### Generating Multiple One-time Passwords 
6554
6555 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:
6556
6557     
6558
6559     % key -n 5 30 zz99999
6560
6561     Reminder - Do not use this program while logged in via telnet or rlogin.
6562
6563     Enter secret password: &lt;secret password&gt;
6564
6565     26: SODA RUDE LEA LIND BUDD SILT
6566
6567     27: JILT SPY DUTY GLOW COWL ROT
6568
6569     28: THEM OW COLA RUNT BONG SCOT
6570
6571     29: COT MASH BARR BRIM NAN FLAG
6572
6573     30: CAN KNEE CAST NAME FOLK BILK
6574
6575 Or for OPIE:
6576
6577     
6578
6579     % opiekey -n 5 30 zz99999
6580
6581     Using the MD5 algorithm to compute response.
6582
6583     Reminder: Don't use opiekey from telnet or dial-in sessions.
6584
6585     Enter secret pass phrase: &lt;secret password&gt;
6586
6587     26: JOAN BORE FOSS DES NAY QUIT
6588
6589     27: LATE BIAS SLAY FOLK MUCH TRIG
6590
6591     28: SALT TIN ANTI LOON NEAL USE
6592
6593     29: RIO ODIN GO BYE FURY TIC
6594
6595     30: GREW JIVE SAN GIRD BOIL PHI
6596
6597 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.
6598
6599 ### Restricting Use of UNIX® Passwords 
6600
6601 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.
6602
6603 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.
6604
6605 Here is a sample `skey.access` configuration file which illustrates the three most common sorts of configuration statements:
6606
6607     
6608
6609     permit internet 192.168.0.0 255.255.0.0
6610
6611     permit user fnord
6612
6613     permit port ttyd0
6614
6615 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.
6616
6617 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.
6618
6619 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.
6620
6621 Here is a sample `opieaccess` file:
6622
6623     
6624
6625     permit 192.168.0.0 255.255.0.0
6626
6627 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.
6628
6629 If no rules in `opieaccess` are matched, the default is to deny non-OPIE logins.
6630
6631 #### Notes 
6632
6633 [[!table  data="""
6634 |<tablestyle="width:100%"> [one-time-passwords.html#AEN8429 (1)] | Under DragonFly the standard login password may be up to 128 characters in length. |
6635
6636 """]]
6637
6638 CategoryHandbook
6639
6640 CategoryHandbook-security
6641
6642 ## Firewalls 
6643
6644 ***Contributed by Gary Palmer and Alex Nash. ***
6645
6646 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.
6647
6648  **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.
6649
6650 ### What Is a Firewall? 
6651
6652 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.
6653
6654 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.
6655
6656 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.
6657
6658 #### Packet Filtering Routers 
6659
6660 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.
6661
6662 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***.
6663
6664 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).
6665
6666 #### Proxy Servers 
6667
6668 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).
6669
6670 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.
6671
6672 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.
6673
6674 ### Firewall options in DragonFlyBSD
6675
6676 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.
6677
6678 A copy of the OpenBSD PF user's guide corresponding to the version of PF in DragonFly can be found in [[PFUsersGuide]].
6679
6680 #### What Does IPFW Allow Me to Do? 
6681
6682 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.
6683
6684 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.
6685
6686 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.
6687
6688 #### Enabling IPFW on DragonFly 
6689
6690 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.
6691
6692  **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.
6693
6694 There are currently four kernel configuration options relevant to IPFW:
6695
6696 `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.
6697
6698 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:
6699
6700     
6701
6702     # ipfw zero 4500
6703
6704 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.
6705
6706 #### Configuring IPFW 
6707
6708 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.
6709
6710 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.
6711
6712 ##### Altering the IPFW Rules 
6713
6714 The syntax for this form of the command is:
6715
6716 `ipfw` [-N] command [index] action [log] protocol addresses [options]
6717
6718 There is one valid flag when using this form of the command:
6719
6720 -N:: Resolve addresses and service names in output.
6721
6722 The ***command*** given can be shortened to the shortest unique form. The valid ***commands*** are:
6723
6724 add:: Add an entry to the firewall/accounting rule listdelete:: Delete an entry from the firewall/accounting rule list
6725
6726 Previous versions of IPFW used separate firewall and accounting entries. The present version provides packet accounting with each firewall entry.
6727
6728 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).
6729
6730 The `log` option causes matching rules to be output to the system console if the kernel was compiled with `IPFIREWALL_VERBOSE`.
6731
6732 Valid ***actions*** are:
6733
6734 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.
6735
6736 Each ***action*** will be recognized by the shortest unambiguous prefix.
6737
6738 The ***protocols*** which can be specified are:
6739
6740 all:: Matches any IP packeticmp:: Matches ICMP packetstcp:: Matches TCP packetsudp:: Matches UDP packets
6741
6742 The ***address*** specification is:
6743
6744 from `***address/mask***` [`***port***`] to `***address/mask***` [`***port***`] [via `***interface***`]
6745
6746 You can only specify `***port***` in conjunction with ***protocols*** which support ports (UDP and TCP).
6747
6748 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.
6749
6750 The syntax used to specify an `***address/mask***` is:
6751
6752     
6753
6754     `***address***`
6755
6756  or
6757
6758     
6759
6760     `***address***`/`***mask-bits***`
6761
6762  or
6763
6764     
6765
6766     `***address***`:`***mask-pattern***`
6767
6768 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***.
6769
6770 The port numbers to be blocked are specified as:
6771
6772 `***port***` [,`***port***` [,`***port***` [...]]]
6773
6774  to specify either a single port or a list of ports, or
6775
6776 `***port***`-`***port***`
6777
6778  to specify a range of ports. You may also combine a single range with a list, but the range must always be specified first.
6779
6780 The ***options*** available are:
6781
6782 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)).
6783
6784 ##### Listing the IPFW Rules 
6785
6786 The syntax for this form of the command is:
6787
6788 `ipfw` [-a] [-c] [-d] [-e] [-t] [-N] [-S] list
6789
6790 There are seven valid flags when using this form of the command:
6791
6792 -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.
6793
6794 ##### Flushing the IPFW Rules 
6795
6796 The syntax for flushing the chain is:
6797
6798 `ipfw` flush
6799
6800 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.
6801
6802 ##### Clearing the IPFW Packet Counters 
6803
6804 The syntax for clearing one or more packet counters is:
6805
6806 `ipfw` zero [`***index***`]
6807
6808 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.
6809
6810 #### Example Commands for  **ipfw**  
6811
6812 This command will deny all packets from the host `evil.crackers.org` to the telnet port of the host `nice.people.org`:
6813
6814     
6815
6816     # ipfw add deny tcp from evil.crackers.org to nice.people.org 23
6817
6818 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).
6819
6820     
6821
6822     # ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org
6823
6824 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:
6825
6826     
6827
6828     # ipfw add deny tcp from any to my.org/28 6000 setup
6829
6830 To see the accounting records:
6831
6832     
6833
6834     # ipfw -a list
6835
6836  or in the short form
6837
6838     
6839
6840     # ipfw -a l
6841
6842 You can also see the last time a chain entry was matched with:
6843
6844     
6845
6846     # ipfw -at l
6847
6848 #### Building a Packet Filtering Firewall 
6849
6850  **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.
6851
6852 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.
6853
6854  **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.
6855
6856 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.
6857
6858 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:
6859
6860 * 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.
6861
6862 * 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.
6863
6864 * 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.
6865
6866 * 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.
6867
6868 Another checklist for firewall configuration is available from CERT at http://www.cert.org/tech_tips/packet_filtering.html
6869
6870 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.
6871
6872 #### IPFW Overhead and Optimization 
6873
6874 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.
6875
6876 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.
6877
6878 Two rule sets, each with 1000 rules, were tested. The first set was designed to demonstrate a worst case scenario by repeating the rule:
6879
6880     
6881
6882     # ipfw add deny tcp from any to any 55555
6883
6884 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`.
6885
6886 The second set of rules were designed to abort the rule check quickly:
6887
6888     
6889
6890     # ipfw add deny ip from 1.2.3.4 to 1.2.3.4
6891
6892 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`.
6893
6894 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.
6895
6896 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.
6897
6898 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:
6899
6900 * Place an `established` rule early on to handle the majority of TCP traffic. Do not put any `allow tcp` statements before this rule.
6901
6902 * 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`.
6903
6904 CategoryHandbook
6905
6906 CategoryHandbook-security
6907
6908 ## OpenSSL 
6909
6910 [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.
6911
6912 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`.
6913
6914 Today, the RSA algorithm is free for use in USA and other countries. In the past it was protected by a patent.
6915
6916 ## VPN over IPsec 
6917
6918 <!-- XXX: someone revise this and add words about pf. I've no clue about this stuff -->
6919
6920 ***Written by Nik Clayton. ***
6921
6922 Creating a VPN between two networks, separated by the Internet, using DragonFly gateways.
6923
6924 ### Understanding IPsec 
6925
6926 ***Written by Hiten M. Pandya. ***
6927
6928 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]).
6929
6930 ***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.
6931
6932 IPsec consists of two sub-protocols:
6933
6934 * ***Encapsulated Security Payload (ESP)***, protects the IP packet data from third party interference, by encrypting the contents using symmetric cryptography algorithms (like Blowfish, 3DES).
6935
6936 * ***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.
6937
6938 ESP and AH can either be used together or separately, depending on the environment.
6939
6940 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.
6941
6942 To add IPsec support to your kernel, add the following options to your kernel configuration file:
6943
6944     
6945
6946     options   IPSEC        #IP security
6947
6948     options   IPSEC_ESP    #IP security (crypto; define w/ IPSEC)
6949
6950     
6951
6952 If IPsec debugging support is desired, the following kernel option should also be added:
6953
6954     
6955
6956     options   IPSEC_DEBUG  #debug for IP security
6957
6958     
6959
6960 ### The Problem 
6961
6962 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.
6963
6964 ### Scenario #1: Two networks, connected to the Internet, to behave as one 
6965
6966 This is the scenario that caused me to first investigating VPNs. The premise is as follows:
6967
6968 * You have at least two sites
6969
6970 * Both sites are using IP internally
6971
6972 * Both sites are connected to the Internet, through a gateway that is running DragonFly.
6973
6974 * The gateway on each network has at least one public IP address.
6975
6976 * 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.
6977
6978 * 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.
6979
6980 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.
6981
6982 The network topology might look something like this:
6983
6984 security/ipsec-network.png
6985
6986 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.
6987
6988 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.
6989
6990 This means that (for example), machine `192.168.1.20` should be able to run
6991
6992     
6993
6994     ping 192.168.2.34
6995
6996 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.
6997
6998 And the whole thing has to be secure. This means that traffic between the two networks has to be encrypted.
6999
7000 Creating a VPN between these two networks is a multi-step process. The stages are as follows:
7001
7002   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.
7003
7004   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.
7005
7006   1. Configure additional software on the DragonFly gateways, to allow Windows machines to see one another across the VPN.
7007
7008 #### Step 1: Creating and testing a ***virtual*** network link 
7009
7010 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?
7011
7012   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`.
7013
7014   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***.
7015
7016   1. Once this packet arrives at `W.X.Y.Z` it will need to ***unencapsulated***, and delivered to `192.168.2.1`.
7017
7018 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.
7019
7020 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.
7021
7022 Support for the gif device must be compiled in to the DragonFly kernel on both machines. You can do this by adding the line:
7023
7024     
7025
7026     pseudo-device gif
7027
7028 to the kernel configuration files on both machines, and then compile, install, and reboot as normal.
7029
7030 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).
7031
7032 On the gateway machine on network #1 you would run the following two commands to configure the tunnel.
7033
7034     
7035
7036     gifconfig gif0 A.B.C.D W.X.Y.Z
7037
7038     ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff
7039
7040     
7041
7042 On the other gateway machine you run the same commands, but with the order of the IP addresses reversed.
7043
7044     
7045
7046     gifconfig gif0 W.X.Y.Z A.B.C.D
7047
7048     ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff
7049
7050     
7051
7052 You can then run:
7053
7054     
7055
7056     gifconfig gif0
7057
7058 to see the configuration. For example, on the network #1 gateway, you would see this:
7059
7060     
7061
7062     # gifconfig gif0
7063
7064     gif0: flags=8011&lt;UP,POINTTOPOINT,MULTICAST&gt; mtu 1280
7065
7066     inet 192.168.1.1 --&gt; 192.168.2.1 netmask 0xffffffff
7067
7068     physical address inet A.B.C.D --&gt; W.X.Y.Z
7069
7070     
7071
7072 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`.
7073
7074 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.
7075
7076     
7077
7078     # netstat -rn
7079
7080     Routing tables
7081
7082     
7083
7084     Internet:
7085
7086     Destination      Gateway       Flags    Refs    Use    Netif  Expire
7087
7088     ...
7089
7090     192.168.2.1      192.168.1.1   UH        0        0    gif0
7091
7092     ...
7093
7094     
7095
7096 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.
7097
7098 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.
7099
7100 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
7101
7102     
7103
7104     ipfw add 1 allow ip from any to any via gif0
7105
7106 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.
7107
7108 This is sufficient to allow each gateway machine to ping the other. On `192.168.1.1`, you should be able to run
7109
7110     
7111
7112     ping 192.168.2.1
7113
7114 and get a response, and you should be able to do the same thing on the other gateway machine.
7115
7116 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.
7117
7118 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:
7119
7120     
7121
7122     route add 192.168.2.0 192.168.2.1 netmask 0xffffff00
7123
7124     
7125
7126 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.
7127
7128 IP traffic from hosts on one network will now be able to reach hosts on the other network.
7129
7130 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
7131
7132     
7133
7134     tcpdump dst host 192.168.2.1
7135
7136 In another log in session on the same host run
7137
7138     
7139
7140     ping 192.168.2.1
7141
7142 You will see output that looks something like this:
7143
7144     
7145
7146     16:10:24.018080 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
7147
7148     16:10:24.018109 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
7149
7150     16:10:25.018814 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
7151
7152     16:10:25.018847 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
7153
7154     16:10:26.028896 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
7155
7156     16:10:26.029112 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
7157
7158     
7159
7160 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.
7161
7162 Obviously this is unacceptable. The next section will discuss securing the link between the two networks so that it all traffic is automatically encrypted.
7163
7164  **Summary:** 
7165
7166 * Configure both kernels with ***pseudo-device gif***.
7167
7168 * Edit `/etc/rc.conf` on gateway host #1 and add the following lines (replacing IP addresses as necessary).
7169
7170       
7171
7172       gifconfig_gif0="A.B.C.D W.X.Y.Z"
7173
7174       ifconfig_gif0="inet 192.168.1.1 192.168.2.1 netmask 0xffffffff"
7175
7176       static_routes="vpn"
7177
7178       route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00"
7179
7180   
7181
7182 * Edit your firewall script (`/etc/rc.firewall`, or similar) on both hosts, and add
7183
7184       
7185
7186       ipfw add 1 allow ip from any to any via gif0
7187
7188   
7189
7190 * Make similar changes to `/etc/rc.conf` on gateway host #2, reversing the order of IP addresses.
7191
7192 #### Step 2: Securing the link 
7193
7194 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.
7195
7196 The are two areas of configuration to be considered here.
7197
7198   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.
7199
7200   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***.
7201
7202 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:
7203
7204     
7205
7206     options IPSEC
7207
7208     options IPSEC_ESP
7209
7210     
7211
7212 and recompiling, reinstalling, and rebooting. As before you will need to do this to the kernels on both of the gateway hosts.
7213
7214 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.
7215
7216 I recommend the latter. Apart from anything else, it is easier to set up.
7217
7218 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.
7219
7220 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.
7221
7222 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).
7223
7224 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.
7225
7226 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***.
7227
7228 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.
7229
7230 `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).
7231
7232 On gateway host #1 this line should look like this:
7233
7234     
7235
7236     W.X.Y.Z            secret
7237
7238 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.
7239
7240 On gateway host #2 the line would look like this
7241
7242     
7243
7244     A.B.C.D            secret
7245
7246 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.
7247
7248 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.
7249
7250     
7251
7252     ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
7253
7254     ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
7255
7256     
7257
7258 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.
7259
7260 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
7261
7262     
7263
7264     setkey -D
7265
7266 on either host to view the security association information.
7267
7268 That's one half of the problem. They other half is setting your security policies.
7269
7270 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.
7271
7272 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.
7273
7274 So if your outgoing packet started looking like this:
7275
7276 security/ipsec-out-pkt.png
7277
7278 Then it will be encapsulated inside another packet, looking something like this:
7279
7280 security/ipsec-encap-pkt.png
7281
7282 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.
7283
7284 Obviously, we want all traffic between the VPNs to be encrypted. You might try putting this in to words, as:
7285
7286 ***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.***
7287
7288 ***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.***
7289
7290 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
7291
7292 ***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.***
7293
7294 ***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.***
7295
7296 A subtle change, but a necessary one.
7297
7298 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.
7299
7300 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:
7301
7302     
7303
7304     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;
7305
7306     
7307
7308 Put these commands in a file (e.g., `/etc/ipsec.conf`) and then run
7309
7310     
7311
7312     # setkey -f /etc/ipsec.conf
7313
7314 `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.
7315
7316 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.
7317
7318 This rule only matches outgoing packets. You will need a similar rule to match incoming packets.
7319
7320     
7321
7322     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;
7323
7324 Note the `in` instead of `out` in this case, and the necessary reversal of the IP addresses.
7325
7326 The other gateway host (which has the public IP address `W.X.Y.Z`) will need similar rules.
7327
7328     
7329
7330     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;
7331
7332            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;
7333
7334 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.
7335
7336     
7337
7338     ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
7339
7340     ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
7341
7342     ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
7343
7344     ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
7345
7346     
7347
7348 Because the rules are symmetric you can use the same rules on each gateway host.
7349
7350 Outgoing packets will now look something like this:
7351
7352 security/ipsec-crypt-pkt.png
7353
7354 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.
7355
7356 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:
7357
7358     
7359
7360     tcpdump dst host 192.168.2.1
7361
7362 In another log in session on the same host run
7363
7364     
7365
7366     ping 192.168.2.1
7367
7368 This time you should see output like the following:
7369
7370     
7371
7372     XXX tcpdump output
7373
7374 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.
7375
7376 Congratulations. You have just set up a VPN between two remote sites.
7377
7378  **Summary** 
7379
7380 * Configure both kernels with:
7381
7382       
7383
7384       options IPSEC
7385
7386       options IPSEC_ESP
7387
7388   
7389
7390 * 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.
7391
7392 * Add the following lines to `/etc/rc.conf` on each host:
7393
7394       
7395
7396       ipsec_enable="YES"
7397
7398       ipsec_file="/etc/ipsec.conf"
7399
7400   
7401
7402 * Create an `/etc/ipsec.conf` on each host that contains the necessary spdadd lines. On gateway host #1 this would be:
7403
7404       
7405
7406       spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec
7407
7408         esp/tunnel/A.B.C.D-W.X.Y.Z/require;
7409
7410       spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec
7411
7412         esp/tunnel/W.X.Y.Z-A.B.C.D/require;
7413
7414   
7415
7416   On gateway host #2 this would be:
7417
7418       
7419
7420       spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec
7421
7422         esp/tunnel/W.X.Y.Z-A.B.C.D/require;
7423
7424       spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec
7425
7426         esp/tunnel/A.B.C.D-W.X.Y.Z/require;
7427
7428   
7429
7430 * Add firewall rules to allow IKE, ESP, and IPENCAP traffic to both hosts:
7431
7432       
7433
7434       ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
7435
7436       ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
7437
7438       ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
7439
7440       ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
7441
7442       ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
7443
7444       ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
7445
7446   
7447
7448 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.
7449
7450 ----
7451
7452 ## OpenSSH 
7453
7454 ***Contributed by Chern Lee. ***
7455
7456  **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.
7457
7458  **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.
7459
7460 ### Advantages of Using OpenSSH 
7461
7462 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.
7463
7464 ### Enabling sshd 
7465
7466 Be sure to make the following addition to your `rc.conf` file:
7467
7468     
7469
7470     sshd_enable="YES"
7471
7472 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.
7473
7474 ### SSH Client 
7475
7476 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).
7477
7478     
7479
7480     # ssh user@example.com
7481
7482     Host key not found from the list of known hosts.
7483
7484     Are you sure you want to continue connecting (yes/no)? yes
7485
7486     Host 'example.com' added to the list of known hosts.
7487
7488     user@example.com's password: *******
7489
7490 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.
7491
7492 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.
7493
7494 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.
7495
7496 ### Secure Copy 
7497
7498 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.
7499
7500     
7501
7502     #  scp user@example.com:/COPYRIGHT COPYRIGHT
7503
7504     user@example.com's password: *******
7505
7506     COPYRIGHT            100% |*****************************|  4735
7507
7508     00:00
7509
7510     #
7511
7512 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.
7513
7514 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.
7515
7516 ### Configuration 
7517
7518 The system-wide configuration files for both the  **OpenSSH**  daemon and client reside within the `/etc/ssh` directory.
7519
7520 `ssh_config` configures the client settings, while `sshd_config` configures the daemon.
7521
7522 Additionally, the `sshd_program` (`/usr/sbin/sshd` by default), and `sshd_flags` `rc.conf` options can provide more levels of configuration.
7523
7524 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`.
7525
7526     
7527
7528     Host shell
7529
7530      Hostname shell.example.com
7531
7532      Username user
7533
7534      Protocol 2
7535
7536      ForwardX11 yes
7537
7538 ### ssh-keygen 
7539
7540 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:
7541
7542     
7543
7544     % ssh-keygen -t rsa1
7545
7546     Initializing random number generator...
7547
7548     Generating p:  .++ (distance 66)
7549
7550     Generating q:  ..............................++ (distance 498)
7551
7552     Computing the keys...
7553
7554     Key generation complete.
7555
7556     Enter file in which to save the key (/home/user/.ssh/identity):
7557
7558     Enter passphrase:
7559
7560     Enter the same passphrase again:
7561
7562     Your identification has been saved in /home/user/.ssh/identity.
7563
7564     ...
7565
7566 [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.
7567
7568 This will allow connection to the remote machine based upon RSA authentication instead of passwords.
7569
7570  **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`.
7571
7572 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.
7573
7574 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`.
7575
7576 DSA public keys are also placed in `~/.ssh/authorized_keys` on the remote machine.
7577
7578 [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.
7579
7580  **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.
7581
7582 ### SSH Tunneling 
7583
7584  **OpenSSH**  has the ability to create a tunnel to encapsulate another protocol in an encrypted session.
7585
7586 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** :
7587
7588     
7589
7590     % ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com
7591
7592     %
7593
7594 The `ssh` command is used with the following options:
7595
7596 `-2`
7597
7598  :: Forces `ssh` to use version 2 of the protocol. (Do not use if you are working with older SSH servers)
7599
7600 `-N`
7601
7602  :: Indicates no command, or tunnel only. If omitted, `ssh` would initiate a normal session.
7603
7604 `-f`
7605
7606  :: Forces `ssh` to run in the background.
7607
7608 `-L`
7609
7610  :: Indicates a local tunnel in `***localport:remotehost:remoteport***` fashion.
7611
7612 `user@foo.example.com`
7613
7614  :: The remote SSH server.
7615
7616 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.
7617
7618 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.
7619
7620 This can be used to wrap any number of insecure TCP protocols such as SMTP, POP3, FTP, etc.
7621
7622  **Example 10-1. Using SSH to Create a Secure Tunnel for SMTP** 
7623
7624     
7625
7626     % ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com
7627
7628     user@mailserver.example.com's password: *****
7629
7630     % telnet localhost 5025
7631
7632     Trying 127.0.0.1...
7633
7634     Connected to localhost.
7635
7636     Escape character is '^]'.
7637
7638     220 mailserver.example.com ESMTP
7639
7640 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.
7641
7642 #### Practical SSH Tunneling Examples 
7643
7644 ##### Secure Access of a POP3 Server 
7645
7646 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.
7647
7648     
7649
7650     % ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com
7651
7652     user@ssh-server.example.com's password: ******
7653
7654 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`.
7655
7656 ##### Bypassing a Draconian Firewall 
7657
7658 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.
7659
7660 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.
7661
7662 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.
7663
7664     
7665
7666     % ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org
7667
7668     user@unfirewalled-system.example.org's password: *******
7669
7670 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.
7671
7672  ***Contributed by Matteo Riondato. Updated for DragonFly by Dario Banno.***
7673
7674
7675 ## Synopsis 
7676
7677  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.
7678
7679  After reading this chapter, you will know:
7680
7681 * What a jail is, and what purpose it may serve in DragonFly installations.
7682
7683 * How to build, start, and stop a jail.
7684
7685 * The basics of jail administration, both from inside and outside the jail.
7686 ***
7687
7688  Other sources of useful information about jails are:
7689
7690 * 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.
7691
7692 * 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).
7693 ***
7694   ***
7695
7696 For information on how to setup a jail, see: [Setting up a jail](http://www.youtube.com/watch?v=s4_dJjfwtR4)
7697
7698 ----
7699
7700 ## Terms Related to Jails 
7701
7702  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:
7703
7704  ***[chroot(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=8) (command)***
7705
7706   A system call of DragonFly, which changes the root directory of a process and all its descendants.
7707
7708 ***
7709
7710  ***[chroot(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=2) (environment)***
7711
7712   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.
7713
7714 ***
7715
7716 *** [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) (command)***
7717
7718   The system administration utility which allows launching of processes within a jail environment.
7719
7720 ***
7721
7722  ***host (system, process, user, etc.)***
7723
7724   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.
7725
7726 ***
7727
7728  ***hosted (system, process, user, etc.)***
7729
7730   A process, user or other entity, whose access to resources is restricted by a DragonFly jail.
7731
7732 ----
7733
7734 ## Introduction 
7735
7736  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.
7737 ***
7738
7739  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.
7740
7741 ## What is a Jail 
7742
7743  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.
7744
7745  This is one of the main reasons why ***jails*** were developed.
7746
7747  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.
7748 ***
7749
7750  A jail is characterized by four elements:
7751
7752 * 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.
7753
7754 * 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.
7755
7756 * 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.
7757
7758 * 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.
7759 ***
7760
7761  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.
7762
7763 ----
7764
7765 ## Creating and Controlling Jails 
7766
7767  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:
7768
7769      
7770
7771     # setenv D /here/is/the/jail
7772     # mkdir -p $D                                     (1)
7773     # cd /usr/src
7774     # make installworld DESTDIR=$D                    (2)
7775     # cd etc 
7776     # make distribution DESTDIR=$D -DNO_MAKEDEV_RUN   (3)
7777     # cd $D
7778     # ln -sf dev/null kernel
7779     # mount_devfs -o jail $D/dev
7780     #
7781
7782   **(1)** 
7783
7784   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.
7785 ***
7786
7787   **(2)** 
7788
7789   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.
7790 ***
7791
7792  **(3)**
7793
7794   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/***.
7795
7796 ***
7797
7798  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.
7799
7800  Jails are often started at boot time and the DragonFly rc mechanism provides an easy way to do this.
7801
7802 ***
7803  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:
7804
7805      
7806
7807     jail_enable="YES"   # Set to NO to disable starting of any jails
7808     jail_list="www"     # Space separated list of names of jails
7809     #
7810
7811 ***
7812
7813  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:
7814
7815      
7816
7817     jail_www_rootdir="/usr/jail/www"     # jail's root directory
7818     jail_www_hostname="www.example.org"  # jail's hostname
7819     jail_www_ip="192.168.0.10"           # jail's IP address
7820     #
7821
7822  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.
7823
7824    **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.
7825
7826  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***:
7827
7828     # /etc/rc.d/jail start www
7829     # /etc/rc.d/jail stop www
7830
7831 ***
7832
7833  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:
7834
7835      
7836
7837     # sh /etc/rc.shutdown
7838
7839  More information about this can be found in the [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) manual page.
7840
7841 ----
7842
7843 ## Fine Tuning and Administration 
7844
7845  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.
7846
7847 ## System tools for jail tuning in DragonFly 
7848
7849  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.
7850
7851 * jail.set_hostname_allowed: 1
7852
7853 * jail.socket_unixiproute_only: 1
7854
7855 * jail.sysvipc_allowed: 0
7856
7857 * jail.enforce_statfs: 2
7858
7859 * jail.allow_raw_sockets: 0
7860
7861 * jail.chflags_allowed: 0
7862
7863 * jail.jailed: 0
7864
7865 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.
7866
7867 ***
7868
7869  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:
7870
7871  * Print a list of active jails and their corresponding jail identifier (JID), IP address, hostname and path.
7872
7873  * 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:
7874
7875        
7876
7877           # jexec 1 tcsh
7878  ***Contributed by Matteo Riondato. Updated for DragonFly by Dario Banno.***
7879
7880
7881 ## Synopsis 
7882
7883  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.
7884
7885  After reading this chapter, you will know:
7886
7887 * What a jail is, and what purpose it may serve in DragonFly installations.
7888
7889 * How to build, start, and stop a jail.
7890
7891 * The basics of jail administration, both from inside and outside the jail.
7892 ***
7893
7894  Other sources of useful information about jails are:
7895
7896 * 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.
7897
7898 * 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).
7899 ***
7900   ***
7901
7902 For information on how to setup a jail, see: [Setting up a jail](http://www.youtube.com/watch?v=s4_dJjfwtR4)
7903
7904 ----
7905
7906 ## Terms Related to Jails 
7907
7908  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:
7909
7910  ***[chroot(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=8) (command)***
7911
7912   A system call of DragonFly, which changes the root directory of a process and all its descendants.
7913
7914 ***
7915
7916  ***[chroot(2)](http://leaf.dragonflybsd.org/cgi/web-man?command=chroot&section=2) (environment)***
7917
7918   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.
7919
7920 ***
7921
7922 *** [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) (command)***
7923
7924   The system administration utility which allows launching of processes within a jail environment.
7925
7926 ***
7927
7928  ***host (system, process, user, etc.)***
7929
7930   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.
7931
7932 ***
7933
7934  ***hosted (system, process, user, etc.)***
7935
7936   A process, user or other entity, whose access to resources is restricted by a DragonFly jail.
7937
7938 ----
7939
7940 ## Introduction 
7941
7942  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.
7943 ***
7944
7945  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.
7946
7947 ## What is a Jail 
7948
7949  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.
7950
7951  This is one of the main reasons why ***jails*** were developed.
7952
7953  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.
7954 ***
7955
7956  A jail is characterized by four elements:
7957
7958 * 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.
7959
7960 * 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.
7961
7962 * 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.
7963
7964 * 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.
7965 ***
7966
7967  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.
7968
7969 ----
7970
7971 ## Creating and Controlling Jails 
7972
7973  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:
7974
7975      
7976
7977     # setenv D /here/is/the/jail
7978     # mkdir -p $D                                     (1)
7979     # cd /usr/src
7980     # make installworld DESTDIR=$D                    (2)
7981     # cd etc 
7982     # make distribution DESTDIR=$D -DNO_MAKEDEV_RUN   (3)
7983     # cd $D
7984     # ln -sf dev/null kernel
7985     # mount_devfs -o jail $D/dev
7986     #
7987
7988   **(1)** 
7989
7990   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.
7991 ***
7992
7993   **(2)** 
7994
7995   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.
7996 ***
7997
7998  **(3)**
7999
8000   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/***.
8001
8002 ***
8003
8004  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.
8005
8006  Jails are often started at boot time and the DragonFly rc mechanism provides an easy way to do this.
8007
8008 ***
8009  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:
8010
8011      
8012
8013     jail_enable="YES"   # Set to NO to disable starting of any jails
8014     jail_list="www"     # Space separated list of names of jails
8015     #
8016
8017 ***
8018
8019  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:
8020
8021      
8022
8023     jail_www_rootdir="/usr/jail/www"     # jail's root directory
8024     jail_www_hostname="www.example.org"  # jail's hostname
8025     jail_www_ip="192.168.0.10"           # jail's IP address
8026     #
8027
8028  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.
8029
8030    **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.
8031
8032  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***:
8033
8034     # /etc/rc.d/jail start www
8035     # /etc/rc.d/jail stop www
8036
8037 ***
8038
8039  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:
8040
8041      
8042
8043     # sh /etc/rc.shutdown
8044
8045  More information about this can be found in the [jail(8)](http://leaf.dragonflybsd.org/cgi/web-man?command=jail&section=8) manual page.
8046
8047 ----
8048
8049 ## Fine Tuning and Administration 
8050
8051  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.
8052
8053 ## System tools for jail tuning in DragonFly 
8054
8055  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.
8056
8057 * jail.set_hostname_allowed: 1
8058
8059 * jail.socket_unixiproute_only: 1
8060
8061 * jail.sysvipc_allowed: 0
8062
8063 * jail.enforce_statfs: 2
8064
8065 * jail.allow_raw_sockets: 0
8066
8067 * jail.chflags_allowed: 0
8068
8069 * jail.jailed: 0
8070
8071 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.
8072
8073 ***
8074
8075  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:
8076
8077  * Print a list of active jails and their corresponding jail identifier (JID), IP address, hostname and path.
8078
8079  * 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:
8080
8081        
8082
8083           # jexec 1 tcsh
8084
8085 ***This Page is under constructions. New software are being added regularly.***
8086 **Follow the links below to see how to make corresponding software work on DragonFly**
8087
8088 ## Servers
8089 [[SSHserver]]
8090
8091 [FTP Server](http://www.dragonflybsd.org/docs/newhandbook/FTP/)
8092
8093 ## Installing flash player on firefox.
8094
8095 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
8096
8097 ### Configure Linux Support
8098
8099     # echo "linux_load=yes" >> /boot/loader.conf
8100     # echo "linux_enable=yes" >> /etc/rc.conf
8101     # echo "proc  /compat/linux/proc  linprocfs  rw  0  0" >> /etc/fstab
8102
8103 **Reboot DragonFly** ( not necessarry but easier for new users )  so that Linux Emulation is loaded to the kernel and configured correctly.
8104
8105 ### Install multimedia/libflashsupport from pkgsrc. 
8106
8107     # cd /usr/pkgsrc/multimedia/libflashsupport
8108     # bmake package
8109
8110 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.
8111
8112     # pkg_info |grep suse
8113     suse_openssl-10.0nb5 Linux compatibility package for OpenSSL
8114     suse_gtk2-10.0nb4   Linux compatibility package for GTK+-2.x
8115     suse_gtk-10.0nb2    Linux compatibility package for GTK+-1.x
8116     suse_libjpeg-10.0nb2 Linux compatibility package for JPEG
8117     suse_base-10.0nb5   Linux compatibility package
8118     suse_slang-10.0nb3  Linux compatibility package for S-Lang
8119     suse_locale-10.0nb2 Linux compatibility package with locale files
8120     suse_fontconfig-10.0nb6 Linux compatibility package for fontconfig
8121     suse_libtiff-10.0nb4 Linux compatibility package for TIFF
8122     suse_openmotif-10.0nb2 Linux compatibility package for OpenMotif
8123     suse_libpng-10.0nb4 Linux compatibility package for PNG
8124     suse_libcups-10.0nb4 Linux compatibility package for CUPS
8125     suse_gdk-pixbuf-10.0nb3 Linux compatibility package for gdk-pixbuf
8126     suse_expat-10.0nb2  Linux compatibility package for expat
8127     suse_vmware-10.0nb2 Linux compatibility package to help run VMware
8128     suse_libxml2-10.0nb2 Linux compatibility package for libxml2
8129     suse_compat-10.0nb3 Linux compatibility package with old shared libraries
8130     suse_x11-10.0nb4    Linux compatibility package for X11
8131     suse_glx-10.0nb4    Linux compatibility package for OpenGL/Mesa
8132     suse_freetype2-10.0nb5 Linux compatibility package for freetype-2.x
8133     suse_aspell-10.0nb2 Linux compatibility package for aspell
8134     suse-10.0nb4        SUSE-based Linux binary emulation environment
8135
8136 ### Install www/nspluginwrapper 
8137
8138 This will allow DragonFly to use the Linux Binary Flash Plugin
8139
8140     # cd /usr/pkgsrc/www/nspluginwrapper
8141     # bmake package
8142
8143 ### Install multimedia/ns-flash
8144
8145 This is the Linux Flash Plugin itself.
8146
8147     # cd /usr/pkgsrc/multimedia/ns-flash
8148     # bmake NO_CHECKSUM=yes package
8149
8150 You can check if the Flash plugin is installed right by.
8151
8152     # /usr/pkg/bin/nspluginwrapper --list
8153     /usr/pkg/lib/netscape/plugins/npwrapper.libflashplayer.so
8154       Original plugin: /usr/pkg/lib/netscape/plugins/libflashplayer.so
8155       Wrapper version string: 1.2.2
8156     /usr/pkg/lib/netscape/plugins/npwrapper.libflashplayer.so
8157       Original plugin: /usr/pkg/lib/netscape/plugins/libflashplayer.so
8158       Wrapper version string: 1.2.2
8159
8160 Don't worry if it is listed twice as above.
8161
8162 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).
8163
8164 You can watch Streaming Flash now.
8165
8166 ##Chapter 18 Serial Communications 
8167
8168 ***Reorganized, and parts rewritten by Ivailo Mladenov. ***
8169
8170 ## Synopsis 
8171
8172 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.
8173
8174 After reading this chapter, you will know:
8175
8176 * How to connect terminals to your DragonFly system.
8177
8178 * How to use a modem to dial out to remote hosts.
8179
8180 * How to allow remote users to login to your system with a modem.
8181
8182 * How to boot your system from a serial console.
8183
8184 Before reading this chapter, you should:
8185
8186 * Know how to configure and install a new kernel ([kernelconfig.html Chapter 10]).
8187
8188 * Understand UNIX permissions and processes ([basics.html Chapter 3]).
8189
8190 * Have access to the technical manual for the serial hardware (modem or multi-port card) that you would like to use with DragonFly.
8191
8192 ***
8193
8194 ## 18.1 Introduction 
8195
8196 ### 18.1.1 Terminology 
8197
8198 bps:: Bits per Second -- the rate at which data is transmitted;
8199
8200 DTE:: Data Terminal Equipment -- for example, your computer;
8201
8202 DCE:: Data Communications Equipment -- your modem;
8203
8204 RS-232:: EIA standard for hardware serial communications.
8205
8206 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).
8207
8208 ### 18.1.2 Cables and Ports 
8209
8210 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.
8211
8212 #### 18.1.2.1 Cables 
8213
8214 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.
8215
8216 ##### 18.1.2.1.1 Null-modem Cables 
8217
8218 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.
8219
8220 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.
8221
8222 [[!table  data="""
8223 | Signal | Pin # |  | Pin # | Signal 
8224  SG | 7 | connects to | 7 | SG 
8225  TxD | 2 | connects to | 3 | RxD 
8226  RxD | 3 | connects to | 2 | TxD 
8227  RTS | 4 | connects to | 5 | CTS 
8228  CTS | 5 | connects to | 4 | RTS 
8229  DTR | 20 | connects to | 6 | DSR 
8230  DCD | 8 |  | 6 | DSR 
8231  DSR | 6 | connects to | 20 | DTR |
8232
8233 """]]
8234
8235  **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.
8236
8237 ##### 18.1.2.1.2 Standard RS-232C Cables 
8238
8239 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.
8240
8241 #### 18.1.2.2 Ports 
8242
8243 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.
8244
8245 ##### 18.1.2.2.1 Kinds of Ports 
8246
8247 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.
8248
8249 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.
8250
8251 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.
8252
8253 ##### 18.1.2.2.2 Port Names 
8254
8255 In DragonFly, you access each serial port through an entry in the `/dev` directory. There are two different kinds of entries:
8256
8257 * 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.
8258
8259 * 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.
8260
8261 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.
8262
8263 ### 18.1.3 Kernel Configuration 
8264
8265 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.
8266
8267 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`.
8268
8269  **Tip:** To view just the messages that have the word `sio`, use the command:
8270
8271     
8272
8273     # /sbin/dmesg | grep 'sio'
8274
8275 For example, on a system with four serial ports, these are the serial-port specific kernel boot messages:
8276
8277     
8278
8279     sio0 at 0x3f8-0x3ff irq 4 on isa
8280
8281     sio0: type 16550A
8282
8283     sio1 at 0x2f8-0x2ff irq 3 on isa
8284
8285     sio1: type 16550A
8286
8287     sio2 at 0x3e8-0x3ef irq 5 on isa
8288
8289     sio2: type 16550A
8290
8291     sio3 at 0x2e8-0x2ef irq 9 on isa
8292
8293     sio3: type 16550A
8294
8295 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].
8296
8297 The relevant device lines for your kernel configuration file would look like this:
8298
8299     
8300
8301     device              sio0    at isa? port IO_COM1 irq 4
8302
8303     device              sio1    at isa? port IO_COM2 irq 3
8304
8305     device              sio2    at isa? port IO_COM3 irq 5
8306
8307     device              sio3    at isa? port IO_COM4 irq 9
8308
8309  **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).
8310
8311 ### 18.1.4 Device Special Files 
8312
8313 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.
8314
8315 ### 18.1.5 Serial Port Configuration 
8316
8317 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
8318
8319     
8320
8321     # stty -a -f /dev/ttyd1
8322
8323 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:
8324
8325     
8326
8327     # stty -f /dev/ttyid5 clocal cs8 ixon ixoff
8328
8329 System-wide initialization of the serial devices is controlled in `/etc/rc.serial`. This file affects the default settings of serial devices.
8330
8331 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:
8332
8333     
8334
8335     # stty -f /dev/ttyld5 57600
8336
8337 Now, an application that opens `ttyd5` and tries to change the speed of the port will be stuck with 57600 bps.
8338
8339 Naturally, you should make the initial state and lock state devices writable only by the `root` account.
8340
8341 ***
8342
8343 ## 18.2 Terminals 
8344
8345 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.
8346
8347 ### 18.2.1 Uses and Types of Terminals 
8348
8349 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.
8350
8351 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.
8352
8353 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.
8354
8355 For DragonFly, there are three kinds of terminals:
8356
8357 * [ Dumb terminals](term.html#TERM-DUMB)
8358
8359 * [ PCs acting as terminals](term.html#TERM-PCS)
8360
8361 * [ X terminals](term.html#TERM-X)
8362
8363 #### 18.2.1.1 Dumb Terminals 
8364
8365 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.
8366
8367 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.
8368
8369 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.
8370
8371 #### 18.2.1.2 PCs Acting as Terminals 
8372
8373 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.
8374
8375 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.
8376
8377 #### 18.2.1.3 X Terminals 
8378
8379 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.
8380
8381 We introduce X terminals just for the sake of completeness. However, this chapter does ***not*** cover setup, configuration, or use of X terminals.
8382
8383 ### 18.2.2 Configuration 
8384
8385 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.
8386
8387 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.
8388
8389 Thus, to configure terminals for your DragonFly system the following steps should be taken as `root`:
8390
8391   1. Add a line to `/etc/ttys` for the entry in the `/dev` directory for the serial port if it is not already there.
8392
8393   1. Specify that `/usr/libexec/getty` be run on the port, and specify the appropriate `***getty***` type from the `/etc/gettytab` file.
8394
8395   1. Specify the default terminal type.
8396
8397   1. Set the port to ***on.***
8398
8399   1. Specify whether the port should be ***secure.***
8400
8401   1. Force `init` to reread the `/etc/ttys` file.
8402
8403 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.
8404
8405 #### 18.2.2.1 Adding an Entry to `/etc/ttys` 
8406
8407 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`).
8408
8409 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.
8410
8411  **Example 17-1. Adding Terminal Entries to `/etc/ttys`** 
8412
8413 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:
8414
8415     
8416
8417     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
8418
8419     ttyd5   "/usr/libexec/getty std.19200"  vt100  on  insecure
8420
8421     
8422
8423 [ ./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.
8424
8425 #### 18.2.2.2 Force `init` to Reread `/etc/ttys` 
8426
8427 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:
8428
8429     
8430
8431     # kill -HUP 1
8432
8433  **Note:** `init` is always the first process run on a system, therefore it will always have PID 1.
8434
8435 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.
8436
8437 ### 18.2.3 Troubleshooting Your Connection 
8438
8439 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.
8440
8441 #### 18.2.3.1 No Login Prompt Appears 
8442
8443 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.
8444
8445 Make sure the cable is connected firmly to both the terminal and the DragonFly computer. Make sure it is the right kind of cable.
8446
8447 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.
8448
8449 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:
8450
8451     
8452
8453     # ps -axww|grep getty
8454
8455 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`:
8456
8457     
8458
8459     22189  d1  Is+    0:00.03 /usr/libexec/getty std.38400 ttyd1
8460
8461 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.
8462
8463 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.
8464
8465 #### 18.2.3.2 If Garbage Appears Instead of a Login Prompt 
8466
8467 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`.
8468
8469 #### 18.2.3.3 Characters Appear Doubled, the Password Appears When Typed 
8470
8471 Switch the terminal (or the terminal emulation software) from ***half duplex*** or ***local echo*** to ***full duplex.***
8472
8473 ***
8474
8475 ## 18.3 Dial-in Service 
8476
8477 Configuring your DragonFly system for dial-in service is very similar to connecting terminals except that you are dealing with modems instead of terminals.
8478
8479 ### 18.3.1 External vs. Internal Modems 
8480
8481 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.
8482
8483 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.
8484
8485 #### 18.3.1.1 Modems and Cables 
8486
8487 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:
8488
8489 * Transmitted Data (SD)
8490
8491 * Received Data (RD)
8492
8493 * Request to Send (RTS)
8494
8495 * Clear to Send (CTS)
8496
8497 * Data Set Ready (DSR)
8498
8499 * Data Terminal Ready (DTR)
8500
8501 * Carrier Detect (CD)
8502
8503 * Signal Ground (SG)
8504
8505 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.
8506
8507 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.
8508
8509 ### 18.3.2 Serial Interface Considerations 
8510
8511 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.
8512
8513 ### 18.3.3 Quick Overview 
8514
8515 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:
8516
8517     
8518
8519      4850 ??  I      0:00.09 /usr/libexec/getty V19200 ttyd0
8520
8521 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.
8522
8523 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.
8524
8525 ### 18.3.4 Configuration Files 
8526
8527 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.
8528
8529 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.
8530
8531 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.
8532
8533 This section will try to give balanced configuration information, but is biased towards having the modem's data rate follow the connection rate.
8534
8535 #### 18.3.4.1 `/etc/gettytab` 
8536
8537 `/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.
8538
8539 ##### 18.3.4.1.1 Locked-speed Config 
8540
8541 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`.
8542
8543 ##### 18.3.4.1.2 Matching-speed Config 
8544
8545 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.
8546
8547     
8548
8549     #
8550
8551     # Fast dialup terminals, 2400/1200/300 rotary (can start either way)
8552
8553     #
8554
8555     D2400|d2400|Fast-Dial-2400:\
8556
8557             :nx#D1200:tc2400-baud:
8558
8559     3|D1200|Fast-Dial-1200:\
8560
8561             :nx#D300:tc1200-baud:
8562
8563     5|D300|Fast-Dial-300:\
8564
8565             :nx#D2400:tc300-baud:
8566
8567 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:
8568
8569     
8570
8571     #
8572
8573     # Additions for a V.32bis Modem
8574
8575     #
8576
8577     um|V300|High Speed Modem at 300,8-bit:\
8578
8579             :nx#V19200:tcstd.300:
8580
8581     un|V1200|High Speed Modem at 1200,8-bit:\
8582
8583             :nx#V300:tcstd.1200:
8584
8585     uo|V2400|High Speed Modem at 2400,8-bit:\
8586
8587             :nx#V1200:tcstd.2400:
8588
8589     up|V9600|High Speed Modem at 9600,8-bit:\
8590
8591             :nx#V2400:tcstd.9600:
8592
8593     uq|V19200|High Speed Modem at 19200,8-bit:\
8594
8595             :nx#V9600:tcstd.19200:
8596
8597 This will result in 8-bit, no parity connections.
8598
8599 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.
8600
8601 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:
8602
8603     
8604
8605     #
8606
8607     # Additions for a V.32bis or V.34 Modem
8608
8609     # Starting at 57.6 Kbps
8610
8611     #
8612
8613     vm|VH300|Very High Speed Modem at 300,8-bit:\
8614
8615             :nx#VH57600:tcstd.300:
8616
8617     vn|VH1200|Very High Speed Modem at 1200,8-bit:\
8618
8619             :nx#VH300:tcstd.1200:
8620
8621     vo|VH2400|Very High Speed Modem at 2400,8-bit:\
8622
8623             :nx#VH1200:tcstd.2400:
8624
8625     vp|VH9600|Very High Speed Modem at 9600,8-bit:\
8626
8627             :nx#VH2400:tcstd.9600:
8628
8629     vq|VH57600|Very High Speed Modem at 57600,8-bit:\
8630
8631             :nx#VH9600:tcstd.57600:
8632
8633 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.
8634
8635 #### 18.3.4.2 `/etc/ttys` 
8636
8637 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:
8638
8639     
8640
8641     ttyd0   "/usr/libexec/getty `***xxx***`"   dialup on
8642
8643 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).
8644
8645 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.
8646
8647 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
8648
8649     
8650
8651     # kill -HUP 1
8652
8653  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`.
8654
8655 ##### 18.3.4.2.1 Locked-speed Config 
8656
8657 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:
8658
8659     
8660
8661     ttyd0   "/usr/libexec/getty std.19200"   dialup on
8662
8663 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`.
8664
8665 ##### 18.3.4.2.2 Matching-speed Config 
8666
8667 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:
8668
8669     
8670
8671     ttyd0   "/usr/libexec/getty V19200"   dialup on
8672
8673 #### 18.3.4.3 `/etc/rc.serial` 
8674
8675 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.
8676
8677 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`:
8678
8679     
8680
8681     # Serial port initial configuration
8682
8683     stty -f /dev/ttyid1 crtscts
8684
8685     stty -f /dev/cuaia1 crtscts
8686
8687 ### 18.3.5 Modem Settings 
8688
8689 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:
8690
8691 * CD asserted when connected
8692
8693 * DTR asserted for operation; dropping DTR hangs up line and resets modem
8694
8695 * CTS transmitted data flow control
8696
8697 * Disable XON/XOFF flow control
8698
8699 * RTS received data flow control
8700
8701 * Quiet mode (no result codes)
8702
8703 * No command echo
8704
8705 Please read the documentation for your modem to find out what commands and/or DIP switch settings you need to give it.
8706
8707 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:
8708
8709     
8710
8711     ATZ
8712
8713     AT&amp;C1&amp;D2&amp;H1&amp;I0&amp;R2&amp;W
8714
8715 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.
8716
8717 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:
8718
8719 * Switch 1: UP -- DTR Normal
8720
8721 * Switch 2: N/A (Verbal Result Codes/Numeric Result Codes)
8722
8723 * Switch 3: UP -- Suppress Result Codes
8724
8725 * Switch 4: DOWN -- No echo, offline commands
8726
8727 * Switch 5: UP -- Auto Answer
8728
8729 * Switch 6: UP -- Carrier Detect Normal
8730
8731 * Switch 7: UP -- Load NVRAM Defaults
8732
8733 * Switch 8: N/A (Smart Mode/Dumb Mode)
8734
8735 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.
8736
8737 #### 18.3.5.1 Locked-speed Config 
8738
8739 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:
8740
8741     
8742
8743     ATZ
8744
8745     AT&amp;B1&amp;W
8746
8747 #### 18.3.5.2 Matching-speed Config 
8748
8749 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:
8750     
8751
8752     ATZ
8753
8754     AT&amp;B2&amp;W
8755
8756 #### 18.3.5.3 Checking the Modem's Configuration 
8757
8758 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`.
8759
8760 If you have a different brand of modem, check your modem's manual to see how to double-check your modem's configuration parameters.
8761
8762 ### 18.3.6 Troubleshooting 
8763
8764 Here are a few steps you can follow to check out the dial-up modem on your system.
8765
8766 #### 18.3.6.1 Checking Out the DragonFly System 
8767
8768 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.
8769
8770 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:
8771
8772     
8773
8774       114 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd0
8775
8776       115 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd1
8777
8778 If you see something different, like this:
8779
8780     
8781
8782       114 d0  I      0:00.10 /usr/libexec/getty V19200 ttyd0
8783
8784 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.
8785
8786 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.
8787
8788 #### 18.3.6.2 Try Dialing In 
8789
8790 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).
8791
8792 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).
8793
8794 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.
8795
8796 ***
8797 ## 18.4 Dial-out Service 
8798
8799 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.
8800
8801 This is useful to log onto a BBS.
8802
8803 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.
8804
8805 ### 18.4.1 My Stock Hayes Modem Is Not Supported, What Can I Do? 
8806
8807 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.
8808
8809 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`).
8810
8811 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`.
8812
8813  **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.
8814
8815 Edit the line `#define HAYES 0` to `#define HAYES 1`. Then `make` and `make install`. Everything works nicely after that.
8816
8817 ### 18.4.2 How Am I Expected to Enter These AT Commands? 
8818
8819 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:
8820
8821     
8822
8823     cuaa0:dv#/dev/cuaa0:br#19200:panone
8824
8825 Use the highest bps rate your modem supports in the br capability. Then, type `tip cuaa0` and you will be connected to your modem.
8826
8827 Or use `cu` as `root` with the following command:
8828
8829     
8830
8831     # cu -l`***line***` -s`***speed***`
8832
8833 `***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.
8834
8835 ### 18.4.3 The `@` Sign for the pn Capability Does Not Work! 
8836
8837 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:
8838
8839     
8840
8841     pn=\@
8842
8843 ### 18.4.4 How Can I Dial a Phone Number on the Command Line? 
8844
8845 Put what is called a ***generic*** entry in your `/etc/remote` file. For example:
8846
8847     
8848
8849     tip115200|Dial any phone number at 115200 bps:\
8850
8851             :dv#/dev/cuaa0:br#115200:athayes:pa=none:du:
8852
8853     tip57600|Dial any phone number at 57600 bps:\
8854
8855             :dv#/dev/cuaa0:br#57600:athayes:pa=none:du:
8856
8857 Then you can do things like:
8858
8859     
8860
8861     # tip -115200 5551234
8862
8863 If you prefer `cu` over `tip`, use a generic `cu` entry:
8864
8865     
8866
8867     cu115200|Use cu to dial any number at 115200bps:\
8868
8869             :dv#/dev/cuaa1:br#57600:athayes:pa=none:du:
8870
8871 and type:
8872
8873     
8874
8875     # cu 5551234 -s 115200
8876
8877 ### 18.4.5 Do I Have to Type in the bps Rate Every Time I Do That? 
8878
8879 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.
8880
8881 ### 18.4.6 I Access a Number of Hosts Through a Terminal Server 
8882
8883 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`:
8884
8885     
8886
8887     pain|pain.deep13.com|Forrester's machine:\
8888
8889             :cm#CONNECT pain\n:tcdeep13:
8890
8891     muffin|muffin.deep13.com|Frank's machine:\
8892
8893             :cm#CONNECT muffin\n:tcdeep13:
8894
8895     deep13:Gizmonics Institute terminal server:\
8896
8897             :dv#/dev/cuaa2:br#38400:athayes:du:pa=none:pn=5551234:
8898
8899 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.
8900
8901 ### 18.4.7 Can Tip Try More Than One Line for Each Site? 
8902
8903 This is often a problem where a university has several modem lines and several thousand students trying to use them.
8904
8905 Make an entry for your university in `/etc/remote` and use `@` for the `pn` capability:
8906
8907     
8908
8909     big-university:\
8910
8911             :pn#\@:tcdialout
8912
8913     dialout:\
8914
8915             :dv#/dev/cuaa3:br#9600:atcourier:du:pa=none:
8916
8917 Then, list the phone numbers for the university in `/etc/phones`:
8918
8919     
8920
8921     big-university 5551111
8922
8923     big-university 5551112
8924
8925     big-university 5551113
8926
8927     big-university 5551114
8928
8929 `tip` will try each one in the listed order, then give up. If you want to keep retrying, run `tip` in a while loop.
8930
8931 ### 18.4.8 Why Do I Have to Hit  **Ctrl** + **P**  Twice to Send  **Ctrl** + **P**  Once? 
8932
8933  **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.***
8934
8935 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.
8936
8937 You can have the force character be whatever you want by specifying the following in your `$HOME/.tiprc` file:
8938
8939     
8940
8941     force=&lt;single-char&gt;
8942
8943 ### 18.4.9 Suddenly Everything I Type Is in Upper Case?? 
8944
8945 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.
8946
8947 Here is a sample .tiprc file perfect for  **Emacs**  users who need to type  **Ctrl** + **2**  and  **Ctrl** + **A**  a lot:
8948
8949     
8950
8951     force=^^
8952
8953     raisechar=^^
8954
8955 The ^^ is  **Shift** + **Ctrl** + **6** .
8956
8957 ### 18.4.10 How Can I Do File Transfers with `tip`? 
8958
8959 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:
8960
8961 `~p` local-file [remote-file]
8962
8963 `~t` remote-file [local-file]
8964
8965 There is no error checking, so you probably should use another protocol, like zmodem.
8966
8967 ### 18.4.11 How Can I Run zmodem with `tip`? 
8968
8969 To receive files, start the sending program on the remote end. Then, type `~C rz` to begin receiving them locally.
8970
8971 To send files, start the receiving program on the remote end. Then, type `~C sz `***files****** to send them to the remote system.
8972
8973 ***
8974
8975 ## 18.5 Setting Up the Serial Console 
8976
8977 ### 18.5.1 Introduction 
8978
8979 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.
8980
8981 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.
8982
8983 In order to set up the serial console you must configure the boot block code, the boot loader code and the kernel.
8984
8985 ### 18.5.2 Serial Console Configuration, Terse Version 
8986
8987 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].
8988
8989   1. Connect the serial port. The serial console will be on COM1.
8990
8991   1. `echo -h &gt; /boot.config` to enable the serial console for the boot loader and kernel.
8992
8993   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.
8994
8995   1. `shutdown -r now` will reboot the system with the serial console.
8996
8997 ### 18.5.3 Serial Console Configuration 
8998
8999   1. Prepare a serial cable.
9000
9001   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.
9002
9003   1. Unplug your keyboard.
9004
9005   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.
9006
9007   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.)
9008
9009   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.
9010
9011    **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.
9012
9013    **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.
9014
9015   1. Plug a dumb terminal into `COM1` (`sio0`).
9016
9017   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.)
9018
9019   1. Make sure the configuration file of your kernel has appropriate flags set for `COM1` (`sio0`).
9020
9021   Relevant flags are:
9022
9023   `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.
9024
9025   Example:
9026
9027       
9028
9029       device sio0 at isa? port IO_COM1 flags 0x10 irq 4
9030
9031   
9032
9033   See the [sio(4)](http://leaf.dragonflybsd.org/cgi/web-man?command#sio&section4) manual page for more details.
9034
9035   If the flags were not set, you need to run UserConfig (on a different console) or recompile the kernel.
9036
9037   1. Create `boot.config` in the root directory of the `a` partition on the boot drive.
9038
9039   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:
9040
9041   `-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.
9042
9043    **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.
9044
9045   Use either the `-P` option to select the console automatically, or the `-h` option to activate the serial console.
9046
9047   You may include other options described in [boot(8)](http://leaf.dragonflybsd.org/cgi/web-man?command#boot&section8) as well.
9048
9049   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.
9050
9051   1. Boot the machine.
9052
9053   When you start your DragonFly box, the boot blocks will echo the contents of `/boot.config` to the console. For example:
9054
9055       
9056
9057       /boot.config: -P
9058
9059       Keyboard: no
9060
9061   
9062
9063   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`.
9064
9065   || Options || Message goes to ||
9066
9067   || none || internal console ||
9068
9069   || `-h` || serial console ||
9070
9071   || `-D` || serial and internal consoles ||
9072
9073   || `-Dh` || serial and internal consoles ||
9074
9075   || `-P`, keyboard present || internal console ||
9076
9077   || `-P`, keyboard absent || serial console ||
9078
9079   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.
9080
9081   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:
9082
9083       
9084
9085       &gt;&gt; DragonFly/i386 BOOT
9086
9087       Default: 0:ad(0,a)/boot/loader
9088
9089       boot:
9090
9091   
9092
9093   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.
9094
9095   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.
9096
9097 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].
9098
9099 ### 18.5.4 Summary 
9100
9101 Here is the summary of various settings discussed in this section and the console eventually selected.
9102
9103 #### 18.5.4.1 Case 1: You Set the Flags to 0x10 for `sio0` 
9104
9105     
9106
9107     device sio0 at isa? port IO_COM1 flags 0x10 irq 4
9108
9109 [[!table  data="""
9110 | Options in /boot.config | Console during boot blocks | Console during boot loader | Console in kernel 
9111  nothing | internal | internal | internal 
9112  `-h` | serial | serial | serial 
9113  `-D` | serial and internal | internal | internal 
9114  `-Dh` | serial and internal | serial | serial 
9115  `-P`, keyboard present | internal | internal | internal 
9116  `-P`, keyboard absent | serial and internal | serial | serial |
9117
9118 """]]
9119
9120 #### 18.5.4.2 Case 2: You Set the Flags to 0x30 for sio0 
9121
9122     
9123
9124     device sio0 at isa? port IO_COM1 flags 0x30 irq 4
9125
9126 [[!table  data="""
9127 | Options in /boot.config | Console during boot blocks | Console during boot loader | Console in kernel 
9128  nothing | internal | internal | serial 
9129  `-h` | serial | serial | serial 
9130  `-D` | serial and internal | internal | serial 
9131  `-Dh` | serial and internal | serial | serial 
9132  `-P`, keyboard present | internal | internal | serial 
9133  `-P`, keyboard absent | serial and internal | serial | serial |
9134
9135 """]]
9136
9137 ### 18.5.5 Tips for the Serial Console 
9138
9139 #### 18.5.5.1 Setting a Faster Serial Port Speed 
9140
9141 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:
9142
9143     
9144
9145     BOOT_COMCONSOLE_SPEED=19200
9146
9147 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:
9148
9149     
9150
9151     options CONSPEED=19200
9152
9153 #### 18.5.5.2 Using Serial Port Other Than `sio0` for the Console 
9154
9155 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.
9156
9157   1. Get the kernel source.
9158
9159   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.
9160
9161   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:
9162
9163       
9164
9165       device sio1 at isa? port IO_COM2 flags 0x10 irq 3
9166
9167   
9168
9169   or
9170
9171       
9172
9173       device sio1 at isa? port IO_COM2 flags 0x30 irq 3
9174
9175   
9176
9177   The console flags for the other serial ports should not be set.
9178
9179   1. Recompile and install the boot blocks and the boot loader:
9180
9181       
9182
9183       # cd /sys/boot
9184
9185       # make
9186
9187       # make install
9188
9189   
9190
9191   1. Rebuild and install the kernel.
9192
9193   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.
9194
9195 #### 18.5.5.3 Entering the DDB Debugger from the Serial Line 
9196
9197 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:
9198
9199     
9200
9201     options BREAK_TO_DEBUGGER
9202
9203     options DDB
9204
9205 #### 18.5.5.4 Getting a Login Prompt on the Serial Console 
9206
9207 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.
9208
9209 Open the file `/etc/ttys` with an editor and locate the lines:
9210
9211     
9212
9213     ttyd0 "/usr/libexec/getty std.9600" unknown off secure
9214
9215     ttyd1 "/usr/libexec/getty std.9600" unknown off secure
9216
9217     ttyd2 "/usr/libexec/getty std.9600" unknown off secure
9218
9219     ttyd3 "/usr/libexec/getty std.9600" unknown off secure
9220
9221 `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`.
9222
9223 You may also want to change the terminal type from `unknown` to the actual type of your serial terminal.
9224
9225 After editing the file, you must `kill -HUP 1` to make this change take effect.
9226
9227 ### 18.5.6 Changing Console from the Boot Loader 
9228
9229 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.
9230
9231 #### 18.5.6.1 Setting Up the Serial Console 
9232
9233 You can easily specify the boot loader and the kernel to use the serial console by writing just one line in `/boot/loader.rc`:
9234
9235     
9236
9237     set console=comconsole
9238
9239 This will take effect regardless of the settings in the boot block discussed in the previous section.
9240
9241 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.
9242
9243 Likewise, you can specify the internal console as:
9244
9245     
9246
9247     set console=vidconsole
9248
9249 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.
9250
9251 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:
9252
9253     
9254
9255     include /boot/loader.4th
9256
9257     start
9258
9259 Then, create `/boot/loader.conf.local` and put the following line there.
9260
9261     
9262
9263     console=comconsole
9264
9265 or
9266
9267     
9268
9269     console=vidconsole
9270
9271  **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.
9272
9273 #### 18.5.6.2 Using a Serial Port Other Than `sio0` for the Console 
9274
9275 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].
9276
9277 ### 18.5.7 Caveats 
9278
9279 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.***
9280