xref: /freebsd/usr.sbin/bsdinstall/bsdinstall.8 (revision b64c5a0ace59af62eff52bfe110a521dc73c937b)
1.\"-
2.\" Copyright (c) 2011-2013 Nathan Whitehorn <nwhitehorn@FreeBSD.org> All rights reserved.
3.\" Copyright (c) 2018 Roberto Fernandez Cueto <roberfern@gmail.com>
4.\" Copyright (c) 2024 The FreeBSD Foundation
5.\"
6.\" Portions of this documentation were written by Björn Zeeb
7.\" under sponsorship from the FreeBSD Foundation.
8.\"
9.\" Redistribution and use in source and binary forms, with or without
10.\" modification, are permitted provided that the following conditions
11.\" are met:
12.\" 1. Redistributions of source code must retain the above copyright
13.\"    notice, this list of conditions and the following disclaimer.
14.\" 2. Redistributions in binary form must reproduce the above copyright
15.\"    notice, this list of conditions and the following disclaimer in the
16.\"    documentation and/or other materials provided with the distribution.
17.\"
18.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21.\" DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
22.\" INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27.\" ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28.\" POSSIBILITY OF SUCH DAMAGE.
29.\"
30.Dd November 4, 2024
31.Dt BSDINSTALL 8
32.Os
33.Sh NAME
34.Nm bsdinstall
35.Nd system installer
36.Sh SYNOPSIS
37.Nm
38.Op Ar options
39.Op Ar target
40.Op Ar ...
41.Sh DESCRIPTION
42.Nm
43is used for installation of new systems, both for system setup from
44installation media, e.g., CD-ROMs, and for use on live systems to prepare
45VM images and jails.
46.Pp
47Much like
48.Xr make 1 , Nm
49takes a target and possible parameters of the target as arguments.
50If invoked with no arguments, it will invoke the
51.Cm auto
52target, which provides a standard interactive installation, invoking the
53others in sequence.
54To perform a scripted installation,
55these subtargets can be invoked separately by an installation script.
56.Sh OPTIONS
57.Nm
58supports the following options, global to all targets:
59.Bl -tag -width indent+
60.It Fl D Ar file
61Provide a path for the installation log file
62.Pq overrides Ev BSDINSTALL_LOG .
63See
64.Sx ENVIRONMENT VARIABLES
65for more information on
66.Ev BSDINSTALL_LOG .
67.El
68.Sh TARGETS
69Most of the following targets are only useful for scripting the installer.
70For interactive use, most users will be interested only in the
71.Cm auto ,
72.Cm jail ,
73and
74.Cm script
75targets.
76.Bl -tag -width "jail destination"
77.It Cm auto
78Run the standard interactive installation, including disk partitioning.
79.It Cm jail Ar destination
80Sets up a new chroot system at
81.Pa destination ,
82suitable for use with
83.Xr jail 8 .
84Behavior is generally similar to
85.Cm auto ,
86except that disk partitioning and network setup are skipped and a kernel is
87not installed into the new system.
88.It Cm script Ar script
89Runs the installation script at
90.Pa script .
91See
92.Sx SCRIPTING
93for more information on this target.
94.It Cm keymap
95If the current controlling TTY is a
96.Xr syscons 4
97or
98.Xr vt 4
99console, asks the user to set the current keymap, and saves the result to the
100new system's
101.Pa rc.conf .
102.It Cm hostname
103Prompts the user for a host name for the new system and saves the result to the
104new system's
105.Pa rc.conf .
106If
107.Ev BSDINSTALL_CONFIGCURRENT
108is set, also sets the host name of the current system.
109.It Cm netconfig
110Interactively configures network interfaces (first invoking
111.Cm wlanconfig
112on wireless interfaces), saving the result to the new system's
113.Pa rc.conf
114and
115.Pa resolv.conf .
116If
117.Ev BSDINSTALL_CONFIGCURRENT
118is set, also configures the network interfaces of the current system to match.
119.It Cm autopart
120Provides the installer's interactive guided disk partitioner for single-disk
121installations.
122Defaults to UFS.
123.It Cm bootconfig
124Detects an appropriate partition and installs UEFI boot loader files.
125.It Cm zfsboot
126Provides a ZFS-only automatic interactive disk partitioner.
127Creates a single
128.Ic zpool
129with separate datasets for
130.Pa /home ,
131.Pa /tmp ,
132.Pa /usr ,
133.Pa /usr/ports ,
134.Pa /usr/src ,
135and
136.Pa /var .
137Optionally can set up
138.Xr geli 8
139to encrypt the disk.
140.It Cm partedit
141Provides the installer's interactive manual disk partitioner with an interface
142identical to
143.Xr sade 8 .
144Supports multiple disks as well as UFS, ZFS, and FAT file systems.
145ZFS is set up with one pool and dataset per partition.
146.It Cm scriptedpart Ar parameters
147Sets up disks like
148.Cm autopart
149and
150.Cm partedit ,
151but non-interactively according to the disk setup specified in
152.Ar parameters .
153Each disk setup is specified by a three-part argument:
154.Pp
155.Ar disk
156.Op Ar scheme
157.Op Ar {partitions}
158.Pp
159Multiple disk setups are separated by semicolons.
160The
161.Ar disk
162argument specifies the disk on which to operate (which will be erased),
163or the special value
164.Em DEFAULT ,
165which will result in either a selection window (as in
166.Cm autopart )
167for the destination disk or, if there is only one possible disk, will
168automatically select it.
169The
170.Ar scheme
171argument specifies the
172.Xr gpart 8
173partition scheme to apply to the disk.
174If
175.Ar scheme
176is unspecified,
177.Cm scriptedpart
178will apply the default bootable scheme on your platform.
179The
180.Ar partitions
181argument is also optional and specifies how to partition
182.Ar disk .
183It consists of a comma-separated list of partitions to create enclosed in
184curly braces.
185Each partition declaration takes the form
186.Pp
187.Ar size
188.Ar type
189.Op Ar mount point
190.Pp
191.Ar size
192specifies the partition size to create in bytes (K, M, and G suffixes
193can be appended to specify kilobytes, megabytes, and gigabytes respectively),
194while the
195.Em auto
196keyword causes the partition to take all the remaining space on the disk.
197The
198.Ar type
199option chooses the
200.Xr gpart 8
201filesystem type, e.g., freebsd-ufs, freebsd-zfs, or freebsd-swap.
202The optional
203.Ar mount point
204argument sets where the created partition is to be mounted in the installed
205system.
206As an example, a typical invocation looks like:
207.Pp
208bsdinstall scriptedpart ada0 { 20G freebsd-ufs /, 4G freebsd-swap, 20G freebsd-ufs /var, auto freebsd-ufs /usr }
209.Pp
210Note that the list of partitions should
211.Em not
212include boot partitions (e.g. EFI system partitions), which will be created automatically on whatever disk includes /.
213.Pp
214A shorter invocation to use the default partitioning (as
215.Cm autopart
216would have used) on the same disk:
217.Pp
218bsdinstall scriptedpart ada0
219.Pp
220or, even shorter:
221.Pp
222bsdinstall scriptedpart DEFAULT
223.It Cm mount
224Mounts the file systems previously configured by
225.Cm autopart ,
226.Cm partedit ,
227or
228.Cm scriptedpart
229under
230.Ev BSDINSTALL_CHROOT .
231.It Cm distfetch
232Fetches the distributions in
233.Ev DISTRIBUTIONS
234to
235.Ev BSDINSTALL_DISTDIR
236from
237.Ev BSDINSTALL_DISTSITE .
238.It Cm checksum
239Verifies the checksums of the distributions listed in
240.Ev DISTRIBUTIONS
241against the distribution manifest.
242.It Cm distextract
243Extracts the distributions listed in
244.Ev DISTRIBUTIONS
245into
246.Ev BSDINSTALL_CHROOT .
247.It Cm firmware
248executes
249.Xr fwget 8
250inside the
251.Ev BSDINSTALL_CHROOT
252to install any needed and available firmware for the new system.
253.It Cm rootpass
254Interactively invokes
255.Xr passwd 1
256in the new system to set the root user's password.
257.It Cm adduser
258Interactively invokes
259.Xr adduser 8
260in the new system.
261.It Cm time
262Interactively sets the time, date, and time zone of the new system.
263.It Cm services
264Queries the user for the system daemons to begin at system startup,
265writing the result into the new system's
266.Pa rc.conf .
267.It Cm entropy
268Reads a small amount of data from
269.Pa /dev/random
270and stores it in a file in the new system's root directory.
271.It Cm config
272Installs the configuration files destined for the new system, e.g.,
273.Xr rc.conf 5
274fragments generated by
275.Cm netconfig ,
276etc.) onto the new system.
277.El
278.Sh ENVIRONMENT VARIABLES
279The following environment variables control various aspects of the installation
280process.
281Many are used internally during installation and have reasonable default values
282for most installation scenarios.
283Others are set by various interactive user prompts, and can be usefully
284overridden when making scripted or customized installers.
285.Bl -tag -width "BSDINSTALL_DISTSITE"
286.It Ev TMPDIR
287The directory to use for temporary files.
288Default:
289.Dq Pa /tmp
290.It Ev DISTRIBUTIONS
291The set of distributions to install, e.g., "base.txz kernel.txz ports.txz".
292Default: unset
293.It Ev PARTITIONS
294The partitioning of the disk onto which the system is being installed.
295See
296.Cm scriptedpart
297of
298the
299.Sx TARGETS
300section for format details. If this variable is unset, the installer will
301use the default partitioning as in
302.Cm autopart .
303Default: unset
304.It Ev BSDINSTALL_DISTDIR
305The directory in which the distribution files can be found (or to which they
306should be downloaded).
307Default:
308.Dq Pa /usr/freebsd-dist
309.It Ev BSDINSTALL_DISTSITE
310URL from which the distribution files should be downloaded if they are not
311already present in the directory defined by
312.Ev BSDINSTALL_DISTDIR .
313This should be a full path to the files, including architecture and release
314names.
315Most targets, e.g.,
316.Cm auto
317and
318.Cm jail ,
319that prompt for a
320.Fx
321mirror will skip that step if this variable is already defined in the
322environment.
323Example:
324.Pa https://download.freebsd.org/ftp/releases/powerpc/powerpc64/13.1-RELEASE/
325or
326.Pa http://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/amd64/12.2-RELEASE/ .
327.It Ev BSDINSTALL_CHROOT
328The directory into which the distribution files should be unpacked and the
329directory at which the root file system of the new system should be mounted.
330Default:
331.Dq Pa /mnt
332.It Ev BSDINSTALL_LOG
333Path to a log file for the installation.
334Default:
335.Dq Pa $TMPDIR/bsdinstall_log
336.It Ev BSDINSTALL_SKIP_FIRMWARE
337If not empty, the
338.Cm auto
339target
340will not invoke the
341.Cm firmware
342target.
343.It Ev BSDINSTALL_SKIP_HARDENING
344If not empty, the
345.Cm auto
346target
347will not invoke the
348.Cm hardening
349target.
350.It Ev BSDINSTALL_SKIP_HOSTNAME
351If not empty, the
352.Cm auto
353target
354will not invoke the
355.Cm hostname
356target.
357.It Ev BSDINSTALL_SKIP_KEYMAP
358If not empty, the
359.Cm auto
360target
361will not invoke the
362.Cm keymap
363target.
364.It Ev BSDINSTALL_SKIP_MANUAL
365If not empty, the
366.Cm auto
367target will not offer to open a shell in the new system
368for final manual modifications.
369.It Ev BSDINSTALL_SKIP_SERVICES
370If not empty, the
371.Cm auto
372target
373will not invoke the
374.Cm services
375target.
376.It Ev BSDINSTALL_SKIP_TIME
377If not empty, the
378.Cm auto
379target
380will not invoke the
381.Cm time
382target.
383.It Ev BSDINSTALL_SKIP_USERS
384If not empty, the
385.Cm auto
386target
387will not invoke the
388.Cm adduser
389target.
390.It Ev BSDINSTALL_SKIP_FINALCONFIG
391If not empty, the
392.Cm auto
393target will not show the final configuration dialog,
394where earlier configuration choices can be revisited.
395.It Ev BSDINSTALL_TMPETC
396Directory where files destined for the new system's
397.Pa /etc
398will be stored until the
399.Cm config
400target is executed.
401If this directory does not already exist, it will be created.
402Default:
403.Dq Pa $TMPDIR/bsdinstall_etc
404.It Ev BSDINSTALL_TMPBOOT
405Directory where files destined for the new system's
406.Pa /boot
407will be stored until the
408.Cm config
409target is executed.
410If this directory does not already exist, it will be created.
411Default:
412.Dq Pa $TMPDIR/bsdinstall_boot
413.It Ev ROOTPASS_ENC
414Encrypted string to set the root password to in the format expected by
415.Xr pw 8
416.Fl H Ar 0 .
417This option is used if both it and
418.Ev ROOTPASS_PLAIN
419are set.
420.It Ev ROOTPASS_PLAIN
421Plain text string to set the root password to.
422.It Ev ZFSBOOT_POOL_NAME
423Name for the pool containing the base system.
424Default:
425.Dq zroot
426.It Ev ZFSBOOT_POOL_CREATE_OPTIONS
427Options to be used when creating the base system's pool.
428Each option must be preceded by the -O flag to be taken into consideration
429or the pool will not be created due to errors using the command
430.Cm zpool .
431Default:
432.Dq Li "-O compress=lz4 -O atime=off"
433.It Ev ZFSBOOT_BEROOT_NAME
434Name for the boot environment parent dataset.
435This is a non-mountable dataset meant to be a parent dataset where different
436boot environment are going to be created.
437Default:
438.Dq ROOT
439.It Ev ZFSBOOT_BOOTFS_NAME
440Name for the primary boot environment, which will be the default boot
441environment for the system.
442Default:
443.Dq default
444.It Ev ZFSBOOT_VDEV_TYPE
445The type of pool to be created for the base system.
446This variable can take one of this values: stripe (No redundancy),
447mirror (n-Way mirroring), raid10 (RAID 1+0 - n x 2-Way Mirrors),
448raidz1 (RAID-Z1 - Single Redundancy RAID), raidz2 (RAID-Z2 - Double Redundancy RAID)
449or raidz3 (RAID-Z3 Triple Redundancy RAID).
450Default:
451.Dq stripe
452.It Ev ZFSBOOT_FORCE_4K_SECTORS
453Controls the minimum sector size of the pool.
454If this variable is not empty, the minimum sector size is 4K.
455If this variable is empty, the minimum sector size is 512.
456Note that the sector size of the pool will always be at least
457the sector size of the backing disks.
458Default:
459.Dq 1
460.It Ev ZFSBOOT_GELI_ENCRYPTION
461If this variable is not empty, it will use
462.Xr geli 8
463to encrypt the root pool, enabling automatically the
464.Ev ZFSBOOT_BOOT_POOL
465variable.
466Default:
467.Dq ""
468.It Ev ZFSBOOT_GELI_KEY_FILE
469Path to the
470.Xr geli 8
471keyfile used to encrypt the pool where the base system is stored.
472Default:
473.Dq Pa /boot/encryption.key
474.It Ev ZFSBOOT_BOOT_POOL
475If set, a separated boot pool will be created for the kernel of the
476system and
477.Xr loader 8 .
478Default: unset
479.It Ev ZFSBOOT_BOOT_POOL_CREATE_OPTIONS
480Options to use when creating the boot pool, when enabled (See
481.Ev ZFSBOOT_BOOT_POOL ).
482Default: unset
483.It Ev ZFSBOOT_BOOT_POOL_NAME
484Name for the optional boot pool when it is enabled, (See
485.Ev ZFSBOOT_BOOT_POOL ).
486Default:
487.Dq bootpool
488.It Ev ZFSBOOT_BOOT_POOL_SIZE
489Size of the boot pool when it is enabled (See
490.Ev ZFSBOOT_BOOT_POOL ).
491Default:
492.Dq 2g
493.It Ev ZFSBOOT_DISKS
494Disks to be used for the base system, including the boot pool.
495This variable must only be used on a scripted installation.
496See
497.Sx SCRIPTING
498for more information.
499Default: unset
500.It Ev ZFSBOOT_SWAP_SIZE
501Size of the swap partition on each block device.
502This variable will be passed to
503.Xr gpart 8 ;
504which supports SI unit suffixes.
505Default:
506.Dq 2g
507.It Ev ZFSBOOT_SWAP_ENCRYPTION
508If set, enables the encryption of the swap partition using
509.Xr geli 8 .
510Default: ""
511.It Ev ZFSBOOT_SWAP_MIRROR
512If set, enables a swap mirroring using
513.Xr gmirror 8 .
514Default:
515unset
516.It Ev ZFSBOOT_DATASETS
517ZFS datasets to be created on the root zpool, it requires the
518following datasets:
519.Pa /tmp ,
520.Pa /var/tmp ,
521.Pa /$ZFSBOOT_BEROOT_NAME/$ZFSBOOT_BOOTFS_NAME .
522See
523.Sx ZFS DATASETS
524for more information about how to populate this variable and
525its default value.
526.It Ev ZFSBOOT_CONFIRM_LAYOUT
527If set and the installation is interactive, allow the user to confirm
528the layout before continuing with the installation.
529Default:
530.Dq 1
531.El
532.Sh SCRIPTING
533.Nm
534supports unattended, or minimally-attended, installations using scripting.
535This can be used with either modified physical installation media or with
536.Xr diskless 8
537installations over the network; information on preparing such media can be
538found in
539.Sx BUILDING AUTOMATIC INSTALL MEDIA
540.Pp
541Scripted installations follow an essentially identical path to interactive
542installations, though with some minor feature differences (for example,
543scripted installations do not support fetching of remote distribution files
544since scripted installations normally install the same files and the distributions
545can be added directly to the installation media).
546.Nm
547scripts consist of two parts: a
548.Em preamble
549and a
550.Em setup script .
551The preamble sets up the options for the installation (how to partition the
552disk[s], which distributions to install, etc.) and the optional second part is
553a shell script run under
554.Xr chroot 8
555in the newly installed system before
556.Nm
557exits.
558The two parts are separated by the usual script header (#!), which also sets
559the interpreter for the setup script.
560.Pp
561A typical bsdinstall script, using the default filesystem layout and the UFS
562filesystem, looks like this:
563.Bd -literal -offset indent
564PARTITIONS=DEFAULT
565DISTRIBUTIONS="kernel.txz base.txz"
566
567#!/bin/sh
568sysrc ifconfig_DEFAULT=DHCP
569sysrc sshd_enable=YES
570pkg install puppet
571.Ed
572.Pp
573For a scripted installation involving a ZFS pool spanning multiple disks,
574the script instead looks like this:
575.Bd -literal -offset indent
576DISTRIBUTIONS="kernel.txz base.txz"
577export ZFSBOOT_VDEV_TYPE=stripe
578export ZFSBOOT_DISKS="ada0 ada1"
579export nonInteractive="YES"
580
581#!/bin/sh
582echo "ifconfig_DEFAULT=DHCP" >> /etc/rc.conf
583echo "sshd_enable=YES" >> /etc/rc.conf
584pkg install puppet
585.Ed
586.Pp
587On
588.Fx
589release media, such a script placed at
590.Pa /etc/installerconfig
591will be run at boot time and the system will be rebooted automatically after
592the installation has completed.
593This can be used for unattended network installation of new systems; see
594.Xr diskless 8
595for details.
596.Ss PREAMBLE
597The preamble consists of installer settings.
598These control global installation parameters (see
599.Sx ENVIRONMENT VARIABLES )
600as well as disk partitioning.
601The preamble is interpreted as a
602.Xr sh 1
603script run at the very beginning of the install.
604If more complicated behavior than setting these variables is desired,
605arbitrary commands can be run here to extend the installer.
606In addition to the variables in
607.Sx ENVIRONMENT VARIABLES ,
608in particular
609.Ev DISTRIBUTIONS ,
610the preamble can contain a variable
611.Ev PARTITIONS
612which is passed to the
613.Cm scriptedpart
614target to control disk setup.
615.Pp
616Alternatively,
617to use
618.Cm zfsboot
619instead of
620.Cm partedit ,
621the preamble can contain the variable
622.Ev ZFSBOOT_DATASETS
623instead of
624.Ev PARTITIONS
625(see below).
626If using
627.Cm zfsboot ,
628the variables
629.Ev ZFSBOOT_DISKS
630and
631.Ev ZFSBOOT_VDEV_TYPE
632must be set to create the pool of disks for the base system.
633Usually, for a mirrored booting disk, these two variables look like this:
634.Bd -literal -offset indent
635ZFSBOOT_DISKS="ada0 ada1"
636ZFSBOOT_VDEV_TYPE=mirror
637.Ed
638.Pp
639Remember to export all the variables for the
640.Cm zfsboot
641command, otherwise installation will fail.
642.Ss SETUP SCRIPT
643Following the preamble is an optional shell script, beginning with a #!
644declaration.
645This script will be run at the end of the installation process inside a
646.Xr chroot 8
647environment in the newly installed system and can be used to set up
648configuration files, install packages, etc.
649Note that newly configured system services, e.g., networking have not
650been started in the installed system at this time and only installation
651host services are available.
652.Ss ZFS DATASETS
653If using
654.Cm zfsboot
655in an installation script, the
656.Cm zfsboot
657partitioning tool takes the
658.Ev ZFSBOOT_DATASETS
659variable to create the ZFS datasets on the base system.
660This variable definition can become large if the pool contains many datasets.
661The default value of
662.Ev ZFSBOOT_DATASETS
663is:
664.Bd -literal -offset indent
665# DATASET	OPTIONS (comma or space separated; or both)
666
667# Boot Environment [BE] root and default boot dataset
668/$ZFSBOOT_BEROOT_NAME				mountpoint=none
669/$ZFSBOOT_BEROOT_NAME/$ZFSBOOT_BOOTFS_NAME	mountpoint=/
670
671# Home directories separated so they are common to all BEs
672/home		mountpoint=/home
673
674# Compress /tmp, allow exec but not setuid
675/tmp		mountpoint=/tmp,exec=on,setuid=off
676
677# Do not mount /usr so that 'base' files go to the BEROOT
678/usr		mountpoint=/usr,canmount=off
679
680# Ports tree
681/usr/ports	setuid=off
682
683# Source tree (compressed)
684/usr/src
685
686# Create /var and friends
687/var		mountpoint=/var,canmount=off
688/var/audit	exec=off,setuid=off
689/var/crash	exec=off,setuid=off
690/var/log	exec=off,setuid=off
691/var/mail	atime=on
692/var/tmp	setuid=off
693.Ed
694.Pp
695The first column is the name of the dataset to be created as part of the
696.Ev ZFSBOOT_POOL_NAME
697pool and the remainder of each line contains the options to be set on each dataset.
698If multiple options are given, they can be separated by either commas or whitespace;
699everything following a pound/hash character is ignored as a comment.
700.Ss BUILDING AUTOMATIC INSTALL MEDIA
701If building automatic install media, use tar to extract a release ISO:
702.Dl mkdir release-media
703.Dl tar -C release-media -xvf FreeBSD-13.0-RELEASE-amd64-disc1.iso
704.Pp
705Then place a script as above in
706.Pa etc/installerconfig
707.Pp
708This directory can then be used directly as an NFS root for
709.Xr diskless 8
710installations or it can be rebuilt into an ISO image using the release scripts in
711.Pa /usr/src/release .
712For example, on amd64:
713.Dl sh /usr/src/release/amd64/mkisoimages.sh -b '13_0_RELEASE_AMD64_CD' output.iso release-media
714.Sh HISTORY
715This version of
716.Nm
717first appeared in
718.Fx 9.0 .
719.Sh AUTHORS
720.An Nathan Whitehorn Aq Mt nwhitehorn@FreeBSD.org
721.An Devin Teske Aq Mt dteske@FreeBSD.org
722.An Allan Jude Aq Mt allanjude@FreeBSD.org
723