diff --git a/en_US.ISO8859-1/articles/committers-guide/article.xml b/en_US.ISO8859-1/articles/committers-guide/article.xml
index 50fcabaa57..d7a58f03d3 100644
--- a/en_US.ISO8859-1/articles/committers-guide/article.xml
+++ b/en_US.ISO8859-1/articles/committers-guide/article.xml
@@ -1,4662 +1,4658 @@
]>
Committer's GuideThe &os; Documentation Project199920002001200220032004200520062007200820092010201120122013The &os; Documentation Project
&tm-attrib.freebsd;
&tm-attrib.coverity;
&tm-attrib.ibm;
&tm-attrib.intel;
&tm-attrib.sparc;
&tm-attrib.general;
$FreeBSD$$FreeBSD$This document provides information for the &os;
committer community. All new committers should read this
document before they start, and existing committers are
strongly encouraged to review it from time to time.Almost all &os; developers have commit rights to one or
more repositories. However, a few developers do not, and some
of the information here applies to them as well. (For
instance, some people only have rights to work with the
Problem Report database). Please see for more information.This document may also be of interest to members of the
&os; community who want to learn more about how the project
works.Administrative DetailsLogin Methods&man.ssh.1;, protocol 2 onlyMain Shell Hostfreefall.FreeBSD.orgsrc/ Subversion
Rootsvn+ssh://svn.FreeBSD.org/base
(see also ).doc/ Subversion
Rootsvn+ssh://svn.FreeBSD.org/doc
(see also ).ports/ Subversion
Rootsvn+ssh://svn.FreeBSD.org/ports
(see also ).Internal Mailing Listsdevelopers (technically called all-developers),
doc-developers, doc-committers, ports-developers,
ports-committers, src-developers, src-committers. (Each
project repository has its own -developers and
-committers mailing lists. Archives for these lists may
be found in files
/home/mail/repository-name-developers-archive
and
/home/mail/repository-name-committers-archive
on the FreeBSD.org
cluster.)Core Team monthly
reports/home/core/public/monthly-reports
on the FreeBSD.org
cluster.Ports Management Team monthly
reports/home/portmgr/public/monthly-reports
on the FreeBSD.org
cluster.Noteworthy src/ SVN
Branchesstable/8 (8.X-STABLE),
stable/9 (9.X-STABLE),
head (-CURRENT)&man.ssh.1; is required to connect to the project hosts.
For more information, see .Useful links:&os;
Project Internal Pages&os; Project
Hosts&os; Project
Administrative GroupsCommit Bit TypesThe &os; repository has a number of components which,
when combined, support the basic operating system source,
documentation, third party application ports infrastructure, and
various maintained utilities. When &os; commit bits are
allocated, the areas of the tree where the bit may be used are
specified. Generally, the areas associated with a bit reflect
who authorized the allocation of the commit bit. Additional
areas of authority may be added at a later date: when this
occurs, the committer should follow normal commit bit allocation
procedures for that area of the tree, seeking approval from the
appropriate entity and possibly getting a mentor for that area
for some period of time.Committer TypeResponsibleTree Componentssrccore@src/, doc/ subject to appropriate reviewdocdoceng@doc/, src/ documentationportsportmgr@ports/Commit bits allocated prior to the development of the notion
of areas of authority may be appropriate for use in many parts
of the tree. However, common sense dictates that a committer
who has not previously worked in an area of the tree seek review
prior to committing, seek approval from the appropriate
responsible party, and/or work with a mentor. Since the rules
regarding code maintenance differ by area of the tree, this is
as much for the benefit of the committer working in an area of
less familiarity as it is for others working on the tree.Committers are encouraged to seek review for their work as
part of the normal development process, regardless of the area
of the tree where the work is occurring.Policy for doc/ Committer Activity
in src/doc committers may commit documentation changes to src
files, such as man pages, READMEs, fortune databases,
calendar files, and comment fixes without approval from a
src committer, subject to the normal care and tending of
commits.doc committers may commit minor src changes and fixes,
such as build fixes, small features, etc, with an
"Approved by" from a src committer.doc committers may seek an upgrade to a src commit bit
by acquiring a mentor, who will propose the doc committer
to core. When approved, they will be added to 'access'
and the normal mentoring period will ensue, which will
involve a continuing of Approved by for
some period."Approved by" is only acceptable from non-mentored src
committers -- mentored committers can provide a "Reviewed
by" but not an "Approved by".Subversion PrimerIt is assumed that you are already familiar with the basic
operation of the version control systems in use. Traditionally
this was CVS. Subversion is used for the src
tree as of May 2008, the doc/www tree as of
May 2012 and the ports tree as of July
2012.There
is a list of things missing in Subversion when compared to
CVS. The notes at
might also be useful.IntroductionThe &os; source repository switched from
CVS to Subversion on May 31st, 2008. The
first real SVN commit is
r179447.The &os; doc/www repository switched
from CVS to Subversion on May 19th, 2012.
The first real SVN commit is
r38821.Part of the doc/www
CVS to SVN conversion
included an infrastructural change to the build process.
The most notable change is the location of the
&os; website www tree, which has
been moved from
www/lang/ to
head/lang/htdocs/.The &os; ports repository switched
from CVS to Subversion on July 14th, 2012.
The first real SVN commit is
r300894.There are mechanisms in place to automatically merge
changes back from the Subversion src
repository to the CVS repository for
some &os; branches (releng/6 through
releng/9), however this is purely to
support pre-existing end-user installs and should not be
relied upon, recommended or advertised. Future branches
will not be exported to CVS at all. The
ports repository was exported to CVS
for a period of time to aid end user migration, but as of
28th February 2013 is no longer exported.Subversion is not that different from
CVS when it comes to daily use, but there
are differences. Subversion has a number of features that
should make developers' lives easier. The most important
advantage to Subversion (and the reason why &os; switched) is
that it handles branches and merging much better than CVS
does. Some of the principal differences are:Commits are atomic.Revision numbers apply across the repository—all
files that were modified in the same commit have the same
revision number.Branching and tagging are namespace operations.Directories are versioned.Files and directories can have arbitrary, versioned
metadata attached to them.Files and directories can be copied, with full history
tracking.No more contortions due to CVS
weakness such as applying &man.patch.1; files at compile
time in order to avoid touching vendor branch code.No more repo-copies.Subversion can be installed from the &os; Ports
Collection, by issuing the following commands:&prompt.root; cd /usr/ports/devel/subversion
&prompt.root; make clean installGetting StartedThere are a few ways to obtain a working copy of the tree
from Subversion. This section will explain them.Direct CheckoutThe first is to check out directly from the main
repository. For the src tree,
use:&prompt.user; svn checkout svn+ssh://svn.freebsd.org/base/head /usr/srcFor the doc tree, use:&prompt.user; svn checkout svn+ssh://svn.freebsd.org/doc/head /usr/docFor the ports tree, use:&prompt.user; svn checkout svn+ssh://svn.freebsd.org/ports/head /usr/portsThough the remaining examples in this document are
written with the workflow of working with the
src tree in mind, the underlying
concepts are the same for working with the
doc and the ports
tree.
Ports related Subversion operations are listed in
.The above command will check out a
CURRENT source tree as /usr/src/,
which can be any target directory on the local filesystem.
Omitting the final argument of that command causes the
working copy, in this case, to be named head,
but that can be renamed safely.svn+ssh means the
SVN protocol tunnelled over
SSH. The name of the server is
svn.freebsd.org, base
is the path to the repository, and head
is the subdirectory within the repository.If your &os; login name is different from your login
name on your local machine, you must either include it in
the URL (for example
svn+ssh://jarjar@svn.freebsd.org/base/head),
or add an entry to your ~/.ssh/config
in the form:Host svn.freebsd.org
User jarjarThis is the simplest method, but it's hard to tell just
yet how much load it will place on the repository.
Subversion is much faster than CVS,
however.The svn diff does not require
access to the server as SVN stores a
reference copy of every file in the working copy. This,
however, means that Subversion working copies are very
large in size.Checkout from a MirrorCheck out a working copy from a mirror by
substituting the mirror's URL for
svn+ssh://svn.freebsd.org/base. This can
be an official mirror or a mirror maintained by
using svnsync.There is a serious disadvantage to this method: every
time something is to be committed, a
svn relocate to the master repository has
to be done, remembering to svn relocate
back to the mirror after the commit. Also, since
svn relocate only works between
repositories that have the same UUID, some hacking of the
local repository's UUID has to occur before it is possible
to start using it.Unlike with CVS,
the hassle of a local
svnsync mirror probably is not worth it
unless the network connectivity situation or other factors
demand it. If it is needed, see the end of this chapter for
information on how to set one up.RELENG_* Branches and General
LayoutIn svn+ssh://svn.freebsd.org/base,
base refers to the source tree.
Similarly, ports refers to the ports
tree, and so on. These are separate repositories with their
own change number sequences, access controls and commit
mail.For the base repository, HEAD refers to the -CURRENT
tree. For example, head/bin/ls is what
would go into /usr/src/bin/ls in a
release. Some key locations are:/head/ which corresponds to
HEAD, also known as
-CURRENT./stable/n
which corresponds to
RELENG_n./releng/n.n
which corresponds to
RELENG_n_n./release/n.n.n
which corresponds to
RELENG_n_n_n_RELEASE./vendor* is the vendor branch
import work area. This directory itself does not
contain branches, however its subdirectories do. This
contrasts with the stable,
releng and
release directories./projects and
/user feature a branch work area,
like in Perforce. As above, the
/user directory does not contain
branches itself.&os; Documentation Project Branches and
LayoutIn svn+ssh://svn.freebsd.org/doc,
doc refers to the repository root of
the source tree.In general, most &os; Documentation Project work will be
done within the head/ branch of the
documentation source tree.&os; documentation is written and/or translated to
various languages, each in a separate
directory in the head/
branch.Each translation set contains several subdirectories for
the various parts of the &os; Documentation Project. A few
noteworthy directories are:/articles/ contains the source
code for articles written by various &os;
contributors./books/ contains the source
code for the different books, such as the
&os; Handbook./htdocs/ contains the source
code for the &os; website.&os; Ports Tree Branches and LayoutIn svn+ssh://svn.freebsd.org/ports,
ports refers repository root of the
ports tree.In general, most &os; port work will be done within
the head/ branch of the ports tree
which is the actual ports tree used to install software.
Some other key locations are:/branches/RELENG_n_n_n
which corresponds to
RELENG_n_n_n
is used to merge back security updates in preparation
for a release./tags/RELEASE_n_n_n
which corresponds to
RELEASE_n_n_n
represents a release tag of the ports tree./tags/RELEASE_n_EOL
represents the end of life tag of a specific &os;
branch.Daily UseThis section will explain how to perform common day-to-day
operations with Subversion.HelpSVN has built in help documentation.
It can be accessed by typing the following command:&prompt.user; svn helpAdditional information can be found in the
Subversion
Book.CheckoutAs seen earlier, to check out the &os; head
branch:&prompt.user; svn checkout svn+ssh://svn.freebsd.org/base/head /usr/srcAt some point, more than just HEAD
will probably be useful, for instance when merging changes
to stable/7. Therefore, it may be useful to have a partial
checkout of the complete tree (a full checkout would be very
painful).To do this, first check out the root of the
repository:&prompt.user; svn checkout --depth=immediates svn+ssh://svn.freebsd.org/baseThis will give base with all the
files it contains (at the time of writing, just
ROADMAP.txt) and empty subdirectories
for head, stable,
vendor and so on.Expanding the working copy is possible. Just change the
depth of the various subdirectories:&prompt.user; svn up --set-depth=infinity base/head
&prompt.user; svn up --set-depth=immediates base/release base/releng base/stableThe above command will pull down a full copy of
head, plus empty copies of every
release tag, every
releng branch, and every
stable branch.If at a later date merging to
7-STABLE is required, expand the working
copy:&prompt.user; svn up --set-depth=infinity base/stable/7Subtrees do not have to be expanded completely. For
instance, expanding only stable/7/sys and
then later expand the rest of
stable/7:&prompt.user; svn up --set-depth=infinity base/stable/7/sys
&prompt.user; svn up --set-depth=infinity base/stable/7Updating the tree with svn update
will only update what was previously asked for (in this
case, head and
stable/7; it will not pull down the whole
tree.Decreasing the depth of a working copy is not
possible.Anonymous CheckoutIt is possible to anonymously check out the &os;
repository with Subversion. This will give access to a
read-only tree that can be updated, but not committed
to. To do this, use the following command:&prompt.user; svn co https://svn0.us-west.FreeBSD.org/base/head /usr/srcSelect the closest mirror and verify the mirror server
certificate from the list of Subversion
mirror sites.Updating the TreeTo update a working copy to either the latest revision,
or a specific revision:&prompt.user; svn update
&prompt.user; svn update -r12345StatusTo view the local changes that have been made to the
working copy:&prompt.user; svn statusTo show local changes and files that are out-of-date
do:&prompt.user; svn status --show-updatesEditing and CommittingUnlike Perforce, SVN does not need to
be told in advance about file editing.svn commit works like the equivalent
CVS command. To commit all changes in
the current directory and all subdirectories:&prompt.user; svn commitTo commit all changes in, for example, lib/libfetch/
and usr/bin/fetch/
in a single operation:&prompt.user; svn commit lib/libfetchusr/bin/fetchThere is also a commit wrapper for the ports tree to
handle the properties and sanity checking your
changes:&prompt.user; /usr/ports/Tools/scripts/psvn commit
Adding and Removing FilesBefore adding files, get a copy of auto-props.txt
(there is also a
ports tree specific version)
and add it to ~/.subversion/config
according to the instructions in the file. If you added
something before reading this, use
svn rm --keep-local for just added
files, fix your config file and re-add them again. The
initial config file is created when you first run a svn
command, even something as simple as
svn help.Files are added to a
SVN repository with svn
add. To add a file named
foo, edit it, then:&prompt.user; svn add fooMost new source files should include a
$&os;$ string in the
new file. On commit, svn will expand
the $&os;$ string,
adding the file path, revision number, date and time of
commit, and the username of the committer. Files which
cannot be modified may be committed without the
$&os;$ string.Files can be removed with svn
remove:&prompt.user; svn remove fooSubversion does not require deleting the file before
using svn rm, and indeed complains if
that happens.It is possible to add directories with
svn add:&prompt.user; mkdir bar
&prompt.user; svn add barAlthough svn mkdir makes this easier
by combining the creation of the directory and the adding of
it:&prompt.user; svn mkdir barLike files, directories are removed with
svn rm. There is no separate command
specifically for removing directories.&prompt.user; svn rm barCopying and Moving FilesThis command creates a copy of
foo.c named bar.c,
with the new file also under version control:&prompt.user; svn copy foo.cbar.cThe example above is equivalent to:&prompt.user; cp foo.c bar.c
&prompt.user; svn add bar.cTo move and rename a file:&prompt.user; svn move foo.cbar.cLog and Annotatesvn log shows revisions and commit
messages, most recent first, for files or directories. When
used on a directory, all revisions that affected the
directory and files within that directory are shown.svn annotate, or equally svn
praise or svn blame, shows
the most recent revision number and who committed that
revision for each line of a file.Diffssvn diff displays changes to the
working copy. Diffs generated by SVN are
unified and include new files by default in the diff
output.svn diff can show the changes between
two revisions of the same file:&prompt.user; svn diff -r179453:179454 ROADMAP.txtIt can also show all changes for a specific changeset.
The following will show what changes were made to the
current directory and all subdirectories in changeset
179454:&prompt.user; svn diff -c179454 .RevertingLocal changes (including additions and deletions) can be
reverted using svn revert. It does not
update out-of-date files, but just replaces them with
pristine copies of the original version.ConflictsIf an svn update resulted in a merge
conflict, Subversion will remember which files have
conflicts and refuse to commit any changes to those files
until explicitly told that the conflicts have been resolved.
The simple, not yet deprecated procedure is the
following:&prompt.user; svn resolved fooHowever, the preferred procedure is:&prompt.user; svn resolve --accept=working fooThe two examples are equivalent. Possible values for
--accept are:working: use the version in your
working directory (which one presumes has been edited to
resolve the conflicts).base: use a pristine copy of the
version you had before svn update,
discarding your own changes, the conflicting changes,
and possibly other intervening changes as well.mine-full: use what you had
before svn update, including your own
changes, but discarding the conflicting changes, and
possibly other intervening changes as well.theirs-full: use the version that
was retrieved when you did
svn update, discarding your own
changes.Advanced UseSparse CheckoutsSVN allows
sparse, or partial checkouts of a
directory by adding to a
svn checkout.Valid arguments to
are:empty: the directory itself
without any of its contents.files: the directory and any
files it contains.immediates: the directory and any
files and directories it contains, but none of the
subdirectories' contents.infinity: anything.The --depth option applies to many
other commands, including svn commit,
svn revert, and svn
diff.Since --depth is sticky, there is a
--set-depth option for svn
update that will change the selected depth.
Thus, given the working copy produced by the previous
example:&prompt.user; cd ~/freebsd
&prompt.user; svn update --set-depth=immediates .The above command will populate the working copy in
~/freebsd with
ROADMAP.txt and empty subdirectories,
and nothing will happen when svn update
is executed on the subdirectories. However, the following
command will set the depth for
head (in this case) to infinity,
and fully populate it:&prompt.user; svn update --set-depth=infinity headDirect OperationCertain operations can be performed directly on the
repository without touching the working copy. Specifically,
this applies to any operation that does not require editing
a file, including:log,
diffmkdirremove, copy,
renamepropset,
propedit,
propdelmergeBranching is very fast. The following command would be
used to branch RELENG_8:&prompt.user; svn copy svn+ssh://svn.freebsd.org/base/head svn+ssh://svn.freebsd.org/base/stable/8This is equivalent to the following set of commands
which take minutes and hours as opposed to seconds,
depending on your network connection:&prompt.user; svn checkout --depth=immediates svn+ssh://svn.freebsd.org/base
&prompt.user; cd base
&prompt.user; svn update --depth=infinity head
&prompt.user; svn copy head stable/8
&prompt.user; svn commit stable/8Merging with SVNThis section deals with merging code from one branch to
another (typically, from head to a stable branch).In all examples below, $FSVN
refers to the location of the &os; Subversion repository,
svn+ssh://svn.freebsd.org/base/.About Merge TrackingFrom the user's perspective, merge tracking
information (or mergeinfo) is stored in a property called
svn:mergeinfo, which is a
comma-separated list of revisions and ranges of revisions
that have been merged. When set on a file, it applies
only to that file. When set on a directory, it applies to
that directory and its descendants (files and directories)
except for those that have their own
svn:mergeinfo.It is not inherited. For
instance, stable/6/contrib/openpam/
does not implicitly inherit mergeinfo from
stable/6/, or
stable/6/contrib/.
Doing so would make partial checkouts very hard to manage.
Instead, mergeinfo is explicitly propagated down the tree.
For merging something into
branch/foo/bar/,
the following rules apply:If
branch/foo/bar/
does not already have a mergeinfo record, but a direct
ancestor (for instance,
branch/foo/)
does, then that record will be propagated down to
branch/foo/bar/
before information about the current merge is
recorded.Information about the current merge will
not be propagated back up that
ancestor.If a direct descendant of
branch/foo/bar/
(for instance, branch/foo/bar/baz/)
already has a mergeinfo record, information about the
current merge will be propagated down to it.If you consider the case where a revision changes
several separate parts of the tree (for example, branch/foo/bar/ and
branch/foo/quux/),
but you only want to merge some of it (for example,
branch/foo/bar/),
you will see that these rules make sense. If mergeinfo
was propagated up, it would seem like that revision had
also been merged to branch/foo/quux/, when in
fact it had not been.Selecting the Source and TargetBecause of mergeinfo propagation, it is important to
choose the source and target for the merge carefully to
minimise property changes on unrelated directories.The rules for selecting the merge target (the
directory that you will merge the changes to) can be
summarized as follows:Never merge directly to a file.Never, ever merge directly to a file.Never, ever, ever merge
directly to a file.Changes to kernel code should be merged to
sys/. For
instance, a change to the &man.ichwd.4; driver should
be merged to
sys/, not
sys/dev/ichwd/.
Likewise, a change to the TCP/IP stack should be
merged to sys/,
not sys/netinet/.Changes to code under
etc/ should be
merged at etc/,
not below it.Changes to vendor code (code in
contrib/,
crypto/ and so
on) should be merged to the directory where vendor
imports happen. For instance, a change to crypto/openssl/util/
should be merged to crypto/openssl/. This
is rarely an issue, however, since changes to vendor
code are usually merged wholesale.Changes to userland programs should as a general
rule be merged to the directory that contains the
Makefile for that program. For instance, a change to
usr.bin/xlint/arch/i386/
should be merged to usr.bin/xlint/.Changes to userland libraries should as a general
rule be merged to the directory that contains the
Makefile for that library. For instance, a change to
lib/libc/gen/
should be merged to lib/libc/.There may be cases where it makes sense to deviate
from the rules for userland programs and libraries.
For instance, everything under lib/libpam/ is merged
to lib/libpam/,
even though the library itself and all of the modules
each have their own Makefile.Changes to manual pages should be merged to
share/man/manN/,
for the appropriate value of
N.Other changes to
share/ should
be merged to the appropriate subdirectory and not to
share/
directly.Changes to a top-level file in the source tree
such as UPDATING or
Makefile.inc1 should be merged
directly to that file rather than to the root of the
whole tree. Yes, this is an exception to the first
three rules.When in doubt, ask.If you need to merge changes to several places at once
(for instance, changing a kernel interface and every
userland program that uses it), merge each target
separately, then commit them together. For instance, if
you merge a revision that changed a kernel
API and updated all the userland bits
that used that API, you would merge the
kernel change to sys, and the userland bits to the
appropriate userland directories, then commit all of these
in one go.The source will almost invariably be the same as the
target. For instance, you will always merge stable/7/lib/libc/ from
head/lib/libc/.
The only exception would be when merging changes to code
that has moved in the source branch but not in the parent
branch. For instance, a change to &man.pkill.1; would be
merged from bin/pkill/ in head to
usr.bin/pkill/ in
stable/7.Preparing the Merge TargetBecause of the mergeinfo propagation issues described
earlier, it is very important that you never merge changes
into a sparse working copy. You must always have a full
checkout of the branch you will merge into. For instance,
when merging from HEAD to 7, you must have a full checkout
of stable/7:&prompt.user; cd stable/7
&prompt.user; svn up --set-depth=infinityThe target directory must also be up-to-date and must
not contain any uncommitted changes or stray files.Identifying RevisionsIdentifying revisions to be merged is a must. If the
target already has complete mergeinfo, ask
SVN for a list:&prompt.user; cd stable/6/contrib/openpam
&prompt.user; svn mergeinfo --show-revs=eligible $FSVN/head/contrib/openpamIf the target does not have complete mergeinfo, check
the log for the merge source.MergingNow, let us start merging!The PrinciplesSay you would like to merge:revision $Rin directory $target in stable branch
$Bfrom directory $source in head$FSVN is
svn+ssh://svn.freebsd.org/baseAssuming that revisions $P and $Q have
already been merged, and that the current directory is
an up-to-date working copy of stable/$B, the
existing mergeinfo looks like this:&prompt.user; svn propget svn:mergeinfo -R $target
$target - /head/$source:$P,$QMerging is done like so:&prompt.user; svn merge -c$R $FSVN/head/$source $targetChecking the results of this is possible with
svn diff.The svn:mergeinfo now looks like:&prompt.user; svn propget svn:mergeinfo -R $target
$target - head/$source:$P,$Q,$RIf the results are not exactly as shown, assistance
may be required before committing as mistakes may have
been made, or there may be something wrong with the
existing mergeinfo, or there may be a bug in
Subversion.Practical ExampleAs a practical example, consider the following
scenario: The changes to netmap.4
in r238987 is to be merged from CURRENT to 9-STABLE.
The file resides in head/share/man/man4 and
according to
this is also where to do the merge. Note that in this
example all paths are relative to the top of the svn
repository. For more information on the directory
layout, see .The first step is to inspect the existing
mergeinfo.&prompt.user; svn propget svn:mergeinfo -R stable/9/share/man/man4Take a quick note of how it looks before moving on
to the next step; doing the actual merge:&prompt.user; svn merge -c r238987 svn+ssh://svn.freebsd.org/base/head/share/man/man4 stable/9/share/man/man4
--- Merging r238987 into 'stable/9/share/man/man4':
U stable/9/share/man/man4/netmap.4
--- Recording mergeinfo for merge of r238987 into
'stable/9/share/man/man4':
U stable/9/share/man/man4Check that the revision number of the merged
revision has been added. Once this is verified, the
only thing left is the actual commit.&prompt.user; svn commit stable/9/share/man/man4Merging into the Kernel
(sys/)As stated above, merging into the kernel is
different from merging in the rest of the tree. In many
ways merging to the kernel is simpler because there is
always the same merge target
(sys/).Once svn merge has been executed,
svn diff has to be run on the
directory to check the changes. This may show some
unrelated property changes, but these can be ignored.
Next, build and test the kernel, and, once the tests are
complete, commit the code as normal, making sure that
the commit message starts with Merge
r226222 from head,
or similar.Precautions Before CommittingAs always, build world (or appropriate parts of
it).Check the changes with svn diff and
svn stat. Make sure all the files that
should have been added or deleted were in fact added or
deleted.Take a closer look at any property change (marked by a
M in the second column of svn
stat). Normally, no svn:mergeinfo properties
should be anywhere except the target directory (or
directories).If something looks fishy, ask for help.CommittingMake sure to commit a top level directory to have the
mergeinfo included as well. Do not specify individual
files on the command line. For more information about
committing files in general, see the relevant section of
this primer.Vendor Imports with SVNPlease read this entire section before starting a
vendor import.Patches to vendor code fall into two
categories:Vendor patches: these are patches that have been
issued by the vendor, or that have been extracted from
the vendor's version control system, which address
issues which in your opinion cannot wait until the
next vendor release.&os; patches: these are patches that modify the
vendor code to address &os;-specific issues.The nature of a patch dictates where it should be
committed:Vendor patches should be committed to the vendor
branch, and merged from there to head. If the patch
addresses an issue in a new release that is currently
being imported, it must not be
committed along with the new release: the release must
be imported and tagged first, then the patch can be
applied and committed. There is no need to re-tag the
vendor sources after committing the patch.&os; patches should be committed directly to
head.Preparing the TreeIf importing for the first time after the switch to
Subversion, flattening and cleaning up the vendor tree is
necessary, as well as bootstrapping the merge history in
the main tree.FlatteningDuring the conversion from CVS to
Subversion, vendor branches were imported with the same
layout as the main tree. This means that the
pf vendor sources ended up in
vendor/pf/dist/contrib/pf. The
vendor source is best directly in
vendor/pf/dist.To flatten the pf tree:&prompt.user; cd vendor/pf/dist/contrib/pf
&prompt.user; svn mv $(svn list) ../..
&prompt.user; cd ../..
&prompt.user; svn rm contrib
&prompt.user; svn propdel -R svn:mergeinfo .
&prompt.user; svn commitThe propdel bit is necessary
because starting with 1.5, Subversion will automatically
add svn:mergeinfo to any directory
that is copied or moved. In this case, as nothing is
being merged from the deleted tree, they just get in the
way.Tags may be flattened as well (3, 4, 3.5 etc.); the
procedure is exactly the same, only changing
dist to 3.5 or
similar, and putting the svn commit
off until the end of the process.Cleaning UpThe dist tree can be cleaned up
as necessary. Disabling keyword expansion is
recommended, as it makes no sense on unmodified vendor
code and in some cases it can even be harmful.
OpenSSH, for example,
includes two files that originated with &os; and still
contain the original version tags. To do this:&prompt.user; svn propdel svn:keywords -R .
&prompt.root; svn commitBootstrapping Merge HistoryIf importing for the first time after the switch to
Subversion, bootstrap svn:mergeinfo
on the target directory in the main tree to the revision
that corresponds to the last related change to the
vendor tree, prior to importing new sources:&prompt.user; cd head/contrib/pf
&prompt.user; svn merge --record-only svn+ssh://svn.freebsd.org/base/vendor/pf/dist@180876 .
&prompt.user; svn commitImporting New SourcesWith two commits—one for the import itself and
one for the tag—this step can optionally be repeated
for every upstream release between the last import and the
current import.Preparing the Vendor SourcesUnlike in CVS where only the
needed parts were imported into the vendor tree to avoid
bloating the main tree, Subversion is able to store a
full distribution in the vendor tree. So, import
everything, but merge only what is required.A svn add is required to add any
files that were added since the last vendor import, and
svn rm is required to remove any that
were removed since. Preparing sorted lists of the
contents of the vendor tree and of the sources that are
about to be imported is recommended, to facilitate the
process.&prompt.user; cd vendor/pf/dist
&prompt.user; svn list -R | grep -v '/$' | sort >../old
&prompt.user; cd ../pf-4.3
&prompt.user; find . -type f | cut -c 3- | sort >../newWith these two files,
comm -23 ../old ../new will list
removed files (files only in old),
while comm -13 ../old ../new will
list added files only in
new.Importing into the Vendor TreeNow, the sources must be copied into
dist and
the svn add and
svn rm commands should be used as
needed:&prompt.user; cd vendor/pf/pf-4.3
&prompt.user; tar cf - . | tar xf - -C ../dist
&prompt.user; cd ../dist
&prompt.user; comm -23 ../old ../new | xargs svn rm
&prompt.user; comm -13 ../old ../new | xargs svn --parents addIf any directories were removed, they will have to
be svn rmed manually. Nothing will
break if they are not, but they will remain in the
tree.Check properties on any new files. All text files
should have svn:eol-style set to
native. All binary files should have
svn:mime-type set to
application/octet-stream unless there
is a more appropriate media type. Executable files
should have svn:executable set to
*. No other properties should exist
on any file in the tree.Committing is now possible, however it is good
practice to make sure that everything is OK by using the
svn stat and
svn diff commands.TaggingOnce committed, vendor releases should be tagged for
future reference. The best and quickest way to do this
is directly in the repository:&prompt.user; svn cp svn+ssh://svn.freebsd.org/base/vendor/pf/dist svn+ssh://svn.freebsd.org/base/vendor/pf/4.3Once that is complete, svn up the
working copy of
vendor/pf
to get the new tag, although this is rarely
needed.If creating the tag in the working copy of the tree,
svn:mergeinfo results must be
removed:&prompt.user; cd vendor/pf
&prompt.user; svn cp dist 4.3
&prompt.user; svn propdel svn:mergeinfo -R 4.3Merging to Head&prompt.user; cd head/contrib/pf
&prompt.user; svn up
&prompt.user; svn merge --accept=postpone svn+ssh://svn.freebsd.org/base/vendor/pf/dist .The --accept=postpone tells
Subversion that it should not complain because merge
conflicts will be taken care of manually.It is necessary to resolve any merge conflicts.
This process is the same in SVN as in
CVS.Make sure that any files that were added or removed in
the vendor tree have been properly added or removed in the
main tree. To check diffs against the vendor
branch:&prompt.user; svn diff --no-diff-deleted --old=svn+ssh://svn.freebsd.org/base/vendor/pf/dist --new=.The --no-diff-deleted tells
Subversion not to complain about files that are in the
vendor tree but not in the main tree, i.e., things that
would have previously been removed before the vendor
import, like for example the vendor's makefiles
and configure scripts.Using CVS, once a file was off the
vendor branch, it was not able to be put back. With
Subversion, there is no concept of on or off the vendor
branch. If a file that previously had local
modifications, to make it not show up in diffs in the
vendor tree, all that has to be done is remove any
left-over cruft like &os; version tags, which is much
easier.If any changes are required for the world to build
with the new sources, make them now, and keep testing
until everything builds and runs perfectly.Committing the Vendor ImportCommitting is now possible! Everything must be
committed in one go. If done properly, the tree will move
from a consistent state with old code, to a consistent
state with new code.From ScratchImporting into the Vendor TreeThis section is an example of importing and tagging
byacc into
head.First, prepare the directory in
vendor:&prompt.user; svn co --depth immediates $FSVN/vendor
&prompt.user; cd vendor
&prompt.user; svn mkdir byacc
&prompt.user; svn mkdir byacc/distNow, import the sources into the
dist directory.
Once the files are in place, svn add
the new ones, then svn commit and tag
the imported version. To save time and bandwidth,
direct remote committing and tagging is possible:&prompt.user; svn cp -m "Tag byacc 20120115"$FSVN/vendor/byacc/dist$FSVN/vendor/byacc/20120115Merging to headDue to this being a new file, copy it for the
merge:&prompt.user; svn cp -m "Import byacc to contrib"$FSVN/vendor/byacc/dist$FSVN/head/contrib/byaccWorking normally on newly imported sources is still
possible.Reverting a CommitReverting a commit to a previous version is fairly
easy:&prompt.user; svn merge -r179454:179453 ROADMAP.txt
&prompt.user; svn commitChange number syntax, with negative meaning a reverse
change, can also be used:&prompt.user; svn merge -c -179454 ROADMAP.txt
&prompt.user; svn commitThis can also be done directly in the repository:&prompt.user; svn merge -r179454:179453 svn+ssh://svn.freebsd.org/base/ROADMAP.txtIt is important to ensure that the mergeinfo
is correct when reverting a file in order to permit
svn mergeinfo --eligible to work as
expected.Reverting the deletion of a file is slightly different.
Copying the version of the file that predates the deletion
is required. For example, to restore a file that was
deleted in revision N, restore version N-1:&prompt.user; svn copy svn+ssh://svn.freebsd.org/base/ROADMAP.txt@179454
&prompt.user; svn commitor, equally:&prompt.user; svn copy svn+ssh://svn.freebsd.org/base/ROADMAP.txt@179454 svn+ssh://svn.freebsd.org/baseDo not simply recreate the file
manually and svn add it—this will
cause history to be lost.Fixing MistakesWhile we can do surgery in an emergency, do not plan on
having mistakes fixed behind the scenes. Plan on mistakes
remaining in the logs forever. Be sure to check the output
of svn status and svn
diff before committing.Mistakes will happen but,
they can generally be fixed without
disruption.Take a case of adding a file in the wrong location. The
right thing to do is to svn move the file
to the correct location and commit. This causes just a
couple of lines of metadata in the repository journal, and
the logs are all linked up correctly.The wrong thing to do is to delete the file and then
svn add an independent copy in the
correct location. Instead of a couple of lines of text, the
repository journal grows an entire new copy of the file.
This is a waste.Setting up a svnsync
MirrorYou probably do not want to do this unless there is a
good reason for it. Such reasons might be to support many
multiple local read-only client machines, or if your network
bandwidth is limited. Starting a fresh mirror from empty
would take a very long time. Expect a minimum of 10 hours
for high speed connectivity. If you have international
links, expect this to take 4 to 10 times longer.A far better option is to grab a seed file. It is large
(~1GB) but will consume less network traffic and take less
time to fetch than a svnsync will. This is possible in one
of the following three ways:&prompt.user; rsync -va --partial --progress freefall:/home/peter/svnmirror-base-r179637.tbz2 .&prompt.user; rsync -va --partial --progress rsync://repoman.freebsd.org:50873/svnseed/svnmirror-base-r215629.tar.xz .&prompt.user; fetch ftp://ftp.freebsd.org/pub/FreeBSD/development/subversion/svnmirror-base-r221445.tar.xzOnce you have the file, extract it to somewhere like
home/svnmirror/base/.
Then, update it, so that it fetches changes since the last
revision in the archive:&prompt.user; svnsync sync file:///home/svnmirror/baseYou can then set that up to run from &man.cron.8;, do
checkouts locally, set up a svnserve server for your local
machines to talk to, etc.The seed mirror is set to fetch from
svn://svn.freebsd.org/base. The
configuration for the mirror is stored in
revprop 0 on the local mirror. To see
the configuration, try:&prompt.user; svn proplist -v --revprop -r 0 file:///home/svnmirror/baseUse propset to change things.Committing High-ASCII DataFiles that have high-ASCII bits are
considered binary files in SVN, so the
pre-commit checks fail and indicate that the
mime-type property should be set to
application/octet-stream. However, the
use of this is discouraged, so please do not set it. The
best way is always avoiding high-ASCII
data, so that it can be read everywhere with any text editor
but if it is not avoidable, instead of changing the
mime-type, set the fbsd:notbinary
property with propset:&prompt.user; svn propset fbsd:notbinary yes foo.dataMaintaining a Project BranchA project branch is one that is synced to head (or
another branch) is used to develop a project then commit it
back to head. In SVN,
dolphin branching is used for this. A
dolphin branch is one that diverges for a
while and is finally committed back to the original branch.
During development code migration in one direction (from
head to the branch only). No code is committed back to head
until the end. Once you commit back at the end, the branch
is dead (although you can have a new branch with the same
name after you delete the branch if you want).As per http://people.freebsd.org/~peter/svn_notes.txt,
work that is intended to be merged back into HEAD should be
in base/projects/.
If you are doing work that is beneficial to the &os;
community in some way but not intended to be merged directly
back into HEAD then the proper location is base/user/your-name/.
This
page contains further details.To create a project branch:&prompt.user; svn copy svn+ssh://svn.freebsd.org/base/head svn+ssh://svn.freebsd.org/base/projects/spifTo merge changes from HEAD back into the project
branch:&prompt.user; cd copy_of_spif
&prompt.user; svn merge svn+ssh://svn.freebsd.org/base/head
&prompt.user; svn commitIt is important to resolve any merge conflicts before
committing.Some TipsIn commit logs etc., rev 179872 should be
spelled r179872 as per convention.Do not remove and re-add the same file in a single commit
as this will break the CVS exporter.Speeding up svn is possible by adding the following to
~/.ssh/config:Host *
ControlPath ~/.ssh/sockets/master-%l-%r@%h:%p
ControlMaster auto
ControlPersist yesand then typingmkdir ~/.ssh/socketsChecking out a working copy with a stock Subversion client
without &os;-specific patches
(OPTIONS_SET=FREEBSD_TEMPLATE) will mean
that $FreeBSD$ tags will not
be expanded. Once the correct version has been installed,
trick Subversion into expanding them like so:&prompt.user; svn propdel -R svn:keywords .
&prompt.user; svn revert -R .This will wipe out uncommitted patches.Conventions and TraditionsAs a new developer there are a number of things you should
do first. The first set is specific to committers only. (If
you are not a committer, e.g., have GNATS-only access, then your
mentor needs to do these things for you.)Guidelines for CommittersThe .ent, .xml,
and .xml files listed below exist in the
&os; Documentation Project SVN repository at
svn.FreeBSD.org/doc/.If you have been given commit rights to one or more of the
repositories:Add your author entity to
head/share/xml/authors.ent; this
should be done first since an omission of this commit will
cause the next commits to break the doc/ build.This is a relatively easy task, but remains a good
first test of your version control skills.New files that do not have the
FreeBSD=%Hsvn:keywords property will be
rejected when attempting to commit them to the
repository. Be sure to read
regarding adding and removing files, in addition to
verifying that ~/.subversion/config
contains the necessary "auto-props" entries
from auto-props.txt mentioned
there.Do not forget to get mentor approval for these
patches!
-
- Also add your author entity to
- head/share/xml/developers.ent.
-
-
Add yourself to the Developers section
of the Contributors
List
(head/en_US.ISO8859-1/articles/contributors/contrib.committers.xml)
and remove yourself from the
Additional Contributors section
(head/en_US.ISO8859-1/articles/contributors/contrib.additional.xml).
Please note that entries are sorted by last name.Add an entry for yourself to
head/share/xml/news.xml. Look for
the other entries that look like
A new committer and follow the
format.You should add your PGP or GnuPG key to
head/share/pgpkeys (and if you do not
have a key, you should create one). Do not forget to
commit the updated
head/share/pgpkeys/pgpkeys.ent and
head/share/pgpkeys/pgpkeys-developers.xml.
Please note that entries are sorted by last name.
- &a.des; has written a shell script
+ &a.des.email; has written a shell script
(head/share/pgpkeys/addkey.sh) to
make this extremely simple. See the README
file for more information.It is important to have an up-to-date PGP/GnuPG key
in the Handbook, since the key may be required for
positive identification of a committer, e.g., by the
&a.admins; for account recovery. A complete keyring of
FreeBSD.org users is
available for download from http://www.FreeBSD.org/doc/pgpkeyring.txt.Add an entry for yourself to
src/share/misc/committers-repository.dot,
where repository is either doc, ports or src, depending on
the commit privileges you obtained.Some people add an entry for themselves to
ports/astro/xearth/files/freebsd.committers.markers.Some people add an entry for themselves to
src/usr.bin/calendar/calendars/calendar.freebsd.If you already have an account at the
&os; wiki,
make sure your mentor moves you from the Contributors
group to the Developers
group. Otherwise, consider signing up for an
account so you can publish projects and ideas you are
working on.Once you get access to the wiki, you may add yourself
to the
How We
Got Here and
Irc
Nicks pages.If you subscribe to &a.svn-src-all.name;,
&a.svn-ports-all.name; or &a.svn-doc-all.name;, you will
probably want to unsubscribe to avoid receiving duplicate
copies of commit messages and their followups.All src commits should go to
&os.current; first before being merged to &os.stable;. No
major new features or high-risk modifications should be made
to the &os.stable; branch.Guidelines for EveryoneWhether or not you have commit rights:Introduce yourself to the other developers, otherwise
no one will have any idea who you are or what you are
working on. You do not have to write a comprehensive
biography, just write a paragraph or two about who you are
and what you plan to be working on as a developer in
&os;. (You should also mention who your mentor will
be). Email this to the &a.developers; and you will be on
your way!Log into hub.FreeBSD.org and create a
/var/forward/user
(where user is your username)
file containing the e-mail address where you want mail
addressed to
yourusername@FreeBSD.org to be
forwarded. This includes all of the commit messages as
well as any other mail addressed to the &a.committers; and
the &a.developers;. Really large mailboxes which have
taken up permanent residence on hub often
get accidentally truncated without warning,
so forward it or read it and you will not lose it.Due to the severe load dealing with SPAM places on the
central mail servers that do the mailing list processing
the front-end server does do some basic checks and will
drop some messages based on these checks. At the moment
proper DNS information for the connecting host is the only
check in place but that may change. Some people blame
these checks for bouncing valid email. If you want these
checks turned off for your email you can place a file
named .spam_lover in your home
directory on
freefall.FreeBSD.org to
disable the checks for your email.If you are a developer but not a committer, you will
not be subscribed to the committers or developers mailing
lists; the subscriptions are derived from the access
rights.MentorsAll new developers also have a mentor assigned to them for
the first few months. Your mentor is responsible for teaching
you the rules and conventions of the project and guiding your
first steps in the developer community. Your mentor is also
personally responsible for your actions during this initial
period.For committers: until your mentor decides (and announces
with a forced commit to access) that you
have learned the ropes and are ready to commit on your own,
you should not commit anything without first getting your
mentor's review and approval, and you should document that
approval with an Approved by: line in the
commit message.Preferred License for New FilesCurrently the &os; Project suggests and uses the following
text as the preferred license scheme:/*-
* Copyright (c) [year] [your name]
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* [id for your version control system, if any]
*/The &os; project strongly discourages the so-called
"advertising clause" in new code. Due to the large number of
contributors to the &os; project, complying with this clause for
many commercial vendors has become difficult. If you have code
in the tree with the advertising clause, please consider
removing it. In fact, please consider using the above license
for your code.The &os; project discourages completely new licenses and
variations on the standard licenses. New licenses require the
- approval of core@FreeBSD.org to reside in the
+ approval of the &a.core; to reside in the
main repository. The more different licenses that are used in
the tree, the more problems that this causes to those wishing to
utilize this code, typically from unintended consequences from a
poorly worded license.Project policy dictates that code under some non-BSD
licenses must be placed only in specific sections of the
repository, and in some cases, compilation must be conditional
or even disabled by default. For example, the GENERIC kernel
must be compiled under only licenses identical to or
substantially similar to the BSD license. GPL, APSL, CDDL, etc,
licensed software must not be compiled into GENERIC.Developers are reminded that in open source, getting "open"
right is just as important as getting "source" right, as
improper handling of intellectual property has serious
consequences. Any questions or concerns should immediately be
brought to the attention of the core team.Developer RelationsIf you are working directly on your own code or on code
which is already well established as your responsibility, then
there is probably little need to check with other committers
before jumping in with a commit. If you see a bug in an area of
the system which is clearly orphaned (and there are a few such
areas, to our shame), the same applies. If, however, you are
about to modify something which is clearly being actively
maintained by someone else (and it is only by watching the
repository-committers
mailing list that you can really get a feel for just what is and
is not) then consider sending the change to them instead, just
as you would have before becoming a committer. For ports, you
should contact the listed MAINTAINER in the
Makefile. For other parts of the
repository, if you are unsure who the active maintainer might
be, it may help to scan the revision history to see who has
- committed changes in the past. &a.fenner; has written a nice
+ committed changes in the past. &a.fenner.email; has written a nice
shell script that can help determine who the active maintainer
might be. It lists each person who has committed to a given
file along with the number of commits each person has made. It
can be found on freefall at
~fenner/bin/whodid. If your queries go
unanswered or the committer otherwise indicates a lack of
interest in the area affected, go ahead and commit it.If you are unsure about a commit for any reason at
all, have it reviewed by -hackers
before committing. Better to have it flamed then and there
rather than when it is part of the repository. If you do
happen to commit something which results in controversy
erupting, you may also wish to consider backing the change out
again until the matter is settled. Remember – with a
version control system we can always change it back.Do not impugn the intentions of someone you disagree with.
If they see a different solution to a problem than you, or even
a different problem, it is not because they are stupid, because
they have questionable parentage, or because they are trying to
destroy your hard work, personal image, or &os;, but simply
because they have a different outlook on the world. Different
is good.Disagree honestly. Argue your position from its merits,
be honest about any shortcomings it may have, and be open to
seeing their solution, or even their vision of the problem,
with an open mind.Accept correction. We are all fallible. When you have made
a mistake, apologize and get on with life. Do not beat up
yourself, and certainly do not beat up others for your mistake.
Do not waste time on embarrassment or recrimination, just fix
the problem and move on.Ask for help. Seek out (and give) peer reviews. One of
the ways open source software is supposed to excel is in the
number of eyeballs applied to it; this does not apply if nobody
will review code.GNATSThe &os; Project utilizes
GNATS for tracking bugs and change
requests. Be sure that if you commit a fix or suggestion found
in a GNATS PR, you use
edit-pr pr-number
on freefall to close it. It is also considered
nice if you take time to close any PRs associated with your
commits, if appropriate. You can also make use of
&man.send-pr.1; yourself for proposing any change which you feel
should probably be made, pending a more extensive peer-review
first.You can find out more about GNATS
at:&os;
Problem Report Handling Guidelineshttp://www.FreeBSD.org/support.html&man.send-pr.1;You can run a local copy of GNATS, and then integrate the
&os; GNATS tree by creating an
rsync mirror. Then you can run GNATS
commands locally, allowing you to query the PR database without
an Internet connection.Mirroring the GNATS TreeIt is possible to mirror the GNATS database by installing
net/rsync, and
executing:&prompt.user; rsync -va rsync://bit0.us-west.freebsd.org/FreeBSD-bit/gnats .Useful ToolsOther than edit-pr there are a
collection of tools in ~gnats/tools/
on freefall which can make working with PRs
much easier.open-pr, close-pr,
take-pr, and feedback-pr
take PR numbers as arguments and then ask you to select from a
preexisting list of change reasons or let you type in your
own.change-pr is a multi purpose tool
that lets you make multiple changes at the same time with one
command.For example, to assign PR 123456 to yourself type
take-pr 123456.
If you want to set the PR to patched awaiting an MFC at
the same time use:
change-pr -t -p -m "awaiting MFC"
123456Who's WhoBesides the repository meisters, there are other &os;
project members and teams whom you will probably get to know in
your role as a committer. Briefly, and by no means
all-inclusively, these are:&a.doceng;doceng is the group responsible for the documentation
build infrastructure, approving new documentation
committers, and ensuring that the &os; website and
documentation on the FTP site is up to date with respect
to the CVS tree. It is not a conflict resolution body.
The vast majority of documentation related discussion
takes place on the &a.doc;. More details regarding the
doceng team can be found in its charter.
Committers interested in contributing to the documentation
should familiarize themselves with the Documentation
Project Primer.
- &a.ru;
+ &a.ru.email;Ruslan is Mister &man.mdoc.7;. If you are writing a
manual page and need some advice on the structure, or the
markup, ask Ruslan.
- &a.bde;
+ &a.bde.email;Bruce is the Style Police-Meister. When you do a
commit that could have been done better, Bruce will be
there to tell you. Be thankful that someone is. Bruce is
also very knowledgeable on the various standards
applicable to &os;.
- &team.re;
+ &a.re.members.email;These are the members of the &a.re;. This team is
responsible for setting release deadlines and controlling
the release process. During code freezes, the release
engineers have final authority on all changes to the
system for whichever branch is pending release status. If
there is something you want merged from &os.current; to
&os.stable; (whatever values those may have at any given
time), these are the people to talk to about it.Hiroki is also the keeper of the release documentation
(src/release/doc/*). If you commit a
change that you think is worthy of mention in the release
notes, please make sure he knows about it. Better still,
send him a patch with your suggested commentary.
- &a.des;
+ &a.des.email;Dag-Erling is the
&os; Security
Officer and oversees the
&a.security-officer;.
- &a.wollman;
+ &a.wollman.email;If you need advice on obscure network internals or
are not sure of some potential change to the networking
subsystem you have in mind, Garrett is someone to talk
to. Garrett is also very knowledgeable on the various
standards applicable to &os;.&a.committers;&a.svn-src-all.name;, &a.svn-ports-all.name; and
&a.svn-doc-all.name; are the mailing lists that the
version control system uses to send commit messages to.
You should never send email directly
to these lists. You should only send replies to this list
when they are short and are directly related to a
commit.&a.developers;All committers are subscribed to -developers. This
list was created to be a forum for the committers
community issues. Examples are Core
voting, announcements, etc.The &a.developers; is for the exclusive use of &os;
committers. In order to develop &os;, committers must
have the ability to openly discuss matters that will be
resolved before they are publicly announced. Frank
discussions of work in progress are not suitable for open
publication and may harm &os;.All &os; committers are reminded to obey the
copyright of the original author(s) of &a.developers;
mail. Do not publish or forward messages from the
&a.developers; outside the list membership without
permission of all of the authors.Copyright violators will be removed from the
&a.developers;, resulting in a suspension of commit
privileges. Repeated or flagrant violations may result in
permanent revocation of commit privileges.This list is not intended as a
place for code reviews or a replacement for the &a.arch;.
In fact using it as such hurts the &os; Project as it
gives a sense of a closed list where general decisions
affecting all of the &os; using community are made
without being open. Last, but not least
never, never ever, email the &a.developers; and
CC:/BCC: another &os; list. Never, ever
email another &os; email list and CC:/BCC: the
&a.developers;. Doing so can greatly diminish the
benefits of this list.SSH Quick-Start GuideIf you do not wish to type your password in every
time you use &man.ssh.1;, and you use RSA or DSA keys to
authenticate, &man.ssh-agent.1; is there for your
convenience. If you want to use &man.ssh-agent.1;, make
sure that you run it before running other applications. X
users, for example, usually do this from their
.xsession or
.xinitrc. See &man.ssh-agent.1;
for details.Generate a key pair using &man.ssh-keygen.1;. The key
pair will wind up in your
$HOME/.ssh/
directory.Send your public key
($HOME/.ssh/id_dsa.pub
or
$HOME/.ssh/id_rsa.pub)
to the person setting you up as a committer so it can be put
into the
yourlogin
file in
/etc/ssh-keys/ on
freefall.Now you should be able to use &man.ssh-add.1; for
authentication once per session. This will prompt you for
your private key's pass phrase, and then store it in your
authentication agent (&man.ssh-agent.1;). If you no longer
wish to have your key stored in the agent, issuing
ssh-add -d will remove it.Test by doing something such as ssh
freefall.FreeBSD.org ls /usr.For more information, see
security/openssh,
&man.ssh.1;, &man.ssh-add.1;, &man.ssh-agent.1;,
&man.ssh-keygen.1;, and &man.scp.1;.&coverity.prevent; Availability for &os; CommittersIn January 2006, the &os; Foundation obtained a license
for &coverity.prevent; from &coverity; Ltd. With this
donation, all &os; developers can obtain access to
Coverity Prevent analysis results of
all &os; Project software.&os; developers who are interested in obtaining access to
the analysis results of the automated
Coverity Prevent runs, can find out
more by logging into freefall and reading the
relevant bits of the files:/usr/local/coverity/coverity_license.txtThe license terms to which the &os; developers will
have to agree in order to use &coverity.prevent; analysis
results./usr/local/coverity/coverity_announcement.txtThe announcement posted to the developers' mailing
list of the &os; Project. It contains useful information
about the &os; Foundation and &coverity; Ltd., as
well as signup information for registering with the
&coverity.prevent; installation of the &os;
Cluster.After reading and understanding the license terms
of coverity_license.txt, all &os;
developers who are interested in using the analysis
results of &coverity.prevent; should read this
file./usr/local/coverity/coverity_readme.txtA short guide about fixes which are committed to the
&os; source tree after being detected by
&coverity.prevent; and analyzed by a &os;
developer.The &os; Wiki includes a mini-guide for developers who are
interested in working with the &coverity.prevent; analysis
reports:
.
Please note that this mini-guide is only readable by &os;
developers, so if you cannot access this page, you will have to
ask someone to add you to the appropriate Wiki access
list.Finally, all &os; developers who are going to use
&coverity.prevent; are always encouraged to ask for more details
and usage information, by posting any questions to the mailing
list of the &os; developers.The &os; Committers' Big List of RulesRespect other committers.Respect other contributors.Discuss any significant change
before committing.Respect existing maintainers (if listed in the
MAINTAINER field in
Makefile or in the
MAINTAINER file in the top-level
directory).Any disputed change must be backed out pending
resolution of the dispute if requested by a maintainer.
Security related changes may
override a maintainer's wishes at the Security Officer's
discretion.Changes go to &os.current; before
&os.stable; unless specifically permitted by
the release engineer or unless they are not applicable to
&os.current;. Any non-trivial or non-urgent
change which is applicable should also be allowed to sit in
&os.current; for at least 3 days before
merging so that it can be given sufficient testing. The
release engineer has the same authority over the
&os.stable; branch as outlined for the
maintainer in rule #5.Do not fight in public with other committers; it looks
bad. If you must strongly disagree about
something, do so only in private.Respect all code freezes and read the
committers and
developers mailing lists in a timely
manner so you know when a code freeze is in effect.When in doubt on any procedure, ask first!Test your changes before committing them.Do not commit to anything under the
src/contrib,
src/crypto, or
src/sys/contrib trees without
explicit approval from the respective
maintainer(s).As noted, breaking some of these rules can be grounds for
suspension or, upon repeated offense, permanent removal of
commit privileges. Individual members of core have the power to
temporarily suspend commit privileges until core as a whole has
the chance to review the issue. In case of an
emergency (a committer doing damage to the
repository), a temporary suspension may also be done by the
repository meisters. Only a 2/3 majority of core has the
authority to suspend commit privileges for longer than a week or
to remove them permanently. This rule does not exist to set
core up as a bunch of cruel dictators who can dispose of
committers as casually as empty soda cans, but to give the
project a kind of safety fuse. If someone is out of control, it
is important to be able to deal with this immediately rather
than be paralyzed by debate. In all cases, a committer whose
privileges are suspended or revoked is entitled to a
hearing by core, the total duration of the
suspension being determined at that time. A committer whose
privileges are suspended may also request a review of the
decision after 30 days and every 30 days thereafter (unless the
total suspension period is less than 30 days). A committer
whose privileges have been revoked entirely may request a review
after a period of 6 months has elapsed. This review policy is
strictly informal and, in all cases, core
reserves the right to either act on or disregard requests for
review if they feel their original decision to be the right
one.In all other aspects of project operation, core is a subset
of committers and is bound by the
same rules. Just because someone is in
core this does not mean that they have special dispensation to
step outside any of the lines painted here; core's
special powers only kick in when it acts as a
group, not on an individual basis. As individuals, the core
team members are all committers first and core second.DetailsRespect other committers.This means that you need to treat other committers as
the peer-group developers that they are. Despite our
occasional attempts to prove the contrary, one does not
get to be a committer by being stupid and nothing rankles
more than being treated that way by one of your peers.
Whether we always feel respect for one another or not (and
everyone has off days), we still have to
treat other committers with respect
at all times, on public forums and in private
email.Being able to work together long term is this
project's greatest asset, one far more important than any
set of changes to the code, and turning arguments about
code into issues that affect our long-term ability to work
harmoniously together is just not worth the trade-off by
any conceivable stretch of the imagination.To comply with this rule, do not send email when you
are angry or otherwise behave in a manner which is likely
to strike others as needlessly confrontational. First
calm down, then think about how to communicate in the most
effective fashion for convincing the other person(s) that
your side of the argument is correct, do not just blow off
some steam so you can feel better in the short term at the
cost of a long-term flame war. Not only is this very bad
energy economics, but repeated displays of
public aggression which impair our ability to work well
together will be dealt with severely by the project
leadership and may result in suspension or termination of
your commit privileges. The project leadership will take
into account both public and private communications
brought before it. It will not seek the disclosure of
private communications, but it will take it into account
if it is volunteered by the committers involved in the
complaint.All of this is never an option which the project's
leadership enjoys in the slightest, but unity comes first.
No amount of code or good advice is worth trading that
away.Respect other contributors.You were not always a committer. At one time you were
a contributor. Remember that at all times. Remember what
it was like trying to get help and attention. Do not
forget that your work as a contributor was very important
to you. Remember what it was like. Do not discourage,
belittle, or demean contributors. Treat them with
respect. They are our committers in waiting. They are
every bit as important to the project as committers.
Their contributions are as valid and as important as your
own. After all, you made many contributions before you
became a committer. Always remember that.Consider the points raised under
and apply them also to
contributors.Discuss any significant change
before committing.The repository is not where changes should be
initially submitted for correctness or argued over, that
should happen first in the mailing lists and the commit
should only happen once something resembling consensus has
been reached. This does not mean that you have to ask
permission before correcting every obvious syntax error or
manual page misspelling, simply that you should try to
develop a feel for when a proposed change is not quite
such a no-brainer and requires some feedback first.
People really do not mind sweeping changes if the result
is something clearly better than what they had before,
they just do not like being surprized
by those changes. The very best way of making sure that
you are on the right track is to have your code reviewed
by one or more other committers.When in doubt, ask for review!Respect existing maintainers if listed.Many parts of &os; are not owned in
the sense that any specific individual will jump up and
yell if you commit a change to their area,
but it still pays to check first. One convention we use
is to put a maintainer line in the
Makefile for any package or subtree
which is being actively maintained by one or more people;
see http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/developers-handbook/policies.html
for documentation on this. Where sections of code have
several maintainers, commits to affected areas by one
maintainer need to be reviewed by at least one other
maintainer. In cases where the
maintainer-ship of something is not clear,
you can also look at the repository logs for the file(s)
in question and see if someone has been working recently
or predominantly in that area.Other areas of &os; fall under the control of
someone who manages an overall category of &os;
evolution, such as internationalization or networking.
See http://www.FreeBSD.org/administration.html
for more information on this.Any disputed change must be backed out pending
resolution of the dispute if requested by a maintainer.
Security related changes may
override a maintainer's wishes at the Security Officer's
discretion.This may be hard to swallow in times of conflict (when
each side is convinced that they are in the right, of
course) but a version control system makes it unnecessary
to have an ongoing dispute raging when it is far easier to
simply reverse the disputed change, get everyone calmed
down again and then try to figure out what is the best way
to proceed. If the change turns out to be the best thing
after all, it can be easily brought back. If it turns out
not to be, then the users did not have to live with the
bogus change in the tree while everyone was busily
debating its merits. People very
rarely call for back-outs in the repository since
discussion generally exposes bad or controversial changes
before the commit even happens, but on such rare occasions
the back-out should be done without argument so that we
can get immediately on to the topic of figuring out
whether it was bogus or not.Changes go to &os.current; before &os.stable; unless
specifically permitted by the release engineer or unless
they are not applicable to &os.current;. Any non-trivial
or non-urgent change which is applicable should also be
allowed to sit in &os.current; for at least 3 days before
merging so that it can be given sufficient testing. The
release engineer has the same authority over the
&os.stable; branch as outlined in rule #5.This is another do not argue about it
issue since it is the release engineer who is ultimately
responsible (and gets beaten up) if a change turns out to
be bad. Please respect this and give the release engineer
your full cooperation when it comes to the &os.stable;
branch. The management of &os.stable; may frequently seem
to be overly conservative to the casual observer, but also
bear in mind the fact that conservatism is supposed to be
the hallmark of &os.stable; and different rules apply
there than in &os.current;. There is also really no point
in having &os.current; be a testing ground if changes are
merged over to &os.stable; immediately. Changes need a
chance to be tested by the &os.current; developers, so
allow some time to elapse before merging unless the
&os.stable; fix is critical, time sensitive or so obvious
as to make further testing unnecessary (spelling fixes to
manual pages, obvious bug/typo fixes, etc.) In other
words, apply common sense.Changes to the security branches (for example,
RELENG_7_0) must be approved by a
member of the &a.security-officer;, or in some cases, by a
member of the &a.re;.Do not fight in public with other committers; it looks
bad. If you must strongly disagree about
something, do so only in private.This project has a public image to uphold and that
image is very important to all of us, especially if we are
to continue to attract new members. There will be
occasions when, despite everyone's very best attempts at
self-control, tempers are lost and angry words are
exchanged. The best thing that can be done in such cases
is to minimize the effects of this until everyone has
cooled back down. That means that you should not air your
angry words in public and you should not forward private
correspondence to public mailing lists or aliases. What
people say one-to-one is often much less sugar-coated than
what they would say in public, and such communications
therefore have no place there - they only serve to inflame
an already bad situation. If the person sending you a
flame-o-gram at least had the grace to send it privately,
then have the grace to keep it private yourself. If you
feel you are being unfairly treated by another developer,
and it is causing you anguish, bring the matter up with
core rather than taking it public. Core will do its best
to play peace makers and get things back to sanity. In
cases where the dispute involves a change to the codebase
and the participants do not appear to be reaching an
amicable agreement, core may appoint a mutually-agreeable
3rd party to resolve the dispute. All parties involved
must then agree to be bound by the decision reached by
this 3rd party.Respect all code freezes and read the
committers and
developers mailing list on a timely
basis so you know when a code freeze is in effect.Committing unapproved changes during a code freeze is
a really big mistake and committers are expected to keep
up-to-date on what is going on before jumping in after a
long absence and committing 10 megabytes worth of
accumulated stuff. People who abuse this on a regular
basis will have their commit privileges suspended until
they get back from the &os; Happy Reeducation Camp we
run in Greenland.When in doubt on any procedure, ask first!Many mistakes are made because someone is in a hurry
and just assumes they know the right way of doing
something. If you have not done it before, chances are
good that you do not actually know the way we do things
and really need to ask first or you are going to
completely embarrass yourself in public. There is no
shame in asking
how in the heck do I do this? We already
know you are an intelligent person; otherwise, you would
not be a committer.Test your changes before committing them.This may sound obvious, but if it really were so
obvious then we probably would not see so many cases of
people clearly not doing this. If your changes are to the
kernel, make sure you can still compile both GENERIC and
LINT. If your changes are anywhere else, make sure you
can still make world. If your changes are to a branch,
make sure your testing occurs with a machine which is
running that code. If you have a change which also may
break another architecture, be sure and test on all
supported architectures. Please refer to the
&os;
Internal Page for a list of available resources.
As other architectures are added to the &os; supported
platforms list, the appropriate shared testing resources
will be made available.Do not commit to anything under the
src/contrib,
src/crypto, and
src/sys/contrib trees without
explicit approval from the respective
maintainer(s).The trees mentioned above are for contributed software
usually imported onto a vendor branch. Committing
something there, even if it does not take the file off the
vendor branch, may cause unnecessary headaches for those
responsible for maintaining that particular piece of
software. Thus, unless you have
explicit approval from the maintainer
(or you are the maintainer), do not
commit there!Please note that this does not mean you should not try
to improve the software in question; you are still more
than welcome to do so. Ideally, you should submit your
patches to the vendor. If your changes are
&os;-specific, talk to the maintainer; they may be
willing to apply them locally. But whatever you do, do
not commit there by yourself!Contact the &a.core; if you wish to take up
maintainership of an unmaintained part of the tree.Policy on Multiple Architectures&os; has added several new architecture ports during
recent release cycles and is truly no longer an &i386; centric
operating system. In an effort to make it easier to keep
&os; portable across the platforms we support, core has
developed the following mandate:
Our 32-bit reference platform is &arch.i386;, and our
64-bit reference platform is &arch.sparc64;. Major design
work (including major API and ABI changes) must prove
itself on at least one 32-bit and at least one 64-bit
platform, preferably the primary reference platforms,
before it may be committed to the source tree.
The &arch.i386; and &arch.sparc64; platforms were chosen
due to being more readily available to developers and as
representatives of more diverse processor and system designs -
big versus little endian, register file versus register stack,
different DMA and cache implementations, hardware page tables
versus software TLB management etc.The &arch.ia64; platform has many of the same
complications that &arch.sparc64; has, but is still limited in
availability to developers.We will continue to re-evaluate this policy as cost and
availability of the 64-bit platforms change.Developers should also be aware of our Tier Policy for
the long term support of hardware architectures. The rules
here are intended to provide guidance during the development
process, and are distinct from the requirements for features
and architectures listed in that section. The Tier rules for
feature support on architectures at release-time are more
strict than the rules for changes during the development
process.Other SuggestionsWhen committing documentation changes, use a spell checker
before committing. For all SGML docs, you should also
verify that your formatting directives are correct by running
make lint.For all on-line manual pages, run manck
(from ports) over the manual page to verify all of the cross
references and file references are correct and that the man
page has all of the appropriate MLINKs
installed.Do not mix style fixes with new functionality. A style
fix is any change which does not modify the functionality of
the code. Mixing the changes obfuscates the functionality
change when asking for differences between revisions, which
can hide any new bugs. Do not include whitespace changes with
content changes in commits to doc/ or
www/. The extra clutter in the diffs
makes the translators' job much more difficult. Instead, make
any style or whitespace changes in separate commits that are
clearly labeled as such in the commit message.Deprecating FeaturesWhen it is necessary to remove functionality from software
in the base system the following guidelines should be followed
whenever possible:Mention is made in the manual page and possibly the
release notes that the option, utility, or interface is
deprecated. Use of the deprecated feature generates a
warning.The option, utility, or interface is preserved until
the next major (point zero) release.The option, utility, or interface is removed and no
longer documented. It is now obsolete. It is also
generally a good idea to note its removal in the release
notes.Support for Multiple Architectures&os; is a highly portable operating system intended to
function on many different types of hardware architectures.
Maintaining clean separation of Machine Dependent (MD) and
Machine Independent (MI) code, as well as minimizing MD code, is
an important part of our strategy to remain agile with regards
to current hardware trends. Each new hardware architecture
supported by &os; adds substantially to the cost of code
maintenance, toolchain support, and release engineering. It
also dramatically increases the cost of effective testing of
kernel changes. As such, there is strong motivation to
differentiate between classes of support for various
architectures while remaining strong in a few key architectures
that are seen as the &os; target audience.Statement of General IntentThe &os; Project targets "production quality commercial
off-the-shelf (COTS) workstation, server, and high-end
embedded systems". By retaining a focus on a narrow set of
architectures of interest in these environments, the &os;
Project is able to maintain high levels of quality, stability,
and performance, as well as minimize the load on various
support teams on the project, such as the ports team,
documentation team, security officer, and release engineering
teams. Diversity in hardware support broadens the options for
&os; consumers by offering new features and usage
opportunities (such as support for 64-bit CPUs, use in
embedded environments, etc.), but these benefits must always
be carefully considered in terms of the real-world maintenance
cost associated with additional platform support.The &os; Project differentiates platform targets into
four tiers. Each tier includes a specification of the
requirements for an architecture to be in that tier,
as well as specifying the obligations of developers with
regards to the platform. In addition, a policy is defined
regarding the circumstances required to change the tier
of an architecture.Tier 1: Fully Supported ArchitecturesTier 1 platforms are fully supported by the security
officer, release engineering, and toolchain maintenance staff.
New features added to the operating system must be fully
functional across all Tier 1 architectures for every release
(features which are inherently architecture-specific, such as
support for hardware device drivers, may be exempt from this
requirement). In general, all Tier 1 platforms must have
build and Tinderbox support either in the FreeBSD.org cluster,
or be easily available for all developers. Embedded platforms
may substitute an emulator available in the &os; cluster
for actual hardware.Tier 1 architectures are expected to be Production Quality
with respects to all aspects of the &os; operating system,
including installation and development environments.Tier 1 architectures are expected to be completely
integrated into the source tree and have all features
necessary to produce an entire system relevant for that target
architecture. Tier 1 architectures generally have at least 6
active developers.Tier 1 architectures are expected to be fully supported by
the ports system. All the ports should build on a Tier 1
platform, or have the appropriate filters to prevent the
inappropriate ones from building there. The packaging system
must support all Tier 1 architectures. To ensure an
architecture's Tier 1 status, proponents of that architecture
must show that all relevant packages can be built on that
platform.Tier 1 embedded architectures must be able to cross-build
packages on at least one other Tier 1 architecture. The
packages must be the most relevant for the platform, but may
be a non-empty subset of those that build natively.Tier 1 architectures must be fully documented. All basic
operations need to be covered by the handbook or other
documents. All relevant integration documentation must also
be integrated into the tree, or readily available.Current Tier 1 platforms are &arch.i386; and
&arch.amd64;.Tier 2: Developmental ArchitecturesTier 2 platforms are not supported by the security officer
and release engineering teams. Platform maintainers are
responsible for toolchain support in the tree. The toolchain
maintainer is expected to work with the platform maintainers
to refine these changes. Major new toolchain components are
allowed to break support for Tier 2 architectures if the
&os;-local changes have not been incorporated upstream.
The toolchain maintainers are expected to provide prompt
review of any proposed changes and cannot block, through their
inaction, changes going into the tree. New features added to
&os; should be feasible to implement on these platforms,
but an implementation is not required before the feature may
be added to the &os; source tree. New features that may be
difficult to implement on Tier 2 architectures should provide
a means of disabling them on those architectures. The
implementation of a Tier 2 architecture may be committed to
the main &os; tree as long as it does not interfere with
production work on Tier 1 platforms, or substantially with
other Tier 2 platforms. Before a Tier 2 platform can be added
to the &os; base source tree, the platform must be able to
boot multi-user on actual hardware. Generally, there must be
at least three active developers working on the
platform.Tier 2 architectures are usually systems targeted at Tier
1 support, but that are still under development.
Architectures reaching end of life may also be moved from Tier
1 status to Tier 2 status as the availability of resources to
continue to maintain the system in a Production Quality state
diminishes. Well supported niche architectures may also be
Tier 2.Tier 2 architectures may have some support for them
integrated into the ports infrastructure. They may have cross
compilation support added, at the discretion of portmgr. Some
ports must built natively into packages if the package system
supports that architecture. If not integrated into the base
system, some external patches for the architecture for ports
must be available.Tier 2 architectures can be integrated into the &os;
handbook. The basics for how to get a system running must be
documented, although not necessarily for every single board or
system a Tier 2 architecture supports. The supported hardware
list must exist and should be no more than a couple of months
old. It should be integrated into the &os;
documentation.Current Tier 2 platforms are &arch.arm;, &arch.ia64;,
&arch.pc98;, &arch.powerpc;, and &arch.sparc64;.Tier 3: Experimental ArchitecturesTier 3 platforms are not supported by the security officer
and release engineering teams. At the discretion of the
toolchain maintainer, they may be supported in the toolchain.
Tier 3 platforms are architectures in the early stages of
development, for non-mainstream hardware platforms, or which
are considered legacy systems unlikely to see broad future
use. New Tier 3 systems will not be committed to the base
source tree. Support for Tier 3 systems may be worked on in
the &os; Perforce Repository, providing source control and
easier change integration from the main &os; tree.
Platforms that transition to Tier 3 status may be removed from
the tree if they are no longer actively supported by the
&os; developer community at the discretion of the release
engineer.Tier 3 platforms may have ports support, either integrated
or external, but do not require it.Tier 3 platforms must have the basics documented for how
to build a kernel and how to boot it on at least one target
hardware or emulation environment. This documentation need
not be integrated into the &os; tree.Current Tier 3 platforms are &arch.mips; and
&s390;.Tier 4: Unsupported ArchitecturesTier 4 systems are not supported in any form by the
project.All systems not otherwise classified into a support tier
are Tier 4 systems.Policy on Changing the Tier of an ArchitectureSystems may only be moved from one tier to another by
approval of the &os; Core Team, which shall make that
decision in collaboration with the Security Officer, Release
Engineering, and toolchain maintenance teams.Ports Specific FAQAdding a New PortHow do I add a new port?First, please read the section about repository
copies.The easiest way to add a new port is to use the
addport script from your machine
(located in the ports/Tools/scripts
directory). It will add a port from the directory you
specify, determining the category automatically from the
port Makefile. It will also add an
entry to the port's category
Makefile. It was written by
- &a.mharo;, &a.will;, and &a.garga;. When sending
+ &a.mharo.email;, &a.will.email;, and &a.garga.email;.
+ When sending
questions about this script to the &a.ports;, please
- also CC &a.crees;, the current maintainer.
+ also CC &a.crees.email;, the current maintainer.
Any other things I need to know when I add a new
port?Check the port, preferably to make sure it compiles
and packages correctly. This is the recommended
sequence:&prompt.root; make install
&prompt.root; make package
&prompt.root; make deinstall
&prompt.root; pkg_add package you built above
&prompt.root; make deinstall
&prompt.root; make reinstall
&prompt.root; make packageThe Porters
Handbook contains more detailed
instructions.Use &man.portlint.1; to check the syntax of the
port. You do not necessarily have to eliminate all
warnings but make sure you have fixed the simple
ones.If the port came from a submitter who has not
contributed to the Project before, add that person's
name to the Additional
Contributors section of the &os;
Contributors List.Close the PR if the port came in as a PR. To close
a PR, just do edit-pr
PR# on
freefall and change the
state from open
to closed. You will be asked to
enter a log message and then you are done.Removing an Existing PortHow do I remove an existing port?First, please read the section about repository
copies. Before you remove the port, you have to verify
there are no other ports depending on it.Make sure there is no dependency on the port
in the ports collection:The port's PKGNAME should appear in exactly
one line in a recent INDEX file.No other ports should contain any reference
to the port's directory or PKGNAME in their
MakefilesThen, remove the port:Remove the port's files via
svn remove.Remove the SUBDIR listing
of the port in the parent directory
Makefile.Add an entry to
ports/MOVED.Remove the port from
ports/LEGAL if it is
there.Alternatively, you can use the
rmport script, from ports/Tools/scripts.
- This script was written by &a.vd;. When sending
+ This script was written by &a.vd.email;. When sending
questions about this script to the &a.ports;, please
- also CC &a.crees;, the current maintainer.
+ also CC &a.crees.email;, the current maintainer.
Re-adding a Deleted PortHow do I re-add a deleted port?This is essentially the reverse of deleting a
port.Figure out when the port was removed. Use this
list
and then copy the last living revision of the port:
&prompt.user; cd /usr/ports/category
&prompt.user; svn cp 'svn+ssh://svn.freebsd.org/ports/category/portname/@{YYYY-MM-DD}' portname
Pick a date that is before the removal but after the
last true commit.Perform whatever changes are necessary to make
the port work again. If it was deleted because the
distfiles are no longer available you will need to
volunteer to host them yourself, or find someone
else to do so.svn add or
svn remove any appropriate
files.Restore the SUBDIR listing of
the port in the parent directory
Makefile, and delete the entry
from ports/MOVED.If the port had an entry in
ports/LEGAL, restore it.svn commit these changes,
preferably in one step.addport now detects when the
port to add has previously existed, and should handle
all except the ports/LEGAL step
automatically.Repository CopiesWhen do we need a repository copy?When you want to add a port that is related to
any port that is already in the tree in a separate
directory, you have to do a repository copy.
Here related means
it is a different version or a slightly modified
version. Examples are
print/ghostscript* (different
versions) and x11-wm/windowmaker*
(English-only and internationalized version).Another example is when a port is moved from one
subdirectory to another, or when you want to change the
name of a directory because the author(s) renamed their
software even though it is a
descendant of a port already in a tree.What do I need to do?With Subversion, a repo copy can be done by any
committer:Doing a repo copy:First make sure that you were using an up to
date ports tree and the target directory does
not exist.Use svn move or
svn copy to do the repo
copy.Upgrade the copied port to the new version.
Remember to change the
LATEST_LINK so there are no
duplicate ports with the same name. In some
rare cases it may be necessary to change the
PORTNAME instead of
LATEST_LINK, but this should
only be done when it is really needed —
e.g., using an existing port as the base for a
very similar program with a different name, or
upgrading a port to a new upstream version which
actually changes the distribution name, like the
transition from
textproc/libxml to
textproc/libxml2. In most
cases, changing LATEST_LINK
should suffice.Add the new subdirectory to the
SUBDIR listing in the parent
directory Makefile. You
can run make checksubdirs in
the parent directory to check this.If the port changed categories, modify the
CATEGORIES line of the port's
Makefile accordinglyAdd an entry to
ports/MOVED, if you remove
the original port.Commit all changes on one commit. A forced
commit is no longer needed with
Subversion.When removing a port:Perform a thorough check of the ports
collection for any dependencies on the old port
location/name, and update them. Running
grep on
INDEX is not enough because
some ports have dependencies enabled by
compile-time options. A full
grep -r of the ports
collection is recommended.Remove the old port and the
old SUBDIR entry.Add an entry to
ports/MOVED.After repo moves (rename
operations where a port is copied and the old
location is removed):Follow the same steps that are outlined in
the previous two entries, to activate the new
location of the port and remove the old
one.Ports FreezeWhat is a ports freeze?Before a release, it is necessary to restrict
commits to the ports tree for a short period of time
while the packages and the release itself are being
built. This is to ensure consistency among the various
parts of the release, and is called the
ports freeze.For more information on the background and
policies surrounding a ports freeze, see the
Portmgr
Quality Assurance page.What is a ports slush or
feature freeze?During a release cycle the ports tree may be in a
slush state instead of in a hard freeze.
The goal during a slush is to reach a stable ports tree
to avoid rebuilding large sets of packages for the
release and to tag the tree. During this time
sweeping changes are prohibited unless
specifically permitted by portmgr. Complete details
about what qualifies as a sweeping change can be found
on the Portmgr
Implementation page.The benefit of a slush as opposed to a complete
freeze is that it allows maintainers to continue adding
new ports, making routine version updates, and bug fixes
to most existing ports, as long as the number of
affected ports is minimal. For example, updating the
shared library version on a port that many other ports
depend on.How long is a ports freeze or slush?A freeze only lasts long enough to tag the tree.
A slush usually lasts a week or two, but may last
longer.What does it mean to me?During a ports freeze, you are not allowed to
commit anything to the tree without explicit approval
from the Ports Management Team. Explicit
approval here means that you send a patch to
the Ports Management Team for review and get a reply
saying, Go ahead and commit it.Not everything is allowed to be committed during
a freeze. Please see the Portmgr Quality
Assurance page for more information.Note that you do not have implicit permission to fix
a port during the freeze just because it is
broken.During a ports slush, you are still allowed to
commit but you must exercise more caution in what you
commit. Furthermore a special note (typically
Feature Safe: yes) must be added to the
commit message.How do I know when the ports slush starts?The Ports Management Team will send out warning
messages to the &a.ports; and &a.committers;
announcing the start of the impending release, usually
two or three weeks in advance. The exact starting time
will not be determined until a few days before the
actual release. This is because the ports slush has to
be synchronized with the release, and it is usually not
known until then when exactly the release will be
rolled.When the slush starts, there will be another
announcement to the &a.ports; and &a.committers;, of
course.How do I know when the freeze or slush ends?A few hours after the release, the Ports Management
Team will send out a mail to the &a.ports; and
&a.committers; announcing the end of the ports freeze or
slush. Note that the release being cut does not
automatically indicate the end of the freeze. We have
to make sure there will be no last minute snafus that
result in an immediate re-rolling of the release.Creating a New CategoryWhat is the procedure for creating a new
category?Please see
Proposing a New Category in the Porter's
Handbook. Once that procedure has been followed and the
PR has been assigned to &a.portmgr;, it is their
decision whether or not to approve it. If they do, it
is their responsibility to do the following:Perform any needed moves. (This only applies
to physical categories.)Update the VALID_CATEGORIES
definition in
ports/Mk/bsd.port.mk.Assign the PR back to you.What do I need to do to implement a new physical
category?Upgrade each moved port's
Makefile. Do not connect the
new category to the build yet.To do this, you will need to:Change the port's
CATEGORIES (this was the
point of the exercise, remember?) The new
category should be listed
first. This will help to
ensure that the PKGORIGIN is
correct.Run a make describe.
Since the top-level
make index that you will be
running in a few steps is an iteration of
make describe over the entire
ports hierarchy, catching any errors here will
save you having to re-run that step later
on.If you want to be really thorough, now
might be a good time to run
&man.portlint.1;.Check that the PKGORIGINs are
correct. The ports system uses each port's
CATEGORIES entry to create its
PKGORIGIN, which is used to
connect installed packages to the port directory
they were built from. If this entry is wrong,
common port tools like &man.pkg.version.1; and
&man.portupgrade.1; fail.To do this, use the
chkorigin.sh tool, as follows:
env
PORTSDIR=/path/to/ports
sh -e
/path/to/ports/Tools/scripts/chkorigin.sh.
This will check every port in
the ports tree, even those not connected to the
build, so you can run it directly after the move
operation. Hint: do not forget to look at the
PKGORIGINs of any slave ports of
the ports you just moved!On your own local system, test the proposed
changes: first, comment out the
SUBDIR entries in the old ports'
categories' Makefiles; then
enable building the new category in
ports/Makefile. Run
make checksubdirs in the affected
category directories to check the
SUBDIR entries. Next, in the
ports/
directory, run make index. This
can take over 40 minutes on even modern systems;
however, it is a necessary step to prevent problems
for other people.Once this is done, you can commit the updated
ports/Makefile to connect the
new category to the build and also commit the
Makefile changes for the old
category or categories.Add appropriate entries to
ports/MOVED.Update the documentation by modifying the
following:the list
of categories in the Porter's
Handbookwww/en/ports/categories.
Note that these are now displayed by sub-groups,
as specified in
www/en/ports/categories.descriptions.(Note: these are in the docs, not the ports,
repository). If you are not a docs committer, you
will need to submit a PR for this.Only once all the above have been done, and no
one is any longer reporting problems with the new
ports, should the old ports be deleted from their
previous locations in the repository.It is not necessary to manually update the
ports web
pages to reflect the new category. This is
now done automatically via your change to
www/en/ports/categories and the
daily automated rebuild of
INDEX.What do I need to do to implement a new virtual
category?This is much simpler than a physical category. You
only need to modify the following:the list
of categories in the Porter's
Handbookwww/en/ports/categoriesMiscellaneous QuestionsHow do I know if my port is building correctly or
not?First, go check .
There you will find error logs from the latest package
building runs on all supported platforms for the most
recent branches.However, just because the port does not show up
there does not mean it is building correctly. (One of
the dependencies may have failed, for instance.) The
relevant directories are available on
pointyhat under /a/portbuild/<arch>/<major_version>
so feel free to dig around. Each architecture and
version has the following subdirectories:errors error logs from latest <major_version> run on <arch>
logs all logs from latest <major_version> run on <arch>
packages packages from latest <major_version> run on <arch>
bak/errors error logs from last complete <major_version> run on <arch>
bak/logs all logs from last complete <major_version> run on <arch>
bak/packages packages from last complete <major_version> run on <arch>Basically, if the port shows up in
packages, or it is in
logs but not in
errors, it built fine. (The
errors directories are what you get
from the web page.)I added a new port. Do I need to add it to the
INDEX?No, INDEX is no longer stored
in the SVN repository. The file can either be generated
by running make index, or a
pre-generated version can be downloaded with
make fetchindex.Are there any other files I am not allowed to
touch?Any file directly under ports/,
or any file under a subdirectory that starts with an
uppercase letter (Mk/,
Tools/, etc.). In particular, the
Ports Management Team is very protective of
ports/Mk/bsd.port*.mk so do not
commit changes to those files unless you want to face
his wra(i)th.What is the proper procedure for updating the
checksum for a port's distfile when the file changes
without a version change?When the checksum for a port's distfile is updated
due to the author updating the file without changing the
port's revision, the commit message should include a
summary of the relevant diffs between the original and
new distfile to ensure that the distfile has not been
corrupted or maliciously altered. If the current
version of the port has been in the ports tree for a
while, a copy of the old distfile will usually be
available on the ftp servers; otherwise the author or
maintainer should be contacted to find out why the
distfile has changed.Issues Specific to Developers Who Are Not
CommittersA few people who have access to the &os; machines do not
have commit bits. For instance, the project is willing to give
access to the GNATS database to contributors who have shown
interest and dedication in working on Problem Reports.Almost all of this document will apply to these developers
as well (except things specific to commits and the mailing list
memberships that go with them). In particular, we recommend
that you read:Administrative
DetailsConventionsYou should get your mentor to add you to the
Additional Contributors
(doc/en_US.ISO8859-1/articles/contributors/contrib.additional.xml),
if you are not already listed there.Developer
RelationsSSH Quick-Start
GuideThe &os; Committers' Big List
of RulesInformation About &ga;As of December 12, 2012, &ga; was enabled on the
&os; Project website to collect anonymized usage statistics
regarding usage of the site. The information collected is
valuable to the &os; Documentation Project, in order to
identify various problems on the &os; website.&ga; General PolicyThe &os; Project takes visitor privacy very
seriously. As such, the &os; Project website honors the
Do Not Track header before
fetching the tracking code from Google. For more information,
please see the
&os; Privacy
Policy.&ga; access is not arbitrarily
allowed — access must be requested, voted on by the
&a.doceng;, and explicitly granted.Requests for &ga; data must include a specific purpose.
For example, a valid reason for requesting access would be
to see the most frequently used web browsers when
viewing &os; web pages to ensure page rendering speeds are
acceptable.Conversely, to see what web browsers are most
frequently used (without stating
why) would be rejected.All requests must include the timeframe for which the data
would be required. For example, it must be explicitly stated
if the requested data would be needed for a timeframe covering
a span of 3 weeks, or if the request would be one-time
only.Any request for &ga; data without a clear, reasonable
reason beneficial to the &os; Project will be
rejected.Data Available Through &ga;A few examples of the types of &ga; data available
include:Commonly used web browsersPage load timesSite access by languagePerks of the JobUnfortunately, there are not many perks involved with being
a committer. Recognition as a competent software engineer is
probably the only thing that will be of benefit in the long run.
However, there are at least some perks:Free 4-CD and DVD Sets&os; committers can get a free 4-CD or DVD set at
conferences from
&os; Mall, Inc.. The sets are no longer
available as a subscription due to the high shipment costs
to countries outside the USA.Freenode IRC Cloaks&os; developers may request a cloaked hostmask for
their account on the Freenode IRC network in the form of
freebsd/developer/freefall
name or
freebsd/developer/NickServ
name. To request a cloak, send an email to
- &a.eadler; with your requested hostmask and NickServ
+ &a.eadler.email; with your requested hostmask and NickServ
account name.Miscellaneous QuestionsWhy are trivial or cosmetic changes to files on a
vendor branch a bad idea?From now on, every new vendor release of that file
will need to have patches merged in by hand.From now on, every new vendor release of that file
will need to have patches
verified by hand.How do I add a new file to a branch?To add a file onto a branch, simply checkout or update
to the branch you want to add to and then add the file
using the add operation as you normally would. This works
fine for the doc and
ports trees. The
src tree uses SVN and requires more
care because of the mergeinfo
properties. See section 1.4.6 of the Subversion
Primer for details. Refer to SubversionPrimer/Merging
for details on how to perform an MFC.What meta information should I include
in a commit message?As well as including an informative message with each
commit you may need to include some additional information
as well.This information consists of one or more lines
containing the key word or phrase, a colon, tabs for
formatting, and then the additional information.The key words or phrases are:PR:The problem report (if any) which is affected
(typically, by being closed) by this
commit.Submitted by:The name and e-mail address of the person
that submitted the fix; for committers, just the
username on the &os; cluster.Reviewed by:The name and e-mail address of the person or
people that reviewed the change; for committers,
just the username on the &os; cluster. If a
patch was submitted to a mailing list for review,
and the review was favorable, then just include
the list name.Approved by:The name and e-mail address of the person or
people that approved the change; for committers,
just the username on the &os; cluster. It is
customary to get prior approval for a commit if it
is to an area of the tree to which you do not
usually commit. In addition, during the run up to
a new release all commits
must be approved by the
release engineering team. If these are your first
commits then you should have passed them past your
mentor first, and you should list your mentor, as
in ``username-of-mentor(mentor)''.Obtained from:The name of the project (if any) from which
the code was obtained.MFC after:If you wish to receive an e-mail reminder to
MFC at a later date, specify
the number of days, weeks, or months after which
an MFC is planned.Security:If the change is related to a security
vulnerability or security exposure, include one or
more references or a description of the
issue.Commit Log for a Commit Based on a PRYou want to commit a change based on a PR submitted
by John Smith containing a patch. The end of the commit
message should look something like this....
PR: foo/12345
Submitted by: John Smith <John.Smith@example.com>Commit Log for a Commit Needing ReviewYou want to change the virtual memory system. You
have posted patches to the appropriate mailing list (in
this case, freebsd-arch) and the
changes have been approved....
Reviewed by: -archCommit Log for a Commit Needing ApprovalYou want to commit a change to a section of the tree
with a MAINTAINER assigned. You have collaborated with
the listed MAINTAINER, who has told you to go ahead and
commit....
Approved by: abcWhere abc is the account
name of the person who approved.Commit Log for a Commit Bringing in Code from
OpenBSDYou want to commit some code based on work done in
the OpenBSD project....
Obtained from: OpenBSDCommit Log for a Change to &os.current; with a
Planned Commit to &os.stable; to Follow at a Later
Date.You want to commit some code which will be merged
from &os.current; into the &os.stable; branch after two
weeks....
MFC after: 2 weeksWhere 2 is the number of
days, weeks, or months after which an
MFC is planned. The
weeks option may be
day, days,
week, weeks,
month, months, or
may be left off (in which case, days will be
assumed).In some cases you may need to combine some of
these.Consider the situation where a user has submitted a PR
containing code from the NetBSD project. You are looking
at the PR, but it is not an area of the tree you normally
work in, so you have decided to get the change reviewed by
the arch mailing list. Since the
change is complex, you opt to MFC after
one month to allow adequate testing.The extra information to include in the commit would
look something likePR: foo/54321
Submitted by: John Smith <John.Smith@example.com>
Reviewed by: -arch
Obtained from: NetBSD
MFC after: 1 monthHow do I access
people.FreeBSD.org to put up
personal or project information?people.FreeBSD.org is the
same as
freefall.FreeBSD.org. Just
create a public_html directory.
Anything you place in that directory will automatically be
visible under .Where are the mailing list archives stored?The mailing lists are archived under
/g/mail which will show up as
/hub/g/mail with &man.pwd.1;. This
location is accessible from any machine on the &os;
cluster.I would like to mentor a new committer. What process
do I need to follow?See the New
Account Creation Procedure document on the
internal pages.
diff --git a/en_US.ISO8859-1/articles/console-server/article.xml b/en_US.ISO8859-1/articles/console-server/article.xml
index b0c78d3ef3..1360b58373 100644
--- a/en_US.ISO8859-1/articles/console-server/article.xml
+++ b/en_US.ISO8859-1/articles/console-server/article.xml
@@ -1,1476 +1,1476 @@
Console ServerGregoryBondgnb@itga.com.au
&tm-attrib.freebsd;
&tm-attrib.cisco;
&tm-attrib.intel;
&tm-attrib.lantronix;
&tm-attrib.microsoft;
&tm-attrib.opengroup;
&tm-attrib.sun;
&tm-attrib.general;
$FreeBSD$$FreeBSD$This document describes how you can use &os;
to set up a console server. A console server is
a machine that you can use to monitor the consoles of many other
machines, instead of a bunch of serial terminals.console-serverThe ProblemYou have a computer room with lots of &unix; server machines and lots
of communications hardware. Each of these machines needs a serial
console. But serial terminals are hard to find and quite expensive
(especially compared to a much more capable PC). And they take up a lot
of precious space in the computer room.You need access to the console because when things break, that is
where error messages go. And some tasks have to be done on the console
(e.g. boot problems or OS installs/upgrades). Some &unix; systems allow
the console to break out to the ROM monitor which can sometimes be the
only way to unstick a hung machine. This is often done with a
LINE BREAK sent on the console serial port.If we are going to play about with consoles, then there are a couple
of other things that would be great:Remote access. Even in the same office, it would be convenient
to access all the consoles from your desk without walking into the
computer room. But often the machines are off-site, perhaps even in
another country.Logging. If something has gone wrong, you would like to be able
to have a look at the previous console output to see what is up.
Ordinary console screens give you the last 25 lines. More would be
better.Network Independence. The solution needs to work even if the
network is down. After all, a failed network is when you need
consoles the most! Even better is network independence with remote
access.No single-point failure. A console system that crashes every
machine when it fails is no use. This is particularly tricky with
Sun &unix; hosts as they will interpret a powered-off terminal as a
BREAK, and drop back to the ROM monitor.Interface with a pager or some similar alerter device.Ability to power-cycle machines remotely.Not be too expensive. Free is even
better!Possible SolutionsIf you use PC hardware for your servers, then a so-called KVM
switch is one possible solution. A KVM switch allows the use of
a single keyboard, video screen and mouse for multiple boxes. This cuts
down on the space problem, but only works for PC hardware (not any
communications gear you might have), and is not accessible from outside
the computer room. Nor does it have much scroll-back or logging, and
you have to handle alerting some other way. The big downside is that it
will not work for serial-only devices, such as communications hardware.
This means that even with a room full of PC-based servers, you are
probably still going to need some sort of serial console
solution.Actually, Doug Schache has pointed out that you
can get KVM switches that also do serial consoles
or Sun compatible KVM switching as well as PCs, but they are
expensive. See Avocent
for example.)You might be tempted to do without a console terminal, but when
things go pear-shaped you really need to see what
is on the console. And you have to use the console to boot the machine
and do things like OS upgrades or installs.You might try having a single console terminal and switching from
server to server as needed, either with a serial switch or just by
patching it into the required machine. Serial switches are also hard to
come by and not cheap, and may cause problems with sending
BREAK when they switch. And (if your computer room
is anything like ours) you never seem to have the right combination of
patch leads to connect to the machine you need to, and even if the leads
are there you can never work out exactly which combination of
DTE/DCE
headshells goes with which lead goes with which hardware. So you spend
the first 10 minutes fooling around with breakout boxes and a box of
leads, all while the server is down and the users are screaming. Of
course this does not deal with the logging or remote access
requirements. And inevitably the console is not switched to the machine
you need so you lose all the console messages that might tell you what
is going on.One popular solution is to use terminal server hardware. Typically,
the serial ports are connected to the various machine consoles, and set
up for reverse telnet access. This means a user can
telnet to a given IP/port and be connected to the appropriate console.
This can be very cost-effective, as suitable old terminal servers can be
picked up fairly cheaply (assuming you do not have a couple lying
around). And it is of course network-accessible so suitable for remote
access. But it suffers from one major drawback: if the network is down,
then you have no access to any console, even if you
are standing right next to the machine. (This may be partially
alleviated by having a suitable terminal connected to one of the
terminal server ports and connecting from there, but the terminal server
software may not support that.) Also there is no logging or replay of
console messages. But with a bit of work, and the addition of some
software such as conserver
(described below), this can be made to work pretty well.A possibility suggested by Bron Gondwana is similar to the above
solution. If you use servers with multiple serial ports, you can
connect each spare serial port to the console port of the
next server, creating a ring of console connections (in
some sort of order). This can be made to work reasonably well with the
aid of the conserver
software, but can be a bit confusing otherwise (i.e. remembering which
port is connected to which console). And you are stuck if you need to
use serial ports for other things (such as modems) or you have machines
without spare ports.Or, if your budget exceeds your willingness to hack, you can
buy an off-the-shelf solution. These vary in price and
capability. See, for example,
Lightwave,
Perle,
Avocent or
Black Box.
These solutions can be quite expensive - typically $USD100 - $USD400 per
port.Our SolutionIn light of the above requirements, we chose a solution based on a
dedicated PC running &unix; with a multiport serial card, and some
software designed to handle serial consoles.It includes the following elements:A surplus PC. We used a &pentium; 166, with a PCI bus, 2Gbyte
hard disk and 64Mb of RAM. This is a massive overkill for this
task, and P-100, 500Mb, 32Mb would be more than enough.A PC &unix; system. We used &os; 4.3 as that is used for
other tasks within our office.A multi-port serial card. We chose the &easyio; PCI
8-port card from Stallion
Technologies. This cost us about $AUD740, or under
$100/port, from Harris
Technologies (which has lots of stuff but is by no means the
cheapest place in town - shop around and you might get it a lot
cheaper). This card has a big DB80 connector on the back, and a
cable plugs into that which has a block with 8 RJ-45 sockets on it.
(We chose the RJ-45 version as our entire cable plant is RJ-45.
This allows us to patch connections from the required box to the
console server without any special cables.) This is the only thing
we needed to buy to make this all happen.We build two servers, one for each computer room, with 8 ports
in one and 16 ports (via two &easyio; PCI cards) in the other. If we
needed more than 16 ports, then another of the Stallion cards would
be more cost-effective. We could conceivably support 128 ports in
each server (with 2 EasyConnect 8/64 host cards and 8 16 port RJ-45
modules) for about $AUD12,000.A modem for remote access to the console server host when the
network is down. We have not done this yet as the computer room is
next door, but when we put a server in Sydney we will add the modem.
The idea is that when the network is down, you can dial up and log
into the server machine and run the console program locally. For
security, we will probably leave the modem powered off and ask the
gopher in Sydney to turn on the well-labelled button when we need
it.A program called conserver. This program
does all the magic required to enable remote access to consoles, and
do the replaying and logging etc. It comes in two parts: a server
called conserver that runs as a daemon
and connects to the serial ports, handles logging etc, and a client
program called console that can connect
to the server, display console messages, send keystrokes (and
BREAK), etc.This design covers all the major requirements except remote power
cycling:Remote access comes because the
console client program works across the
network.Logging is handled by the conserver
program.If the network is down, then we can use the console on the PC to
run the console client locally. For
remote sites, we can add a modem for dial-in access to the
server command line to run the client.By patching the &solaris; servers (see ),
we can avoid pranging the whole computer room when the console
server PC crashes (or the power supply fails, or whatever).We already have pager alerts from another system we have
installed, but the console server has all the required log info so
that could easily be implemented if we needed. And it even has a
modem for calling the pager company!We do not currently support remote power cycling. Some versions
of the conserver program support this, but it does require
specialised serial-controlled power boards. We have no immediate
need for remote power cycling (we have a gopher in each remote
office who can do it by remote control) so this is not a major
problem, and we could add it easily should we ever see the need and
get the appropriate hardware.This solution was very cheap. Total cost for the 9-port server
was $AUD750 for the IO card, as we re-used a surplus PC and already
owned the hardware for the special cables. If we had to buy
everything, then it would still only cost around $AUD1500 for the
8-port server.Setting Up The ServerChecking the Stallion driver&os; has adequate support for modern Stallion cards since
4.4 release. If you are running an older version of &os;, you
will need to upgrade to a more modern version of &os; (which
you should do anyway, to make sure your system is not
vulnerable to known security issues). See the &os;
Handbook for information about updating your
system.Configuring a new kernelThe Stallion driver is not included in the default
GENERIC kernel, so you will need to create a kernel
config file with the appropriate entries. See &man.stl.4; and the
appropriate section of the &os;
Handbook.Making The DevicesYou will need to make the device notes for the Stallion card
(which are not made by default). A new version of
/dev/MAKEDEV with Stallion support will have been
created by the mergemaster run during the
above procedure. If you have a Stallion card with more than 8 ports,
then you will need to edit /dev/MAKEDEV and
change the definition of maxport at about line 250.
By default, MAKEDEV only makes device nodes for 8
ports to keep the size of the /dev directory
down.Run a command like:
&prompt.root; cd /dev/ && sh MAKEDEV cuaE0
to create dial-out devices for the first Stallion card. See the
comments in MAKEDEV and the &man.stl.4; man page
for more details.Compiling conserverSee the section on conserver versions
; the version I use is
available in the &os; ports collection; however, it is not the only
one.)There are two ways to install conserver.
You can either compile
from the source or use the &os; ports framework.Using the ports frameworkUsing the ports is a bit cleaner, as the package system can then
keep track of installed software and cleanly delete them when not
being used. I recommend using the
comms/conserver-com port.
Change into the
port directory and (as root) type:&prompt.root; make DEFAULTHOST=consolehost installwhere consolehost is the name of the
machine running the console server. Specifying this when the binary
is compiled will avoid having to either specify it each time the
program is run on remote hosts or having to maintain a
conserver.cf file on every host. This command
will fetch, patch, configure, compile and install the
conserver application.You can then run make package to create a
binary package that can be installed on all the other &os; hosts
with &man.pkg.add.1;. For extra style points, you can make a two
versions of the package: one for the console server machine without
a DEFAULTHOST argument, and one for all the other
hosts with a DEFAULTHOST argument. This will
mean the console client program on the console server machine will
default to localhost, which will work in the
absence of name servers when the network is busted, and also allow
trusted (i.e. no password required) connections
via the localhost IP address for users logged into the console
server machine (either via the console screen or the emergency
backup modem). The version for the other machines with a
DEFAULTHOST argument means users can just use the
console client without specifying a
hostname every time, and without needing to configure the
conserver.cf file on every machine.From the source tarballIf you prefer, you can download conserver
and compile it yourself.
You might need to do this if you want to install the
console client on non-&os; systems. We run the client on our
&solaris; hosts and it inter-operates with the &os;-hosted server
with no problems. This allows anyone in the whole company (many of
whom have PCs and no &os; host access on their desk) to access
the console server.Download the file from the conserver.com
FTP site. Extract it into a handy directory then
configure it by running&prompt.user; ./configure The argument avoids having to
specify the master server every time the client is run remotely (or
keeping up-to-date config files on all remote hosts). The
argument avoids having to update
on every machine.Then type make and, as root,
make install.Configuring conserverThe conserver program is configured via a file called
conserver.cf. This file usually lives in
/usr/local/etc and is documented in the
&man.conserver.cf.5; manual page.Our config file looks like this:LOGDIR=/var/log/consoles
gallows:/dev/cuaE0:9600p:&:
roo:/dev/cuaE1:9600p:&:
kanga:/dev/cuaE2:9600p:&:
%%
allow: itga.com.au
trusted: 127.0.0.1 buzzThe first line means all the console log files by default go into
the /var/log/consoles directory. The
& in each line says the log file for that machine
will be
/var/log/consoles/machine.The next three lines show three machines to which we need to
connect. We use the
cuaEx devices
rather than the
ttyEx
devices because console ports typically do not show carrier. This
means that opening
ttyEx would hang
and conserver would never connect. Using
the
cuaEx
device avoids this problem. Another solution would be to use the
ttyEx
devices and enable soft carrier on these ports, perhaps by
setting this using the
ttyiEx
device in the /etc/rc.serial file. See the
comments in this file for more details. Also see &man.sio.4;
for information on the initial-state and locked-state devices. (The
Stallion driver also supports these conventions). And see the
&man.stty.1; for details on setting device modes.The last section shows that any user logged into the
server machine has passwordless access to all consoles. We do
this because there are no user accounts on this machine and it
is safely isolated from the wide world behind our firewall.
The allow line allows anyone on a machine inside our
organisation to access the console server if they provide
their password, which is recorded in the
conserver.passwd file (see next
section).Setting conserver passwordsThe conserver.passwd file contains the
encrypted version of the password that each user. The file is
documented in the conserver.cf(5) manual
page.The only tricky bit is loading the file with encoded passwords.
It appeared in &os; that was is no obvious way to generate an
encrypted password for inclusion in another file (but see below). So
I put together a quick hack perl script to do this:@rands = ();
foreach (0..4) {
push(@rands, rand 64);
}
$salt = join '', ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[@rands];
$salt = '$1$' . $salt . '$';
print 'Enter password: ';
`stty -echo`;
$cleartext = <>;
`stty echo`;
chop($cleartext);
print crypt($cleartext, $salt), "\n";This uses the &os; MD5-style encrypted passwords. Running
this on other &unix; variants, or on &os; with DES passwords, will
likely need a different style of salt.
- &a.kris; has since pointed out you can get the same effect using
+ &a.kris.email; has since pointed out you can get the same effect using
the openssl passwd command:&prompt.user; openssl passwd -1
Password: password
$1$VTd27V2G$eFu23iHpLvCBM5nQtNlKj/Starting conserver at system boot timeThere are two ways this can be done. Firstly, you could start up
conserver from init
by including an entry in
/etc/ttys that is similar to this:cuaE0 "/usr/local/sbin/conserver" unknown on insecureThis has two advantages: init will restart
the master console
server if it ever crashes for any reason (but we have not noticed any
crashes so far), and it arranges for standard output of the
conserver
process to be directed to the named tty (in this case
cuaE0). This is useful because you
can plug a terminal into this port, and the
conserver program
will show all console output not otherwise captured by a
client console connection. This is useful as a general
monitoring tool to see if anything is going on. We set this
terminal up in the computer room but visible from the main
office. It is a very handy feature. The downside of running
conserver
from the ttys file is that it cannot run in daemon
mode (else &man.init.8; would continually restart it). This means
conserver will not write a PID file,
which makes it hard to rotate the log files.So we start conserver from an rc.d script.
If you installed conserver via the port,
there will be a
conserver.sh.sample file installed in
/usr/local/etc/rc.d. Copy and/or rename this to
conserver.sh to enable conserver
to start at boot time.In fact we use a modified version of this script which also
connects conserver to a terminal via a tty device so we can monitor
unwatched console output. Our conserver.sh script looks like
this:#!/bin/sh
#
# Startup for conserver
#
PATH=/usr/bin:/usr/local/bin
case "$1" in
'start')
TTY=/dev/cuaE7
conserver -d > $TTY
# get NL->CR+NL mapping so msgs look right
stty < /dev/cuaE7 opost onlcr
echo -n ' conserver'
;;
'stop')
kill `cat /var/run/conserver.pid` && echo -n ' conserver'
;;
*)
echo "Usage: $0 { start | stop }"
;;
esac
exit 0Note the use of cuaE0 device
and the need to set tty modes for proper NL-<CR
handling).Keeping the log files trimmed&os; has a program called
newsyslog that will automatically
handle log file trimming. Just add some lines to the
configuration file /etc/newsyslog.conf
for the console logs:#
# The log files from conserver
/var/log/consoles/gallows 644 10 1000 * Z /var/run/conserver.pid
/var/log/consoles/kanga 644 10 1000 * Z /var/run/conserver.pid
/var/log/consoles/roo 644 10 1000 * Z /var/run/conserver.pidThis tells newsyslog (which is run from cron every hour on the
hour) that the console log files should be archived and compressed
once they reach 1Mb, that we should keep 10 of them, and that to
signal the server program you send a SIGHUP to the process whose PID
is in the conserver.pid file. This is the master server, and it will
arrange to signal all the child processes. Yes, this will send a HUP
to all clients whenever a single log file needs rotating, but that is
quite cheap. See &man.newsyslog.8; for details.CablingThis is always the hardest part of this kind of problem. We had
only a dozen or so cables/headshells to build, and we already had a
collection of the appropriate crimping tools and hardware, so we did it
ourselves. But if you are not set up for this, or you have a large
number of cables to make, then you might consider getting some cables
custom made. Look in the yellow pages, there are a surprising number of
places that do this! Getting custom-made cabling is good, and you can
get much more professional results, but can be expensive. For example,
the RJ-45 to DB-25 adapter kits described below are about $10 each;
custom-made headshells are about twice that (and take a couple of weeks
to arrive). Similarly, crimping custom RJ-45 to RJ-45 leads is quite
cheap (say, $5 each) but it takes a fair amount of time. Custom made
RJ-45 socket to RJ-45 plug converters cost about $25 each.We have settled on RJ-45 Cat-V cabling for all our office and
computer room cabling needs. This included patching between racks in the
computer room. For serial connections, we use patchable headshells that
have RJ-45 sockets on the back. This allows us to patch whatever
RJ-45–DB-25 connections we need.Which is just as well, because there are many incompatible ways to
represent serial connections on the RJ-45 plug. So the cabling has to
be very careful to use the right mapping.RJ-45 colorsRJ-45 cables and plugs have 8 pins/conductors. These are used as
4 matched pairs. There are a couple of conventions about how the
pairs are mapped onto pins, but 100baseT uses the most common (known
as EIA 586B). There are three common color-coding conventions for the
individual conductors in RJ-45 cables. They are:
PinScheme 1Scheme 2 (EIA 568B)Scheme 3 (EIA 568A)Pair1BlueWhite+GreenWhite+Orange2+2OrangeGreenOrange2-3BlackWhite+OrangeWhite+Green3+4RedBlueBlue1+5GreenWhite+BlueWhite+Blue1-6YellowOrangeGreen3-7BrownWhite+BrownWhite+Brown4+8White or GreyBrownBrown4-
Note EIA 468A and EIA 568B are very similar, simply swapping the
colors assigned to pair 2 and pair 3.See for example the Cabletron
Tech Support Site for more details.The pins in the RJ-45 plug are numbered from 1 to 8. Holding a
patch lead with the cable pointing down and the clip away from you,
pin 1 is at the left. Or, looking into an RJ-45 socket with the clip
to the top, pin 1 is on the right. The following illustration
(shamelessly lifted from the Cabletron web site above) shows it pretty
well:We have four classes of equipment to deal with in our
setup:Sun serversSun servers operate as DTE (i.e. send data on TxD and read
RxD, and assert DTR) with a female DB-25 socket on board. So we
need to create a headshell for the Stallion that operates as DCE
and has a male DB-25 plug (i.e. acts as a null
modem cable as well as converts from RJ-45 to DB-25).
We use headshells that have an RJ-45 socket in them and 8 short
flyleads with DB-25 pins on the end. These pins can be inserted
into the DB-25 plug as required. This allows us to create a
custom RJ-45-DB-25 mapping. We used a couple of different
sorts, including the
MOD-TAP
part no. 06-9888-999-00
and the FA730
series from
Black
Box.On our version of the headshells, these flyleads had the
following colours (from Pin 1-8): Blue, Orange, Black, Red,
Green, Yellow, Brown, White. (Looking into an RJ-45 socket,
with the clip towards the top, pin 1 is on the right.) This is
how they are connected to the DB-25 socket:
Note that colours may be different for your
cables/headshells. In particular, pin 8 may be grey instead of
white.Remember to label the headshell
clearly, in a way that will not fade/fall
off/rub off with time!Cisco 16xx/26xx/36xx RoutersI think that all Cisco gear that has RJ-45 console ports and
runs &ios; will have the same cable requirements. But best to
check first. We have tried this on 1600s and 2600s only.Both the Stallion card and the 2600 have RJ-45 connections,
but of course they are not compatible. So you need to crimp up
a special RJ-45-RJ-45 cable. And this cable must be plugged in
the right way round! We use normal RJ-45 flyleads from the
router to the patch panel, then the special flylead from the
patch panel to the Stallion card.We built two special Stallion-Cisco leads by cutting in half
a 2m flylead and crimping an RJ-45 with the appropriate pinouts
to each free end. The original connector will be the Cisco end
of the cable, the new crimped connector will be the Stallion
end. Holding the RJ-45 connector on the flylead with the cable
pointing down and the clip pointing away, this is the order of
the colours of the cables in our flylead (pins 1-8, from L to
R): white/green, green, white/orange, blue, white/blue, orange,
white/brown, brown. For the Stallion end, trim and discard the
brown/white+brown and green/white+green pairs. Then holding the
RJ-45 plug in the same manner (cable down, clip away), the
connections should be (from L to R): None, None, Blue, Orange,
White/Orange, White/Blue, None, None, as shown:
Note again that colours may be different for your
cables/headshells.Carefully label the cable, and each end of the cable, and
test it. If it does not work, testing is
really hard as they do not make RJ-45
serial line testers!Let me state this more strongly: Be very
sure that you label this cable in a way that is easily,
instantly and permanently recognisable as a special cable and
not easily confused with normal drop cables. Some suggestions
(from Hugh Irvine):Make them out of different coloured cable.For marking the ends, clear heat-shrink tubing slipped
over printed labels *before* putting on the connectors is
the best way I have seen for marking what they are.You can also use Panduit or similar tags that you put on
with nylon tie straps, but I find the ink wears off the
tags.Cisco &catalyst; switchesAstoundingly, the pinout on the console ports of the
&catalyst; switches is actually different to the
pinout used on the 26xx-series Cisco hardware. I think the way
to tell which is which is by considering the operating software.
If it uses &ios;, then the previous pinout is required. If it
uses the switch software, then this pinout is required.Fortunately, while the pinouts are different, the &catalyst;
pinout is simply a mirror image of the pinout for the 2600.
Even more fortunately, the Ciscos (both &catalyst; switches and 2600s)
seem to ship with a special rollover cable, which
is exactly what is required in this case. We use the rollover
cable from the &catalyst; switches to the patch panel, then the same cable
as above for the 2600s from the patch panel to the Stallion
card, and it all works just fine.This rollover cable is an RJ-45-RJ-45 cable and is intended
to be used with the shipped (hardwired) RJ-45 - DB-25 and
RJ-45–DB-9 headshells for console connections. Ours are
2m long, either light blue or black, and are quite flat.
Attempts to use them for 100baseT Ethernet will fail miserably!
You can tell it is a rollover cable by holding both ends with
the cable pointing down and the clip pointing away from you.
Check the colour of the leads in each pin in the two connectors,
they should be mirror images. (In our case, one goes
grey-orange-black-red-green-yellow-blue-brown, the other
brown-blue-yellow-green-red-black-orange-grey). This is a
rollover cable.If you do not have a rollover cable present, then you can
use the same cable as for the 26xx except plug it in the other
way around (i.e. original 8-pin plug goes into the Stallion, the
new crimped plug with only 4 active wires goes into the
&catalyst; switch).&os; servers (or any other &i386; PC systems using a serial
console)We run &os; 4 on a couple of &i386; PCs for various peripheral
uses. &os; usually uses a screen and keyboard for the
console, but can be configured to use a serial port (usually the
first serial port known as COM1 in DOS/&windows; or
ttyd0 in &unix;).The cabling for these servers depends on the PC hardware. If
the PC has DB-25 female socket on board (as most older PCs do),
then the same headshell as works for the Sun server above will
work fine. If the PC has DB-9 male plug on board (as more
recent PCs tend to do), then there are two choices. Either use
a DB-9 to DB-25 converter (this is not recommended as it can
lead to unreliable connections over the long term as the adapter
is bumped/works loose), or build an RJ-45 to DB-9 cable as
follows:
See for tips on configuring &os;
to use a serial console.On Sun Systems And BreakAnyone who has turned off a terminal used as a console for a Sun
system will know what happens and why this is a problem. Sun hardware
recognises a serial BREAK as a command to halt the
OS and return to the ROM monitor prompt. A serial BREAK
is an out-of-band signal on an RS-232 serial port that involves making
the TX DATA line active (i.e. pulled down to less than -5V) for more than
two whole character times (or about 2ms on a 9600bps line).
Alas, this BREAK signal is all to
easily generated by serial hardware during power-on or power-off. And
the Stallion card does, in fact, generate breaks when the power to the
PC fails. Unless fixed, this problem would mean that every Sun box
connected to the console server would be halted whenever the power
failed (due to dead power supplies, or fat-fingered operators unplugging
it, or whatever). This is clearly not an acceptable situation.Fortunately, Sun have come up with a set of fixes for this. For
&solaris; 2.6 and later, the kbd(1) command can be used
to disable the ROM-on-BREAK behaviour. This is a good start,
but leaves you out of luck in the situation where a break is needed to get into a
broken machine.Starting with &solaris; 8, the kbd command can also
be used to enable an alternate break sequence using the
kbd -a alternate command.
When this is set, the key sequence
ReturnTildeCtrlB
(within 5 seconds) will drop to the ROM. You can enable this
permanently by editing the /etc/default/kbd file;
see the kbd(1) man page. Note that this alternate
break sequence is only active once the kernel has started running
multiuser and processed the default file. While the ROM is active
(during power-on and during the boot process) and while running
single-user, you still need to use a BREAK to get to the ROM prompt.
The console client can cause the server to send a BREAK using the escape
sequence
Esccl1.If you have a Sun software support contract, there are patches
available for &solaris; 2.6 and 2.7 that add the alternate
break capability integrated into &solaris; 2.8. &solaris; 2.6
requires patch 105924-10 or higher. &solaris; 2.7 requires patch 107589-02
or higher.We have added this patch to all our &solaris; 2.6 servers, and added
it (and the entry in the /etc/default/kbd file) to our jumpstart
configuration so it will automatically be added to every new
install.We have confirmed by direct testing that neither the Cisco 16xx,
26xx, or &catalyst; hardware suffers from the BREAK sent
when the Stallion card loses power. Contemporary Cisco software listens
for BREAK signal only for first 30 seconds after
power-on or reboot.Using a Serial Console on &os;The procedure for doing this is described in detail in the
&os;
Handbook. This is a quick summary.Check the kernel configurationCheck that the kernel configuration file has
flags 0x10 in the config line for the
sio0 device. This signals this device (known
as COM1 in DOS/&windows; or
/dev/ttyd0 in &os;) can be used as a
console. This flag is set on the GENERIC and
LINT sample configs, so is likely to be set in
your kernel.Create the /boot.conf
fileThis file should be created containing a single line containing
just -h (minus the quotes). This
tells the &os; boot blocks to use the serial console.Edit /etc/ttysEdit this file and make the following changes.If you are not going to have any keyboard/video screen on this
server at all, you should find all the lines for
ttyv devices likettyv1 "/usr/libexec/getty Pc" cons25 on secureChange the on to off. This
will stop login screens being run on the useless video
consoles.Find the line containing ttyd0. Change
it fromttyd0 "/usr/libexec/getty std.9600" dialup off securetottyd0 "/usr/libexec/getty std.9600" vt100 on secure(replacing vt100 with the term type of your
console. The xterms terminal type might be a good
choice). This allows you to log in to the console port once the
system is running multi-user.Reboot and off you go!Security ImplicationsThe client-server protocol for conserver
requires the user of the console client to
enter a password. This password is passed across the net in
cleartext! This means
conserver is not really suitable for use
across untrusted networks (such as the Internet). Use of conserver-only
passwords (in the conserver.passwd file) slightly
mitigate this problem, but anyone sniffing a
conserver connection can
easily get console access, and from there prang your machine using the
console break sequence. For operating across the Internet, use
something secure like SSH to log into to the
server machine, and run the console client there.On Conserver VersionsThe conserver program has fractured into
a number of versions. The home page referenced below seems to be the
latest and most featureful version around, and for July 2004 carries a version number
of 8.1.9. This is maintained by Bryan Stansell
bryan@conserver.com, who has brought together the work of
many people (listed on his webpage).The &os; ports collection contains a port for version 8.5 of
conserver at
comms/conserver.
This seems to be older and less featureful than the 8.1.9
version (in particular, it does not support consoles connected to
terminal server ports and does not support a
conserver.passwd file), and is written in a fairly
idiosyncratic manner (using a preprocessor to generate C code). Version
8.5 is maintained by Kevin S. Braunsdorf
ksb+conserver@sa.fedex.com who did most of the original
work on conserver,
and whose work Bryan Stansell is building on. The
8.5 version does support one feature not in the 8.1.9 version
(controlling power to remote machines via a specific serial-interfaced
power controller hardware).Beginning with December 2001, Brian's version (currently 8.1.9) is
also presented in ports collection at
comms/conserver-com. We therefore
recommend you to use this version as it is much more appropriate for
console server building.LinksHomepage for the latest version of conserver.ftp://ftp.conserver.com/conserver/conserver-8.1.9.tar.gzThe source tarball for version 8.1.9 of
conserver.Homepage of Stallion Technologies.Davis Harris' Minor Scroll of Console Knowledge
contains a heap of useful information on serial consoles and
serial communications in general.The Greater Scroll of Console Knowledge
contains even more specific information on connecting devices to
various other devices. Oh the joy of standards!Doug Hughes has a similar console server, based on the
screen program and an old &sunos; host.The Real Weasel company makes a ISA or PCI video card that
looks like a PC video card but actually talks to a serial port.
This can be used to implement serial consoles on PC hardware for
operating systems that can not be forced to use serial console
ports early enough.Manual Pagesconsole(8)conserver(8)conserver.cf(5)
diff --git a/en_US.ISO8859-1/articles/contributors/article.xml b/en_US.ISO8859-1/articles/contributors/article.xml
index c7c0a6fa95..6d66577526 100644
--- a/en_US.ISO8859-1/articles/contributors/article.xml
+++ b/en_US.ISO8859-1/articles/contributors/article.xml
@@ -1,424 +1,424 @@
%contrib.ent;
]>
Contributors to FreeBSD
&tm-attrib.freebsd;
&tm-attrib.sun;
&tm-attrib.general;
$FreeBSD$$FreeBSD$This article lists individuals and organizations who have
made a contribution to FreeBSD.Donors GalleryAs of 2010, the following section is several years out-of-date.
Donations from the past several years appear
here.
The FreeBSD Project is indebted to the following donors and would
like to publicly thank them here!Contributors to the central server
project:The following individuals and businesses made it possible for
the FreeBSD Project to build a new central server machine, which
has replaced freefall.FreeBSD.org at
one point, by donating the following items:
- &a.mbarkah; and his employer, &a.mbarkah.email; and his employer, Hemisphere Online,
donated a Pentium Pro (P6) 200MHz CPUASA
Computers donated a Tyan 1662
motherboard.Joe McGuckin joe@via.net of ViaNet Communications donated
a Kingston ethernet controller.Jack O'Neill jack@diamond.xtalwind.net
donated an NCR 53C875 SCSI controller
card.Ulf Zimmermann ulf@Alameda.net of Alameda Networks donated
128MB of memory, a 4 Gb disk
drive and the case.Direct funding:The following individuals and businesses have generously
contributed direct funding to the project:Annelise Anderson
ANDRSN@HOOVER.STANFORD.EDU
- &a.dillon;
+ &a.dillon.email;Blue Mountain
ArtsEpilogue Technology
Corporation
- &a.sef;
+ &a.sef.email;Global Technology
Associates, IncDon Scott WildeGianmarco Giovannelli
gmarco@masternet.itJosef C. Grosch joeg@truenorth.orgRobert T. Morris
- &a.chuckr;
+ &a.chuckr.email;Kenneth P. Stox ken@stox.sa.enteract.com of
Imaginary Landscape,
LLC.Dmitry S. Kohmanyuk dk@dog.farm.orgLaser5 of Japan
(a portion of the profits from sales of their various FreeBSD
CDROMs).Fuki Shuppan
Publishing Co. donated a portion of their profits from
Hajimete no FreeBSD (FreeBSD, Getting
started) to the FreeBSD and XFree86 projects.ASCII Corp.
donated a portion of their profits from several FreeBSD-related
books to the FreeBSD project.Yokogawa Electric
Corp has generously donated significant funding to the
FreeBSD project.BuffNETPacific
SolutionsSiemens AG
via Andre Albsmeier
andre.albsmeier@mchp.siemens.deChris Silva ras@interaccess.comHardware contributors:The following individuals and businesses have generously
contributed hardware for testing and device driver
development/support:BSDi for providing the Pentium P5-90 and
486/DX2-66 EISA/VL systems that are being used for our
development work, to say nothing of the network access and other
donations of hardware resources.Compaq
has donated a variety of Alpha systems to the FreeBSD
Project. Among the many generous donations are 4
AlphaStation DS10s, an AlphaServer DS20,
AlphaServer 2100s, an AlphaServer 4100, 8 500Mhz
Personal Workstations, 4 433Mhz Personal Workstations,
and more! These machines are used for release
engineering, package building, SMP development, and general
development on the Alpha architecture.TRW Financial Systems, Inc. provided 130 PCs, three 68 GB
file servers, twelve Ethernets, two routers and an ATM switch for
debugging the diskless code.Dermot McDonnell donated the Toshiba XM3401B CDROM drive
currently used in freefall.Chuck Robey chuckr@glue.umd.edu contributed
his floppy tape streamer for experimental work.
- Larry Altneu larry@ALR.COM, and &a.wilko;,
+ Larry Altneu larry@ALR.COM, and &a.wilko.email;,
provided Wangtek and Archive QIC-02 tape drives in order to
improve the wt driver.Ernst Winter (Deceased)
contributed a 2.88 MB floppy drive to the project. This will hopefully
increase the pressure for rewriting the floppy disk driver.
Tekram
Technologies sent one each of their DC-390, DC-390U
and DC-390F FAST and ULTRA SCSI host adapter cards for
regression testing of the NCR and AMD drivers with their cards.
They are also to be applauded for making driver sources for free
operating systems available from their FTP server .Larry M. Augustin contributed not only a
Symbios Sym8751S SCSI card, but also a set of data books,
including one about the forthcoming Sym53c895 chip with Ultra-2
and LVD support, and the latest programming manual with
information on how to safely use the advanced features of the
latest Symbios SCSI chips. Thanks a lot!
- Christoph Kukulies kuku@FreeBSD.org donated
+ &a.kuku.email; donated
an FX120 12 speed Mitsumi CDROM drive for IDE CDROM driver
development.Mike Tancsa mike@sentex.ca donated four various
ATM PCI cards in order to help increase support of these cards as
well as help support the development effort of the netatm ATM
stack.
Special contributors:BSDi (formerly Walnut Creek CDROM)
has donated almost more than we can say (see the 'About the FreeBSD Project'
section of the FreeBSD Handbook for more details).
In particular, we would like to thank them for the original
hardware used for freefall.FreeBSD.org, our primary
development machine, and for thud.FreeBSD.org, a testing and build
box. We are also indebted to them for funding various
contributors over the years and providing us with unrestricted
use of their T1 connection to the Internet.The interface
business GmbH, Dresden has been patiently supporting
- &a.joerg; who has often preferred FreeBSD work over paid work, and
+ &a.joerg.email; who has often preferred FreeBSD work over paid work, and
used to fall back to their (quite expensive) EUnet Internet
connection whenever his private connection became too slow or
flaky to work with it...Berkeley Software Design,
Inc. has contributed their DOS emulator code to the
remaining BSD world, which is used in the
doscmd command.The FreeBSD DevelopersThese are the people who have commit privileges and do the
engineering work on the FreeBSD source tree. All core team members are
also developers.(in alphabetical order by last name):
&contrib.committers;
Core Team Alumnicore teamThe following people were members of the FreeBSD core team during
the periods indicated. We thank them for their past efforts in the
service of the FreeBSD project.In rough reverse chronological order:
&contrib.corealumni;
Development Team Alumnidevelopment teamThe following people were members of the FreeBSD development team
during the periods indicated. We thank them for their past efforts
in the service of the FreeBSD project.In rough reverse chronological order:
&contrib.develalumni;
Ports Management Team Alumniportmgr teamThe following people were members of the FreeBSD portmgr team during
the periods indicated. We thank them for their past efforts in the
service of the FreeBSD project.In rough reverse chronological order:
&contrib.portmgralumni;
Development Team: In Memoriamdevelopment teamDuring the many years that the FreeBSD Project has been in
existence, sadly, some of our developers have passed away.
Here are some remembrances.In rough reverse chronological order of their
passing:
&contrib.develinmemoriam;
Derived Software ContributorsThis software was originally derived from William F. Jolitz's 386BSD
release 0.1, though almost none of the original 386BSD specific code
remains. This software has been essentially re-implemented from the
4.4BSD-Lite release provided by the Computer Science Research Group
(CSRG) at the University of California, Berkeley and associated academic
contributors.There are also portions of NetBSD and OpenBSD that have been
integrated into FreeBSD as well, and we would therefore like to thank
all the contributors to NetBSD and OpenBSD for their work.Additional FreeBSD Contributors(in alphabetical order by first name):
&contrib.additional;
386BSD Patch Kit Patch Contributors(in alphabetical order by first name):
&contrib.386bsd;
diff --git a/en_US.ISO8859-1/articles/contributors/contrib.additional.xml b/en_US.ISO8859-1/articles/contributors/contrib.additional.xml
index 889848027c..824e8d9607 100644
--- a/en_US.ISO8859-1/articles/contributors/contrib.additional.xml
+++ b/en_US.ISO8859-1/articles/contributors/contrib.additional.xml
@@ -1,11165 +1,11159 @@
ABURAYA Ryushirou
rewsirow@ff.iij4u.or.jpAIDA Shinra
aida-s@jcom.home.ne.jpAMAGAI Yoshiji
amagai@nue.orgAaron Bornstein
aaronb@j51.comAaron Myles Landwehr
aaron@snaphat.comAaron Smith
aaron@mutex.orgAaron Straup Cope
ascope@cpan.orgAaron Voisine
voisine@gmail.comAaron Zauner
az_mail@gmx.atAasmund Eikli
inter@o12a.comAchim Patzner
ap@noses.comAda T Lim
ada@bsd.orgAdam Baran
badam@mw.mil.plAdam C. Migus
adam@migus.orgAdam Glass
glass@postgres.berkeley.eduAdam Herzog
adam@herzogdesigns.comAdam Jette
jettea46@yahoo.comAdam Kranzel
adam@alameda.eduAdam McDougall
mcdouga9@egr.msu.eduAdam McLaurin
adam.freebsd@fastmail.fmAdam Strohl
troll@digitalspark.netAdam Wight
adamw@tulum.brsys.comAdoal Xu
adoal@iname.comAdrian Colley
aecolley@ois.ieAdrian Filipi-Martin
adrian@ubergeeks.comAdrian Hall
ahall@mirapoint.comAdrian Mariano
adrian@cam.cornell.eduAdrian Pircalabu
apircalabu@bitdefender.comAdrian Steinmann
ast@marabu.chAdrian T. Filipi-Martin
atf3r@agate.cs.virginia.eduAftab Jahan Subedar
jahan@bol-online.comAjit ThyagarajanAkinori YAMADA
yamada-a@nextcom.co.jpAkira Ikeuchi
a_ikeuchi@mic.mitsumi.co.jpAkira SAWADAAkira Watanabe
akira@myaw.ei.meisei-u.ac.jpAkito Fujita
fujita@zoo.ncl.omron.co.jpAl Hoang
hoanga@mac.comAlain Kalker
A.C.P.M.Kalker@student.utwente.nlAlan Amesbury
amesbury@indefi.netAlan Bawden
alan@curry.epilogue.comAlan Snelson
Alan@Wave2.co.ukAlbert Graef
Dr.Graef@t-online.deAldert Nooitgedagt
aldert@nooitgedagt.netAldis Berjoza
killasmurf86@gmail.comAlec Wolman
wolman@cs.washington.eduAled Morris
aledm@routers.co.ukAleksander Fafula
alex@fafula.comAleksandr A Babaylov
.@babolo.ruAleksandr S. Goncharov
mraleks@bk.ruAlex D. Chen
dhchen@elearning.nsysu.edu.twAlex Deiter
tiamat@komi.mts.ruAlex G. Bulushev
bag@demos.suAlex Kapranoff
alex@kapranoff.ruAlex Keda
admin@lissyara.suAlex Kiesel
kiesel@schlund.deAlex Le Heux
alexlh@funk.orgAlex M
alex@myzona.netAlex Miller
asm@asm.kiev.uaAlex Perel
veers@disturbed.netAlex Pesternikov
ap@page2rss.comAlex Rodioukov
simuran@shaw.caAlex Rousskov
rousskov@measurement-factory.comAlex Samorukov
samm@os2.kiev.uaAlex Semenyaka
alex@rinet.ruAlex Steiner
ast@treibsand.comAlex Trull
alexander@trull.comAlex Varju
freebsd-ports@varju.caAlex Vasylenko
lxv@omut.orgAlex Wilkinson
alex.wilkinson@dsto.defence.gov.auAlex Zepeda
garbanzo@hooked.netAlexander Bechikov
goo@t72.ru
- Alexander Best
- arundel@FreeBSD.org
+ &a.arundel.email;Alexander Churanov
alexanderchuranov@gmail.comAlexander B. Povolotsky
tarkhil@mgt.msk.ruAlexander Gelfenbain
mail@gelf.comAlexander Pereira Girald
girald@etcom.ufrgs.brAlexander Grigoryev
alexander.4mail@gmail.comAlexander Gromnizki
gromnizki@unixdev.netAlexander Haderer
alexander.haderer@charite.deAlexander Koch
fbsd@meersau.deAlexander Kojevnikov
alexander@kojevnikov.comAlexander Kovalenko
never@nevermind.kiev.uaAlexander Novitsky
alecn2002@yandex.ruAlexander Peresunko
alex@freeman.org.uaAlexander Pohoyda
alexander.pohoyda@gmx.netAlexander Pyhalov
alp@sfedu.rualexander smishlajev
alex@ank-sia.comAlexander V. Ribchansky
triosoft@triosoft.com.uaAlexander Yerenkow
yerenkow@gmail.comAlexander Zagrebin
alexz@visp.ruAlexander Zhuravlev
zaa@zaa.pp.ruAlexandre Peixoto
alexandref@tcoip.com.brAlexandre Snarskii
snar@paranoia.ruAlexandros Kosiaris
akosiaris+ports@gmail.comAlexey Illarionov
littlesavage@rambler.ruAlexey V. Antipovsky
kemm@in-line.ruAlexey V. Neyman
alex.neyman@auriga.ruAlexey Y. Mikhailov
karma@ez.pereslavl.ruAlexey Shuvaev
shuvaev@physik.uni-wuerzburg.deAlexey Zaytsev
mangoost@inetcomm.ruAlexis Yushin
alexis@forest.NLnetLabs.nlAli Mashtizadeh
mashtizadeh@gmail.comAlistair G. Crooks
agc@uts.amdahl.comAllan Bowhill
bowhill@bowhill.vservers.comAllan Saddi
asaddi@philosophysw.comAllen Campbell
allenc@verinet.comAmakawa Shuhei
amakawa@hoh.t.u-tokyo.ac.jpAmar Takhar
verm@drunkmonk.netAmir Farah
amir@comtrol.comAmir Shalem
amir@boom.org.ilAmarendra Godbole
amarendra.godbole@gmail.comAmy Baron
amee@beer.orgAnthony Garcia
agarcia@experts-exchange.comAnatoliy Dmytriyev
tolid@plab.ku.dkAnatoly A. Orehovsky
tolik@mpeks.tomsk.suAnatoly Borodin
anatoly.borodin@gmail.comAnatoly Vorobey
mellon@pobox.comAnatoly Zherdev
tolyar@mx.ruAnders Andersson
anders@codefactory.seAnders Nor Berle
debolaz@debolaz.comAnders Thulin
Anders.X.Thulin@telia.seAnders Troback
freebsd@troback.comAnderson S. Ferreira
anderson@cnpm.embrapa.brAndi Payn
andi_payn@speedymail.orgAndre Albsmeier
Andre.Albsmeier@mchp.siemens.deAndre Goeree
abgoeree@uwnet.nlAndre Yelistratov
andre@andre.net.ruAndrea Venturoli
a.ventu@flashnet.itAndreas Berg
aberg@doomnet.deAndreas Fehlner
fehlner@gmx.deAndreas Fuchs
asf@boinkor.netAndreas Gustafsson
gson@araneus.fiAndreas Haakh
ah@alman.robin.deAndreas Heil
ah@linux-hq.deAndreas K Foerster
akf3@akfoerster.deAndreas Kasparz
andy@interface-business.deAndreas Kohn
andreas@syndrom23.deAndreas Kohout
shanee@rabbit.augusta.deAndreas Lohr
andreas@marvin.RoBIN.deAndreas Möller
segfault@gmx.netAndreas Riedel
rian@hrz.tu-chemnitz.deAndreas Wetzel
mickey@deadline.snafu.deAndreas Wrede
andreas@planix.comAndrei V. Shetuhin
shetuhin@corp.mail.ruAndres Vega GarciaAndrew Arensburger
arensb@ooblick.comAndrew Atrens
atreand@statcan.caAndrew Boothman
andrew@cream.orgAndrew Gillham
gillham@andrews.eduAndrew Gordon
andrew.gordon@net-tel.co.ukAndrew Greenwood
greenwood.andy@gmail.comAndrew Herbert
andrew@werple.apana.org.auAndrew J. Caines
A.J.Caines@halplant.comAndrew J. Korty
ajk@iu.eduAndrew Khlebutin
andrey@hm.perm.ruAndrew Kochetkov
kochetkov.andrew@gmail.comAndrew Kolchoogin
andrew@rinet.ruAndrew L. Kilpatrick
tiger@whitetigersd.comAndrew L. Neporada
andrew@chg.ruAndrew Marks
andrew@amrx.netAndrew McKay
andy@openirc.co.ukAndrew McNaughton
andrew@scoop.co.nzAndrew McRae
amcrae@cisco.comAndrew Morton
drewish@katherinehouse.comAndrew P. Lentvorski
bsder@allcaps.orgAndrew Predoehl
predoehl@mail.kgAndrew Reilly
a.reilly@lake.comAndrew Romanenko
melanhit@gmail.comAndrew S. Midthune
amidthune@cableone.netAndrew Shevtsov
nyxo@dnuc.polyn.kiae.suAndrew Stevenson
andrew@ugh.net.auAndrew Timonin
tim@pool1.convey.ruAndrew V. Stesin
stesin@elvisti.kiev.uaAndrew V. Stikheev
sand@links.ruAndrew Webster
awebster@dataradio.comAndrey Novikov
andrey@novikov.comAndrey Simonenko
simon@comsys.ntu-kpi.kiev.uaAndrey Surkov
nsand@sura.ruAndrey Sverdlichenko
rblaze@users.sourceforge.netAndrey Tchoritch
andy@venus.sympad.netAndy Farkas
andyf@speednet.com.auAndy Fawcett
andy@athame.co.ukAndy Gilligan
andy@evo6.orgAndy Kosela
andy.kosela@gmail.comAndy Miller
andy@trit.orgAndy Newman
atrn@zeta.org.auAndy Pavlo
amp0928@rit.eduAndy Sparrow
spadger@best.comAndy Valencia
ajv@csd.mot.comAndy Whitcroft
andy@sarc.city.ac.ukAnes Muhametov
anes@anes.suAngel Todorov
todorov_bg@gmx.netAngelo Turetta
aturetta@commit.itAnish Mistry
amistry@am-productions.bizAnthony C. Chavez
acc@anthonychavez.orgAnthony Ginepro
anthony.ginepro@laposte.netAnthony Mawer
gnats@mawer.orgAnthony Yee-Hang Chan
yeehang@netcom.comAntoine Beaupre
anarcat@anarcat.ath.cxAntoine Pelisse
apelisse@gmail.comAnton Hryciuk
gnixua@gmail.comAnton N. Bruesov
antonz@library.ntu-kpi.kiev.uaAnton Shterenlikht
mexas@bris.ac.ukAnton Voronin
anton@urc.ac.ruAntonio Bonifati
ant@monitor.deis.unical.itAntonio Carlos Venancio Junior
antonio@php.netAntti Kaipila
anttik@iki.fiAragon Gouveia
aragon@phat.za.netAre Bryne
are.bryne@communique.noAri Suutari
ari@suutari.iki.fiArindum Mukerji
raja@moselle.comArjan de Vet
devet@devet.nlArnaud Berthomier
oz@cyprio.netArnaud Launay
asl@launay.orgArne Henrik Juul
arnej@Lise.Unit.NOAron Schlesinger
as@bsdgroup.deAron Stansvik
elvstone@gmail.comArtem Kazakov
kazakov@gmail.comArtem Naluzhnyy
tut@nhamon.com.uaArtem Nosov
chip-set@mail.ruAshley Penney
ashp@unloved.orgAsk Bjoern Hansen
ask@valueclick.comAtsushi Furuta
furuta@sra.co.jpAttila Nagy
bra@fsn.huAtushi Sakauchi
sakauchi@yamame.toAutrijus Tang
autrijus@autrijus.orgAxel Gonzalez
loox@e-shell.netBalázs Nagy
js@iksz.huBarry Bierbauch
pivrnec@vszbr.czBarry Lustig
barry@ictv.comBartek Rutkowski
r@robakdesign.comBartosz Fabianowski
freebsd@chillt.deBayanzul Lodoysamba
baynaa@yahoo.comBen Hutchinson
benhutch@xfiles.org.ukBen JacksonBen Walter
bwalter@itachi.swcp.comBen Woolley
ports@tautology.orgBenedikt Köhler
benedikt@furukama.deBeni Keller
navigium@grindcore.chBenjamin Lewis
bhlewis@gte.netBenjamin Lutz
benlutz@datacomm.chBenny Kjrgaard
benny@catpipe.netBenoit Calvez
benoit@litchis.orgBerend de Boer
berend@pobox.comBernd Luevelsmeyer
bdluevel@heitec.netBernd Rosauer
br@schiele-ct.deBill Cadwallader
hurbold@yahoo.comBill Kish
kish@osf.orgBill Lloyd
wlloyd@mpd.caBill Moran
wmoran@collaborativefusion.comBill Trost
trost@cloud.rain.comBjörn König
bkoenig@cs.tu-berlin.deBjörn Lindström
bkhl@elektrubadur.seBlaz Zupan
blaz@amis.netBluePex Security Solutions
freebsd-ports@bluepex.comBob Eager
bob@eager.cxBob Frazier
bobf@mrp3.comBob Van Valzah
Bob@whitebarn.comBob Willcox
bob@luke.pmr.comBoris Kovalenko
boris@tagnet.ruBoris Lytochkin
lytboris@gmail.comBoris Staeblow
balu@dva.in-berlin.deBoyd R. Faulkner
faulkner@asgard.bga.comBrad Chapman
chapmanb@arches.uga.eduBrad Hendrickse
bradh@uunet.co.zaBrad Jones
brad@kazrak.comBrad Karp
karp@eecs.harvard.eduBrad Lanam
bll@gentoo.comBradley Dunn
bradley@dunn.orgBram Moolenaar
bram@moolenaar.netBrandon Fosdick
bfoz@glue.umd.eduBrandon Gillespie
brandon@roguetrader.comBrent B. Powers
bbp2006@columbia.eduBrent J. Nordquist
bjn@visi.comBrett Lymn
blymn@mulga.awadi.com.AUBrett Taylor
brett@peloton.runet.eduBrian Campbell
brianc@pobox.comBrian Cully
shmit@kublai.comBrian Gardner
brian@getsnappy.comBrian Handy
handy@lambic.space.lockheed.comBrian Litzinger
brian@MediaCity.comBrian M. Clapper
bmc@clapper.comBrian McGovern
bmcgover@cisco.comBrian Moore
ziff@houdini.eecs.umich.eduBrian R. Gaeke
brg@dgate.orgBrian R. Haug
haug@conterra.comBrian Skrab
brian@quynh-and-brian.orgBrian Tao
taob@risc.orgBrion Moss
brion@queeg.comBruce Albrecht
bruce@zuhause.mn.orgBruce Gingery
bgingery@gtcs.comBruce J. Keeler
loodvrij@gridpoint.comBruce Murphy
packrat@iinet.net.auBruce Walter
walter@fortean.comBruno Schwander
bruno@tinkerbox.orgByung-Hee HWANG
bh@izb.knu.ac.krCamson Huynh
chuynh@biolateral.com.auCarey Jones
mcj@acquiesce.orgCarl Fongheiser
kf0yn@mchsi.comCarl Makin
carl@stagecraft.cxCarl Mascott
cmascott@world.std.comCarl Schmidt
carl@perlpimp.codersluts.netCarlos A. M. dos Santos
unixmania@gmail.comCarlos Eduardo G. Carvalho
cartola@openit.com.brCasper
casper@acc.amCastor Fu
castor@geocast.comCédric Lamalle
cedric@cedric.trix.netCezary Morga
cm@therek.netChad Castleberry
crcastle@ius.eduChain Lee
chain@110.netCharles Hannum
mycroft@ai.mit.eduCharles Henrich
henrich@msu.eduCharles Mott
cmott@scientech.comCharles Owens
owensc@enc.eduCharles Swiger
chuck@pkix.netCheng-Tao Lin
b89605222@ntu.edu.twChenGuang LI
horus.li@gmail.comChess Griffin
chess@chessgriffin.comChet Ramey
chet@odin.INS.CWRU.EduChi-Feng QU
chifeng@gmail.comChia-Hsing Yu
davidyu@ucsd.eduChia-liang Kao
clkao@CirX.ORGChiang Cheng-Hsiung
elvis@sslab.cs.ccu.edu.twChiharu Shibata
chi@bd.mbn.or.jpChip NorkusChoe, Cheng-Dae
whitekid@netian.comChris Burkert
chris@chrisburkert.deChris Csanady
cc@tarsier.ca.sandia.govChris Dabrowski
chris@vader.orgChris Dillon
cdillon@wolves.k12.mo.usChris Howells
howells@kde.orgChris Jones
chris.jones@ualberta.caChris Knight
chris@e-easy.com.auChris Larsen
darth@vader.dkChris Laverdure
dashevil@gmail.comChris Pepper
pepper@mail.rockefeller.eduChris Petrik
c.petrik.sosa@gmail.comChris Pressey
chris_pressey@yahoo.caChris Shenton
cshenton@angst.it.hq.nasa.govChris Stenton
jacs@gnome.co.ukChris Torek
torek@ee.lbl.govChristian Gusenbauer
c47g@gmx.atChristian Haury
Christian.Haury@sagem.frChristian Heckendorf
heckend@bu.eduChristian Lackas
delta@lackas.netChristian Laursen
xi@borderworlds.dkChristian Schade
christian.schade@interface-projects.deChristian Zander
zander@minion.de
- Christoph P. Kukulies
- kuku@FreeBSD.org
+ &a.kuku.email;Christoph Robitschko
chmr@edvz.tu-graz.ac.atChristoph Weber-Fahr
wefa@callcenter.systemhaus.netChristophe Juniet
cjuniet@entreview.comChristopher Boumenot
boumenot@gmail.comChristopher G. Demetriou
cgd@postgres.berkeley.eduChristopher Illies
christopher.illies@ki.seChristopher J. Ruwe
cjr@cruwe.deChristopher K. Davis
ckd-freebsd@ckdhr.comChristopher Key
cjk32@cam.ac.ukChristopher Knaust
jigboe@gmx.deChristopher N. Harrell
cnh@ivmg.netChristopher Nehren
apeiron@comcast.netChristopher Preston
rbg@gayteenresource.orgChristopher T. Johnson
cjohnson@neunacht.netgsi.comChristopher Vance
vance@aurema.comChrisy Luke
chrisy@flix.netChuck Hein
chein@cisco.comClayton Rollins
crollins666@hotmail.comClement MOULIN
moeti-freebsd@ouestil.comCliff Rowley
dozprompt@onsea.comClive Crous
clive@darkarts.co.zaColman Reilly
careilly@tcd.ieConor McDermottroe
ports@mcdermottroe.comConrad Sabatier
conrads@cox.netConstantin S. Svintsoff
kostik@iclub.nsu.ruCoranth Gryphon
gryphon@healer.comCorey Smith
corsmith@gmail.comCornelis van der Laan
nils@guru.ims.uni-stuttgart.deCosmin Stroe
cstroe1@uic.eduCove Schneider
cove@brazil.nbn.comCraig Boston
craig@yekse.gank.orgCraig Butler
craig001@lerwick.hopto.orgCraig Leres
leres@ee.lbl.govCraig LoomisCraig Metz
cmetz@inner.netCraig Spannring
cts@internetcds.comCraig Struble
cstruble@vt.eduCristian Ferretti
cfs@riemann.mat.puc.clCristiano Rolim Pereira
cristianorolim@hotmail.comCurt Mayer
curt@toad.comCyril Guibourg
aragorn+ports@teaser.frCyrille Lefevre
clefevre@citeweb.netCyrus Rahman
cr@jcmax.comDaan Vreeken
Danovitsch@Vitsch.netDai Ishijima
ishijima@tri.pref.osaka.jpDaisuke Aoyama
aoyama@peach.ne.jpDaisuke Watanabe
NU7D-WTNB@asahi-net.or.jpDamian Gerow
dgerow@afflictions.orgDamian Hamill
damian@cablenet.netDamien Tougas
damien@tougas.netDan Angelescu
mrhsaacdoh@yahoo.comDan Caescu
daniel@freebsd.roDan Cross
tenser@spitfire.ecsel.psu.eduDan Langille
dan@freebsddiary.orgDan Lukes
dan@obluda.czDan Nelson
dnelson@allantgroup.comDan Papasian
bugg@bugg.strangled.netDan Pelleg
dpelleg+unison@cs.cmu.eduDan Piponi
wmtop@tanelorn.demon.co.ukDan Rench
citric@cubicone.tmetic.comDan Smith
dan@algenta.comDan Walters
hannibal@cyberstation.netDaniel B. Hemmerich
dan@spot.orgDaniel Blankensteiner
db@TruNet.dkDaniel Bretoi
daniel@netwalk.orgDaniel Bryan
sisko@bsdmail.comDaniel Hagan
dhagan@acm.vt.eduDaniel Levai
leva@ecentrum.huDaniel J. O'Connor
darius@dons.net.auDaniel O'Connor
doconnor@gsoft.com.auDaniel Poirot
poirot@aio.jsc.nasa.govDaniel Rock
rock@cs.uni-sb.deDaniel Roethlisberger
daniel@roe.chDaniel W. McRobb
dwm@caimis.comDaniel W. Steinbrook
dsteinbr@fas.harvard.eduDaniel Wijnands
daniel@itxl.nlDanilo Egêa Gondolfo
danilogondolfo@gmail.comDanny Braniss
danny@cs.huji.ac.ilDanny EgenDanny Howard
dannyman@toldme.comDanny J. Zerkel
dzerkel@phofarm.comDanny Pansters
danny@ricin.comDario Freni
saturnero@gufi.orgDarren Pilgrim
ports.maintainer@evilphi.comDave Adkins
adkin003@tc.umn.eduDave Andersen
angio@aros.netDave Blizzard
dblizzar@sprynet.comDave Bodenstab
imdave@synet.netDave Burgess
burgess@hrd769.brooks.af.milDave Chapeskie
dchapes@ddm.on.caDave Cornejo
dave@dogwood.comDave Edmondson
davided@sco.comDave Glowacki
dglo@ssec.wisc.eduDave Marquardt
marquard@austin.ibm.com
- Dave Tweten
- tweten@FreeBSD.org
+ &a.tweten.email;David A. Adkins
adkin003@tc.umn.eduDavid A. Bader
dbader@eece.unm.eduDavid Borman
dab@bsdi.comDavid Bremner
bremner@unb.caDavid Bushong
david+ports@bushong.netDavid Chaplin-Loebell
direct@klatha.comDavid Dawes
dawes@XFree86.orgDavid Demelier
markand@malikania.frDavid FiloDavid G. Holm
harbour@netfang.netDavid Gardner
david@pinko.netDavid Gilbert
dave@daveg.caDavid H. Munro
munro1@llnl.govDavid Holland
dholland@eecs.harvard.eduDavid Holloway
daveh@gwythaint.tamis.comDavid Horwitt
dhorwitt@ucsd.eduDavid Hovemeyer
daveho@infocom.comDavid Johnson
david@usermode.orgDavid Jones
dej@qpoint.torfree.netDavid Julien
david.julien@gmail.comDavid K. Gerry
David.K.Gerry@GMail.comDavid Kelly
dkelly@tomcat1.tbe.comDavid Kirchner
dpk@dpk.netDavid Kulp
dkulp@neomorphic.comDavid L. Nugent
davidn@blaze.net.auDavid Landgren
david@landgren.netDavid Lay
dsl@webize.com.auDavid Le Brun
david@trucs.orgDavid Leonard
d@scry.dstc.edu.auDavid Magda
dmagda@magda.caDavid Muir Sharnoff
muir@idiom.comDavid Otto
ottodavid@gmx.netDavid Quattlebaum
drq@drqware.comDavid Romano
unobe@cpan.orgDavid S. Miller
davem@jenolan.rutgers.eduDavid Siebörger
drs@rucus.ru.ac.zaDavid Sugar
dyfet@gnu.orgDavid Syphers
dsyphers@u.washington.eduDavid Sze
dsze@alumni.uwaterloo.caDavid Terry
dterry@digifonica.comDavid Vachulka
arch_dvx@users.sourceforge.netDavid Wolfskill
david@catwhisker.orgDavid Yeske
dyeske@yahoo.comDax Labrador
semprix@bsdmail.orgDean Gaudet
dgaudet@arctic.orgDean Hollister
dean@odyssey.apana.org.auDean Huxley
dean@fsa.caDenis Barov
dindin@dindin.ruDenis FortinDenis Generalov
gd@rambler-co.ru>Denis Philippov
for_spam@mezon.ruDenis E. Podolskiy
bytestore@yandex.ruDenis Pokataev
catone@cpan.orgDenis Shaposhnikov
dsh@vlink.ruDennis Cabooter
dennis@rootxs.orgDennis Glatting
dennis.glatting@software-munitions.comDennis S. Davidoff
null@cvs.1system.ruDenton Gentry
denny1@home.comDerek Inksetter
derek@saidev.comDerik van Zuetphen
dz@426.chDermot Tynan
dtynan@kalopa.comDiego Depaoli
trebestie@gmail.comDikshie
dikshie@lapi.itb.ac.idDikshie
dikshie@sfc.wide.ad.jpDierk Sacher
dierk@blaxxtarz.deDirk Gouders
gouders@et.bocholt.fh-gelsenkirchen.deDirk Jagdmann
doj@cubic.orgDirk Keunecke
dk@panda.rhein-main.deDirk Nehrling
nerle@pdv.deDirk-Willem van Gulik
dirkx@webweaving.orgDishanker Rajakulendren
draj@oceanfree.netDitesh Shashikant Gathani
ditesh@gathani.orgDmitri Nikulin
setagllib@optusnet.com.auDmitriy Limonov
earl1k@mail.ruDmitry A. Yanko
fm@astral.ntu-kpi.kiev.uaDmitry Afanasiev
KOT@MATPOCKuH.RuDmitry Dyomin
old@old.com.uaDmitry Karasik
dmitry@karasik.eu.orgDmitry Kazarov
d.y.kazarov@mail.ruDmitry Khrustalev
dima@xyzzy.machaon.ruDmitry Kohmanyuk
dk@farm.orgDmitry Pryadko
d.pryadko@rambler-co.ruDmitry Semkin
ds@tic-tac.ruDmitry V. Sukhodoyev
raven428@gmail.comDmytro Rud
unixoid@yahoo.comDom Mitchell
dom@myrddin.demon.co.ukDomas Mituzas
midom@dammit.ltDominic Fandrey
lon_kamikaze@gmx.deDominic Marks
dominic_marks@btinternet.comDominic Mitchell
dom@happygiraffe.netDominik Brettnacher
domi@saargate.deDominik Rothert
dr@domix.deDominique Goncalves
dominique.goncalves@gmail.comDon Croyle
croyle@gelemna.orgDon Morrison
dmorrisn@u.washington.eduDon Owens
don@regexguy.com
- &a.whiteside;
+ &a.whiteside.email;Don Yuniskis
dgy@rtd.comDonald Maddox
dmaddox099@yahoo.comDonn Miller
dmmiller@cvzoom.netDoug Harple
dharple@nycap.rr.comDoug Penner
darwinsurvivor@gmail.comDouglas A. Maske
maske@rungepaper.comDouglas Carmichael
dcarmich@mcs.comDouglas Crosher
dtc@scrooge.ee.swin.oz.auDouglas K. Rand
rand@meridian-enviro.comDouglas W. Thrift
douglas@douglasthrift.netDrew Derbyshire
ahd@kew.comDustin Sallings
dustin@spy.netDylan Carlson
absinthe@retrovertigo.comDylan Simon
dylan@dylex.netELISA Font ProjectEckart "Isegrim" Hofmann
Isegrim@Wunder-Nett.orgEd Gold
vegold01@starbase.spd.louisville.eduEd Hudson
elh@p5.spnet.comEderson de Moura
ederbs@ederbs.orgEdgardo Garcia Hoeffler
edybsd@yahoo.com.arEdmondas Girkantas
eg@fbsd.ltEduard Martinescu
martines@rochester.rr.comEdward Chuang
edwardc@firebird.org.twEdward Wang
edward@edcom.comEdwin Mons
e@ik.nuEge Rekk
aagero@aage.priv.noEiji-usagi-MATSUmoto
usagi@clave.gr.jpEijiro Shibusawa
ej-sib@ice.uec.ac.jpEike Bernhardt
eike.bernhardt@gmx.deEintisy Chuang
eintisy@gmail.comElias Mandouvalos
ocean@mail.grElisey Savateev
b3k@mail.ruElmar Bartel
bartel@informatik.tu-muenchen.deEmily Boyd
emily@emilyboyd.comEoin Lawless
eoin@maths.tcd.ieEric A. Griff
eric@talesfromthereal.comEric Anderson
anderson@centtech.comEric Blood
eblood@cs.unr.eduEric Cronin
ecronin@eecs.umich.eduEric D. Futch
efutch@nyct.netEric F. Crist
ecrist@secure-computing.netEric Freeman
freebsdports@chillibear.comEric J. Haug
ejh@slustl.slu.eduEric J. Schwertfeger
eric@cybernut.comEric Kjeldergaard
kjelderg@gmail.comEric L. Hernes
erich@lodgenet.comEric Masson
e-masson@kisoft-services.comEric Ogren
eogren@stanford.eduEric P. Scott
eps@sirius.comEric S. Van Gyzen
esv@vangyzen.netEric Schnoebelen
eric@cirr.comEric Shao-yu Cheng
eric@fractal.csie.orgEric Sprinkle
eric@ennovatenetworks.comEric W. Bates
ericx@vineyard.netEric Yu
ericyu@mail2000.com.twEric van Gyzen
vangyzen@stat.duke.eduErich Stefan Boleyn
erich@uruk.orgErich Zigler
erich@tacni.netErik E. Rantapaa
rantapaa@math.umn.eduErik Greenwald
erik@smluc.orgErik H. Bakke
erikhb@bgnett.noErik H. Moe
ehm@cris.comErik L. Chen
d9364104@mail.nchu.edu.twErnie Smallis
esmallis@stbernard.comErnst Winter (Deceased)Espen Skoglund
esk@ira.uka.deEspen Tagestad
espen@tagestad.noEugene Grosbein
eugen@grosbein.pp.ruEugene M. Kim
astralblue@usa.netEugene Ossintsev
eugos@gmx.netEugene Radchenko
genie@qsar.chem.msu.suEugene Ray
pal@paladin7.netEugeney Ryzhyk
rzheka@users.sourceforge.netEugeny Kuzakov
CoreDumped@coredumped.null.ruEvan Champion
evanc@synapse.netEvan Sarmiento
esarmiento@wayfair.comEvgueni V. Gavrilov
aquatique@rusunix.orgEwgenij Gawrilow
gawrilow@math.tu-berlin.deFUJIMOTO Kensaku
fujimoto@oscar.elec.waseda.ac.jpFURUSAWA Kazuhisa
furusawa@com.cs.osakafu-u.ac.jpFabian Keil
fk@fabiankeil.deFabian M. Borschel
fmb@onibox.netFabien Devaux
fab@gcu.infoFabio Tosques
fabio.tosques@rz.hu-berlin.deFanying Jen
fanying@fynet.comFaried Nawaz
fn@Hungry.COMFernan Aguero
fernan@iib.unsam.edu.arFernando Apesteguia
fernando.apesteguia@gmail.comFerruccio Vitale
vitale@cs.tin.itFilipe Rocha
filiperocha@gmail.comFilippo Natali
filippo@widestore.netFlemming Jacobsen
fj@batmule.dkFlorian Unglaub
usenet04@rootofallevil.netFong-Ching Liaw
fong@juniper.netFrancis M J Hsieh
mjshieh@life.nthu.edu.twFrancisco Cabrita
include@npf.pt.freebsd.orgFrancisco Gomez
francisco@gomezmarin.comFrancisco Reyes
fjrm@yahoo.comFrançois Tamone
tamone@eig.unige.chFrank Bartels
knarf@camelot.deFrank Behrens
frank@pinky.sax.deFrank Börner
frank-freebsd@online.deFrank Chen Hsiung Chan
frankch@waru.life.nthu.edu.twFrank Denis
j@pureftpd.orgFrank Gründer
elwood@mc5sys.in-berlin.deFrank MacLachlan
fpm@n2.netFrank Mayhar
frank@exit.comFrank Nobis
fn@Radio-do.deFrank Ruell
stoerte@dreamwarrior.netFrank Steinborn
steinex@nognu.deFrank Volf
volf@oasis.IAEhv.nlFrank Wall
fw@moov.deFrank W. Josellis
frank@dynamical-systems.orgFrank ten Wolde
franky@pinewood.nlFrank van der Linden
frank@fwi.uva.nlFranz Klammer
klammer@webonaut.comFraser Tweedale
frase@frase.id.auFred Cawthorne
fcawth@jjarray.umn.eduFred Gilham
gilham@csl.sri.comFred Templin
templin@erg.sri.comFreddie Cash
fcash@bigfoot.comFrederic Dubuy
fdubuy@free.frFrédéric Praca
frederic.praca@freebsd-fr.orgFrederick Earl Gray
fgray@rice.eduFredrik Lindberg
fli@shapeshifter.seFrerich Raabe
frerich.raabe@gmx.deFumihiko Kimura
jfkimura@yahoo.co.jpFuyuhiko Maruyama
fuyuhik8@is.titech.ac.jp
- &a.stanislav;
+ &a.stanislav.email;Gábor Kincses
gabor@acm.orgGábor Zahemszky
zgabor@CoDe.huGasol Wu
gasol.wu@gmail.comGareth McCaughan
gjm11@dpmms.cam.ac.ukGarrett Rooney
rooneg@electricjellyfish.netGary A. Browning
gab10@griffcd.amdahl.comGary Hayers
gary@hayers.orgGary Howland
gary@hotlava.comGary J.
garyj@rks32.pcs.dec.comGary Kline
kline@thought.orgGaspar Chilingarov
nightmar@lemming.acc.amGautam Mani
execve@gmail.comGavin Mu
gavin@FreeBSDChina.orgGea-Suan Lin
gslin@gslin.orgGeoff Glasson
g_glasson@jimali.dyndns.orgGeoff Rehmet
csgr@alpha.ru.ac.zaGeoffrey Mainland
mainland@apeiron.netGeoffroy Rivat
grivat@sicfa.netGeorg Graf
georg@graf.priv.atGeorg Wagner
georg.wagner@ubs.comGeorge Hartzell
hartzell@kestrel.alerce.comGeorge Liaskos
geo.liaskos@gmail.comGerasimos Dimitriadis
gedimitr@auth.grGeraud Continsouzas
geraud@gcu.infoGerhard Gonter
g.gonter@ieee.orgGerrit Beine
tux@pinguru.netGiacomo Mariani
giacomomariani@yahoo.itGianlorenzo Masini
masini@uniroma3.itGianmarco Giovannelli
gmarco@giovannelli.itGil Kloepfer Jr.
gil@limbic.ssdl.comGilad Rom
rom_glsa@ein-hashofet.co.ilGiles Lean
giles@nemeton.com.auGinga Kawaguti
ginga@amalthea.phys.s.u-tokyo.ac.jpGleb Sushko
neuroworker@gmail.comGlen Foster
gfoster@gfoster.comGiel van Schijndel
me@mortis.euGlenn Johnson
gljohns@bellsouth.netGodmar Back
gback@facility.cs.utah.eduGoran Hammarback
goran@astro.uu.seGord Matzigkeit
gord@enci.ucalgary.caGordon Greeff
gvg@uunet.co.zaGraham Wheeler
gram@cdsec.comGreg A. Woods
woods@zeus.leitch.comGreg Albrecht
gregoryba@gmail.comGreg Ansley
gja@ansley.comGreg Becker
greg@codeconcepts.comGreg J.
xcas@cox.netGreg Kennedy
kennedy.greg@gmail.comGreg Robinson
greg@rosevale.com.auGreg Troxel
gdt@ir.bbn.comGreg Ungerer
gerg@stallion.oz.auGregory Bond
gnb@itga.com.auGregory D. Moncreaff
moncrg@bt340707.res.ray.comGrün Christian-Rolf
kiki@bsdro.orgGuillaume Paquet
amyfoub@videotron.caGurkan Sengun
grknsngn@gmail.comGustavo Fukao
gustavofukao@gmail.comGuy Brand
gb@isis.u-strasbg.frGuy Coleman
gtchask@mm.stGuy Harris
guy@netapp.comGuy Poizat
guy@device.dyndns.orgH. Wade Minter
minter@lunenburg.orgHAMADA Naoki
hamada@astec.co.jpHATANOU Tomomi
hatanou@infolab.ne.jpHIYAMA Takeshi
gibbon@cocoa.freemail.ne.jpHONDA Yasuhiro
honda@kashio.info.mie-u.ac.jpHOSOBUCHI Noriyuki
hoso@buchi.tama.or.jpHOTARU-YA
hotaru@tail.netHaesu Jeon
haesu@towardex.comHakisho Nukama
nukama@gmail.comHammurabi Mendes
hmendes_br@yahoo.comHannes Frederic Sowa
hannes@stressinduktion.orgHannu Savolainen
hannu@voxware.pp.fiHans Huebner
hans@artcom.deHans Petter Bieker
zerium@webindex.noHans Petter Selasky
hselasky@c2i.netHans Zuidam
hans@brandinnovators.comHans-Christian Ebke
hans-christian_ebke@gmx.deHansjoerg Pehofer
hansjoerg.pehofer@uibk.ac.atHarald Schmalzbauer
h.schmalzbauer@omnisec.deHarald Wille
harald.wille@students.jku.atHardy Schumacher
hardy.schumacher@gmx.deHarlan Stenn
Harlan.Stenn@pfcs.comHarold Barker
hbarker@dsms.comHarry Coin
harrycoin@qconline.comHarry Newton
harry_newton@telinco.co.ukHavard Eidnes
Havard.Eidnes@runit.sintef.noHeath Nielson
heath@cs.byu.eduHeikki Suonsivu
hsu@cs.hut.fiHeiko W. RuppHeiner Eichmann
h.eichmann@gmx.deHeiner Strauss
heiner@bilch.comHelko Glathe
glathe.helko@googlemail.comHelmut F. Wirth
hfwirth@ping.atHendrik Scholz
hendrik@scholz.netHenri Michelon
michelon@e-cml.orgHenrik Brautaset Aronsen
freebsd-ports@henrik.synth.noHenrik Friedrichsen
hrkfrd@googlemail.comHenrik Motakef
henrik.motakef@web.deHenrik Nymann Jensen
henriknj@0xmilk.orgHenrik Vestergaard Draboel
hvd@terry.ping.dkHenry Whincup
henry@techiebod.comHerb Peyerl
hpeyerl@NetBSD.orgHerbert J. Skuhra
herbert.skuhra@gmx.atHernan Di Pietro
hernan.di.pietro@gmail.comHideaki Machida
hido@coreblack.comHideaki Ohmon
ohmon@tom.sfc.keio.ac.jpHidekazu Kuroki
hidekazu@cs.titech.ac.jpHideki Yamamoto
hyama@acm.orgHideyuki Suzuki
hideyuki@sat.t.u-tokyo.ac.jpHirayama Issei
iss@mail.wbs.ne.jpHiroaki Sakai
sakai@miya.ee.kagu.sut.ac.jpHiroharu Tamaru
tamaru@ap.t.u-tokyo.ac.jpHirohisa Yamaguchi
umq@ueo.co.jpHironori Ikura
hikura@kaisei.orgHiroshi Nishikawa
nis@pluto.dti.ne.jpHiroto Kagotani
hiroto.kagotani@gmail.comHiroya TsubakimotoHolger Lamm
holger@eit.uni-kl.deHolger Veit
Holger.Veit@gmd.deHolm Tiffe
holm@geophysik.tu-freiberg.deHorance Chou
horance@freedom.ie.cycu.edu.twHorihiro Kumagai
kuma@jp.FreeBSD.orgHr.Ladavac
lada@ws2301.gud.siemens.co.atHsin-Hsiung Chang
sexbear@tmu.edu.twHubert Feyrer
hubertf@NetBSD.ORGHubert Tournier
hubert@frbsd.orgHugh Mahon
h_mahon@fc.hp.comHugo Leisink
hugo@leisink.netHung-Chi Chu
hcchu@r350.ee.ntu.edu.twHung-Yi Chen
gaod.chen@gmail.comHyogeol Lee
hyogeollee@gmail.comIMAI Takeshi
take-i@ceres.dti.ne.jpIMAMURA Tomoaki
tomoak-i@is.aist-nara.ac.jpIWASHITA Yoji
shuna@pop16.odn.ne.jpIWATSUKI Hiroyuki
don@na.rim.or.jpIan Holland
ianh@tortuga.com.auIan Struble
ian@broken.netIan Vaudrey
i.vaudrey@bigfoot.comIgor Artemiev
ai@kliksys.ruIgor Khasilev
igor@jabber.paco.odessa.uaIgor Leonenko
bananaz@bk.ruIgor Pokrovsky
ip@doom.homeunix.orgIgor Roshchin
str@giganda.komkon.orgIgor Serikov
bt@turtle.pangeatech.comIgor Sviridov
siac@ua.netIgor Vinokurov
igor@zynaps.ruIkuo Nakagawa
ikuo@isl.intec.co.jpIldar Hizbulin
hizel@vyborg.ruIlia Chipitsine
ilia@rediska.ruIlya Bakulin
webmaster@kibab.comIlya Khamushkin
ilya@space.rootshell.ruIlya V. Komarov
mur@lynx.ruIsmail Yenigul
ismail@enderunix.orgItsuro Saito
saito@miv.t.u-tokyo.ac.jpIvan Klymenko
fidaj@ukr.netIvan Sharov
ivan.sharov@iname.comIvan Sviridov
sin@vimcom.netJ Shoemaker
shoemaker@softhome.netJ. Bryant
jbryant@argus.flash.netJ. David Lowe
lowe@saturn5.comJ. Han
hjh@photino.comJ. Hawk
jhawk@MIT.EDUJ. Randolph
snortsms@servangle.netJ.R. Oldroyd
fbsd@opal.comJ.T. Conklin
jtc@cygnus.comJacek Pelka
jacek@combit.com.plJack
jack@zeus.xtalwind.netJackson Low
xxjack12xx@gmail.comJacob Atzen
jatzen@gmail.comJacob Bohn Lorensen
jacob@jblhome.ping.mkJacques Marneweck
jacques@php.netJagane D Sundar
jagane@netcom.comJake Hamby
jehamby@anobject.comJake Smith
jake@xz.cxJakub Klausa
jacke@bofh.plJames Bailie
jimmy@mammothcheese.caJames Clark
jjc@jclark.comJames D. Stewart
jds@c4systm.comJames Jegers
jimj@miller.cs.uwm.eduJames McNaughton
bitbucket63-it@yahoo.comJames O'Gorman
james@netinertia.co.ukJames P. Howard, II
jh@jameshoward.usJames Raftery
james@now.ieJames Raynard
fhackers@jraynard.demon.co.ukJames T. Liu
jtliu@phlebas.rockefeller.eduJames da Silva
jds@cs.umd.eduJamie Heckford
jamie@jamiesdomain.co.ukJamie Jones
jamie@bishopston.netJan Conard
charly@fachschaften.tu-muenchen.deJan Henrik Sylvester
me@janh.deJan Jungnickel
Jan@Jungnickel.com
- Jan Koum
- jkb@FreeBSD.org
+ &a.jkb.email;Jan L. Peterson
jlp@flipdog.comJan Rochel
jan.rochel@epost.deJan Siml
jsi@jules.deJan Srzednicki
w@wrzask.plJan Stocker
jan.stocker@t-online.deJan-Peter Koopmann
j.koopmann@seceidos.deJanaka Wickramasinghe
janaka@opensource.lkJanick Taillandier
Janick.Taillandier@ratp.frJanky Jay
ek@purplehat.orgJános Mohácsi
janos.mohacsi@bsd.huJanusz Kokot
janek@gaja.ipan.lublin.plJarle Greipsland
jarle@idt.unit.noJason Bacon
jwbacon@tds.netJason Burgess
dev@fenux.netJason DiCioccio
geniusj@ods.orgJason Garman
init@risen.orgJason Harris
jharris@widomaker.comJason R. Mastaler
jason-freebsd@mastaler.comJason Stone
jason-fbsd-ports@shalott.netJason Thorpe
thorpej@NetBSD.orgJason Wright
jason@OpenBSD.orgJason Young
doogie@forbidden-donut.anet-stl.comJavad Kouhi
javad.kouhi@gmail.comJavier Martin Rueda
jmrueda@diatel.upm.esJay Fenlason
hack@datacube.comJay Krell
jay.krell@cornell.eduJaye Mathisen
mrcpu@cdsnet.netJaap Akkerhuis
jaap@NLnetLabs.nlJean-Baptiste Quenot
jb.quenot@caraldi.comJean Benoit
jean@unistra.frJean-Sebastien Roy
js@jeannot.orgJeff Bartig
jeffb@doit.wisc.eduJeff Brown
jabrown@caida.orgJeff Burchell
toxic@doobie.comJeff Forys
jeff@forys.cranbury.nj.usJeff Kletsky
Jeff@Wagsky.comJeff Palmer
scorpio@drkshdw.orgJeffrey Evans
evans@scnc.k12.mi.usJeffrey H. Johnson
CPE1704TKS@bellsouth.netJeffrey Leung
zenoss@experts-exchange.comJeff Molofee
nehe@cruzinternet.comJeffrey Wheat
jeff@cetlink.netJens Holmqvist
zparta@hispan.seJens K. Loewe
bsd@tuxproject.deJens Rehsack
rehsack@liwing.deJeremy Allison
jallison@whistle.comJeremy C. Reed
reed@pugetsoundtechnology.comJeremy Chatfield
jdc@xinside.comJeremy Karlson
karlj000@unbc.caJeremy PriorJeremy Shaffner
jeremy@external.orgJeroen Schot
schot@a-askwadraat.nlJerry Eriksson
jerry@freebsd.seJesper Dalberg
jesper@jdn.dkJesper Noehr
jesper@noehr.orgJesse Kempf
jessekempf@gmail.comJesse McConnell
jesse@cylant.comJesse Rosenstock
jmr@ugcs.caltech.eduJesse van den Kieboom
troplosti@orcaweb.cjb.netJia-Wei Ye
leafy7382@gmail.comJian-Da Li
jdli@csie.nctu.edu.twJie Gao
gaoj@cpsc.ucalgary.ca
- Jim Babb
- babb@FreeBSD.org
+ &a.babb.email;Jim Binkley
jrb@cs.pdx.eduJim Bloom
bloom@acm.orgJim Carroll
jim@carroll.comJim Flowers
jflowers@ezo.netJim Geovedi
jim@corebsd.or.idJim Leppek
jleppek@harris.comJim Lowe
james@cs.uwm.eduJim Mattson
jmattson@sonic.netJim Mercer
jim@komodo.reptiles.orgJim Pirzyk
pirzyk@uiuc.eduJim Riggs
ports@christianserving.orgJim Shewmaker
jim@bluenotch.comJim Sloan
odinn@atlantabiker.netJim Stapleton
sjss@var-dev.netJim Wilson
wilson@moria.cygnus.comJimbo Bahooli
griffin@blackhole.iceworld.orgJin Guojun
jin@george.lbl.govJin-Shan Tseng
tjs@cdpa.nsysu.edu.twJo Rhett
jrhett@netconsonance.comJoachim Kuebart
kuebart@mathematik.uni-ulm.deJoachim Strombergson
Watchman@ludd.luth.seJoao Carlos Mendes Luis
jonny@jonny.eng.brJochen Pohl
jpo.drs@sni.deJoe Abley
jabley@automagic.orgJoe Barbish
barbish@a1poweruser.comJoe Halpin
joe.halpin@attbi.comJoe Holden
joe@joeholden.co.ukJoe Horn
joehorn@gmail.comJoe Jih-Shian Lu
jslu@dns.ntu.edu.twJoe Kelsey
joek@flyingcroc.netJoe Orthoefer
j_orthoefer@tia.netJoe Smith
inwap@best.comJoe Traister
traister@mojozone.orgJoel Diaz
joeldiaz@bellsouth.netJoel Faedi
Joel.Faedi@esial.u-nancy.frJoel Ray Holveck
joelh@gnu.orgJoel Sutton
jsutton@bbcon.com.auJoerg Pulz
Joerg.Pulz@frm2.tum.deJoerg Schilling
schilling@fokus.gmd.deJohan Granlund
johan@granlund.nuJohan Larsson
johan@moon.campus.luth.seJohan Strom
johan@stromnet.orgJohann Tonsing
jtonsing@mikom.csir.co.zaJohannes 5 Joemann
joemann@beefree.free.deJohannes Grødem
johs@copyleft.noJohannes HelanderJohannes StilleJohn Beckett
jbeckett@southern.eduJohn Beukema
jbeukema@hk.super.netJohn BrezakJohn Capo
jc@irbs.comJohn F. Woods
jfw@jfwhome.funhouse.comJohn Ferrel
jdferrell3@yahoo.comJohn Goerzen
jgoerzen@alexanderwohl.complete.orgJohn Heidemann
johnh@isi.eduJohn Hood
cgull@owl.orgJohn KohlJohn Lind
john@starfire.mn.orgJohn Mackin
john@physiol.su.oz.auJohn Marino
draco@marino.stJohn McAree
john@mcaree.orgJohn MacFarlane
jgm@berkeley.eduJohn Mehr
jcm@visi.comJohn Merryweather Cooper
jmcoopr@webmail.bmi.netJohn Nielsen
john@jnielsen.netJohn Oxley
john@yoafrica.comJohn P
johnp@lodgenet.comJohn Perry
perry@vishnu.alias.netJohn Prather
john.c.prather@gmail.comJohn Preisler
john@vapornet.comJohn Reynolds
johnjen@reynoldsnet.orgJohn Rochester
jr@cs.mun.caJohn Sadler
john_sadler@alum.mit.eduJohn Saunders
john@pacer.nlc.net.auJohn Von Essen
john@essenz.comJohn Wehle
john@feith.comJohn Woods
jfw@eddie.mit.eduJohny Mattsson
lonewolf@flame.orgJon Amundsen
online@jamundsen.dyndns.orgJon Morgan
morgan@terminus.trailblazer.comJon Nistor
nistor@snickers.orgJon Passki
cykyc@yahoo.comJon Wilson
jon@phuq.co.ukJona Joachim
walkingshadow@grummel.netJonathan Belson
jon@witchspace.comJonathan Bokovza
Jonathan@afarsec.comJonathan Chen
jonc@chen.org.nzJonathan Chu
milki@rescomp.berkeley.eduJonathan Drews
j.e.drews@att.netJonathan H N Chin
jc254@newton.cam.ac.ukJonathan Hanna
jhanna@shaw.caJonathan Lennox
lennox@cs.columbia.eduJonathan Liu
Net147@hotmail.comJonathan McDowell
noodles@earth.liJonathan Pennington
john@coastalgeology.orgJordan DeLong
fracture@allusion.netJordi Haarman
jhaarman-keyword-tinyerpPort.fd583c@projects.synantics.netJorge Goncalves
j@bug.fe.up.ptJorge M. Goncalves
ee96199@tom.fe.up.ptJoris Vandalon
joris@vandalon.nlJos Backus
jos@catnook.comJose Abelardo Martinez
jamartinez@altern.orgJose Liang
jose@jose.idv.twJose Marques
jose@nobody.orgJose Rodriguez
king@v2project.comJosé García Juanino
jjuanino@gmail.comJosef Grosch
jgrosch@superior.mooseriver.comJoseph Haga
tuximus@tcsn.netJoseph Mingrone
jrm@ftfl.caJoseph Scott
joseph@randomnetworks.comJoseph Stein
joes@wstein.comJosh Carroll
josh.carroll@gmail.comJosh Elsasser
jre@vineyard.netJosh Gilliam
josh@quick.netJosh Tiefenbach
josh@ican.netJosh Tolbert
hemi@puresimplicity.netJoshua D. Abraham
jabra@ccs.neu.eduJoshua Goodall
joshua@roughtrade.netJostein Trondal
jostein.trondal@sikkerhet.noJuan Salaverria
rael@vectorstar.netJuha Inkari
inkari@cc.hut.fiJuha Nygard
juha.nygard1@netikka.fiJuha Ylitalo
juha.ylitalo@iki.fiJui-Nan Lin
jnlin@csie.nctu.edu.twJukka A. Ukkonen
jau@iki.fiJulian Assange
proff@suburbia.netJulian C. Dunn
jdunn@aquezada.comJulian Coleman
j.d.coleman@ncl.ac.uk
- &a.jhs;
+ &a.jhs.email;Julian Jenkins
kaveman@magna.com.auJulian Stecklina
der_julian@web.deJun Mukai
mukai@jmuk.orgJunichi Satoh
junichi@jp.FreeBSD.orgJunji NAKANISHI
jun-g@daemonfreaks.comJunji SAKAI
sakai@jp.FreeBSD.orgJunya WATANABE
junya-w@remus.dti.ne.jpJustas
justas@mbank.lvJustin Stanford
jus@security.za.netJyun-Yan You
jyyou@cs.nctu.edu.twGergely CZUCZY
gergely.czuczy@harmless.huK.Higashino
a00303@cc.hc.keio.ac.jpKANOU Hiroki
kanou@khdd.netKATO Tsuguru
tkato@prontomail.ne.jpKIMURA Shigekazu
zau50357@lion.zero.ad.jpKIMURA Yasuhiro
yasu@utahime.orgKUNISHIMA Takeo
kunishi@c.oka-pu.ac.jpKai Vorma
vode@snakemail.hut.fiKai Wang
kaiwang27@gmail.comKaleb S. Keithley
kaleb@ics.comKaneda Hiloshi
vanitas@ma3.seikyou.ne.jpKang Liu
liukang@bjut.edu.cnKang-ming Liu
gugod@gugod.orgKapil Chowksey
kchowksey@hss.hns.comKarel Miklav
karel@lovetemple.netKarl Denninger
karl@mcs.comKarl Dietz
Karl.Dietz@triplan.comKarl Lehenbauer
karl@NeoSoft.comKarsten W. Rohrbach
karsten@rohrbach.deKatalin Konkoly
katalin.konkoly@gmail.comKatsura Matsumoto
katsura@cc.osaka-kyoiku.ac.jpKawanobe Koh
kawanobe@st.rim.or.jpKay Abendroth
kay.abendroth@raxion.netKay Lehmann
kay_lehmann@web.deKazami
kazami@angels.vgKazuhito HONDA
kazuhito@ph.noda.tus.ac.jpKees Jan Koster
kjkoster@kjkoster.orgKeith Bostic
bostic@bostic.comKeith E. Walker
kew@icehouse.netKeith MooreKeith SklowerKelley Reynolds
kelley@insidesystems.netKen HornsteinKen Key
key@cs.utk.eduKen Mayer
kmayer@freegate.comKen McGlothlen
mcglk@artlogix.comKen Menzel
kenm@icarz.comKen Tom
subd@mui.netKenji Saito
marukun@mx2.nisiq.netKenji Takefu
takefu@airport.fmKenji Tomita
tommyk@da2.so-net.or.jpKenneth Furge
kenneth.furge@us.endress.comKenneth Monville
desmo@bandwidth.orgKenneth R. Westerback
krw@tcn.netKenneth Stailey
kstailey@yahoo.comKenneth Vestergaard Schmidt
kvs@pil.dkKent Talarico
kent@shipwreck.tsoft.netKent Vander Velden
graphix@iastate.eduKentaro Inagaki
JBD01226@niftyserve.ne.jpKevin Bracey
kbracey@art.acorn.co.ukKevin Brunelle
kruptos@mlinux.orgKevin Day
toasty@dragondata.comKevin Golding
kevin@caomhin.demon.co.ukKevin Lahey
kml@nas.nasa.govKevin Meltzer
perlguy@perlguy.comKevin Oberman
oberman@es.netKevin Street
street@iname.comKevin Van Maren
vanmaren@fast.cs.utah.eduKevin Zheng
kevinz5000@gmail.comKey-Teck SIN
ktsin@acm.orgKhairil Yusof
kaeru@inigo-tech.comKiller
killer@prosalg.noKim Scarborough
sluggo@unknown.nuKimura Fuyuki
fuyuki@hadaly.orgKiril Mitev
kiril@ideaglobal.comKirill Bezzubets
kirill@solaris.ruKirill A. Korinskiy
catap@catap.ruKirk Strauser
kirk@strauser.comKiroh HARADA
kiroh@kh.rim.or.jpKlaus Goger
klaus.goger@reflex.atKlaus Herrmann
klaus.herrmann@gmx.netKlaus Klein
kleink@layla.inka.deKlaus Michael Indlekofer
M.Indlekofer@gmx.deKlaus-J. Wolf
Yanestra@t-online.deKoichi Sato
copan@ppp.fastnet.or.jpKonrad Heuer
kheuer@gwdu60.gwdg.deKonrad Lapsz
konrad.lapsz@gmail.comKonstantin Chuguev
Konstantin.Chuguev@dante.org.ukKonstantin Reznichenko
kot@premierbank.dp.uaKonstantinos Mplekos
mplekos@physics.upatras.grKostya Lukin
lukin@okbmei.msk.suKouichi Hirabayashi
kh@mogami-wire.co.jpKris Dow
kris@vilnya.demon.co.ukKrzysztof Kowalewski
pyzmen@kam.plKrzysztof Pawlowski
msciciel@darkzone.ma.cxKuan-Chung Chiu
buganini@gmail.comKuang-che Wu
kcwu@csie.orgKuo-Feng Tseng
kftseng@iyard.orgKurt D. Zeilenga
Kurt@Boolean.NETKurt Jaeger
fbsd-ports@opsec.euKurt Olsen
kurto@tiny.mcs.usu.eduKyle Martin
mkm@ieee.orgL. Jonas Olsson
ljo@ljo-slip.DIALIN.CWRU.EduLandon Fuller
landonf@opendarwin.orgLapo Luchini
lapo@lapo.itLarry Altneu
larry@ALR.COMLarry P. Maloney
larry@kiputers.comLarry Rosenman
ler@lerctr.orgLars Bernhardsson
lab@fnurt.netLars Eggert
lars.eggert@gmx.netLars Erik Gullerud
lerik@nolink.netLasse L. Johnsen
lasse@freebsdcluster.orgLaurence Lopez
lopez@mv.mv.comLaurent Courty
lrntct@gmail.comLaurent Levier
llevier@argosnet.comLauri Watts
lauri@kde.orgLaust S. Jespersen
L@ust.dkLee Cremeans
lcremean@tidalwave.netLefteris Chatzibarbas
lefcha@hellug.grLeif Pedersen
pedersen@meridian-enviro.comLen Sassaman
rabbi@abditum.comLeo Kim
leo@florida.sarang.netLeo Vandewoestijne
freebsd@dns-lab.comLeonardo Silveira de A. Martins
lmartins@nepe.eee.ufg.brLeonhard Wimmer
leo@mediatomb.ccLeonid Zolotarev
leoz.2005@gmail.comLev Walkin
vlm@lionet.infoLevent Kayan
levent@corehack.orgLewis Thompson
purple@lewiz.netLi-lun Wang
llwang@infor.orgLiam Foy
liamfoy@sepulcrum.orgLinh Pham
question+freebsdpr@closedsrc.orgLon Willett
lon%softt.uucp@math.utah.eduLoren J. Rittle
ljrittle@acm.orgLoren M. Lang
lorenl@alzatex.comLouis A. Mamakos
loiue@TransSys.comLowell Gilbert
lowell@world.std.comLubomir Metodiev Marinov
lubomir.marinov@gmail.comLucas James
Lucas.James@ldjpc.apana.org.auLucio Costa
lucio@zetasolucoes.com.brLuiz Eduardo Roncato Cordeiro
cordeiro@nic.brLukasz Stelmach
lukasz.stelmach@iem.pw.edu.plLupe Christoph
lupe@lupe-christoph.deLutz Boehne
lboehne@damogran.deLyndon Nerenberg
lyndon@orthanc.ab.caM Rothwell
freebsd-ports@coreland.ath.cxM. L. Dodson
bdodson@scms.utmb.EDUM.C. WongMOROHOSHI Akihiko
moro@remus.dti.ne.jpMachiel Mastenbroek
machiel_mastenbroek@hotmail.comMagnus Enbom
dot@tinto.campus.luth.seMahesh Neelakanta
mahesh@gcomm.comMahlon E. Smith
mahlon@martini.nuMakoto WATANABE
watanabe@zlab.phys.nagoya-u.ac.jpMakoto YAMAKURA
makoto@pinpott.spnet.ne.jpMalte Lance
malte.lance@gmx.netMantas Kaulakys
stone@tainet.ltManu Iyengar
iyengar@grunthos.pscwa.psca.comManuel Creach
manuel.creach@me.comManuel Rabade Garcia
mig@mig-29.netMarc Blanchet
marc.blanchet@viagenie.qc.caMarc Frajola
marc@dev.comMarc Olzheim
marcolz@stack.nlMarc Ramirez
mrami@mramirez.sy.yale.eduMarc Recht
marc@informatik.uni-bremen.deMarc Silver
marcs@draenor.orgMarc Slemko
marcs@znep.comMarc van Kempen
wmbfmk@urc.tue.nlMarc van Woerkom
marc.vanwoerkom@fernuni-hagen.deMarcello Silva Coutinho
marcellocoutinho@gmail.comMarcelo/Porks Rossi
marcelorossi@gmail.comMarcin Cieslak
saper@system.plMarcin Gondek
drixter@e-utp.netMarcin Jessa
yazzy@yazzy.orgMarcin Wisnicki
mwisnicki@gmail.comMarco Molteni
molter@tin.itMarco van de Voort
marcov@stack.nlMarin Atanasov
dnaeon@gmail.comMarius Nünnerich
marius@nuenneri.chMark A. Wicks
mwicks@kettering.eduMark AndrewsMark Blackman
freebsd-ports@blackmans.orgMark Cammidge
mark@gmtunx.ee.uct.ac.zaMark Daniel Reidel
ports@mark.reidel.infoMark Diekhans
markd@grizzly.comMark Foster
mark@foster.ccMark Hannon
markhannon@optusnet.com.auMark Huizer
xaa+freebsd@timewasters.nlMark J. Miller
joup@bigfoot.comMark J. Taylor
mtaylor@cybernet.comMark Johnston
mjohnston@skyweb.caMark Kane
mark@mkproductions.orgMark Knight
markk@knigma.orgMark Krentel
krentel@rice.eduMark Mayo
markm@vmunix.comMark Starovoytov
mark_sf@kikg.ifmo.ruMark Stosberg
mark@summersault.comMark Thompson
thompson@tgsoft.comMark Tinguely
tinguely@plains.nodak.eduMark TreacyMark Valentine
mark@thuvia.orgMarkus Holmberg
saska@acc.umu.seMarkus Niemistö
markus.niemisto@gmx.netMartijn Lina
martijn@pacno.netMartin Dieringer
martin.dieringer@gmx.deMartin Hinner
mhi@linux.gyarab.czMartin Ibert
mib@ppe.bb-data.deMartin Jackson
mhjacks@swbell.netMartin Kammerhofer
mkamm@gmx.netMartin Karlsson
martin.karlsson@visit.seMartin Klaffenboeck
martin.klaffenboeck@gmx.atMartin Kraft
martin.kraft@fal.deMartin Kropfinger
freebsd@rakor-net.de>Martin Mersberger
gremlin@portal-to-web.deMartin Minkus
diskiller@cnbinc.comMartin Neubauer
m.ne@gmx.netMartin Otto
gamato@users.sf.netMartin Preuss
martin@libchipcard.deMartin Sugioarto
martin.sugioarto@udo.eduMartin Tournoij
carpetsmoker@gmail.comMartti Kuparinen
martti.kuparinen@ericsson.comMarwan Burelle
marwan.burelle@lri.frMasachika ISHIZUKA
ishizuka@isis.min.ntt.jpMasafumi Otsune
info@otsune.comMasahiro Sekiguchi
seki@sysrap.cs.fujitsu.co.jpMasahiro TAKEMURA
mastake@msel.t.u-tokyo.ac.jpMasahiro Teramoto
markun@onohara.toMasakazu HIGAKI
higamasa@dream.comMasaki TAGAWA
masaki@club.kyutech.ac.jpMasanobu Saitoh
msaitoh@spa.is.uec.ac.jpMasanori Kanaoka
kana@saijo.mke.mei.co.jpMasanori Kiriake
seiken@ARGV.ACMasanori OZAWA
ozawa@ongs.co.jpMasashi CHIBA
chiba.masashi@gmail.comMasatoshi TAMURA
tamrin@shinzan.kuee.kyoto-u.ac.jpMathias Monnerville
mathias@monnerville.comMats Lofkvist
mal@algonet.seMatt Bartley
mbartley@lear35.cytex.comMatt Dawson
matt@mattsnetwork.co.ukMatt Douhan
matt@athame.co.ukMatt Emmerton
matt@gsicomp.on.caMatt Heckaman
matt@LUCIDA.QC.CAMatt Jibson
dolmant@dolmant.netMatt Lancereau
matt@bsdfly.orgMatt Loschert
loschert@servint.comMatt Mills
matt_mills@btopenworld.comMatt Peterson
matt@peterson.orgMatt Smith
matt@xtaz.netMatt Stofko
matt@mjslabs.comMatt Thomas
matt@3am-software.comMatt Tosto
datahead4@gmail.comMatt White
mwhite+@CMU.EDUMatthew Braithwaite
mab@red-bean.comMatthew C. Mead
mmead@Glock.COMMatthew Cashdollar
mattc@rfcnet.comMatthew Donovan
kitchetech@gmail.comMatthew Emmerton
root@gabby.gsicomp.on.caMatthew Flatt
mflatt@cs.rice.eduMatthew Fuller
fullermd@over-yonder.netMatthew George
mdg@secureworks.netMatthew Gibson
mdg583@hotmail.comMatthew Grooms
mgrooms@shrew.netMatthew Holder
sixxgate@hotmail.comMatthew Luckie
mjl@luckie.org.nzMatthew Stein
matt@bdd.netMatthew West
mwest@uct.ac.zaMatthew Will
mwill@spingen.comMatthew X. Economou
xenophon+fbsdports@irtnog.orgMatthias Fechner
idefix@fechner.netMatthias Petermann
matthias@d2ux.netMatthias Pfaller
leo@dachau.marco.deMatthias Scheler
tron@netbsd.orgMatthias Schmidt
schmidtm@mathematik.uni-marburg.deMatthias Sund
m.sund@arcor.deMatthias Schündehütte
msch@snafu.deMatthias Teege
mteege.deMatthieu Guegan
matt.guegan@free.frMatthias Teege
mteege.deMattias Gronlund
Mattias.Gronlund@sa.erisoft.seMattias Pantzare
pantzer@ludd.luth.seMatus Uhlar
uhlar@fantomas.skMaurice Castro
maurice@planet.serc.rmit.edu.auMauricio Herrera Cuadra
mauricio@arareko.netMax Campos
mcampos@bpsw.bizMax E. Kuznecov
mek@mek.uz.uaMax Euston
meuston@jmrodgers.comMax N. Boyarov
m.boyarov@bsd.byMaxim Bolotin
max@rsu.ruMaxim Dounin
mdounin@mdounin.ruMaxim Ignatenko
gelraen.ua@gmail.comMaxim Loginov
zeliboba@mail.ruMaxim Samsonov
xors@sendmail.ruMaxim Tuliuk
mt@primats.org.uaMaxime Romano
verbophobe@hotmail.comMeikel Brandmeyer
Brandels_Mikesh@web.deMel Flynn
rflynn@acsalaska.netMeno Abels
meno.abels@adviser.comMeyer Wolfsheim
wolf@priori.netMicha Class
michael_class@hpbbse.bbn.hp.comMichael A. Kohn
naken@naken.ccMichael Alyn Miller
malyn@strangeGizmo.comMichael Butler
imb@scgt.oz.auMichael Butschky
butsch@computi.erols.comMichael C. Shultz
ringworm@inbox.lvMichael Clay
mclay@weareb.orgMichael Collette
metrol@metrol.netMichael Ebert
ebert@informatik.unibw-muenchen.deMichael Edenfield
kutulu@kutulu.orgMichael Galassi
nerd@percival.rain.comMichael Gmelin
freebsd@grem.deMichael Hancock
michaelh@cet.co.jpMichael Handler
handler@grendel.netMichael Hohmuth
hohmuth@inf.tu-dresden.deMichael Iatrou
m_iatrou@freemail.grMichael Lyngbøl
michael@lyngbol.dkMichael Neumann
mneumann@ntecs.deMichael O. Boev
mike@tric.tomsk.gov.ruMichael Perlman
canuck@caam.rice.eduMichael Petry
petry@netwolf.NetMasters.comMichael Ranner
mranner@inode.atMichael Sanders
mike@topcat.hypermart.netMichael Sardo
jaeger16@yahoo.comMichael Schout
mschout@gkg.netMichael Searle
searle@longacre.demon.co.ukMichael Seyfert
michaels@sdf.lonestar.orgMichael Urban
murban@tznet.comMichael Vasilenko
acid@stu.cn.uaMichal Listos
mcl@Amnesiac.123.orgMichal Pasternak
dotz@irc.plMichel Lavondés
fox@vader.aacc.cc.md.usMichele Possamai
possamai@xs4all.nlMichio Karl Jinbo
karl@marcer.nagaokaut.ac.jpMicho Durdevich
micho@math.unam.mxMickael Maillot
mickael.maillot@gmail.comMiguel Angel Sagreras
msagre@cactus.fi.uba.arMiguel Mendez
flynn@energyhq.es.eu.orgMihoko Tanaka
m_tonaka@pa.yokogawa.co.jpMij
mij@bitchx.itMika Nystrom
mika@cs.caltech.eduMikael Hybsch
micke@dynas.seMikael Karpberg
karpen@ocean.campus.luth.seMike Andrews
mandrews@bit0.comMike Bowie
mbowie@buzmo.comMike Bristow
mike@urgle.comMike Del
repenting@hotmail.comMike Durian
durian@boogie.comMike Durkin
mdurkin@tsoft.sf-bay.orgMike E. Matsnev
mike@azog.cs.msu.suMike Edenfield
kutulu@kutulu.orgMike Erickson
mee@quidquam.comMike Evans
mevans@candle.comMike Futerko
mike@LITech.lviv.uaMike Grupenhoff
kashmir@umiacs.umd.eduMike Harding
mvh@ix.netcom.comMike Hibler
mike@marker.cs.utah.eduMike KarelsMike Krutov
neko@takino.orgMike Lockwood
mike@mikelockwood.comMike McGaughey
mmcg@cs.monash.edu.auMike Meyer
mwm@mired.orgMike Mitchell
mitchell@ref.tfs.comMike Murphy
mrm@alpharel.comMike Patterson
mike.patterson@unb.caMike Peck
mike@binghamton.eduMike Sherwood
mike@fate.comMike Spengler
mks@msc.eduMike Tancsa
mike@sentex.netMikhail A. Sokolov
mishania@demos.suMikhail T.
michael@fun-box.ruMikhail Zakharov
zmey20000@yahoo.comMikolaj Rydzewski
miki@ceti.plMikolaj Golub
to.my.trociny@gmail.comMiks Mikelsons
miks@cubesystems.lvMilan Obuch
bsd@dino.skMilosz Galazka
milosz.galazka@gmail.comMing-I Hseh
PA@FreeBSD.ee.Ntu.edu.TWMitsuru Yoshida
mitsuru@riken.go.jpMonte Mitzelfelt
monte@gonefishing.orgMooneer Salem
mooneer@translator.cxMorgan Davis
root@io.cts.comMorten Slot Kristensen
ontherenth@gmail.comMostyn Lewis
mostyn@mrl.comMotomichi Matsuzaki
mzaki@e-mail.ne.jpMotoyuki Kasahara
m-kasahr@sra.co.jpMunish Chopra
munish@engmail.uwaterloo.caMurilo Opsfelder
mopsfelder@gmail.comMustafa Arif
ma499@doc.ic.ac.ukMykola Dzham
i@levsha.meMykola Khotyaintsev
ko@irfu.seMykola Marzhan
delgod@portaone.comN.G.Smith
ngs@sesame.hensa.ac.ukNAGAO Tadaaki
nagao@cs.titech.ac.jpNAKAJI Hiroyuki
nakaji@jp.freebsd.orgNAKAMURA Kazushi
kaz@kobe1995.netNAKAMURA Motonori
motonori@econ.kyoto-u.ac.jpNIIMI Satoshi
sa2c@and.or.jpNOKUBI Hirotaka
h-nokubi@yyy.or.jpNadav Eiron
nadav@barcode.co.ilNanbor Wang
nw1@cs.wustl.eduNaofumi Honda
honda@Kururu.math.sci.hokudai.ac.jpNaoki Hamada
nao@tom-yam.or.jpNaram Qashat
cyberbotx@cyberbotx.comNarayan Namdev Newton
narayannewton@gmail.comNarvi
narvi@haldjas.folklore.eeNate Eldredge
neldredge@math.ucsd.eduNathan Dorfman
nathan@rtfm.netNathaniel Roark
robb_force@holybuffalo.netNatsagdorj Shagdar
natsag2000@yahoo.comNeal Fachan
kneel@ishiboo.comNecati Ersen Siseci
siseci@enderunix.orgNed Wolpert
wolpert@codeheadsystems.comNguyen Tam Chinh
chinhngt@sectorb.msk.ruNiall Smart
rotel@indigo.ieNicholas Esborn
nick@netdot.netNick Barnes
Nick.Barnes@pobox.comNick Dewing
nickdewing@gmail.comNick Handel
nhandel@NeoSoft.comNick Hilliard
nick@foobar.orgNick Johnson
freebsd@spatula.netNicole Reid
root@cooltrainer.orgNikolai Lifanov
lifanov@mail.lifanov.comNikos Kokkalis
nickkokkalis@gmail.comNick Leuta
skynick@mail.sc.ruNick Rogness
nick@rogness.netNick Williams
njw@cs.city.ac.ukNick Withers
nick@nickwithers.comNicko Dehaine
nicko@stbernard.comNickolay N. Dudorov
nnd@itfs.nsk.suNicolas Jombart
ecu@ipv42.netNiklas Hallqvist
niklas@filippa.appli.seNikola Lecic
nikola.lecic@anthesphoria.netNikola Kolev
koue@chaosophia.netNikos Ntarmos
ntarmos@ceid.upatras.grNils M. Holm
nmh@t3x.orgNisha Talagala
nisha@cs.berkeley.eduNo Name
ZW6T-KND@j.asahi-net.or.jpNo Name
adrian@virginia.eduNo Name
alex@elvisti.kiev.uaNo Name
anto@netscape.netNo Name
bobson@egg.ics.nitch.ac.jpNo Name
bovynf@awe.beNo Name
burg@is.ge.comNo Name
chris@gnome.co.ukNo Name
colsen@usa.netNo Name
coredump@nervosa.comNo Name
dannyman@arh0300.urh.uiuc.eduNo Name
davids@SECNET.COMNo Name
derek@free.orgNo Name
dvv@sprint.netNo Name
enami@ba2.so-net.or.jpNo Name
flash@eru.tubank.msk.suNo Name
flash@hway.ruNo Name
fn@pain.csrv.uidaho.eduNo Name
frf@xocolatl.comNo Name
gclarkii@netport.neosoft.comNo Name
gordon@sheaky.lonestar.orgNo Name
graaf@iae.nlNo Name
greg@greg.rim.or.jpNo Name
grossman@cygnus.comNo Name
gusw@fub46.zedat.fu-berlin.deNo Name
hfir@math.rochester.eduNo Name
hnokubi@yyy.or.jpNo Name
iaint@css.tuu.utas.edu.auNo Name
invis@visi.comNo Name
ishisone@sra.co.jpNo Name
iverson@lionheart.comNo Name
jpt@magic.netNo Name
junker@jazz.snu.ac.krNo Name
k-sugyou@ccs.mt.nec.co.jpNo Name
kenji@reseau.toyonaka.osaka.jpNo Name
kfurge@worldnet.att.netNo Name
lh@aus.orgNo Name
lhecking@nmrc.ucc.ieNo Name
mrgreen@mame.mu.oz.auNo Name
nakagawa@jp.FreeBSD.orgNo Name
nemysis@gmx.chNo Name
ohki@gssm.otsuka.tsukuba.ac.jpNo Name
owaki@st.rim.or.jpNo Name
pechter@shell.monmouth.comNo Name
pete@pelican.pelican.comNo Name
pritc003@maroon.tc.umn.eduNo Name
risner@stdio.comNo Name
root@ns2.redline.ruNo Name
root@uglabgw.ug.cs.sunysb.eduNo Name
stephen.ma@jtec.com.auNo Name
sumii@is.s.u-tokyo.ac.jpNo Name
takas-su@is.aist-nara.ac.jpNo Name
tjevans@raleigh.ibm.comNo Name
tony-o@iij.ad.jp amurai@spec.co.jpNo Name
torii@tcd.hitachi.co.jpNo Name
uenami@imasy.or.jpNo Name
vode@hut.fiNo Name
wlloyd@mpd.caNo Name
wlr@furball.wellsfargo.comNo Name
wmbfmk@urc.tue.nlNo Name
yamagata@nwgpc.kek.jpNo Name
ziggy@ryan.orgNo Name
salexanov@gmail.comNobuhiro Yasutomi
nobu@psrc.isac.co.jpNobuyuki Koganemaru
kogane@koganemaru.co.jpNorberto Lopes
nlopes.ml@gmail.comNorio Suzuki
nosuzuki@e-mail.ne.jpNoritaka Ishizumi
graphite@jp.FreeBSD.orgNoritoshi Demizu
demizu@dd.iij4u.or.jpNoriyuki Soda
soda@sra.co.jpOddbjorn Steffensen
oddbjorn@tricknology.orgOh Junseon
hollywar@mail.holywar.netOlaf Wagner
wagner@luthien.in-berlin.deOlafur Osvaldsson
oli@isnic.isOleg Alexeenkov
proler@gmail.comOleg Ginzburg
olevole@olevole.ruOleg Kiselyov
oleg@pobox.comOleg A. Mamontov
oleg@mamontov.netOleg M. Golovanov
olmi@rentech.ruOleg Moskalenko
mom040267@gmail.comOleg R. Muhutdinov
mor@whiteluna.comOleg Semyonov
os@altavista.netOleg Sharoiko
os@rsu.ruOleg Ukraincev
oleg@ht-systems.ruOleg V. Volkov
rover@lglobus.ruOleksandr Lystopad
laa@laa.zp.uaOlexander Kunytsa
kunia@wolf.istc.kiev.uaOliver Breuninger
ob@seicom.NETOliver Dunkl
odunkl@gmx.netOliver Fischer
plexus@snafu.deOliver Friedrichs
oliver@secnet.comOliver Hartmann
ohartman@zedat.fu-berlin.deOliver Heesakkers
dev2@heesakkers.infoOliver Helmling
oliver.helmling@stud.uni-bayreuth.deOliver Laumann
net@informatik.uni-bremen.deOliver Oberdorf
oly@world.std.comOliver Peter
hoschi@mouhaha.deOlivier Beyssac
obld@r14.freenix.orgOlivier Cochard-Labbé
olivier@cochard.meOlivier Tharan
olive@oban.frmug.orgOlof Johansson
offe@ludd.luth.seOmer Faruk Sen
ofsen@enderunix.orgOscar Bonilla
obonilla@galileo.eduOtacílio de Araújo Ramos Neto
otacilio.neto@ee.ufcg.edu.brOtávio Fernandes
otaviof@gmail.comOzkan KIRIK
ozkan@enderunix.orgPace Willisson
pace@blitz.comPaco Rosich
rosich@modico.eleinf.uv.esPanagiotis Astithas
past@noc.ntua.grPanagiotis Kritikakos
panoskrt@googlemail.comParag Patel
parag@cgt.comPascal Pederiva
pascal@zuo.dec.comPascal Vizeli
pvizeli@yahoo.dePasi Hirvonen
psh@iki.fiPasvorn Boonmark
boonmark@juniper.netPatrick Alken
cosine@ellipse.mcs.drexel.eduPatrick Atamaniuk
atamaniuk-ports@frobs.netPatrick Bihan-Faou
patrick@mindstep.comPatrick Dung
patrick_dkt@yahoo.com.hkPatrick HausenPatrick MARIE
mycroft@virgaria.orgPatrick Powell
papowell@astart.comPatrick Rinke
patrick@rinke-bochum.dePatrick Seal
patseal@hyperhost.netPatrick Tracanelli
eksffa@freebsdbrasil.com.brPaul
onemda@gmail.comPaul A. Hoadley
paulh@logicsquad.netPaul Antonov
apg@demos.suPaul Chvostek
paul@it.caPaul Dlug
paul@aps.orgPaul F. WerkowskiPaul Fox
pgf@foxharp.boston.ma.usPaul Koch
koch@thehub.com.auPaul Kranenburg
pk@NetBSD.orgPaul M. Lambert
plambert@plambert.netPaul Mackerras
paulus@cs.anu.edu.auPaul Popelka
paulp@uts.amdahl.comPaul S. LaFollette, Jr.Paul Sandys
myj@nyct.netPaul Schmehl
pauls@utdallas.eduPaul T. Root
proot@horton.iaces.comPaul Vixie
paul@vix.comPaulo Fragoso
paulo@nlink.com.brPaulo Menezes
paulo@isr.uc.ptPaulo Menezes
pm@dee.uc.ptPavel Janik
Pavel@Janik.czPavel Novikov
pavel@ext.byPavel Pankov
pankov_p@mail.ruPavel Veretennikov
vermut@kid.lvPavel I Volkov
pavelivolkov@googlemail.comPawel Worach
pawel.worach@gmail.comPedro A M Vazquez
vazquez@IQM.Unicamp.BRPengfei JU
jupengfei@gmail.comPer Wigren
wigren@home.sePete Bentley
pete@demon.netPeter Ankerstål
peter@pean.orgPeter Avalos
pavalos@theshell.comPeter Childs
pjchilds@imforei.apana.org.auPeter Cornelius
pc@inr.fzk.dePete French
pete@twisted.org.ukPeter Haight
peterh@prognet.comPeter Holub
hopet@ics.muni.czPeter Klatt
glocke@bsdstammtisch.atPeter Kolmisoppi
growspd@brokep.comPeter M. Chen
pmchen@eecs.umich.eduPeter Much
peter@citylink.dinoex.sub.orgPeter OlssonPeter Philipp
pjp@bsd-daemon.netPeter S. Housel
housel@acm.orgPeter Schuller
peter.schuller@infidyne.comPeter Stubbs
PETERS@staidan.qld.edu.auPéter Terbe
sncdev@gmail.comPeter Thoenen
peter.thoenen@yahoo.comPeter Vereshagin
peter@vereshagin.orgPeter W. Schmiedeskamp
pschmied@qwest.netPeter van Dijk
peter@dataloss.nlPeter van Heusden
pvh@wfeet.za.netPetr Macek
pm@kostax.czPetr Rehor
prehor@gmail.comPhil Budne
phil@ultimate.comPhil Maker
pjm@gnu.orgPhil Oleson
oz@nixil.netPhil Phillips
pphillips@experts-exchange.comPhil Sutherland
philsuth@mycroft.dialix.oz.auPhil Taylor
phil@zipmail.co.ukPhilip Musumeci
p.musumeci@ieee.orgPhilip Reynolds
philip.reynolds@rfc-networks.iePhilip Schulz
phs@deadc0.dePhilippe Lefebvre
nemesis@balistik.netPhilippe Pepiot
phil@philpep.orgPhilippe Rocques
phil@teaser.frPierre David
pdagog@gmail.comPierre Y. Dampure
pierre.dampure@k2c.co.ukPierre-Paul Lavoie
ppl@nbnet.nb.caPieter Danhieux
opr@bsdaemon.bePiotr Florczyk
p.florczyk@adminworkshop.plPiotr Rybicki
meritus@innervision.plPiotr Smyrak
piotr.smyrak@heron.plPius Fischer
pius@ienet.comPomegranate
daver@flag.blackened.netPontus Stenetorp
ninjin@kth.sePowerdog Industries
kevin.ruddy@powerdog.comPriit Järv
priit@cc.ttu.eePrudhvi Krishna
prudhvikrishna@gmail.comQing Feng
qingfeng@me.comQuentin Stievenart
acieroid@awesom.euQuinton Dolan
q@onthenet.com.auR Joseph Wright
rjoseph@mammalia.orgR. Kym HorsellR Skinner
port_maintainer@herveybayaustralia.com.auRadek Kozlowski
radek@raadradd.comRadim Kolar
hsn@netmag.czRadoslav Vasilev
rvasilev@uni-svishtov.bgRafal Lesniak
fbsd@grid.einherjar.deRaffaele De Lorenzo
raffaele.delorenzo@libero.itRainer Duffer
rainer@ultra-secure.deRainer Hurling
rhurlin@gwdg.deRalf Friedl
friedl@informatik.uni-kl.deRalf Gebhart
gebhart@secnetix.deRalf van Dooren
r.vdooren@snow.nlRandal S. Masutani
randal@comtest.comRandall Hopper
rhh@ct.picker.comRandall W. Dean
rwd@osf.orgRandy Bush
rbush@bainbridge.verio.netRashid N. Achilov
shelton@sentry.granch.ruRasmus Kaj
rasmus@kaj.seRaul Pollicino
email-ports@def-defying.comRazi Khaja
razi@genet.sickkids.on.caReinier Bezuidenhout
rbezuide@mikom.csir.co.zaRemington Lang
MrL0L@charter.netRemy Card
Remy.Card@masi.ibp.frRevis Zinkov
rzinkov@gmail.comRicardas Cepas
rch@richard.eu.orgRicardo A. Reis
ricardo.areis@gmail.comRiccardo Veraldi
veraldi@cs.unibo.itRich Morin
rdm@cfcl.comRich Wood
rich@FreeBSD.org.ukRichard Arends
richard@unixguru.nlRichard Henderson
richard@atheist.tamu.eduRichard Hwang
rhwang@bigpanda.comRichard J Kuhns
rjk@watson.grauel.comRichard Kiss
richard@homemail.comRichard M. Neswold
rneswold@enteract.comRichard Stallman
rms@gnu.ai.mit.eduRichard Straka
straka@user1.inficad.comRichard Tobin
richard@cogsci.ed.ac.ukRichard Wackerbarth
rkw@Dataplex.NETRichard Winkel
rich@math.missouri.eduRichard Wiwatowski
rjwiwat@adelaide.on.netRick Fournier
rick@help-desk.caRick MacklinRick van der Zwet
rick@wzoeterwoude.netRoar Pettersen
roar.pettersen@it.uib.noRob Austein
sra@epilogue.comRob Evers
rob@debank.tvRob Mallory
rmallory@qualcomm.comRob Snow
rsnow@txdirect.netRobert Crossfield
robcrossfield@gmail.comRobert Crowe
bob@speakez.comRobert D. Thrush
rd@phoenix.aii.comRobert Eckardt
roberte@MEP.Ruhr-Uni-Bochum.deRobert Felber
robtone@ek-muc.deRobert P Ricci
ricci@cs.utah.eduRobert Sanders
rsanders@mindspring.comRobert Schlotterbeck
robert@rs.tarrant.tx.usRobert Sexton
robert@kudra.comRobert Shady
rls@id.netRobert Simmons
rsimmons0@gmail.comRobert Swindells
swindellsr@genrad.co.ukRobert Withrow
witr@rwwa.comRobert YoderRobin Carey
robin@mailgate.dtc.rankxerox.co.ukRobin Elfrink
elfrink@introweb.nlRobin Schilham
co9@xs4all.nlRobin Schoonover
robin.schoonover@gmail.google.comRod Taylor
ports@rbt.caRodrigo Graeff
delphus@gmail.comRodrigo Osorio
rodrigo@bebik.netRoger Hardiman
roger@cs.strath.ac.ukRoland Jesse
jesse@cs.uni-magdeburg.deRoland Smith
rsmith@xs4all.nlDr. Rolf Jansen
cyclaero@gmail.comRoman Neuhauser
neuhauser@chello.czRoman Shterenzon
roman@xpert.comRoman Synyuk
roman@univ.kiev.uaRoman V. Palagin
romanp@unshadow.netRoman Y. Bogdanov
sam@brj.pp.ruRon Bickers
rbickers@intercenter.netRon Lenk
rlenk@widget.xmission.comRon van Daal
ronvdaal@n1x.nlRonald F. Guilmette
rfg@monkeys.comRonald Klop
ronald@echteman.nlRonald Kuehn
kuehn@rz.tu-clausthal.deRoselyn Lee
rosel@verniernetworks.comRoss West
freebsd@linepoint.comRostislav Krasny
rosti.bsd@gmail.comRoy Maples
roy@marples.nameRuben
chromium@hybridsource.orgRudolf Cejka
cejkar@fit.vutbr.czRui Lopes
rui@ruilopes.comRuslan Belkin
rus@home2.UA.netRuslan Shevchenko
rssh@cam.grad.kiev.uaRussell Jackson
rjackson@cserv62.csub.eduRussell L. Carter
rcarter@pinyon.orgRussell Vincent
rv@groa.uct.ac.zaRusty Nejdl
rnejdl@ringofsaturn.comRyan Grove
ryan@wonko.comRyan Moe
ryan@transaeris.comRyan T. Dean
rtdean@cytherianage.netRyan Thompson
ryan@sasknow.comRyan Younce
ryany@pobox.comRyo MIYAMOTO
rmiya@cc.hirosaki-u.ac.jpRyo Okamoto
ryo@aquahill.netRyoTa SimaMoto
liangtai.s4@gmail.com Ryuichiro IMURA
imura@af.airnet.ne.jpSANETO Takanori
sanewo@strg.sony.co.jpSASAKI Shunsuke
ele@pop17.odn.ne.jpSAWADA Mizuki
miz@qb3.so-net.ne.jpSPF
spf@xslt.cs.nccu.edu.twSUGIMURA Takashi
sugimura@jp.FreeBSD.orgSURANYI Peter
suranyip@jks.is.tsukuba.ac.jpSakai Hiroaki
sakai@miya.ee.kagu.sut.ac.jpSakari Jalovaara
sja@tekla.fiSam Hartman
hartmans@mit.eduSamuel Lam
skl@ScalableNetwork.comSamuel Tardieu
sam@rfc1149.netSamuele Zannoli
zannoli@cs.unibo.itSamy Al Bahra
samy@kerneled.comSander Janssen
janssen@rendo.dekooi.nlSander Vesik
sander@haldjas.folklore.eeSandro Sigala
ssigala@globalnet.itSarod Yatawatta
sarod@users.sf.netSascha Blank
blank@fox.uni-trier.deSascha Holzleiter
sascha@root-login.orgSascha Klauder
sklauder@trimind.deSascha Wildner
swildner@channelz.GUN.deSatoh Junichi
junichi@astec.co.jpSaulius Menkevicius
bob@nulis.ltScot Elliott
scot@poptart.orgScot W. Hetzel
hetzels@westbend.netScott A. Kenney
saken@rmta.ml.orgScott A. Moberly
smoberly@xavier.dyndns.orgScott Blachowicz
scott.blachowicz@seaslug.orgScott Burris
scott@pita.cns.ucla.eduScott Flatman
sf@slappy.orgScott Hazen Mueller
scott@zorch.sf-bay.orgScott Kleihege
scott-ports@tummy.comScott Lambert
lambert@lambertfam.orgScott Michel
scottm@cs.ucla.eduScott Reynolds
scott@clmqt.marquette.mi.usScott Ullrich
sullrich@gmail.comSeaD
sead@mail.ruSean McLaughlin
sigma.zx@gmail.comSeamus Venasse
svenasse@polaris.caSébastian Santoro
dereckson@gmail.comSebastian Strollo
seb@erix.ericsson.seSebastian Yepes
esn@x123.infoSeiya Yanagita
s_yanagita@ybb.ne.jpSerge Gagnon
gagnon_s@sympatico.caSerge Negodyuck
petr@petrovich.kiev.uaSerge V. Vakulenko
vak@zebub.msk.suSergei Chechetkin
csl@whale.sunbay.crimea.uaSergei S. Laskavy
laskavy@pc759.cs.msu.suSergei Vyshenski
svysh.fbsd@gmail.comSergey Akifyev
asa@gascom.ruSergey V. Dyatko
sergey.dyatko@gmail.comSergey Gershtein
sg@mplik.ruSergey Glushchenko
deen@smz.com.uaSergey Kosyakov
ks@itp.ac.ruSergey Lyubka
valenok@gmail.comSergey N. Vorokov
serg@tmn.ruSergey Potapov
sp@alkor.ruSergey Samoyloff
gonza@techline.ruSergey Shkonda
serg@bcs.zp.uaSergey V. Dorokhov
svd@kbtelecom.nalnet.ruSergey Velichkevych
serg@cad.kiev.uaSergio Lenzi
lenzi@bsi.com.brSevan Janiyan
venture37@geeklan.co.ukShane Ambler
freebsd@shaneware.bizShane Kinney
mod6@freebsdhackers.netShaun Courtney
shaun@emma.eng.uct.ac.zaShawn M. Carey
smcarey@mailbox.syr.eduShell Hung
shell@shellhung.orgShen Chuan-Hsing
statue@freebsd.sinica.edu.twShigeru Yamamoto
shigeru@iij.ad.jpShigio Yamaguchi
shigio@tamacom.comShin'ya Murakami
murakami@ahs.scitec.kobe-u.ac.jpShinichiro Komatsu
koma2@ms.u-tokyo.ac.jpShinsuke Matsui
smatsui@karashi.orgShinya Esu
esu@yk.rim.or.jpShinya FUJIE
fujie@tk.elec.waseda.ac.jpShuichi Tanaka
stanaka@bb.mbn.or.jpSiebrand Mazeland
s.mazeland@xs4all.nlSimon
simon@masi.ibp.frSimon Burge
simonb@telstra.com.auSimon Cornelius P. Umacob
simoncpu@infoweapons.comSimon Dick
simond@irrelevant.orgSimon Lang
simon@lang-clan.deSimon Marlow
simonmar@microsoft.comSimon Olofsson
simon@olofsson.deSimon Schubert
corecode@corecode.ath.cxSimon Shapiro
shimon@simon-shapiro.orgSimun Mikecin
sime@logos.hrSin'ichiro MIYATANI
siu@phaseone.co.jpSlaven Rezic
slaven@rezic.deSnow Chyld
snowchyld+freebsdports@gmail.comSoochon Radee
slr@mitre.orgSoren Dayton
csdayton@midway.uchicago.eduSoren Debois
debois@diku.dkSoren Dossing
sauber@netcom.comSoren S. Jorvang
soren@wheel.dkStan Barber
sob@academ.comStanislav A. Svirid
count@riss-telecom.ruStanislav Grozev
tacho@daemonz.orgStanislaw Halik
sthalik@tehran.lain.plStanislav Shalunov
shalunov@internet2.eduStas Timokhin
devel@stasyan.comStefan A. Deutscher
sad@mailaps.orgStefan Eggers
seggers@semyam.dinoco.deStefan Ehmann
shoesoft@gmx.netStefan Grundmann
sg-sendpr@waset.deStefan Jahn
stefan.jahn@nemesis-sektor.deStefan Moeding
s.moeding@ndh.netStefan PetriStefan Rumetshofer
sterum@overrider.atStefan Schmidt
stefan.schmidt@twest.deStefan Schwarzer
sschwarzer@sschwarzer.netStefan Tell
stefan.tell@crashmail.deStefan `Sec` Zehl
sec@42.orgSteffen Mazanek
steffen.mazanek@unibw-muenchen.deSteffen Vogelreuter
Steffen@Vogelreuter.DeSteinar Haug
sthaug@nethelp.noSten Poldma
exile@chamber.eeSten Spans
sten@blinkenlights.nlStepan Zastupov
redchrom@gmail.comStephane Lapie
stephane.lapie@darkbsd.orgStephen Clawson
sclawson@marker.cs.utah.eduStephen F. Combs
combssf@salem.ge.comStephen Farrell
stephen@farrell.orgStephen Fisher
stephentfisher@yahoo.comStephen Gunn
csg@fedex.comStephen Hocking
sysseh@devetir.qld.gov.auStephen Hurd
admin@nix.synchro.netStephen J. Roznowski
sjr@home.netStephen McKay
syssgm@devetir.qld.gov.auStephen Melvin
melvin@zytek.comStephen Weeks
sweeks@sweeks.comStephon Chen
stephon@gmail.comSteve Ames
steve@energistic.comSteve Bauer
sbauer@rock.sdsmt.eduSteve Coltrin
spcoltri@unm.eduSteve DeeringSteve Franks
bahamasfranks@gmail.comSteve Gerakines
steve2@genesis.tiac.netSteve Gericke
steveg@comtrol.comSteve O'Hara-Smith
steve@sohara.orgSteve Piette
steve@simon.chi.il.USSteve Roome
steve@pepcross.comSteve Schwarz
schwarz@alpharel.comSteve Wills
steve@mouf.netSteven Enderle
panic@subphase.deSteven H. Samorodin
samorodi@NUXI.comSteven Hartland
steven.hartland@multiplay.co.ukSteven Honson
steven@honson.orgSteven McCanne
mccanne@cs.berkeley.eduSteven Plite
splite@purdue.eduSteven WallaceStijn Hoop
stijn@win.tue.nlStuart Henderson
stuart@internationalschool.co.ukStylianos Sideridis
siderste@yahoo.grSue Blake
sue@welearn.com.auSugimoto Sadahiro
ixtl@komaba.utmc.or.jpSugiura Shiro
ssugiura@duo.co.jpSujal Patel
smpatel@wam.umd.eduSulev-Madis Silber
madis555@hot.eeSune Stjerneby
sst@vmunix.dkSungman Cho
smcho@tsp.korea.ac.krSutra Zhou
zhoushuqun@gmail.comSuzuki Yoshiaki
zensyo@ann.tama.kawasaki.jpSvein Skogen
tds@dmnstech.netSven Klose
pixel@hugbox.orgSven Mohr
svmohr@rm6.netSvyatoslav Lempert
svyatoslav.lempert@gmail.comSybolt de Boer
bolt@xs4all.nlTAKAHASHI Kaoru
kaoru@kaisei.orgTERAMOTO Masahiro
markun@onohara.toTadashi Kumano
kumano@strl.nhk.or.jpTaguchi Takeshi
taguchi@tohoku.iij.ad.jpTakahiro Yugawa
yugawa@orleans.rim.or.jpTakashi Mega
mega@minz.orgTakashi Uozu
j1594016@ed.kagu.sut.ac.jpTakayuki Ariga
a00821@cc.hc.keio.ac.jpTakayuki Nakao
t@nakao.orgTakeru NAIKI
naiki@bfd.es.hokudai.ac.jpTakeshi Amaike
amaike@iri.co.jpTakeshi MUTOH
mutoh@info.nara-k.ac.jpTakeshi Ohashi
ohashi@mickey.ai.kyutech.ac.jpTakeshi WATANABE
watanabe@crayon.earth.s.kobe-u.ac.jpTakuya SHIOZAKI
tshiozak@makino.ise.chuo-u.ac.jpTanja Wittke
tawi@gruft.deTarasov Alexey
master@preved.cnTassilo Philipp
tphilipp@potion-studios.comTatoku Ogaito
tacha@tera.fukui-med.ac.jpTatsuki Makino
tatsuki_makino@hotmail.comTatsuya Kudoh
cdr@cosmonet.orgTatsuya Ueda
ml+freebsd@tatsuya.infoTaylor Dondich
tdondich@majiknetworks.comTed Buswell
tbuswell@mediaone.netTed Faber
faber@isi.eduTed Lemon
mellon@isc.orgTed Stodgell
trs137@psu.eduTerry Lambert
terry@lambert.orgTerry Lee
terry@uivlsi.csl.uiuc.eduTerry Sposato
terry@sucked-in.comTeruaki Ata
PFA03027@nifty.ne.jpTetsuro Yabu
yabu@uopmu.ees.osakafu-u.ac.jpTetsuya Furukawa
tetsuya@secom-sis.co.jpThaddeus Covert
tcovert+ports@sahuagin.netTheo de Raadt
deraadt@OpenBSD.orgThierry Dussuet
thierry@dussuet.lugs.chThomas
thomas@mathematik.uni-Bremen.deThomas A. Stephens
tas@stephens.orgThomas BRETON
tom@h-inventory.comThomas D. Dean
tomdean@ix.netcom.comThomas David Rivers
rivers@dignus.comThomas Dreibholz
dreibh@iem.uni-due.deThomas E. Zander
riggs@rrr.deThomas G. McWilliams
tgm@netcom.comThomas Hurst
tom@hur.stThomas Kempka
t.kempka@web.deThomas König
Thomas.Koenig@ciw.uni-karlsruhe.deThomas M. Hermann
Thomas.Hermann@cox.netThomas Melzer
tmelzer@tomesoft.deThomas PtacekThomas Spreng
spreng@socket.chThomas Stromberg
tstrombe@rtci.comThomas Valentino Crimi
tcrimi+@andrew.cmu.eduThomas Vogt
thomas.vogt@bsdunix.chThorsten Greiner
thorsten@tgreiner.netÞórður Ívarsson
totii@est.isTillman Hodgson
tillman@seekingfire.comTim Daneliuk
tundra@tundraware.comTim Hemel
tim@n2it.netTim Niemueller
tim@niemueller.deTim Pozar
pozar@lns.comTim Singletary
tsingle@sunland.gsfc.nasa.govTim Welch
ports@thepentagon.orgTim Wilkinson
tim@sarc.city.ac.ukTimo J. Rinne
tri@iki.fiTimofeev Vladimir
vovkasm@gmail.comTimothy Beyer
beyert@cs.ucr.eduTimothy Bourke
timbob@bigpond.comTimothy Jensen
toast@blackened.comTimothy Redaelli
drizzt@drizzt.ath.cxTobias Begalke
tobega@spyz.orgTobias Reifenberger
treif@mayn.deTobias Roth
ports@fsck.chToby Allsopp
toby@mi6.gen.nzTodd Miller
millert@openbsd.orgTodd Mortensen
todd@thisisa.comTofig Suleymanov
tofig@freebsd.azTom
root@majestix.cmr.noTom Carrick
knyghtmare@knyghtmare.comTom Gray - DCA
dcasba@rain.orgTom Jobbins
tom@tom.tjTom Mortensen
tom@tavrasm.orgTom Mueller-Kortkamp
tmueko@kommunity.netTom Pusateri
pusateri@juniper.netTom Rush
tarush@mindspring.comTom Samplonius
tom@misery.sdf.comTomas Verbaitis
tomasv@megalogika.ltTomasz Walaszek
tmwalaszek@gmail.comTomaz Muraus
kami@k5-storitve.netTomek Cedro
tomek.cedro@gmail.comTomohiko Kurahashi
kura@melchior.q.t.u-tokyo.ac.jpTomoyuki Sakurai
cherry@trombik.orgToni Andjelkovic
toni@soth.atToni Gundogdu
legatvs@gmail.comToni Viemero
toni.viemero@iki.fiTony Kimball
alk@Think.COMTony Li
tli@jnx.comTony Lynn
wing@cc.nsysu.edu.twTony Maher
tonym@biolateral.com.auTony Shadwick
numbski@hksilver.netTor Halvard "Squat" Furulund
squat@squat.noTorbjorn Granlund
tege@matematik.su.seToshihiko SHIMOKAWA
toshi@tea.forus.or.jpToshihiro Kanda
candy@kgc.co.jpToshiomi Moriki
Toshiomi.Moriki@ma1.seikyou.ne.jpToshiya SAITOH
toshiya@saitoh.nuTravis Campbell
hcoyote@ghostar.orgTravis Poppe
tlp@liquidx.orgTrefor S.
trefor@flevel.co.ukTrenton Schulz
twschulz@cord.eduTrevor Blackwell
tlb@viaweb.comTrevor Cornpropst
tcornpropst@cox.netTroels Kofoed Jacobsen
tkjacobsen@gmail.comTsung-Han Yeh
snowfly@yuntech.edu.twTz-Huan Huang
tzhuan@gmail.comTzanetos Balitsaris
tzabal@it.teithe.grUMENO Takashi
umeno@rr.iij4u.or.jpURATA Shuichiro
s-urata@nmit.tmg.nec.co.jpUdo Schweigert
udo.schweigert@siemens.comUffe Jakobsen
uffe@uffe.orgUgo Paternostro
paterno@dsi.unifi.itUlf Kieber
kieber@sax.deUlli Linzen
ulli@perceval.camelot.deUllrich Franke
trash.esiac@googlemail.comUwe Arndt
arndt@mailhost.uni-koblenz.deUwe Pierau
uwe.pierau@tu-clausthal.deVaggelis Typaldos
frances@mylannet.grVadim Belman
voland@catpipe.netVadim Chekan
vadim@gc.lviv.uaVadim Goncharov
vadim_nuclight@mail.ruVadim Kolontsov
vadim@tversu.ac.ruVadim Kurland
vadim@fwbuilder.orgVadim Mikhailov
mvp@braz.ruVaida Bogdan
vaida.bogdan@gmail.comVaidas Zlotkus
r2@music.ltValentin Nechayev
netch@lucky.netValentin Zahariev
curly@e-card.bgValery Komarov
komarov@valerka.netVan Jacobson
van@ee.lbl.govVany Serezhkin
ivan@serezhkin.comVaclav Haisman
v.haisman@sh.cvut.czVasek Balcar
vasek@ti.czVasily V. Grechishnikov
bazilio@ns1.ied-vorstu.ac.ruVasim Valejev
vasim@uddias.diaspro.comVassili Tchersky
vt@bsd-fr.orgVernon J. Schryver
vjs@mica.denver.sgi.comVeselin Slavov
vess@btc.netVic Abell
abe@cc.purdue.eduVictor Cruceru
victor.cruceru@gmail.comVictor Popov
v.a.popov@gmail.comVictor Semionov
semionov@mail.bgViktor Fomichev
vfom@narod.ruVille Eerola
ve@sci.fiVince Valenti
vince@blue-box.netVincent Poy
vince@DNALOGIC.NETVincent Tantardini
vinc@freebsd-fr.orgVincenzo Capuano
VCAPUANO@vmprofs.esoc.esa.deVirgil Champlin
champlin@pa.dec.comVitaly Magerya
vmagerya@gmail.comVivek Khera
vivek@khera.orgVlad GALU
dudu@dudu.roVlad V. Teterya
vlad@vlad.uz.uaVladimir A. Jakovenko
vovik@ntu-kpi.kiev.uaVladimir Gorelov
virtual.lark@gmail.comVladimir Kurtikov
vk@vk.pp.ruVladimir Kushnir
kushn@mail.kar.netVladimir Osintsev
oc@nm.ruVladimir Savichev
vlad@ariel.phys.wesleyan.eduVolker Theile
votdev@gmx.deVolker Quetschke
quetschke@scytek.deVolodymyr Kostyrko
c.kworr@gmail.comVsevolod Lobko
seva@ip.net.uaVyacheslav Anikin
ghos@mail.ruVyacheslav Ivanchenko
ivi@dhs.net.ruW. Gerald Hicks
wghicks@bellsouth.netW. Richard Stevens
rstevens@noao.eduWaitman Gobble
waitman@waitman.netWalt Howard
howard@ee.utah.eduWalt M. Shandruk
walt@erudition.netWalter Hop
walter@binity.comWalter Venable
weaseal@hotmail.comWarren Toomey
wkt@csadfa.cs.adfa.oz.auWatanabe Kazuhiro
CQG00620@nifty.ne.jpWayne Scott
wscott@ichips.intel.comWei-Hao Syu
whsyu@arbor.ee.ntu.edu.twWei-Yu Chen
weiyu.csie@gmail.comWei Guo
darcsis@gmail.comWerner Griessl
werner@btp1da.phy.uni-bayreuth.deWes Santee
wsantee@wsantee.oz.netWietse Venema
wietse@wzv.win.tue.nlWiljo Heinen
wiljo@freeside.ki.open.deWillem Jan Withagen
wjw@withagen.nlWillem van Engen
wvengen@stack.nlWilliam Jolitz
withheldWilliam Josephson
wkj-freebsd@honk.eecs.harvard.eduWilliam Liao
william@tale.netWojtek Pilorz
wpilorz@celebris.bdk.lublin.plWolfgang Helbig
helbig@ba-stuttgart.deWolfgang Solfrank
ws@tools.de
- Wolfgang Stanglmeier
- wolf@FreeBSD.org
+ &a.wolf.email;Woodchuck Dave
djv@bedford.netWoody Carey
woodycarey@hotmail.comWouter Van Hemel
wouter@pair.comWu Ching-hong
woju@FreeBSD.ee.Ntu.edu.TW
- &a.wylie;
+ &a.wylie.email;Xavier Beaudouin
kiwi@oav.netYamagi Burmeister
yamagi@yamagi.orgYanhui Shen
shen.elf@gmail.comYann Berthier
yb@bachibouzouk.orgYannis Kotsinos
zookie@med.auth.grYarema
yds@ingress.comYaroslav Terletsky
ts@polynet.lviv.uaYasuhiro Fukama
yasuf@big.or.jpYasuhito FUTATSUKI
futatuki@fureai.or.jpYen-Shuo Su
yssu@CCCA.NCTU.edu.twYi-Feng Tzeng
yftzeng@gmail.comYi-Hsuan Hsin
mhsin@mhsin.orgYing-Chieh Chen
yinjieh@csie.nctu.edu.twYinghong Liu
relaxbsd@gmail.comYixin Jin
yjin@rain.cs.ucla.eduYoichi Asai
yatt@msc.biglobe.ne.jpYoshiaki Uchikawa
yoshiaki@kt.rim.or.jpYoshihiko SARUMRU
mistral@imasy.or.jpYoshihisa NAKAGAWA
y-nakaga@ccs.mt.nec.co.jpYoshikazu Goto
gotoh@ae.anritsu.co.jpYoshimasa Ohnishi
ohnishi@isc.kyutech.ac.jpYoshishige Arai
ryo2@on.rim.or.jpYu-Shun Wang
yushunwa@isi.eduYuan-Chung Hsiao
ychsiao@ychsiao.idv.twYuan Jue
yuanjue@yuanjue.netYuichi MATSUTAKA
matutaka@osa.att.ne.jpYuichiro AIZAWA
yaizawa@mdbl.sfc.keio.ac.jpYujiro MIYATA
miyata@bioele.nuee.nagoya-u.ac.jpYuki SHIMAZU
y.shimazu@nifty.comYuri Kurenkov
y.kurenkov@init.ruYuriy N. Shkandybin
jura@netams.comYuriy Tsibizov
Yuriy.Tsibizov@gfk.ruYusuke Nawano
azuki@azkey.orgYu-Xi Lim
yuxi@gmx.netYuu Yashiki
s974123@cc.matsuyama-u.ac.jpYuuichi Narahara
aconitum@po.teleway.ne.jpYuuki SAWADA
mami@whale.cc.muroran-it.ac.jpYuukis
Ys@PixyGarden.netYuval Yarom
yval@cs.huji.ac.ilYves Fonk
yves@cpcoup5.tn.tudelft.nlYves Fonk
yves@dutncp8.tn.tudelft.nlZach Garner
zach@neurosoft.orgZach Heilig
zach@gaffaneys.comZach Thompson
hideo@lastamericanempire.comZach Zurflu
zach@pabst.bendnet.comZachariah Thompson
lin-chi@lastamericanempire.comZak Johnson
zakj@nox.cxZane C. Bowers
vvelox@vvelox.netZhen REN
bg1tpt@gmail.comZhihao Yuan
lichray@gmail.comZhixiang JIANG
luckrill@yahoo.com.cnZhong Ming-Xun
zmx@mail.CDPA.nsysu.edu.twappleboy
appleboy.tw@gmail.comarci
vega@sophia.inria.frayunyan
ayunyan@gmail.comBartoletti
coder@tuxfamily.orgder Mouse
mouse@Collatz.McRCIM.McGill.EDUPiotr Szerman
pmsz@tlen.plrossiya
rossiya@gmail.com
diff --git a/en_US.ISO8859-1/articles/contributors/contrib.committers.xml b/en_US.ISO8859-1/articles/contributors/contrib.committers.xml
index 3fcedcc145..22cdc7253c 100644
--- a/en_US.ISO8859-1/articles/contributors/contrib.committers.xml
+++ b/en_US.ISO8859-1/articles/contributors/contrib.committers.xml
@@ -1,1689 +1,1689 @@
- &a.ariff;
+ &a.ariff.email;
- &a.tabthorpe;
+ &a.tabthorpe.email;
- &a.eadler;
+ &a.eadler.email;
- &a.akiyama;
+ &a.akiyama.email;
- &a.monthadar;
+ &a.monthadar.email;
- &a.ambrisko;
+ &a.ambrisko.email;
- &a.shaun;
+ &a.shaun.email;
- &a.brix;
+ &a.brix.email;
- &a.jonathan;
+ &a.jonathan.email;
- &a.mandree;
+ &a.mandree.email;
- &a.will;
+ &a.will.email;
- &a.dim;
+ &a.dim.email;
- &a.mva;
+ &a.mva.email;
- &a.araujo;
+ &a.araujo.email;
- &a.mat;
+ &a.mat.email;
- &a.syuu;
+ &a.syuu.email;
- &a.gavin;
+ &a.gavin.email;
- &a.jsa;
+ &a.jsa.email;
- &a.jadawin;
+ &a.jadawin.email;
- &a.timur;
+ &a.timur.email;
- &a.jhb;
+ &a.jhb.email;
- &a.gjb;
+ &a.gjb.email;
- &a.art;
+ &a.art.email;
- &a.kib;
+ &a.kib.email;
- &a.tobez;
+ &a.tobez.email;
- &a.gber;
+ &a.gber.email;
- &a.pb;
+ &a.pb.email;
- &a.tdb;
+ &a.tdb.email;
- &a.gblach;
+ &a.gblach.email;
- &a.mbr;
+ &a.mbr.email;
- &a.wblock;
+ &a.wblock.email;
- &a.novel;
+ &a.novel.email;
- &a.garga;
+ &a.garga.email;
- &a.sbz;
+ &a.sbz.email;
- &a.ebrandi;
+ &a.ebrandi.email;
- &a.harti;
+ &a.harti.email;
- &a.makc;
+ &a.makc.email;
- &a.antoine;
+ &a.antoine.email;
- &a.db;
+ &a.db.email;
- &a.sbruno;
+ &a.sbruno.email;
- &a.brueffer;
+ &a.brueffer.email;
- &a.markus;
+ &a.markus.email;
- &a.oleg;
+ &a.oleg.email;
- &a.jchandra;
+ &a.jchandra.email;
- &a.acm;
+ &a.acm.email;
- &a.gahr;
+ &a.gahr.email;
- &a.adrian;
+ &a.adrian.email;
- &a.dchagin;
+ &a.dchagin.email;
- &a.charnier;
+ &a.charnier.email;
- &a.jon;
+ &a.jon.email;
- &a.loader;
+ &a.loader.email;
- &a.luoqi;
+ &a.luoqi.email;
- &a.ache;
+ &a.ache.email;
- &a.melifaro;
+ &a.melifaro.email;
- &a.theraven;
+ &a.theraven.email;
- &a.davidch;
+ &a.davidch.email;
- &a.marcus;
+ &a.marcus.email;
- &a.tijl;
+ &a.tijl.email;
- &a.rakuco;
+ &a.rakuco.email;
- &a.alc;
+ &a.alc.email;
- &a.cracauer;
+ &a.cracauer.email;
- &a.brucec;
+ &a.brucec.email;
- &a.culot;
+ &a.culot.email;
- &a.joel;
+ &a.joel.email;
- &a.bapt;
+ &a.bapt.email;
- &a.davidc;
+ &a.davidc.email;
- &a.brd;
+ &a.brd.email;
- &a.brooks;
+ &a.brooks.email;
- &a.pjd;
+ &a.pjd.email;
- &a.jwd;
+ &a.jwd.email;
- &a.carl;
+ &a.carl.email;
- &a.vd;
+ &a.vd.email;
- &a.rdivacky;
+ &a.rdivacky.email;
- &a.mdodd;
+ &a.mdodd.email;
- &a.danfe;
+ &a.danfe.email;
- &a.dd;
+ &a.dd.email;
- &a.iedowse;
+ &a.iedowse.email;
- &a.bdrewery;
+ &a.bdrewery.email;
- &a.gad;
+ &a.gad.email;
- &a.olivierd;
+ &a.olivierd.email;
- &a.bruno;
+ &a.bruno.email;
- &a.ale;
+ &a.ale.email;
- &a.peadar;
+ &a.peadar.email;
- &a.deischen;
+ &a.deischen.email;
- &a.eivind;
+ &a.eivind.email;
- &a.julian;
+ &a.julian.email;
- &a.ae;
+ &a.ae.email;
- &a.lme;
+ &a.lme.email;
- &a.rse;
+ &a.rse.email;
- &a.ru;
+ &a.ru.email;
- &a.le;
+ &a.le.email;
- &a.se;
+ &a.se.email;
- &a.bde;
+ &a.bde.email;
- &a.jasone;
+ &a.jasone.email;
- &a.bf;
+ &a.bf.email;
- &a.madpilot;
+ &a.madpilot.email;
- &a.rafan;
+ &a.rafan.email;
- &a.stefanf;
+ &a.stefanf.email;
- &a.scf;
+ &a.scf.email;
- &a.feld;
+ &a.feld.email;
- &a.green;
+ &a.green.email;
- &a.lioux;
+ &a.lioux.email;
- &a.fanf;
+ &a.fanf.email;
- &a.mdf;
+ &a.mdf.email;
- &a.blackend;
+ &a.blackend.email;
- &a.olli;
+ &a.olli.email;
- &a.decke;
+ &a.decke.email;
- &a.gallatin;
+ &a.gallatin.email;
- &a.avg;
+ &a.avg.email;
- &a.beat;
+ &a.beat.email;
- &a.danger;
+ &a.danger.email;
- &a.sjg;
+ &a.sjg.email;
- &a.gibbs;
+ &a.gibbs.email;
- &a.pfg;
+ &a.pfg.email;
- &a.girgen;
+ &a.girgen.email;
- &a.pgollucci;
+ &a.pgollucci.email;
- &a.trociny;
+ &a.trociny.email;
- &a.daichi;
+ &a.daichi.email;
- &a.bgray;
+ &a.bgray.email;
- &a.dg;
+ &a.dg.email;
- &a.grehan;
+ &a.grehan.email;
- &a.jamie;
+ &a.jamie.email;
- &a.edwin;
+ &a.edwin.email;
- &a.wg;
+ &a.wg.email;
- &a.bar;
+ &a.bar.email;
- &a.jmg;
+ &a.jmg.email;
- &a.mjg;
+ &a.mjg.email;
- &a.vg;
+ &a.vg.email;
- &a.jhale;
+ &a.jhale.email;
- &a.smh;
+ &a.smh.email;
- &a.ehaupt;
+ &a.ehaupt.email;
- &a.jhay;
+ &a.jhay.email;
- &a.jh;
+ &a.jh.email;
- &a.jgh;
+ &a.jgh.email;
- &a.ghelmer;
+ &a.ghelmer.email;
- &a.wen;
+ &a.wen.email;
- &a.dhn;
+ &a.dhn.email;
- &a.jhibbits;
+ &a.jhibbits.email;
- &a.nhibma;
+ &a.nhibma.email;
- &a.pho;
+ &a.pho.email;
- &a.mich;
+ &a.mich.email;
- &a.cognet;
+ &a.cognet.email;
- &a.sunpoet;
+ &a.sunpoet.email;
- &a.lwhsu;
+ &a.lwhsu.email;
- &a.chinsan;
+ &a.chinsan.email;
- &a.davide;
+ &a.davide.email;
- &a.iwasaki;
+ &a.iwasaki.email;
- &a.mjacob;
+ &a.mjacob.email;
- &a.versus;
+ &a.versus.email;
- &a.raj;
+ &a.raj.email;
- &a.gj;
+ &a.gj.email;
- &a.weongyo;
+ &a.weongyo.email;
- &a.peterj;
+ &a.peterj.email;
- &a.jinmei;
+ &a.jinmei.email;
- &a.ahze;
+ &a.ahze.email;
- &a.markj;
+ &a.markj.email;
- &a.tj;
+ &a.tj.email;
- &a.kan;
+ &a.kan.email;
- &a.bjk;
+ &a.bjk.email;
- &a.phk;
+ &a.phk.email;
- &a.pluknet;
+ &a.pluknet.email;
- &a.cokane;
+ &a.cokane.email;
- &a.kargl;
+ &a.kargl.email;
- &a.kato;
+ &a.kato.email;
- &a.kris;
+ &a.kris.email;
- &a.keramida;
+ &a.keramida.email;
- &a.arved;
+ &a.arved.email;
- &a.fjoe;
+ &a.fjoe.email;
- &a.manolis;
+ &a.manolis.email;
- &a.kientzle;
+ &a.kientzle.email;
- &a.jkim;
+ &a.jkim.email;
- &a.jceel;
+ &a.jceel.email;
- &a.koobs;
+ &a.koobs.email;
- &a.jkois;
+ &a.jkois.email;
- &a.motoyuki;
+ &a.motoyuki.email;
- &a.maxim;
+ &a.maxim.email;
- &a.taras;
+ &a.taras.email;
- &a.jkoshy;
+ &a.jkoshy.email;
- &a.wkoszek;
+ &a.wkoszek.email;
- &a.ak;
+ &a.ak.email;
- &a.skreuzer;
+ &a.skreuzer.email;
- &a.gabor;
+ &a.gabor.email;
- &a.anchie;
+ &a.anchie.email;
- &a.rik;
+ &a.rik.email;
- &a.kuriyama;
+ &a.kuriyama.email;
- &a.gleb;
+ &a.gleb.email;
- &a.rene;
+ &a.rene.email;
- &a.jlaffaye;
+ &a.jlaffaye.email;
- &a.clement;
+ &a.clement.email;
- &a.mlaier;
+ &a.mlaier.email;
- &a.erwin;
+ &a.erwin.email;
- &a.martymac;
+ &a.martymac.email;
- &a.glarkin;
+ &a.glarkin.email;
- &a.benl;
+ &a.benl.email;
- &a.dru;
+ &a.dru.email;
- &a.jlh;
+ &a.jlh.email;
- &a.leeym;
+ &a.leeym.email;
- &a.sam;
+ &a.sam.email;
- &a.oliver;
+ &a.oliver.email;
- &a.grog;
+ &a.grog.email;
- &a.netchild;
+ &a.netchild.email;
- &a.ian;
+ &a.ian.email;
- &a.achim;
+ &a.achim.email;
- &a.truckman;
+ &a.truckman.email;
- &a.glewis;
+ &a.glewis.email;
- &a.qingli;
+ &a.qingli.email;
- &a.delphij;
+ &a.delphij.email;
- &a.avatar;
+ &a.avatar.email;
- &a.pclin;
+ &a.pclin.email;
- &a.yzlin;
+ &a.yzlin.email;
- &a.linimon;
+ &a.linimon.email;
- &a.dryice;
+ &a.dryice.email;
- &a.kevlo;
+ &a.kevlo.email;
- &a.zml;
+ &a.zml.email;
- &a.nox;
+ &a.nox.email;
- &a.remko;
+ &a.remko.email;
- &a.avl;
+ &a.avl.email;
- &a.issyl0;
+ &a.issyl0.email;
- &a.scottl;
+ &a.scottl.email;
- &a.imp;
+ &a.imp.email;
- &a.ade;
+ &a.ade.email;
- &a.eri;
+ &a.eri.email;
- &a.pav;
+ &a.pav.email;
- &a.rmacklem;
+ &a.rmacklem.email;
- &a.kmacy;
+ &a.kmacy.email;
- &a.rm;
+ &a.rm.email;
- &a.mtm;
+ &a.mtm.email;
- &a.jmallett;
+ &a.jmallett.email;
- &a.dwmalone;
+ &a.dwmalone.email;
- &a.nobutaka;
+ &a.nobutaka.email;
- &a.amdmi3;
+ &a.amdmi3.email;
- &a.dmarion;
+ &a.dmarion.email;
- &a.kwm;
+ &a.kwm.email;
- &a.emaste;
+ &a.emaste.email;
- &a.cherry;
+ &a.cherry.email;
- &a.matusita;
+ &a.matusita.email;
- &a.mm;
+ &a.mm.email;
- &a.sem;
+ &a.sem.email;
- &a.mckay;
+ &a.mckay.email;
- &a.mckusick;
+ &a.mckusick.email;
- &a.jmelo;
+ &a.jmelo.email;
- &a.ken;
+ &a.ken.email;
- &a.mezz;
+ &a.mezz.email;
- &a.dinoex;
+ &a.dinoex.email;
- &a.sanpei;
+ &a.sanpei.email;
- &a.rmh;
+ &a.rmh.email;
- &a.stephen;
+ &a.stephen.email;
- &a.marcel;
+ &a.marcel.email;
- &a.kmoore;
+ &a.kmoore.email;
- &a.marck;
+ &a.marck.email;
- &a.mav;
+ &a.mav.email;
- &a.lippe;
+ &a.lippe.email;
- &a.markm;
+ &a.markm.email;
- &a.knu;
+ &a.knu.email;
- &a.max;
+ &a.max.email;
- &a.maho;
+ &a.maho.email;
- &a.trasz;
+ &a.trasz.email;
- &a.neel;
+ &a.neel.email;
- &a.dbn;
+ &a.dbn.email;
- &a.bland;
+ &a.bland.email;
- &a.gnn;
+ &a.gnn.email;
- &a.simon;
+ &a.simon.email;
- &a.rnoland;
+ &a.rnoland.email;
- &a.anders;
+ &a.anders.email;
- &a.obrien;
+ &a.obrien.email;
- &a.ohauer;
+ &a.ohauer.email;
- &a.olgeni;
+ &a.olgeni.email;
- &a.andre;
+ &a.andre.email;
- &a.osa;
+ &a.osa.email;
- &a.philip;
+ &a.philip.email;
- &a.jpaetzel;
+ &a.jpaetzel.email;
- &a.pgj;
+ &a.pgj.email;
- &a.hiren;
+ &a.hiren.email;
- &a.hmp;
+ &a.hmp.email;
- &a.fluffy;
+ &a.fluffy.email;
- &a.np;
+ &a.np.email;
- &a.wpaul;
+ &a.wpaul.email;
- &a.rpaulo;
+ &a.rpaulo.email;
- &a.dumbbell;
+ &a.dumbbell.email;
- &a.mp;
+ &a.mp.email;
- &a.pawel;
+ &a.pawel.email;
- &a.roam;
+ &a.roam.email;
- &a.cperciva;
+ &a.cperciva.email;
- &a.alfred;
+ &a.alfred.email;
- &a.csjp;
+ &a.csjp.email;
- &a.wes;
+ &a.wes.email;
- &a.gerald;
+ &a.gerald.email;
- &a.sperber;
+ &a.sperber.email;
- &a.sepotvin;
+ &a.sepotvin.email;
- &a.mpp;
+ &a.mpp.email;
- &a.thomas;
+ &a.thomas.email;
- &a.hq;
+ &a.hq.email;
- &a.dfr;
+ &a.dfr.email;
- &a.attilio;
+ &a.attilio.email;
- &a.lbr;
+ &a.lbr.email;
- &a.darrenr;
+ &a.darrenr.email;
- &a.crees;
+ &a.crees.email;
- &a.mr;
+ &a.mr.email;
- &a.bcr;
+ &a.bcr.email;
- &a.trhodes;
+ &a.trhodes.email;
- &a.benno;
+ &a.benno.email;
- &a.beech;
+ &a.beech.email;
- &a.matteo;
+ &a.matteo.email;
- &a.luigi;
+ &a.luigi.email;
- &a.jeff;
+ &a.jeff.email;
- &a.roberto;
+ &a.roberto.email;
- &a.rodrigc;
+ &a.rodrigc.email;
- &a.guido;
+ &a.guido.email;
- &a.rea;
+ &a.rea.email;
- &a.ray;
+ &a.ray.email;
- &a.ps;
+ &a.ps.email;
- &a.wsalamon;
+ &a.wsalamon.email;
- &a.bsam;
+ &a.bsam.email;
- &a.hrs;
+ &a.hrs.email;
- &a.bschmidt;
+ &a.bschmidt.email;
- &a.sos;
+ &a.sos.email;
- &a.wosch;
+ &a.wosch.email;
- &a.ed;
+ &a.ed.email;
- &a.cy;
+ &a.cy.email;
- &a.das;
+ &a.das.email;
- &a.scheidell;
+ &a.scheidell.email;
- &a.schweikh;
+ &a.schweikh.email;
- &a.matthew;
+ &a.matthew.email;
- &a.tmseck;
+ &a.tmseck.email;
- &a.stas;
+ &a.stas.email;
- &a.hselasky;
+ &a.hselasky.email;
- &a.johans;
+ &a.johans.email;
- &a.lev;
+ &a.lev.email;
- &a.gshapiro;
+ &a.gshapiro.email;
- &a.wxs;
+ &a.wxs.email;
- &a.nork;
+ &a.nork.email;
- &a.simokawa;
+ &a.simokawa.email;
- &a.syrinx;
+ &a.syrinx.email;
- &a.vanilla;
+ &a.vanilla.email;
- &a.ashish;
+ &a.ashish.email;
- &a.silby;
+ &a.silby.email;
- &a.bms;
+ &a.bms.email;
- &a.jls;
+ &a.jls.email;
- &a.demon;
+ &a.demon.email;
- &a.skv;
+ &a.skv.email;
- &a.flo;
+ &a.flo.email;
- &a.glebius;
+ &a.glebius.email;
- &a.kensmith;
+ &a.kensmith.email;
- &a.des;
+ &a.des.email;
- &a.sobomax;
+ &a.sobomax.email;
- &a.asomers;
+ &a.asomers.email;
- &a.brian;
+ &a.brian.email;
- &a.sson;
+ &a.sson.email;
- &a.ssouhlal;
+ &a.ssouhlal.email;
- &a.loos;
+ &a.loos.email;
- &a.uqs;
+ &a.uqs.email;
- &a.mohans;
+ &a.mohans.email;
- &a.vsevolod;
+ &a.vsevolod.email;
- &a.zi;
+ &a.zi.email;
- &a.lstewart;
+ &a.lstewart.email;
- &a.rrs;
+ &a.rrs.email;
- &a.rstone;
+ &a.rstone.email;
- &a.xride;
+ &a.xride.email;
- &a.marius;
+ &a.marius.email;
- &a.cs;
+ &a.cs.email;
- &a.sumikawa;
+ &a.sumikawa.email;
- &a.clsung;
+ &a.clsung.email;
- &a.ryusuke;
+ &a.ryusuke.email;
- &a.suz;
+ &a.suz.email;
- &a.nyan;
+ &a.nyan.email;
- &a.sahil;
+ &a.sahil.email;
- &a.tota;
+ &a.tota.email;
- &a.tanimura;
+ &a.tanimura.email;
- &a.romain;
+ &a.romain.email;
- &a.sylvio;
+ &a.sylvio.email;
- &a.dteske;
+ &a.dteske.email;
- &a.itetcu;
+ &a.itetcu.email;
- &a.mi;
+ &a.mi.email;
- &a.gordon;
+ &a.gordon.email;
- &a.lth;
+ &a.lth.email;
- &a.jase;
+ &a.jase.email;
- &a.lx;
+ &a.lx.email;
- &a.fabient;
+ &a.fabient.email;
- &a.thierry;
+ &a.thierry.email;
- &a.thompsa;
+ &a.thompsa.email;
- &a.flz;
+ &a.flz.email;
- &a.yar;
+ &a.yar.email;
- &a.jilles;
+ &a.jilles.email;
- &a.andreast;
+ &a.andreast.email;
- &a.ganbold;
+ &a.ganbold.email;
- &a.tuexen;
+ &a.tuexen.email;
- &a.andrew;
+ &a.andrew.email;
- &a.gonzo;
+ &a.gonzo.email;
- &a.ume;
+ &a.ume.email;
- &a.ups;
+ &a.ups.email;
- &a.vanhu;
+ &a.vanhu.email;
- &a.bryanv;
+ &a.bryanv.email;
- &a.avilla;
+ &a.avilla.email;
- &a.nivit;
+ &a.nivit.email;
- &a.jfv;
+ &a.jfv.email;
- &a.ivoras;
+ &a.ivoras.email;
- &a.ticso;
+ &a.ticso.email;
- &a.stefan;
+ &a.stefan.email;
- &a.kaiw;
+ &a.kaiw.email;
- &a.takawata;
+ &a.takawata.email;
- &a.rwatson;
+ &a.rwatson.email;
- &a.adamw;
+ &a.adamw.email;
- &a.naddy;
+ &a.naddy.email;
- &a.peter;
+ &a.peter.email;
- &a.dwhite;
+ &a.dwhite.email;
- &a.nwhitehorn;
+ &a.nwhitehorn.email;
- &a.miwi;
+ &a.miwi.email;
- &a.swills;
+ &a.swills.email;
- &a.wollman;
+ &a.wollman.email;
- &a.joerg;
+ &a.joerg.email;
- &a.davidxu;
+ &a.davidxu.email;
- &a.emax;
+ &a.emax.email;
- &a.yongari;
+ &a.yongari.email;
- &a.zec;
+ &a.zec.email;
- &a.bz;
+ &a.bz.email;
- &a.zeising;
+ &a.zeising.email;
- &a.phantom;
+ &a.phantom.email;
- &a.sephe;
+ &a.sephe.email;
- &a.zont;
+ &a.zont.email;
- &a.az;
+ &a.az.email;
diff --git a/en_US.ISO8859-1/articles/contributors/contrib.corealumni.xml b/en_US.ISO8859-1/articles/contributors/contrib.corealumni.xml
index 45028ce029..e2a4163d48 100644
--- a/en_US.ISO8859-1/articles/contributors/contrib.corealumni.xml
+++ b/en_US.ISO8859-1/articles/contributors/contrib.corealumni.xml
@@ -1,188 +1,188 @@
- &a.attilio; (2012)
+ &a.attilio.email; (2012)
- &a.wilko; (2006 - 2012)
+ &a.wilko.email; (2006 - 2012)
- &a.brooks; (2006 - 2012)
+ &a.brooks.email; (2006 - 2012)
- &a.pav; (2010 - 2012)
+ &a.pav.email; (2010 - 2012)
- &a.cperciva; (2010 - 2012)
+ &a.cperciva.email; (2010 - 2012)
- &a.rwatson; (2000 - 2012)
+ &a.rwatson.email; (2000 - 2012)
- &a.keramida; (2006 - 2010)
+ &a.keramida.email; (2006 - 2010)
- &a.kris; (2008 - 2010)
+ &a.kris.email; (2008 - 2010)
- &a.gnn; (2006 - 2010)
+ &a.gnn.email; (2006 - 2010)
- &a.murray; (2002 - 2010)
+ &a.murray.email; (2002 - 2010)
- &a.wes; (2002 - 2008)
+ &a.wes.email; (2002 - 2008)
- &a.imp; (2000 - 2008, 2010 - 2012)
+ &a.imp.email; (2000 - 2008, 2010 - 2012)
- &a.markm; (2002 - 2006)
+ &a.markm.email; (2002 - 2006)
- &a.kuriyama; (2002 - 2006)
+ &a.kuriyama.email; (2002 - 2006)
- &a.scottl; (2004 - 2005)
+ &a.scottl.email; (2004 - 2005)
- &a.grog; (2000 - 2004)
+ &a.grog.email; (2000 - 2004)
- &a.dg; (1992 - 2002)
+ &a.dg.email; (1992 - 2002)
- &a.dfr; (1999 - 2002)
+ &a.dfr.email; (1999 - 2002)
- &a.msmith; (2000 - 2002)
+ &a.msmith.email; (2000 - 2002)
- &a.jkh; (1992 - 2002)
+ &a.jkh.email; (1992 - 2002)
- &a.asami; (1993 - 2001)
+ &a.asami.email; (1993 - 2001)
- &a.ache; (1993 - 2000)
+ &a.ache.email; (1993 - 2000)
- &a.jmb; (1993 - 2000)
+ &a.jmb.email; (1993 - 2000)
- &a.bde; (1992 - 2000)
+ &a.bde.email; (1992 - 2000)
- &a.gibbs; (1993 - 2000)
+ &a.gibbs.email; (1993 - 2000)
- &a.rich; (1994 - 2000)
+ &a.rich.email; (1994 - 2000)
- &a.phk; (1992 - 2000)
+ &a.phk.email; (1992 - 2000)
- &a.gpalmer; (1993 - 2000)
+ &a.gpalmer.email; (1993 - 2000)
- &a.sos; (1993 - 2000)
+ &a.sos.email; (1993 - 2000)
- &a.wollman; (1993 - 2000)
+ &a.wollman.email; (1993 - 2000)
- &a.joerg; (1995 - 2000)
+ &a.joerg.email; (1995 - 2000)
- &a.jdp; (1997 - 2000)
+ &a.jdp.email; (1997 - 2000)
- &a.guido; (1995 - 1999)
+ &a.guido.email; (1995 - 1999)
- &a.dyson; (1993 - 1998)
+ &a.dyson.email; (1993 - 1998)
- &a.nate; (1992 - 1996)
+ &a.nate.email; (1992 - 1996)
- &a.rgrimes; (1992 - 1995)
+ &a.rgrimes.email; (1992 - 1995)
- &a.ats; (1992 - 1995)
+ &a.ats.email; (1992 - 1995)
- &a.csgr; (1993 - 1995)
+ &a.csgr.email; (1993 - 1995)
- &a.paul; (1992 - 1995)
+ &a.paul.email; (1992 - 1995)
- &a.smace; (1993 - 1994)
+ &a.smace.email; (1993 - 1994)
- &a.alm; (1993 - 1994)
+ &a.alm.email; (1993 - 1994)
- &a.chmr; (1993 - 1994)
+ &a.chmr.email; (1993 - 1994)
- &a.jtc; (1992 - 1993)
+ &a.jtc.email; (1992 - 1993)
diff --git a/en_US.ISO8859-1/articles/contributors/contrib.develalumni.xml b/en_US.ISO8859-1/articles/contributors/contrib.develalumni.xml
index 319651d9d9..5ef408d38e 100644
--- a/en_US.ISO8859-1/articles/contributors/contrib.develalumni.xml
+++ b/en_US.ISO8859-1/articles/contributors/contrib.develalumni.xml
@@ -1,1125 +1,1125 @@
- &a.randi; (2010 - 2012)
+ &a.randi.email; (2010 - 2012)
- &a.zack; (2010 - 2012)
+ &a.zack.email; (2010 - 2012)
- &a.erik; (2008 - 2012)
+ &a.erik.email; (2008 - 2012)
- &a.carvay; (2008 - 2012)
+ &a.carvay.email; (2008 - 2012)
- &a.lulf; (2007 - 2012)
+ &a.lulf.email; (2007 - 2012)
- &a.mnag; (2005 - 2012)
+ &a.mnag.email; (2005 - 2012)
- &a.ceri; (2002 - 2012)
+ &a.ceri.email; (2002 - 2012)Doug Barton (2000 - 2012)
- &a.wilko; (2000 - 2012)
+ &a.wilko.email; (2000 - 2012)
- &a.murray; (2000 - 2012)
+ &a.murray.email; (2000 - 2012)
- &a.steve; (1996 - 2012)
+ &a.steve.email; (1996 - 2012)
- &a.jacula; (2010 - 2011)
+ &a.jacula.email; (2010 - 2011)
- &a.nemoliu; (2007 - 2011)
+ &a.nemoliu.email; (2007 - 2011)
- &a.alexbl; (2006 - 2011)
+ &a.alexbl.email; (2006 - 2011)
- &a.alepulver; (2006 - 2011)
+ &a.alepulver.email; (2006 - 2011)
- &a.tmclaugh; (2005 - 2011)
+ &a.tmclaugh.email; (2005 - 2011)
- &a.anray; (2005 - 2011)
+ &a.anray.email; (2005 - 2011)
- &a.niels; (2004 - 2011)
+ &a.niels.email; (2004 - 2011)
- &a.sergei; (2003 - 2011)
+ &a.sergei.email; (2003 - 2011)
- &a.krion; (2003 - 2011)
+ &a.krion.email; (2003 - 2011)
- &a.mux; (2002 - 2011)
+ &a.mux.email; (2002 - 2011)
- &a.hm; (1998 - 2011)
+ &a.hm.email; (1998 - 2011)
- &a.ijliao; (2001 - 2011)
+ &a.ijliao.email; (2001 - 2011)
- &a.scrappy; (1996 - 2011)
+ &a.scrappy.email; (1996 - 2011)
- &a.snb; (2009 - 2010)
+ &a.snb.email; (2009 - 2010)
- &a.cbzimmer; (2009 - 2010)
+ &a.cbzimmer.email; (2009 - 2010)
- &a.bushman; (2007 - 2010)
+ &a.bushman.email; (2007 - 2010)
- &a.benjsc; (2007 - 2010)
+ &a.benjsc.email; (2007 - 2010)
- &a.rink; (2006 - 2010)
+ &a.rink.email; (2006 - 2010)
- &a.piso; (2006 - 2010)
+ &a.piso.email; (2006 - 2010)
- &a.laszlof; (2006 - 2010)
+ &a.laszlof.email; (2006 - 2010)
- &a.bvs; (2005 - 2010)
+ &a.bvs.email; (2005 - 2010)
- &a.barner; (2005 - 2010)
+ &a.barner.email; (2005 - 2010)
- &a.vs; (2004 - 2010)
+ &a.vs.email; (2004 - 2010)
- &a.dds; (2003 - 2010)
+ &a.dds.email; (2003 - 2010)
- &a.perky; (2002 - 2010)
+ &a.perky.email; (2002 - 2010)
- &a.yoichi; (2001 - 2010)
+ &a.yoichi.email; (2001 - 2010)
- &a.okazaki; (2000 - 2010)
+ &a.okazaki.email; (2000 - 2010)
- &a.cjh; (2000 - 2010)
+ &a.cjh.email; (2000 - 2010)
- &a.jesusr; (1998 - 2010)
+ &a.jesusr.email; (1998 - 2010)
- &a.sat; (2006 - 2009)
+ &a.sat.email; (2006 - 2009)
- &a.jcamou; (2005 - 2009)
+ &a.jcamou.email; (2005 - 2009)
- &a.rushani; (2003 - 2009)
+ &a.rushani.email; (2003 - 2009)
- &a.nik; (1998 - 2009)
+ &a.nik.email; (1998 - 2009)
- &a.lofi; (2003 - 2009)
+ &a.lofi.email; (2003 - 2009)
- &a.den; (2003 - 2009)
+ &a.den.email; (2003 - 2009)
- &a.obraun; (2002 - 2009)
+ &a.obraun.email; (2002 - 2009)
- &a.anholt; (2002 - 2009)
+ &a.anholt.email; (2002 - 2009)
- &a.mwlucas; (2001 - 2009)
+ &a.mwlucas.email; (2001 - 2009)
- &a.chern; (2001 - 2009)
+ &a.chern.email; (2001 - 2009)
- &a.mita; (2000 - 2009)
+ &a.mita.email; (2000 - 2009)
- &a.horikawa; (2000 - 2009)
+ &a.horikawa.email; (2000 - 2009)
- &a.clive; (2000 - 2009)
+ &a.clive.email; (2000 - 2009)
- &a.bmah; (2000 - 2009)
+ &a.bmah.email; (2000 - 2009)
- &a.gioria; (1999 - 2009)
+ &a.gioria.email; (1999 - 2009)
- &a.tg; (1995 - 2009)
+ &a.tg.email; (1995 - 2009)
- &a.kishore; (2007 - 2008)
+ &a.kishore.email; (2007 - 2008)
- &a.twinterg; (2006 - 2008)
+ &a.twinterg.email; (2006 - 2008)
- &a.koitsu; (2006 - 2008)
+ &a.koitsu.email; (2006 - 2008)
- &a.bakul; (2006 - 2008)
+ &a.bakul.email; (2006 - 2008)
- &a.jylefort; (2005 - 2008)
+ &a.jylefort.email; (2005 - 2008)
- &a.garys; (2005 - 2008)
+ &a.garys.email; (2005 - 2008)
- &a.damien; (2005 - 2008)
+ &a.damien.email; (2005 - 2008)
- &a.aaron; (2005 - 2008)
+ &a.aaron.email; (2005 - 2008)
- &a.tackerman; (2004 - 2008)
+ &a.tackerman.email; (2004 - 2008)
- &a.metal; (2004 - 2008)
+ &a.metal.email; (2004 - 2008)
- &a.marks; (2004 - 2008)
+ &a.marks.email; (2004 - 2008)
- &a.lesi; (2004 - 2008)
+ &a.lesi.email; (2004 - 2008)
- &a.josef; (2004 - 2008)
+ &a.josef.email; (2004 - 2008)
- &a.dhartmei; (2004 - 2008)
+ &a.dhartmei.email; (2004 - 2008)
- &a.sah; (2004 - 2008)
+ &a.sah.email; (2004 - 2008)
- &a.rsm; (2003 - 2008)
+ &a.rsm.email; (2003 - 2008)
- &a.hoek; (2003 - 2008)
+ &a.hoek.email; (2003 - 2008)
- &a.eik; (2003 - 2008)
+ &a.eik.email; (2003 - 2008)
- &a.matk; (2003 - 2008)
+ &a.matk.email; (2003 - 2008)
- &a.seanc; (2002 - 2008)
+ &a.seanc.email; (2002 - 2008)
- &a.njl; (2002 - 2008)
+ &a.njl.email; (2002 - 2008)
- &a.ikob; (2002 - 2008)
+ &a.ikob.email; (2002 - 2008)
- &a.pdeuskar; (2001 - 2008)
+ &a.pdeuskar.email; (2001 - 2008)
- &a.mikeh; (2001 - 2008)
+ &a.mikeh.email; (2001 - 2008)
- &a.shiba; (2000 - 2008)
+ &a.shiba.email; (2000 - 2008)
- &a.pat; (2000 - 2008)
+ &a.pat.email; (2000 - 2008)
- &a.onoe; (2000 - 2008)
+ &a.onoe.email; (2000 - 2008)
- &a.lkoeller; (2000 - 2008)
+ &a.lkoeller.email; (2000 - 2008)
- &a.jayanth; (2000 - 2008)
+ &a.jayanth.email; (2000 - 2008)
- &a.jake; (2000 - 2008)
+ &a.jake.email; (2000 - 2008)
- &a.dmlb; (2000 - 2008)
+ &a.dmlb.email; (2000 - 2008)
- &a.bmilekic; (2000 - 2008)
+ &a.bmilekic.email; (2000 - 2008)
- &a.babkin; (2000 - 2008)
+ &a.babkin.email; (2000 - 2008)
- &a.joe; (1999 - 2008)
+ &a.joe.email; (1999 - 2008)
- &a.imura; (1999 - 2008)
+ &a.imura.email; (1999 - 2008)
- &a.andy; (1999 - 2008)
+ &a.andy.email; (1999 - 2008)
- &a.shige; (1999 - 2008)
+ &a.shige.email; (1999 - 2008)
- &a.hosokawa; (1998 - 2008)
+ &a.hosokawa.email; (1998 - 2008)
- &a.foxfair; (1998 - 2008)
+ &a.foxfair.email; (1998 - 2008)
- &a.billf; (1998 - 2008)
+ &a.billf.email; (1998 - 2008)
- &a.tegge; (1997 - 2008)
+ &a.tegge.email; (1997 - 2008)
- &a.jlemon; (1997 - 2008)
+ &a.jlemon.email; (1997 - 2008)
- &a.fenner; (1996 - 2008)
+ &a.fenner.email; (1996 - 2008)
- &a.andreas; (1996 - 2008)
+ &a.andreas.email; (1996 - 2008)
- &a.jkh; (1993 - 2008)
+ &a.jkh.email; (1993 - 2008)
- &a.jdp; ( - 2008)
+ &a.jdp.email; ( - 2008)
- &a.hsu; ( - 2008)
+ &a.hsu.email; ( - 2008)
- &a.farrokhi; (2006 - 2007)
+ &a.farrokhi.email; (2006 - 2007)
- &a.cel; (2006 - 2007)
+ &a.cel.email; (2006 - 2007)
- &a.vsevolod; (2005 - 2007)
+ &a.vsevolod.email; (2005 - 2007)
- &a.lawrance; (2005 - 2007)
+ &a.lawrance.email; (2005 - 2007)
- &a.rees; (2004 - 2007)
+ &a.rees.email; (2004 - 2007)
- &a.tjr; (2002 - 2007)
+ &a.tjr.email; (2002 - 2007)
- &a.johan; (2002 - 2007)
+ &a.johan.email; (2002 - 2007)
- &a.markp; (2001 - 2007)
+ &a.markp.email; (2001 - 2007)
- &a.jesper; (2001 - 2007)
+ &a.jesper.email; (2001 - 2007)
- &a.eric; (2001 - 2007)
+ &a.eric.email; (2001 - 2007)
- &a.trevor; (2000 - 2007)
+ &a.trevor.email; (2000 - 2007)
- &a.non; (2000 - 2007)
+ &a.non.email; (2000 - 2007)
- &a.kbyanc; (2000 - 2007)
+ &a.kbyanc.email; (2000 - 2007)
- &a.jeh; (2000 - 2007)
+ &a.jeh.email; (2000 - 2007)
- &a.gsutter; (2000 - 2007)
+ &a.gsutter.email; (2000 - 2007)
- &a.bsd; (2000 - 2007)
+ &a.bsd.email; (2000 - 2007)
- &a.tom; (1999 - 2007)
+ &a.tom.email; (1999 - 2007)
- &a.mharo; (1999 - 2007)
+ &a.mharo.email; (1999 - 2007)
- &a.chris; (1999 - 2007)
+ &a.chris.email; (1999 - 2007)
- &a.bp; (1999 - 2007)
+ &a.bp.email; (1999 - 2007)
- &a.archie; (1998 - 2007)
+ &a.archie.email; (1998 - 2007)
- &a.vkashyap; (2004 - 2006)
+ &a.vkashyap.email; (2004 - 2006)
- &a.niklas; (2004 - 2006)
+ &a.niklas.email; (2004 - 2006)
- &a.smkelly; (2003 - 2006)
+ &a.smkelly.email; (2003 - 2006)
- &a.arun; (2003 - 2006)
+ &a.arun.email; (2003 - 2006)
- &a.am; (2003 - 2006)
+ &a.am.email; (2003 - 2006)
- &a.scop; (2002 - 2006)
+ &a.scop.email; (2002 - 2006)
- &a.mheinen; (2002 - 2006)
+ &a.mheinen.email; (2002 - 2006)
- &a.jennifer; (2002 - 2006)
+ &a.jennifer.email; (2002 - 2006)
- &a.adamw; (2002 - 2006)
+ &a.adamw.email; (2002 - 2006)
- &a.znerd; (2001 - 2006)
+ &a.znerd.email; (2001 - 2006)
- &a.keichii; (2001 - 2006)
+ &a.keichii.email; (2001 - 2006)
- &a.ue; (2001 - 2006)
+ &a.ue.email; (2001 - 2006)
- &a.tmm; (2001 - 2006)
+ &a.tmm.email; (2001 - 2006)
- &a.robert; (2001 - 2006)
+ &a.robert.email; (2001 - 2006)
- &a.petef; (2001 - 2006)
+ &a.petef.email; (2001 - 2006)
- &a.mike; (2001 - 2006)
+ &a.mike.email; (2001 - 2006)
- &a.greid; (2001 - 2006)
+ &a.greid.email; (2001 - 2006)
- &a.cjc; (2001 - 2006)
+ &a.cjc.email; (2001 - 2006)
- &a.bbraun; (2001 - 2006)
+ &a.bbraun.email; (2001 - 2006)
- &a.sf; (2000 - 2006)
+ &a.sf.email; (2000 - 2006)
- &a.kiri; (2000 - 2006)
+ &a.kiri.email; (2000 - 2006)
- &a.dannyboy; (2000 - 2006)
+ &a.dannyboy.email; (2000 - 2006)
- &a.ben; (2000 - 2006)
+ &a.ben.email; (2000 - 2006)
- &a.sheldonh; (1999 - 2006)
+ &a.sheldonh.email; (1999 - 2006)
- &a.roger; (1999 - 2006)
+ &a.roger.email; (1999 - 2006)
- &a.nsayer; (1999 - 2006)
+ &a.nsayer.email; (1999 - 2006)
- &a.nbm; (1999 - 2006)
+ &a.nbm.email; (1999 - 2006)
- &a.jedgar; (1999 - 2006)
+ &a.jedgar.email; (1999 - 2006)
- &a.nsouch; (1998 - 2006)
+ &a.nsouch.email; (1998 - 2006)
- &a.nectar; (1998 - 2006)
+ &a.nectar.email; (1998 - 2006)
- &a.mph; (1998 - 2006)
+ &a.mph.email; (1998 - 2006)
- &a.kjc; (1997 - 2006)
+ &a.kjc.email; (1997 - 2006)
- &a.hanai; (1997 - 2006)
+ &a.hanai.email; (1997 - 2006)
- &a.viny; (2004 - 2005)
+ &a.viny.email; (2004 - 2005)
- &a.stephane; (2002 - 2005)
+ &a.stephane.email; (2002 - 2005)
- &a.arr; (2001 - 2005)
+ &a.arr.email; (2001 - 2005)
- &a.sada; (1998 - 2005)
+ &a.sada.email; (1998 - 2005)
- &a.flathill; (1998 - 2005)
+ &a.flathill.email; (1998 - 2005)
- &a.paul; (1993 - 2005)
+ &a.paul.email; (1993 - 2005)
- &a.mini; (2002 - 2004)
+ &a.mini.email; (2002 - 2004)
- &a.emoore; (2002 - 2004)
+ &a.emoore.email; (2002 - 2004)
- &a.wjv; (2001 - 2004)
+ &a.wjv.email; (2001 - 2004)
- &a.rpratt; (2001 - 2004)
+ &a.rpratt.email; (2001 - 2004)
- &a.orion; (2001 - 2004)
+ &a.orion.email; (2001 - 2004)
- &a.logo; (2001 - 2004)
+ &a.logo.email; (2001 - 2004)
- &a.tomsoft; (2000 - 2004)
+ &a.tomsoft.email; (2000 - 2004)
- &a.patrick; (2000 - 2004)
+ &a.patrick.email; (2000 - 2004)
- &a.chm; (2000 - 2004)
+ &a.chm.email; (2000 - 2004)
- &a.taoka; (1999 - 2004)
+ &a.taoka.email; (1999 - 2004)
- &a.jmas; (1999 - 2004)
+ &a.jmas.email; (1999 - 2004)
- &a.dcs; (1999 - 2004)
+ &a.dcs.email; (1999 - 2004)
- &a.dan; (1999 - 2004)
+ &a.dan.email; (1999 - 2004)
- &a.smace; (1993 - 2004)
+ &a.smace.email; (1993 - 2004)
- &a.alex; ( - 2004)
+ &a.alex.email; ( - 2004)
- &a.dwcjr; (2002 - 2003)
+ &a.dwcjr.email; (2002 - 2003)
- &a.zarzycki; (2001 - 2003)
+ &a.zarzycki.email; (2001 - 2003)
- &a.tshiozak; (2001 - 2003)
+ &a.tshiozak.email; (2001 - 2003)
- &a.pirzyk; (2001 - 2003)
+ &a.pirzyk.email; (2001 - 2003)
- &a.wsanchez; (2000 - 2003)
+ &a.wsanchez.email; (2000 - 2003)
- &a.toshi; (2000 - 2003)
+ &a.toshi.email; (2000 - 2003)
- &a.mb; (2000 - 2003)
+ &a.mb.email; (2000 - 2003)
- &a.marko; (2000 - 2003)
+ &a.marko.email; (2000 - 2003)
- &a.furuta; (2000 - 2003)
+ &a.furuta.email; (2000 - 2003)
- &a.bean; (2000 - 2003)
+ &a.bean.email; (2000 - 2003)
- &a.shin; (1999 - 2003)
+ &a.shin.email; (1999 - 2003)
- &a.pho; (1999 - 2003)
+ &a.pho.email; (1999 - 2003)
- &a.newton; (1999 - 2003)
+ &a.newton.email; (1999 - 2003)
- &a.mtaylor; (1999 - 2003)
+ &a.mtaylor.email; (1999 - 2003)
- &a.lile; (1999 - 2003)
+ &a.lile.email; (1999 - 2003)
- &a.jim; (1999 - 2003)
+ &a.jim.email; (1999 - 2003)
- &a.ejc; (1999 - 2003)
+ &a.ejc.email; (1999 - 2003)
- &a.dick; (1999 - 2003)
+ &a.dick.email; (1999 - 2003)
- &a.dbaker; (1999 - 2003)
+ &a.dbaker.email; (1999 - 2003)
- &a.cpiazza; (1999 - 2003)
+ &a.cpiazza.email; (1999 - 2003)
- &a.cp; (1999 - 2003)
+ &a.cp.email; (1999 - 2003)
- &a.thepish; (1998 - 2003)
+ &a.thepish.email; (1998 - 2003)
- &a.semenu; (1998 - 2003)
+ &a.semenu.email; (1998 - 2003)
- &a.rvb; (1998 - 2003)
+ &a.rvb.email; (1998 - 2003)
- &a.rnordier; (1998 - 2003)
+ &a.rnordier.email; (1998 - 2003)
- &a.dt; (1998 - 2003)
+ &a.dt.email; (1998 - 2003)
- &a.dirk; (1998 - 2003)
+ &a.dirk.email; (1998 - 2003)
- &a.dillon; (1998 - 2003)
+ &a.dillon.email; (1998 - 2003)
- &a.stark; (1997 - 2003)
+ &a.stark.email; (1997 - 2003)
- &a.pds; (1997 - 2003)
+ &a.pds.email; (1997 - 2003)
- &a.jseger; (1997 - 2003)
+ &a.jseger.email; (1997 - 2003)
- &a.helbig; (1997 - 2003)
+ &a.helbig.email; (1997 - 2003)
- &a.fsmp; (1997 - 2003)
+ &a.fsmp.email; (1997 - 2003)
- &a.cwt; (1997 - 2003)
+ &a.cwt.email; (1997 - 2003)
- &a.brandon; (1997 - 2003)
+ &a.brandon.email; (1997 - 2003)
- &a.smpatel; (1996 - 2003)
+ &a.smpatel.email; (1996 - 2003)
- &a.msmith; (1996 - 2003)
+ &a.msmith.email; (1996 - 2003)
- &a.mbarkah; (1996 - 2003)
+ &a.mbarkah.email; (1996 - 2003)
- &a.jfitz; (1996 - 2003)
+ &a.jfitz.email; (1996 - 2003)
- &a.davidn; (1996 - 2003)
+ &a.davidn.email; (1996 - 2003)
- &a.uhclem; (1995 - 2003)
+ &a.uhclem.email; (1995 - 2003)
- &a.lars; (1995 - 2003)
+ &a.lars.email; (1995 - 2003)
- &a.jfieber; (1995 - 2003)
+ &a.jfieber.email; (1995 - 2003)
- &a.dufault; (1995 - 2003)
+ &a.dufault.email; (1995 - 2003)
- &a.amurai; (1995 - 2003)
+ &a.amurai.email; (1995 - 2003)
- &a.ugen; (1994 - 2003)
+ &a.ugen.email; (1994 - 2003)
- &a.swallace; (1994 - 2003)
+ &a.swallace.email; (1994 - 2003)
- &a.stb; (1994 - 2003)
+ &a.stb.email; (1994 - 2003)
- &a.rich; (1994 - 2003)
+ &a.rich.email; (1994 - 2003)
- &a.pst; (1994 - 2003)
+ &a.pst.email; (1994 - 2003)
- &a.mks; (1994 - 2003)
+ &a.mks.email; (1994 - 2003)
- &a.ljo; (1994 - 2003)
+ &a.ljo.email; (1994 - 2003)
- &a.csgr; (1994 - 2003)
+ &a.csgr.email; (1994 - 2003)
- &a.adam; (1994 - 2003)
+ &a.adam.email; (1994 - 2003)
- &a.nate; (1993 - 2003)
+ &a.nate.email; (1993 - 2003)
- &a.gpalmer; (1993 - 2003)
+ &a.gpalmer.email; (1993 - 2003)
- &a.rgrimes; (1992 - 2003)
+ &a.rgrimes.email; (1992 - 2003)
- &a.amorita; (2001 - 2002)
+ &a.amorita.email; (2001 - 2002)
- &a.uch; (2000 - 2002)
+ &a.uch.email; (2000 - 2002)
- &a.shafeeq; (2000 - 2002)
+ &a.shafeeq.email; (2000 - 2002)
- &a.reg; (2000 - 2002)
+ &a.reg.email; (2000 - 2002)
- &a.keith; (2000 - 2002)
+ &a.keith.email; (2000 - 2002)
- &a.issei; (2000 - 2002)
+ &a.issei.email; (2000 - 2002)
- &a.cshumway; (2000 - 2002)
+ &a.cshumway.email; (2000 - 2002)
- &a.assar; (2000 - 2002)
+ &a.assar.email; (2000 - 2002)
- &a.nakai; (1999 - 2002)
+ &a.nakai.email; (1999 - 2002)
- &a.asmodai; (1999 - 2002)
+ &a.asmodai.email; (1999 - 2002)
- &a.dburr; (1998 - 2002)
+ &a.dburr.email; (1998 - 2002)
- &a.abial; (1998 - 2002)
+ &a.abial.email; (1998 - 2002)
- &a.jmb; (1997 - 2002)
+ &a.jmb.email; (1997 - 2002)
- &a.danny; (1997 - 2002)
+ &a.danny.email; (1997 - 2002)
- &a.graichen; (1996 - 2002)
+ &a.graichen.email; (1996 - 2002)
- &a.torstenb; (1995 - 2002)
+ &a.torstenb.email; (1995 - 2002)
- &a.jmacd; (1995 - 2002)
+ &a.jmacd.email; (1995 - 2002)
- &a.erich; (1995 - 2002)
+ &a.erich.email; (1995 - 2002)
- &a.martin; (1994 - 2002)
+ &a.martin.email; (1994 - 2002)
- &a.unfurl; (2000 - 2001)
+ &a.unfurl.email; (2000 - 2001)
- &a.rv; (2000 - 2001)
+ &a.rv.email; (2000 - 2001)
- &a.dec; (2000 - 2001)
+ &a.dec.email; (2000 - 2001)
- &a.groudier; (1999 - 2001)
+ &a.groudier.email; (1999 - 2001)
- &a.yokota; (1997 - 2001)
+ &a.yokota.email; (1997 - 2001)
- &a.dima; (1995 - 2001)
+ &a.dima.email; (1995 - 2001)
- &a.sef; (1993 - 2001)
+ &a.sef.email; (1993 - 2001)
- &a.asami; (1993 - 2001)
+ &a.asami.email; (1993 - 2001)
- &a.gehenna; (1999 - 2000)
+ &a.gehenna.email; (1999 - 2000)
- &a.tedm; (1997 - 2000)
+ &a.tedm.email; (1997 - 2000)
- &a.nsj; (1996 - 2000)
+ &a.nsj.email; (1996 - 2000)
- &a.jraynard; (1996 - 2000)
+ &a.jraynard.email; (1996 - 2000)
- &a.chuckr; (1996 - 2000)
+ &a.chuckr.email; (1996 - 2000)
- &a.karl; (1995 - 2000)
+ &a.karl.email; (1995 - 2000)
- &a.gclarkii; (1993 - 2000)
+ &a.gclarkii.email; (1993 - 2000)
- &a.jgreco; (1997 - 1999)
+ &a.jgreco.email; (1997 - 1999)
- &a.jamil; (1997 - 1999)
+ &a.jamil.email; (1997 - 1999)
- &a.ats; (1992 - 1999)
+ &a.ats.email; (1992 - 1999)
- &a.meganm; (1997 - 1998)
+ &a.meganm.email; (1997 - 1998)
- &a.ahd; (1997 - 1998)
+ &a.ahd.email; (1997 - 1998)
- &a.ahasty; (1997 - 1998)
+ &a.ahasty.email; (1997 - 1998)
- &a.dyson; (1993 - 1998)
+ &a.dyson.email; (1993 - 1998)
- &a.olah; (1995 - 1996)
+ &a.olah.email; (1995 - 1996)
- &a.jhs; (1995 - 1995)
+ &a.jhs.email; (1995 - 1995)gjp (1995 - 1995)
- &a.alm; (1993 - 1995)
+ &a.alm.email; (1993 - 1995)
diff --git a/en_US.ISO8859-1/articles/contributors/contrib.develinmemoriam.xml b/en_US.ISO8859-1/articles/contributors/contrib.develinmemoriam.xml
index 4c7d03fe7c..52c4849be6 100644
--- a/en_US.ISO8859-1/articles/contributors/contrib.develinmemoriam.xml
+++ b/en_US.ISO8859-1/articles/contributors/contrib.develinmemoriam.xml
@@ -1,66 +1,66 @@
- &a.jb; (1997 - 2009; RIP 2009)
+ &a.jb.email; (1997 - 2009; RIP 2009)John
made major contributions to FreeBSD, the best known of which
is the import of the &man.dtrace.1; code. John's unique sense
of humor and plain-spokenness either ruffled feathers or
made him quick friends. At the end of his life, he had
moved to a rural area and was attempting to live with
as minimal impact to the planet as possible, while at
the same time still working in the high-tech area.
- &a.jmz; (1994 - 2009; RIP 2009)
+ &a.jmz.email; (1994 - 2009; RIP 2009)Jean-Marc
was an astrophysicist who made important contributions to the modeling
of the atmospheres of both planets and comets at
l'Observatoire de Besançon
in Besançon, France. While there, he participated in the
conception and construction of the Vega tricanal spectrometer
that studied Halley's Comet. He had also been a long-time
contributor to FreeBSD.
- &a.itojun; (1997 - 2001; RIP 2008)
+ &a.itojun.email; (1997 - 2001; RIP 2008)Known to everyone as
itojun,
Jun-ichiro Hagino was was a core researcher at the
KAME Project,
which aimed to provide IPv6 and IPsec technology in freely
redistributable form. Much of this code was incorporated
into FreeBSD. Without his efforts, the state of IPv6 on the
Internet would be much different.
- &a.cg; (1999 - 2005; RIP 2005)
+ &a.cg.email; (1999 - 2005; RIP 2005)Cameron
was a unique individual who contributed to the project
despite serious physical disabilities. He was responsible
for a complete rewrite of our sound system during the
late 1990s. Many of those who corresponded with him had
no idea of his limited mobility, due to his cheerful
spirit and willingness to help others.
- &a.alane; (2002 - 2003; RIP 2003)
+ &a.alane.email; (2002 - 2003; RIP 2003)Alan
was a major contributor to the KDE on FreeBSD group. In addition,
he maintained many other difficult and time-consuming ports such
as autoconf,
CUPS, and python.
Alan's path was not an easy one but his passion for FreeBSD, and
dedication to programming excellence, won him many friends.
diff --git a/en_US.ISO8859-1/articles/contributors/contrib.portmgralumni.xml b/en_US.ISO8859-1/articles/contributors/contrib.portmgralumni.xml
index 9cb8441e21..d422aa16c2 100644
--- a/en_US.ISO8859-1/articles/contributors/contrib.portmgralumni.xml
+++ b/en_US.ISO8859-1/articles/contributors/contrib.portmgralumni.xml
@@ -1,64 +1,64 @@
- &a.beat; (2011 - 2013)
+ &a.beat.email; (2011 - 2013)
- &a.linimon; (2004 - 2013)
+ &a.linimon.email; (2004 - 2013)
- &a.pav; (2006 - 2012)
+ &a.pav.email; (2006 - 2012)
- &a.flz; (2008 - 2012)
+ &a.flz.email; (2008 - 2012)
- &a.kris; (2001 - 2010)
+ &a.kris.email; (2001 - 2010)
- &a.krion; (2004 - 2009)
+ &a.krion.email; (2004 - 2009)
- &a.clement; (2005 - 2007)
+ &a.clement.email; (2005 - 2007)
- &a.eik; (2004 - 2005)
+ &a.eik.email; (2004 - 2005)
- &a.will; (2001 - 2004)
+ &a.will.email; (2001 - 2004)
- &a.knu; (2001 - 2004)
+ &a.knu.email; (2001 - 2004)
- &a.lioux; (2001 - 2004)
+ &a.lioux.email; (2001 - 2004)
- &a.sobomax; (2001 - 2004)
+ &a.sobomax.email; (2001 - 2004)
- &a.steve; (2001 - 2004)
+ &a.steve.email; (2001 - 2004)
- &a.ade; (2001 - 2002)
+ &a.ade.email; (2001 - 2002)
- &a.asami; ( - 2001)
+ &a.asami.email; ( - 2001)
diff --git a/en_US.ISO8859-1/articles/cvs-freebsd/article.xml b/en_US.ISO8859-1/articles/cvs-freebsd/article.xml
index ddf0d2845b..234a19f0a9 100644
--- a/en_US.ISO8859-1/articles/cvs-freebsd/article.xml
+++ b/en_US.ISO8859-1/articles/cvs-freebsd/article.xml
@@ -1,685 +1,685 @@
Setting up a CVS repository - the FreeBSD wayStijnHoopstijn@win.tue.nl200120022003Stijn Hoop$FreeBSD$$FreeBSD$
&tm-attrib.freebsd;
&tm-attrib.general;
This article describes the steps I took to set up a CVS repository
that uses the same scripts the FreeBSD project uses in their setup.
This has several advantages over a stock CVS setup, including more
granular access control to the source tree and generation of readable
email of every commit.IntroductionMost of the open source software projects use
CVS as their source code control system.
While CVS is pretty good at this, it has its
share of flaws and weaknesses. One of these is that sharing a source
tree with other developers can quickly lead to a system administration
nightmare, especially if one wishes to protect parts of the tree from
general access.FreeBSD is one of the projects using CVS.
It also has a large base of developers located around the world.
They developed some scripts to make management of the repository easier.
- Recently, these scripts were revisited and normalized by &a.joe;
+ Recently, these scripts were revisited and normalized by &a.joe.email;
to make it easier to reuse them in other projects. This
article describes one method of using the new scripts.To make the most use of the information in this article, you need to
be familiar with the basic method of operation of
CVS.First setupIt might be best to first perform this procedure with an empty
test repository, to make sure you understand all consequences.
As always, make sure you have recent, readable backups!Initializing the repositoryThe first thing to do when setting up a new repository is to tell
CVS to initialize it:&prompt.user; cvs -d path-to-repository initThis tells CVS to create the
CVSROOT administrative directory, where all the
customization takes place.The repository groupNow we will create the group which will own the repository.
All committers need to be in this group, so that they can write to the
repository. We will assume the FreeBSD default of
ncvs for this group.&prompt.root; pw groupadd ncvsNext, you should &man.chown.8; the directory to the group
you just added:&prompt.root; chown -R :ncvspath-to-your-repositoryThis ensures that no one can write to the repository without proper
group permissions.Getting the sourcesNow you need to obtain the CVSROOT directory
from the FreeBSD repository. This is most easily done by checking it
out from a FreeBSD anonymous CVS mirror. See the relevant chapter in
the handbook for more information. Let us assume that the
sources are stored in CVSROOT-freebsd in the
current directory.Copying the FreeBSD scriptsNext, we will copy the FreeBSD CVSROOT
sources into your own repository. If you are accustomed to
CVS, you might be thinking that you can just
import the scripts, in an attempt to make synchronizing with later
versions easier. However, it turns out that
CVS has a deficiency in this area:
when importing sources into the CVSROOT directory,
it will not update the needed administrative files. In order to make
it recognize those, you will need to checkin each file after importing
them, losing the value of cvs import. Therefore,
the recommended method is to simply copy over the scripts.It does not matter if the above paragraph did not make sense to
you—the end result is the same. Simply check out your
CVSROOT and copy the FreeBSD files over your
local (untouched) copies:&prompt.user; cvs -d path-to-your-repository checkout CVSROOT
&prompt.user; cd CVSROOT
&prompt.user; cp ../CVSROOT-freebsd/* .
&prompt.user; cvs add *Note that you will probably get a few warnings about some directories
not being copied; this is normal, you do not need those.The scriptsNow you have in your working directory an exact copy of the scripts
that the FreeBSD project itself uses for their repository. A summary
of what each file is used for is included below.access - this file is not used in the
default setup. It is used in the
FreeBSD project specific setup, where it controls access to
the repository. You can remove this file if you
do not wish to use this setup.avail - this file controls access to the
repository. In this, you can specify groups of people that are
allowed access to the repository, as well as disallow commits on a
per-directory or per-file basis. You should tailor it to contain the groups
and directories that will be in your repository.cfg.pm - this file parses your
configuration, and provides the default configuration. You should
not make changes to this file. Instead, put
your configuration changes in
cfg_local.pm.cfg_local.pm - this file contains all
configurable parameters of the system. You should configure all
sorts of settings here, such as where commit mail is send, on what
hosts people can commit, and others. More information on this
below.checkoutlist - this files lists all
files under control of CVS in this
directory, apart from the standard ones created by
cvs init. You should edit this to remove
some FreeBSD-specific files.commit_prep.pl - this script performs
various pre-commit checks, based on whether you enabled them in your
cfg_local.pm. You should not have to touch
this.commitcheck - this script is invoked
directly from CVS. It first checks
if the committer has access to the specified part of the tree
using cvs_acls.pl, and then runs
commit_prep.pl for the various pre-commit
checks. If those are OK, CVS will
allow the commit to proceed. You should not have to touch this
file.commitinfo - this file is used by
CVS to determine which script to run
before a commit—in this case commitcheck.
You should not have to touch this file.config - the configuration file for
this repository. You should change this as needed, but most
administrators can probably leave the defaults. More information on
the options that can be set here can be found in the
CVS manual.cvs_acls.pl - this script determines
the committers identity, and whether he/she is allowed access to the
tree. It does this based on the avail file.
You should not have to touch this file.cvsignore - this file specifies files
that CVS should not checkin in the
repository. You can edit this as you wish. More information about
this file is available in the CVS
manual.cvswrappers - this file is used by
CVS to enable or disable keyword
expansion, or whether a file should be considered binary. You
can edit this as you wish. More information about this file
is available in the CVS manual.
Note that the -t and -f
options do not work correctly with client/server
CVS.edithook - this file is not used
any more, but kept for historic reasons. You can safely
remove this file.editinfo - CVS
uses this file for editor overrides. FreeBSD does not use this
functionality, as parsing the log message is done by
verifymsg and logcheck.
This is because the editinfo
functionality does not work properly with remote commits, or ones
that use the -m or -F
options. You should not have to touch this file.exclude - this file lists regular
expressions that are used by commit_prep.pl
to determine files which cannot contain a revision header. In the
FreeBSD setup, all files under revision control need to have a
revision header (like $FreeBSD$). All filenames that
match one of the lines in this file are exempted from this check.
You should add expressions to this file as you checkin files that
cannot have a revision header. For the purpose of installing the
scripts, it may be best to exclude CVSROOT/
from header checks.log_accum.pl - this is a script that takes
the log message as provided by the logcheck
script, and appends it to a log file in the repository for backup
purposes. It also handles mailing out a message to an email address
you provide (in cfg_local.pm). It hooks into
CVS via loginfo.
You should not have to touch this file.logcheck - this file parses the commit
log message that committers provide, and attempts to sanitize it
somewhat. It hooks into CVS via
verifymsg. You should not have to touch
this file.This script depends on a local FreeBSD hack of
CVS: this version reads the log message
back in after this script has modified it. The stock version of
CVS does not do this which makes
logcheck unable to clean up the log message,
although it is still able to check that it is syntactically
OK. CVS 1.11.2 can be configured to
have the same behaviour as FreeBSD's version by setting
RereadLogAfterVerify=always in the
config file.loginfo - this file is used by
CVS to control where log
information is sent; log_accum.pl hooks
in here. You should not have to touch this file.modules - this file retains its
traditional meaning in CVS. You should
remove the FreeBSD modules from the stock version. You can edit this
as you wish. More information about this file is available in the
CVS manual.notify - this file is used by
CVS in case someone sets a watch on a
file. It is not used in the FreeBSD repository. You can edit this as
you wish. More information about this file is available in the
CVS manual.options - this file is specific to
the FreeBSD version of CVS, and is
also supported by the Debian version. It contains
the keyword to expand in revision headers. You should alter this to
match the keyword you specified in
cfg_local.pm (if you use that feature, which
is FreeBSD specific for now).rcsinfo - this file maps directories in
the repository to template files such as
rcstemplate. By default, FreeBSD uses one
template for the whole repository. You can add others to this file
if you wish.rcstemplate - this file is the actual
template committers will see when they make a checkin. You should
edit this to describe the various extra parameters you defined in
cfg_local.pm.tagcheck - this files controls access
to tagging in the repository. The stock FreeBSD version disallows
tags with names of RELENG*, because of the release engineering
process. You should edit this file as desired.taginfo - this file maps tag operations
on repository directories to access control scripts such as
tagcheck. You should not have to touch this
file.unwrap - this script can be used to
automatically unwrap binary files (see
cvswrappers) on checkout. It is not used in
the current FreeBSD setup because the functionality it hooks into
does not work well with remote commits. You should not have to
touch this file.verifymsg - this file maps repository
directories to post processor scripts of log messages such as
logcheck. You should not have to touch
this file.wrap - this script can be used to
automatically wrap binary files (see
cvswrappers) on checkin. It is not used
in the current FreeBSD setup because the functionality it
hooks into does not work well with remote commits. You should
not have to touch this file.Customizing the scriptsThe next step is to set up the scripts so that they work in
your environment. You should go over all files in the directory and
make your customizations. In particular, you might want to do edit the
following files:If you do not wish to use the
FreeBSD specific features of the scripts, you can safely
remove the access file:&prompt.user; cvs rm -f accessEdit avail to contain the various
repository directories in which you want to control access. Make
sure you retain the avail||CVSROOT line,
otherwise you will lock yourself out in the next step.The other thing you can add in this file are committer groups.
By default, FreeBSD uses the access file to
list all its committers in, but you can use any file you wish. You
can also add groups if you want (the syntax is specified at the
top of cvs_acls.pl).Edit cfg_local.pm to contain the options
you want. In particular, you should take a look at the following
configurable items:%TEMPLATE_HEADERS - these get
processed by the log scripts, and inserted below the
commit mail if present and non-empty in the commit
message. You can probably remove the PR
and MFC after entries. And of course
you can add your own.$MAIL_BRANCH_HDR - if you want
to insert a header into each commit mail describing the
branch on which the commit was made, define this to match
your setup. Or leave it empty if you do not want such a
header.@COMMIT_HOSTS - define this to
be a list of hosts on which people can commit.$MAILADDRS - set this to the
admin or list address that should receive commit mail.@LOG_FILE_MAP - change this array
as you wish - each regexp is matched on the directory of
the commit, and the commit log message gets stored in
the commitlogs subdirectory in
the filename mentioned.$COMMITCHECK_EXTRA - if you do not
want to use the FreeBSD
specific access checks, you should remove the
definition of $COMMITCHECK_EXTRA from
this file.Changing the $IDHEADER parameter
is only guaranteed to work on FreeBSD platforms; it depends on
FreeBSD specific modifications to
CVS.You can check cfg.pm to see which other
options can be changed, but the above is a reasonable subset.Edit exclude to remove the FreeBSD specific
entries (such as all lines beginning with ^ports/
etc.). Furthermore, comment out the lines beginning with
^CVSROOT/, and add one line with only
^CVSROOT/ on it. After the wrapper is
installed, you can add your header to the files in the
CVSROOT directory and restore these lines,
but for now they will only be in the way when you try to commit
later on.Edit modules, and delete all FreeBSD
stuff. Add your own modules if you wish.This step is only necessary if you specified a
value for $IDHEADER in
cfg_local.pm (which only works using a
FreeBSD modified CVS).Edit options to match the tag you
specified in cfg_local.pm. A global
search and replace of FreeBSD with your
tag should suffice.Edit rcstemplate to contain the same
keywords as specified in cfg_local.pm.Optionally remove the FreeBSD checks from
tagcheck. You can simply add
exit 0 to the top of the file to disable all
checks on tagging.The last thing to do before you are finished, is to make sure
the commitlogs can be stored. By default these are stored in
the repository, in the commitlogs subdirectory
of the CVSROOT directory. This directory
needs to be created, so do the following:&prompt.user; mkdir commitlogs
&prompt.user; cvs add commitlogsNow, after careful review, you should commit your changes. Be
sure that you have granted yourself access to the
CVSROOT directory in your
avail before you do this, because otherwise you
will lock yourself out. So make sure everything is as you intend, and
then do the following:&prompt.user; cvs commit -m '- Initial FreeBSD scripts commit'Testing the setupYou are ready for the first test: a forced commit to the
avail file, to make sure everything works as
expected.&prompt.user; cvs commit -f -m 'Forced commit to test the new CVSROOT scripts' availIf everything works, congratulations! You now have a working setup
of the FreeBSD scripts for your repository. If
CVS still complains about something, go
back and recheck if all of the above steps have been performed
correctly.FreeBSD specific setupThe FreeBSD project itself uses a slightly different setup, which
also uses files from the freebsd subdirectory of
the FreeBSD CVSROOT. The project uses this because
of the large number of committers, which all would have to be in the
same group. So, a simple wrapper was written which ensures that people
have the correct credentials to commit, and then sets the group id
to that of the repository.If your repository also needs this, the steps to set this up are
documented below. But first an overview of the files involved.Files used in the FreeBSD setupaccess - this file controls access
information. You should edit this file to include all members
of your project.freebsd/commitmail.pl - this file is
not used any more, but kept for historic reasons. You should not
have to touch this file.freebsd/cvswrap.c - this is the source
to the CVS wrapper that you will need to install to make all
access checks actually work. More information on this below. You
should edit the paths in the ACCESS and
REALCVS macros to match your setup.freebsd/mailsend.c - this file is
needed by the FreeBSD setup of the mailing lists. You should
not have to touch this file.The procedureEdit the access file to contain only
your username.Edit cvswrap.c to contain the
correct path for your setup. This is defined in a macro named
ACCESS. You should also change the location of
the real cvs binary if it is not appropriate to
your situation. The stock cvswrap.c expects
to be a replacement for the systemwide cvs command, which will be
moved to /usr/bin/ncvs.My copy of cvswrap.c has this:#define ACCESS "/local/cvsroot/CVSROOT/access"
#define REALCVS "/usr/bin/ncvs"Next up is installing the wrapper to ensure you become the
correct group when committing. The sources for this live in
cvswrap.c in your
CVSROOT.Compile the sources that you edited to include the correct
paths:&prompt.user; cc -o cvs cvswrap.cAnd then install them (you have to be root for this step):&prompt.root; mv /usr/bin/cvs /usr/bin/ncvs
&prompt.root; mv cvs /usr/bin/cvs
&prompt.root; chown root:ncvs /usr/bin/cvs /usr/bin/ncvs
&prompt.root; chmod o-rx /usr/bin/ncvs
&prompt.root; chmod u-w,g+s /usr/bin/cvsThis installs the wrapper as the default cvs
command, making sure that anyone who wants to use the repository
has to have the correct access levels.You can now remove everyone from your repository group. All
access control is done by your wrapper, and this wrapper will
set the correct group for access.Testing the setupYour wrapper should now be setup. You can of course test this by
making a forced commit to the access file:&prompt.user; cvs commit -f -m 'Forced commit to test the new CVSROOT scripts' accessAgain, if this fails, check to see whether all of the above steps have
been executed correctly.
diff --git a/en_US.ISO8859-1/articles/freebsd-update-server/article.xml b/en_US.ISO8859-1/articles/freebsd-update-server/article.xml
index 3eb9bec50b..0a760f67ca 100644
--- a/en_US.ISO8859-1/articles/freebsd-update-server/article.xml
+++ b/en_US.ISO8859-1/articles/freebsd-update-server/article.xml
@@ -1,815 +1,815 @@
FreeBSD Update Server">
]>
Build Your Own &os; Update ServerJasonHelfman
- &a.jgh;
+ &a.jgh.email;
2009201020112013Jason Helfman
&tm-attrib.freebsd;
&tm-attrib.general;
&tm-attrib.intel;
&tm-attrib.amd;
$FreeBSD$$FreeBSD$This article describes building an internal &fbus.ap;.
The freebsd-update-server
- software is written by &a.cperciva;, Security Officer Emeritus of &os;.
+ is written by &a.cperciva.email;, Security Officer Emeritus of &os;.
For users that think it is convenient to update their systems
against an official update server, building their own &fbus.ap; may
help to extend its functionality by supporting manually-tweaked
&os; releases or by providing a local mirror that will allow faster
updates for a number of machines.AcknowledgmentsThis article was subsequently printed at BSD
Magazine.IntroductionExperienced users or administrators are often responsible for
several machines or environments. They understand the difficult
demands and challenges of maintaining such an infrastructure.
Running a &fbus.ap; makes it easier to deploy security and software
patches to selected test machines before rolling them out to
production. It also means a number of systems can be updated from the
local network rather than a potentially slower Internet connection.
This article outlines the steps involved in creating an internal
&fbus.ap;.PrerequisitesTo build an internal &fbus.ap; some requirements should be
met.A running &os; system.At a minimum, updates require building on a &os;
release greater than or equal to the target release
version for distribution.A user account with at least 4 GB of available space.
This will allow the creation of updates for 7.1 and 7.2, but the
exact space requirements may change from version to version.An &man.ssh.1; account on a remote machine to upload
distributed updates.A web server, like Apache,
with over half of the space required for the build. For instance,
test builds for 7.1 and 7.2 consume a total amount of 4 GB,
and the webserver space needed to distribute these updates is
2.6 GB.Basic knowledge of shell scripting with Bourne shell,
&man.sh.1;.Configuration: Installation & SetupDownload the
freebsd-update-server software by installing devel/subversion , and execute:&prompt.user; svn co http://svn.freebsd.org/base/user/cperciva/freebsd-update-build freebsd-update-serverUpdate scripts/build.conf appropriately.
It is sourced during all build operations.Here is the default build.conf, which should
be modified to suit your environment.
# Main configuration file for FreeBSD Update builds. The
# release-specific configuration data is lower down in
# the scripts tree.
# Location from which to fetch releases
export FTP=ftp://ftp2.freebsd.org/pub/FreeBSD/releases
# Host platform
export HOSTPLATFORM=`uname -m`
# Host name to use inside jails
export BUILDHOSTNAME=${HOSTPLATFORM}-builder.daemonology.net
# Location of SSH key
export SSHKEY=/root/.ssh/id_dsa
# SSH account into which files are uploaded
MASTERACCT=builder@wadham.daemonology.net
# Directory into which files are uploaded
MASTERDIR=update-master.freebsd.orgParameters for consideration would be:This is the location where ISO images are downloaded from (by
the fetchiso() subroutine
of scripts/build.subr). The location
configured is not limited to FTP URIs. Any URI scheme
supported by standard &man.fetch.1; utility should work
fine.Customizations to the fetchiso() code can
be installed by copying the
default build.subr script to the release and
architecture-specific area
at scripts/RELEASE/ARCHITECTURE/build.subr
and applying local changes.The name of the build host. This information will be
displayed on updated systems when issuing:&prompt.user; uname -vThe SSH key for uploading files to
the update server. A key pair can be created by
typing ssh-keygen -t dsa. This parameter is
optional; standard password authentication will be used as a
fallback authentication method when SSHKEY is
not defined.The &man.ssh-keygen.1; manual page has more detailed
information about SSH and the
appropriate steps for creating and using one.Account for uploading files to the update
server.Directory on the update server where files are uploaded
to.The default build.conf file shipped with
the freebsd-update-server sources is
suitable for building &arch.i386; releases of &os;. As an example of
building an update server for other architectures, the following steps
outline the configuration changes needed for &arch.amd64;:Create a build environment for &arch.amd64;:&prompt.user; mkdir -p /usr/local/freebsd-update-server/scripts/7.2-RELEASE/amd64Install a build.conf file in the
newly created build directory. The build configuration
options for &os; 7.2-RELEASE on &arch.amd64; should be similar
to:# SHA256 hash of RELEASE disc1.iso image.
export RELH=1ea1f6f652d7c5f5eab7ef9f8edbed50cb664b08ed761850f95f48e86cc71ef5
# Components of the world, source, and kernels
export WORLDPARTS="base catpages dict doc games info manpages proflibs lib32"
export SOURCEPARTS="base bin contrib crypto etc games gnu include krb5 \
lib libexec release rescue sbin secure share sys tools \
ubin usbin cddl"
export KERNELPARTS="generic"
# EOL date
export EOL=1275289200The &man.sha256.1; hash key for the desired release, is
published within the respective release announcement.To generate the "End of Life" number for
build.conf, refer to the "Estimated
EOL" posted on the &os;
Security Website. The value
of EOL can be derived from the date listed on
the web site, using the &man.date.1; utility, for example:&prompt.user; date -j -f '%Y%m%d-%H%M%S' '20090401-000000' '+%s'Building Update CodeThe first step is to run scripts/make.sh.
This will build some binaries, create directories, and generate an RSA
signing key used for approving builds. In this step, a passphrase will
have to be supplied for the final creation of the signing key.&prompt.root; sh scripts/make.sh
cc -O2 -fno-strict-aliasing -pipe findstamps.c -o findstamps
findstamps.c: In function 'usage':
findstamps.c:45: warning: incompatible implicit declaration of built-in function 'exit'
cc -O2 -fno-strict-aliasing -pipe unstamp.c -o unstamp
install findstamps ../bin
install unstamp ../bin
rm -f findstamps unstamp
Generating RSA private key, 4096 bit long modulus
................................................................................++
...................++
e is 65537 (0x10001)
Public key fingerprint:
27ef53e48dc869eea6c3136091cc6ab8589f967559824779e855d58a2294de9e
Encrypting signing key for root
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:Keep a note of the generated key fingerprint. This value
is required in /etc/freebsd-update.conf for
binary updates.At this point, we are ready to stage a build.&prompt.root; cd /usr/local/freebsd-update-server
&prompt.root; sh scripts/init.sh amd64 7.2-RELEASEWhat follows is a sample of an initial build
run.&prompt.root; sh scripts/init.sh amd64 7.2-RELEASE
Mon Aug 24 16:04:36 PDT 2009 Starting fetch for FreeBSD/amd64 7.2-RELEASE
/usr/local/freebsd-update-server/work/7.2-RELE100% of 588 MB 359 kBps 00m00s
Mon Aug 24 16:32:38 PDT 2009 Verifying disc1 hash for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 16:32:44 PDT 2009 Extracting components for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 16:34:05 PDT 2009 Constructing world+src image for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 16:35:57 PDT 2009 Extracting world+src for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 23:36:24 UTC 2009 Building world for FreeBSD/amd64 7.2-RELEASE
Tue Aug 25 00:31:29 UTC 2009 Distributing world for FreeBSD/amd64 7.2-RELEASE
Tue Aug 25 00:32:36 UTC 2009 Building and distributing kernels for FreeBSD/amd64 7.2-RELEASE
Tue Aug 25 00:44:44 UTC 2009 Constructing world components for FreeBSD/amd64 7.2-RELEASE
Tue Aug 25 00:44:56 UTC 2009 Distributing source for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 17:46:18 PDT 2009 Moving components into staging area for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 17:46:33 PDT 2009 Identifying extra documentation for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 17:47:13 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 17:47:18 PDT 2009 Indexing release for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 17:50:44 PDT 2009 Indexing world0 for FreeBSD/amd64 7.2-RELEASE
Files built but not released:
Files released but not built:
Files which differ by more than contents:
Files which differ between release and build:
kernel|generic|/GENERIC/hptrr.ko
kernel|generic|/GENERIC/kernel
src|sys|/sys/conf/newvers.sh
world|base|/boot/loader
world|base|/boot/pxeboot
world|base|/etc/mail/freebsd.cf
world|base|/etc/mail/freebsd.submit.cf
world|base|/etc/mail/sendmail.cf
world|base|/etc/mail/submit.cf
world|base|/lib/libcrypto.so.5
world|base|/usr/bin/ntpq
world|base|/usr/lib/libalias.a
world|base|/usr/lib/libalias_cuseeme.a
world|base|/usr/lib/libalias_dummy.a
world|base|/usr/lib/libalias_ftp.a
...Then the build of the world is performed again, with world
patches. A more detailed explanation may be found
in scripts/build.subr.During this second build cycle, the network time protocol
- daemon, &man.ntpd.8;, is turned off. Per &a.cperciva;,
+ daemon, &man.ntpd.8;, is turned off. Per &a.cperciva.email;,
Security Officer Emeritus of &os;, "the freebsd-update-server
build code needs to identify timestamps which are stored in files so
that they can be ignored when comparing builds to determine which
files need to be updated. This timestamp-finding works by doing two
builds 400 days apart and comparing the results."Mon Aug 24 17:54:07 PDT 2009 Extracting world+src for FreeBSD/amd64 7.2-RELEASE
Wed Sep 29 00:54:34 UTC 2010 Building world for FreeBSD/amd64 7.2-RELEASE
Wed Sep 29 01:49:42 UTC 2010 Distributing world for FreeBSD/amd64 7.2-RELEASE
Wed Sep 29 01:50:50 UTC 2010 Building and distributing kernels for FreeBSD/amd64 7.2-RELEASE
Wed Sep 29 02:02:56 UTC 2010 Constructing world components for FreeBSD/amd64 7.2-RELEASE
Wed Sep 29 02:03:08 UTC 2010 Distributing source for FreeBSD/amd64 7.2-RELEASE
Tue Sep 28 19:04:31 PDT 2010 Moving components into staging area for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 19:04:46 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 19:04:51 PDT 2009 Indexing world1 for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 19:08:04 PDT 2009 Locating build stamps for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 19:10:19 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 19:10:19 PDT 2009 Preparing to copy files into staging area for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 19:10:20 PDT 2009 Copying data files into staging area for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 12:16:57 PDT 2009 Copying metadata files into staging area for FreeBSD/amd64 7.2-RELEASE
Mon Aug 24 12:16:59 PDT 2009 Constructing metadata index and tag for FreeBSD/amd64 7.2-RELEASE
Files found which include build stamps:
kernel|generic|/GENERIC/hptrr.ko
kernel|generic|/GENERIC/kernel
world|base|/boot/loader
world|base|/boot/pxeboot
world|base|/etc/mail/freebsd.cf
world|base|/etc/mail/freebsd.submit.cf
world|base|/etc/mail/sendmail.cf
world|base|/etc/mail/submit.cf
world|base|/lib/libcrypto.so.5
world|base|/usr/bin/ntpq
world|base|/usr/include/osreldate.h
world|base|/usr/lib/libalias.a
world|base|/usr/lib/libalias_cuseeme.a
world|base|/usr/lib/libalias_dummy.a
world|base|/usr/lib/libalias_ftp.a
...Finally, the build completes.Values of build stamps, excluding library archive headers:
v1.2 (Aug 25 2009 00:40:36)
v1.2 (Aug 25 2009 00:38:22)
@(#)FreeBSD 7.2-RELEASE #0: Tue Aug 25 00:38:29 UTC 2009
FreeBSD 7.2-RELEASE #0: Tue Aug 25 00:38:29 UTC 2009
root@server.myhost.com:/usr/obj/usr/src/sys/GENERIC
7.2-RELEASE
Mon Aug 24 23:55:25 UTC 2009
Mon Aug 24 23:55:25 UTC 2009
##### built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009
##### built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009
##### built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009
##### built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009
Mon Aug 24 23:46:47 UTC 2009
ntpq 4.2.4p5-a Mon Aug 24 23:55:53 UTC 2009 (1)
* Copyright (c) 1992-2009 The FreeBSD Project.
Mon Aug 24 23:46:47 UTC 2009
Mon Aug 24 23:55:40 UTC 2009
Aug 25 2009
ntpd 4.2.4p5-a Mon Aug 24 23:55:52 UTC 2009 (1)
ntpdate 4.2.4p5-a Mon Aug 24 23:55:53 UTC 2009 (1)
ntpdc 4.2.4p5-a Mon Aug 24 23:55:53 UTC 2009 (1)
Tue Aug 25 00:21:21 UTC 2009
Tue Aug 25 00:21:21 UTC 2009
Tue Aug 25 00:21:21 UTC 2009
Mon Aug 24 23:46:47 UTC 2009
FreeBSD/amd64 7.2-RELEASE initialization build complete. Please
review the list of build stamps printed above to confirm that
they look sensible, then run
# sh -e approve.sh amd64 7.2-RELEASE
to sign the release.Approve the build if everything is correct. More information on
determining this can be found in the distributed source
file named USAGE. Execute
scripts/approve.sh, as directed. This will sign
the release, and move components into a staging area suitable for
uploading.&prompt.root; cd /usr/local/freebsd-update-server
&prompt.root; sh scripts/mountkey.sh&prompt.root; sh -e scripts/approve.sh amd64 7.2-RELEASE
Wed Aug 26 12:50:06 PDT 2009 Signing build for FreeBSD/amd64 7.2-RELEASE
Wed Aug 26 12:50:06 PDT 2009 Copying files to patch source directories for FreeBSD/amd64 7.2-RELEASE
Wed Aug 26 12:50:06 PDT 2009 Copying files to upload staging area for FreeBSD/amd64 7.2-RELEASE
Wed Aug 26 12:50:07 PDT 2009 Updating databases for FreeBSD/amd64 7.2-RELEASE
Wed Aug 26 12:50:07 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.2-RELEASEAfter the approval process is complete, the upload procedure may
be started.&prompt.root; cd /usr/local/freebsd-update-server
&prompt.root; sh scripts/upload.sh amd64 7.2-RELEASEIn the event update code needs to be re-uploaded, this may be
done by changing to the public distributions directory for the
target release and updating attributes of the
uploaded file.&prompt.root; cd /usr/local/freebsd-update-server/pub/7.2-RELEASE/amd64
&prompt.root; touch -t 200801010101.01 uploadedThe uploaded files will need to be in the
document root of the webserver in order for updates
to be distributed. The exact configuration will vary depending on the
web server used. For the Apache web server,
please refer to the Configuration of
Apache servers section in the Handbook.Update client's KeyPrint and
ServerName in
/etc/freebsd-update.conf, and perform updates as
instructed in the &os;
Update
section of the Handbook.In order for &fbus.ap; to work properly, updates
for both the current release and the
release one wants to upgrade to need to be
built. This is necessary for determining the differences of
files between releases. For example, when upgrading a &os;
system from 7.1-RELEASE to 7.2-RELEASE, updates will need to be built
and uploaded to your distribution server for both versions.For reference, the entire run of init.sh is
attached.Building a PatchEvery time a security advisory
or security notice
is announced, a patch update can be built.For this example, 7.1-RELEASE will be used.A couple of assumptions are made for a different release
build:Setup the correct directory structure for the initial
build.Perform an initial build for 7.1-RELEASE.Create the patch directory of the respective release
under /usr/local/freebsd-update-server/patches/.&prompt.user; mkdir -p /usr/local/freebsd-update-server/patches/7.1-RELEASE/
&prompt.user; cd /usr/local/freebsd-update-server/patches/7.1-RELEASEAs an example, take the patch for &man.named.8;. Read the advisory,
and grab the necessary file from &os; Security
Advisories. More information on interpreting the advisory,
can be found in the &os; Handbook.In the security brief,
this advisory is called SA-09:12.bind. After
downloading the file, it is required to rename the file to an
appropriate patch level. It is suggested to keep this consistent with
official &os; patch levels, but its name may be freely chosen.
For this build, let us follow the currently established practice of
&os; and call this p7. Rename the file:&prompt.user; cd /usr/local/freebsd-update-server/patches/7.1-RELEASE/; mv bind.patch 7-SA-09:12.bind When running a patch level build, it is assumed that previous
patches are in place. When a patch build is run, it will run all
patches contained in the patch directory.There can be custom patches added to any build. Use the number
zero, or any other number.It is up to the administrator of the &fbus.ap; to take
appropriate measures to verify the authenticity of every
patch.At this point, a diff is ready to be built.
The software checks first to see if a
scripts/init.sh has been run on the respective
release prior to running the diff build.&prompt.root; cd /usr/local/freebsd-update-server
&prompt.root; sh scripts/diff.sh amd64 7.1-RELEASE 7What follows is a sample of a differential
build run.&prompt.root; sh -e scripts/diff.sh amd64 7.1-RELEASE 7
Wed Aug 26 10:09:59 PDT 2009 Extracting world+src for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 17:10:25 UTC 2009 Building world for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 18:05:11 UTC 2009 Distributing world for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 18:06:16 UTC 2009 Building and distributing kernels for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 18:17:50 UTC 2009 Constructing world components for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 18:18:02 UTC 2009 Distributing source for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 11:19:23 PDT 2009 Moving components into staging area for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 11:19:37 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 11:19:42 PDT 2009 Indexing world0 for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 11:23:02 PDT 2009 Extracting world+src for FreeBSD/amd64 7.1-RELEASE-p7
Thu Sep 30 18:23:29 UTC 2010 Building world for FreeBSD/amd64 7.1-RELEASE-p7
Thu Sep 30 19:18:15 UTC 2010 Distributing world for FreeBSD/amd64 7.1-RELEASE-p7
Thu Sep 30 19:19:18 UTC 2010 Building and distributing kernels for FreeBSD/amd64 7.1-RELEASE-p7
Thu Sep 30 19:30:52 UTC 2010 Constructing world components for FreeBSD/amd64 7.1-RELEASE-p7
Thu Sep 30 19:31:03 UTC 2010 Distributing source for FreeBSD/amd64 7.1-RELEASE-p7
Thu Sep 30 12:32:25 PDT 2010 Moving components into staging area for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 12:32:39 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 12:32:43 PDT 2009 Indexing world1 for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 12:35:54 PDT 2009 Locating build stamps for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 12:36:58 PDT 2009 Reverting changes due to build stamps for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 12:37:14 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 12:37:14 PDT 2009 Preparing to copy files into staging area for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 12:37:15 PDT 2009 Copying data files into staging area for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 12:43:23 PDT 2009 Copying metadata files into staging area for FreeBSD/amd64 7.1-RELEASE-p7
Wed Aug 26 12:43:25 PDT 2009 Constructing metadata index and tag for FreeBSD/amd64 7.1-RELEASE-p7
...
Files found which include build stamps:
kernel|generic|/GENERIC/hptrr.ko
kernel|generic|/GENERIC/kernel
world|base|/boot/loader
world|base|/boot/pxeboot
world|base|/etc/mail/freebsd.cf
world|base|/etc/mail/freebsd.submit.cf
world|base|/etc/mail/sendmail.cf
world|base|/etc/mail/submit.cf
world|base|/lib/libcrypto.so.5
world|base|/usr/bin/ntpq
world|base|/usr/include/osreldate.h
world|base|/usr/lib/libalias.a
world|base|/usr/lib/libalias_cuseeme.a
world|base|/usr/lib/libalias_dummy.a
world|base|/usr/lib/libalias_ftp.a
...
Values of build stamps, excluding library archive headers:
v1.2 (Aug 26 2009 18:13:46)
v1.2 (Aug 26 2009 18:11:44)
@(#)FreeBSD 7.1-RELEASE-p7 #0: Wed Aug 26 18:11:50 UTC 2009
FreeBSD 7.1-RELEASE-p7 #0: Wed Aug 26 18:11:50 UTC 2009
root@server.myhost.com:/usr/obj/usr/src/sys/GENERIC
7.1-RELEASE-p7
Wed Aug 26 17:29:15 UTC 2009
Wed Aug 26 17:29:15 UTC 2009
##### built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009
##### built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009
##### built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009
##### built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009
Wed Aug 26 17:20:39 UTC 2009
ntpq 4.2.4p5-a Wed Aug 26 17:29:42 UTC 2009 (1)
* Copyright (c) 1992-2009 The FreeBSD Project.
Wed Aug 26 17:20:39 UTC 2009
Wed Aug 26 17:29:30 UTC 2009
Aug 26 2009
ntpd 4.2.4p5-a Wed Aug 26 17:29:41 UTC 2009 (1)
ntpdate 4.2.4p5-a Wed Aug 26 17:29:42 UTC 2009 (1)
ntpdc 4.2.4p5-a Wed Aug 26 17:29:42 UTC 2009 (1)
Wed Aug 26 17:55:02 UTC 2009
Wed Aug 26 17:55:02 UTC 2009
Wed Aug 26 17:55:02 UTC 2009
Wed Aug 26 17:20:39 UTC 2009
...Updates are printed, and approval is requested.New updates:
kernel|generic|/GENERIC/kernel.symbols|f|0|0|0555|0|7c8dc176763f96ced0a57fc04e7c1b8d793f27e006dd13e0b499e1474ac47e10|
kernel|generic|/GENERIC/kernel|f|0|0|0555|0|33197e8cf15bbbac263d17f39c153c9d489348c2c534f7ca1120a1183dec67b1|
kernel|generic|/|d|0|0|0755|0||
src|base|/|d|0|0|0755|0||
src|bin|/|d|0|0|0755|0||
src|cddl|/|d|0|0|0755|0||
src|contrib|/contrib/bind9/bin/named/update.c|f|0|10000|0644|0|4d434abf0983df9bc47435670d307fa882ef4b348ed8ca90928d250f42ea0757|
src|contrib|/contrib/bind9/lib/dns/openssldsa_link.c|f|0|10000|0644|0|c6805c39f3da2a06dd3f163f26c314a4692d4cd9a2d929c0acc88d736324f550|
src|contrib|/contrib/bind9/lib/dns/opensslrsa_link.c|f|0|10000|0644|0|fa0f7417ee9da42cc8d0fd96ad24e7a34125e05b5ae075bd6e3238f1c022a712|
...
FreeBSD/amd64 7.1-RELEASE update build complete. Please review
the list of build stamps printed above and the list of updated
files to confirm that they look sensible, then run
# sh -e approve.sh amd64 7.1-RELEASE
to sign the build.Follow the same process as noted before for approving a
build:&prompt.root; sh -e scripts/approve.sh amd64 7.1-RELEASE
Wed Aug 26 12:50:06 PDT 2009 Signing build for FreeBSD/amd64 7.1-RELEASE
Wed Aug 26 12:50:06 PDT 2009 Copying files to patch source directories for FreeBSD/amd64 7.1-RELEASE
Wed Aug 26 12:50:06 PDT 2009 Copying files to upload staging area for FreeBSD/amd64 7.1-RELEASE
Wed Aug 26 12:50:07 PDT 2009 Updating databases for FreeBSD/amd64 7.1-RELEASE
Wed Aug 26 12:50:07 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.1-RELEASE
The FreeBSD/amd64 7.1-RELEASE update build has been signed and is
ready to be uploaded. Remember to run
# sh -e umountkey.sh
to unmount the decrypted key once you have finished signing all
the new builds.After approving the build, upload the software:&prompt.root; cd /usr/local/freebsd-update-server
&prompt.root; sh scripts/upload.sh amd64 7.1-RELEASEFor reference, the entire run of
diff.sh is
attached.TipsIf a custom release is built using the native
make releaseprocedure,
freebsd-update-server code will work
from your release. As an example, a release without ports or
documentation can be built by clearing functionality pertaining
to documentation subroutines findextradocs (),
addextradocs () and altering the download
location in fetchiso (), respectively, in
scripts/build.subr. As a last step, change
the &man.sha256.1; hash in build.conf under
your respective release and architecture and you are ready to build
off your custom release.# Compare ${WORKDIR}/release and ${WORKDIR}/$1, identify which parts
# of the world|doc subcomponent are missing from the latter, and
# build a tarball out of them.
findextradocs () {
}
# Add extra docs to ${WORKDIR}/$1
addextradocs () {
}
Adding
flags to buildworld and
obj targets in the
scripts/build.subr script may speed up
processing depending on the hardware used, however it is not
necessary. Using these flags in other targets is not
recommended, as it may cause the build to become unreliable. # Build the world
log "Building world"
cd /usr/src &&
make -j 2 ${COMPATFLAGS} buildworld 2>&1
# Distribute the world
log "Distributing world"
cd /usr/src/release &&
make -j 2 obj &&
make ${COMPATFLAGS} release.1 release.2 2>&1Create an appropriate DNS
SRV record for the update server, and put others behind it with
variable weights. Using this facility will provide update
mirrors, however this tip is not necessary unless you wish to
provide a redundant service. _http._tcp.update.myserver.com. IN SRV 0 2 80 host1.myserver.com.
SRV 0 1 80 host2.myserver.com.
SRV 0 0 80 host3.myserver.com.
diff --git a/en_US.ISO8859-1/articles/gjournal-desktop/article.xml b/en_US.ISO8859-1/articles/gjournal-desktop/article.xml
index 1b0566cba2..aadd5cf22c 100644
--- a/en_US.ISO8859-1/articles/gjournal-desktop/article.xml
+++ b/en_US.ISO8859-1/articles/gjournal-desktop/article.xml
@@ -1,670 +1,670 @@
Implementing UFS Journaling on a Desktop PCManolisKiagiasmanolis@FreeBSD.org2008Manolis Kiagias$FreeBSD$$FreeBSD$
&tm-attrib.freebsd;
&tm-attrib.general;
A journaling file system uses a log to record all transactions
that take place in the file system, and preserves its integrity in the
event of a system crash or power failure. Although it is still
possible to lose unsaved changes to files, journaling almost
completely eliminates the possibility of file system corruption caused
by an unclean shutdown. It also shortens to a minimum the time
required for after-failure file system checking. Although the UFS
file system employed by &os; does not implement journaling itself,
the new journal class of the GEOM framework in &os; 7.X can be
used to provide file system independent journaling. This article
explains how to implement UFS journaling on a typical desktop PC
scenario.IntroductionWhile professional servers are usually well protected from
unforeseen shutdowns, the typical desktop is at the mercy of power
failures, accidental resets, and other user related incidents that can
lead to unclean shutdowns. Soft Updates usually protect the file system
efficiently in such cases, although most of the times a lengthy
background check is required. On rare occasions, file system corruption
reaches a point where user intervention is required and data may be
lost.The new journaling capability provided by GEOM can greatly assist
in such scenarios, by virtually eliminating the time required for
file system checking, and ensuring that the file system is quickly
restored to a consistent state.This article describes a procedure for implementing UFS journaling
on a typical desktop PC scenario (one hard disk used for both operating
system and data). It should be followed during a fresh installation of
&os;. The steps are simple enough and do not require overly complex
interaction with the command line.After reading this article, you will know:How to reserve space for journaling during a new installation of
&os;.How to load and enable the geom_journal
module (or build support for it in your custom kernel).How to convert your existing file systems to utilize journaling,
and what options to use in /etc/fstab to mount
them.How to implement journaling in new (empty) partitions.How to troubleshoot common problems associated with
journaling.Before reading this article, you should be able to:Understand basic &unix; and &os; concepts.Be familiar with the installation procedure of &os; and the
sysinstall utility.The procedure described here is intended for preparing a new
installation where no actual user data is stored on the disk yet.
While it is possible to modify and extend this procedure for
systems already in production, you should backup
all important data before doing so. Messing around with disks and
partitions at a low level can lead to fatal mistakes and data
loss.Understanding Journaling in &os;The journaling provided by GEOM in &os; 7.X is not file system
specific (unlike for example the ext3 file system in &linux;) but is
functioning at the block level. Though this means it can be applied
to different file systems, for &os; 7.0-RELEASE, it can only be used
on UFS2.This functionality is provided by loading the
geom_journal.ko module into the kernel (or
building it into a custom kernel) and using the
gjournal command to configure the file systems.
In general, you would like to journal large file systems, like
/usr. You will need however (see the following
section) to reserve some free disk space.When a file system is journaled, some disk space is needed to keep
the journal itself. The disk space that holds the actual data is
referred to as the data provider, while the one
that holds the journal is referred to as the
journal provider. The data and journal providers
need to be on different partitions when journaling an existing
(non-empty) partition. When journaling a new partition, you have the
option to use a single provider for both data and journal. In any case,
the gjournal command combines both providers to
create the final journaled file system. For example:You wish to journal your /usr file system,
stored in /dev/ad0s1f (which
already contains data).You reserved some free disk space in a partition in
/dev/ad0s1g.Using gjournal, a new /dev/ad0s1f.journal device is created
where /dev/ad0s1f is the data
provider, and /dev/ad0s1g is
the journal provider. This new device is then used for all
subsequent file operations.The amount of disk space you need to reserve for the journal
provider depends on the usage load of the file system and not on the
size of the data provider. For example on a typical office desktop,
a 1 GB journal provider for the /usr file system
will suffice, while a machine that deals with heavy disk I/O (i.e.
video editing) may need more. A kernel panic will occur if the
journal space is exhausted before it has a chance to be
committed.The journal sizes suggested here, are highly unlikely to cause
problems in typical desktop use (such as web browsing, word
processing and playback of media files). If your workload
includes intense disk activity, use the following rule for maximum
reliability: Your RAM size should fit in 30% of the journal provider's
space. For example, if your system has 1 GB RAM, create an
approximately 3.3 GB journal provider. (Multiply your
RAM size with 3.3 to obtain the size of the journal).For more information about journaling, please read the manual
page of &man.gjournal.8;.Steps During the Installation of &os;Reserving Space for JournalingA typical desktop machine usually has one hard disk that stores
both the OS and user data. Arguably, the default partitioning scheme
selected by sysinstall is more or less
suitable: A desktop machine does not need a large
/var partition, while /usr
is allocated the bulk of the disk space, since user data and a lot of
packages are installed into its subdirectories.The default partitioning (the one obtained by pressing
A at the &os; partition editor, called Disklabel) does not leave any
unallocated space. Each partition that will be journaled, requires
another partition for the journal. Since the /usr
partition is the largest, it makes sense to shrink this partition
slightly, to obtain the space required for journaling.In our example, an 80 GB disk is used. The following screenshot
shows the default partitions created by Disklabel during
installation:If this is more or less what you need, it is very easy to adjust
for journaling. Simply use the
arrow keys to move the highlight to the
/usr partition and press D to
delete it.Now, move the highlight to the disk name at the top of the screen
and press C to create a new partition for
/usr. This new partition should be smaller by
1 GB (if you intend to journal /usr only), or
2 GB (if you intend to journal both /usr and
/var). From the pop-up that appears, opt to
create a file system, and type /usr as the mount
point.Should you journal the /var partition?
Normally, journaling makes sense on quite large partitions. You may
decide not to journal /var, although doing so
on a typical desktop will cause no harm. If the file system is
lightly used (quite probable for a desktop) you may wish to
allocate less disk space for its journal.In our example, we journal both /usr and
/var. You may of course adjust the procedure
to your own needs.To keep things as easy going as possible, we are going to use
sysinstall to create the partitions
required for journaling. However, during installation,
sysinstall insists on asking a mount point
for each partition you create. At this point, you do not have any
mount points for the partitions that will hold the journals, and in
reality you do not even need them. These are
not partitions that we are ever going to mount somewhere.To avoid these problems with
sysinstall, we are going to create the
journal partitions as swap space. Swap is never mounted, and
sysinstall has no problem creating as many
swap partitions as needed. After the first reboot,
/etc/fstab will have to be edited, and the extra
swap space entries removed.To create the swap, again use the
arrow keys to move the highlight to the top of
Disklabel screen, so that the disk name itself is
highlighted. Then press N, enter the desired size
(1024M), and select
swap space from the pop-up menu that appears. Repeat
for every journal you wish to create. In our example, we create two
partitions to provide for the journals of /usr and
/var. The final result is shown in the following
screenshot:When you have completed creating the partitions, we suggest you
write down the partition names, and mount points, so you can easily
refer to this information during the configuration phase. This will
help alleviate mistakes that may damage your installation. The
following table shows our notes for the sample configuration:
Partitions and JournalsPartitionMount PointJournalad0s1d/varad0s1had0s1f/usrad0s1g
If successful, open() returns a non-negative
integer, termed a file descriptor. It returns -1 on failure,
and sets errno to indicate the error.
The assembly language programmer new to &unix; and FreeBSD will
immediately ask the puzzling question: Where is
errno and how do I get to it?
The information presented in the manual pages applies
to C programs. The assembly language programmer needs additional
information.
Where Are the Return Values?
Unfortunately, it depends... For most system calls it is
in EAX, but not for all.
A good rule of thumb,
when working with a system call for
the first time, is to look for
the return value in EAX.
If it is not there, you
need further research.
I am aware of one system call that returns the value in
EDX: SYS_fork. All others
I have worked with use EAX.
But I have not worked with them all yet.
If you cannot find the answer here or anywhere else,
study libc source code and see how it
interfaces with the kernel.
Where Is errno?
Actually, nowhere...
errno is part of the C language, not the
&unix; kernel. When accessing kernel services directly, the
error code is returned in EAX,
the same register the proper
return value generally ends up in.
This makes perfect sense. If there is no error, there is
no error code. If there is an error, there is no return
value. One register can contain either.
Determining an Error Occurred
When using the standard FreeBSD calling convention,
the carry flag is cleared upon success,
set upon failure.
When using the Linux emulation mode, the signed
value in EAX is non-negative upon success,
and contains the return value. In case of an error, the value
is negative, i.e., -errno.
Creating Portable Code
Portability is generally not one of the strengths of assembly language.
Yet, writing assembly language programs for different platforms is
possible, especially with nasm. I have written
assembly language libraries that can be assembled for such different
operating systems as &windows; and FreeBSD.
It is all the more possible when you want your code to run
on two platforms which, while different, are based on
similar architectures.
For example, FreeBSD is &unix;, Linux is &unix; like. I only
mentioned three differences between them (from an assembly language
programmer's perspective): The calling convention, the
function numbers, and the way of returning values.
Dealing with Function Numbers
In many cases the function numbers are the same. However,
even when they are not, the problem is easy to deal with:
Instead of using numbers in your code, use constants which
you have declared differently depending on the target
architecture:
%ifdef LINUX
%define SYS_execve 11
%else
%define SYS_execve 59
%endif
Dealing with Conventions
Both, the calling convention, and the return value (the
errno problem) can be resolved with macros:
%ifdef LINUX
%macro system 0
call kernel
%endmacro
align 4
kernel:
push ebx
push ecx
push edx
push esi
push edi
push ebp
mov ebx, [esp+32]
mov ecx, [esp+36]
mov edx, [esp+40]
mov esi, [esp+44]
mov ebp, [esp+48]
int 80h
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
or eax, eax
js .errno
clc
ret
.errno:
neg eax
stc
ret
%else
%macro system 0
int 80h
%endmacro
%endif
Dealing with Other Portability Issues
The above solutions can handle most cases of writing code
portable between FreeBSD and Linux. Nevertheless, with some
kernel services the differences are deeper.
In that case, you need to write two different handlers
for those particular system calls, and use conditional
assembly. Luckily, most of your code does something other
than calling the kernel, so usually you will only need
a few such conditional sections in your code.
Using a Library
You can avoid portability issues in your main code altogether
by writing a library of system calls. Create a separate library
for FreeBSD, a different one for Linux, and yet other libraries
for more operating systems.
In your library, write a separate function (or procedure, if
you prefer the traditional assembly language terminology) for each system
call. Use the C calling convention of passing parameters.
But still use EAX to pass the call number in.
In that case, your FreeBSD library can be very simple, as
many seemingly different functions can be just labels to
the same code:
sys.open:
sys.close:
[etc...]
int 80h
ret
Your Linux library will require more different functions.
But even here you can group system calls using the same
number of parameters:
sys.exit:
sys.close:
[etc... one-parameter functions]
push ebx
mov ebx, [esp+12]
int 80h
pop ebx
jmp sys.return
...
sys.return:
or eax, eax
js sys.err
clc
ret
sys.err:
neg eax
stc
ret
The library approach may seem inconvenient at first because
it requires you to produce a separate file your code depends
on. But it has many advantages: For one, you only need to
write it once and can use it for all your programs. You can
even let other assembly language programmers use it, or perhaps use
one written by someone else. But perhaps the greatest
advantage of the library is that your code can be ported
to other systems, even by other programmers, by simply
writing a new library without any changes to your code.
If you do not like the idea of having a library, you can
at least place all your system calls in a separate assembly language file
and link it with your main program. Here, again, all porters
have to do is create a new object file to link with your
main program.
Using an Include File
If you are releasing your software as (or with)
source code, you can use macros and place them
in a separate file, which you include in your
code.
Porters of your software will simply write a new
include file. No library or external object file
is necessary, yet your code is portable without any
need to edit the code.
This is the approach we will use throughout this chapter.
We will name our include file system.inc, and
add to it whenever we deal with a new system call.
We can start our system.inc by declaring the
standard file descriptors:
%define stdin 0
%define stdout 1
%define stderr 2
Next, we create a symbolic name for each system call:
%define SYS_nosys 0
%define SYS_exit 1
%define SYS_fork 2
%define SYS_read 3
%define SYS_write 4
; [etc...]
We add a short, non-global procedure with a long name,
so we do not accidentally reuse the name in our code:
section .text
align 4
access.the.bsd.kernel:
int 80h
ret
We create a macro which takes one argument, the syscall number:
%macro system 1
mov eax, %1
call access.the.bsd.kernel
%endmacro
Finally, we create macros for each syscall. These macros take
no arguments.
%macro sys.exit 0
system SYS_exit
%endmacro
%macro sys.fork 0
system SYS_fork
%endmacro
%macro sys.read 0
system SYS_read
%endmacro
%macro sys.write 0
system SYS_write
%endmacro
; [etc...]
Go ahead, enter it into your editor and save it as
system.inc. We will add more to it as we
discuss more syscalls.
Our First Program
We are now ready for our first program, the mandatory
Hello, World!
1: %include 'system.inc'
2:
3: section .data
4: hello db 'Hello, World!', 0Ah
5: hbytes equ $-hello
6:
7: section .text
8: global _start
9: _start:
10: push dword hbytes
11: push dword hello
12: push dword stdout
13: sys.write
14:
15: push dword 0
16: sys.exit
Here is what it does: Line 1 includes the defines, the macros,
and the code from system.inc.
Lines 3-5 are the data: Line 3 starts the data section/segment.
Line 4 contains the string "Hello, World!" followed by a new
line (0Ah). Line 5 creates a constant that contains
the length of the string from line 4 in bytes.
Lines 7-16 contain the code. Note that FreeBSD uses the elf
file format for its executables, which requires every
program to start at the point labeled _start (or, more
precisely, the linker expects that). This label has to be
global.
Lines 10-13 ask the system to write hbytes bytes
of the hello string to stdout.
Lines 15-16 ask the system to end the program with the return
value of 0. The SYS_exit syscall never
returns, so the code ends there.
If you have come to &unix; from &ms-dos;
assembly language background, you may be used to writing directly
to the video hardware. You will never have to worry about
this in FreeBSD, or any other flavor of &unix;. As far as
you are concerned, you are writing to a file known as
stdout. This can be the video screen, or
a telnet terminal, or an actual file,
or even the input of another program. Which one it is,
is for the system to figure out.
Assembling the Code
Type the code (except the line numbers) in an editor, and save
it in a file named hello.asm. You need
nasm to assemble it.
Installing nasm
If you do not have nasm, type:
&prompt.user; su
Password:your root password
&prompt.root; cd /usr/ports/devel/nasm
&prompt.root; make install
&prompt.root; exit
&prompt.user;
You may type make install clean instead of just
make install if you do not want to keep
nasm source code.
Either way, FreeBSD will automatically download
nasm from the Internet,
compile it, and install it on your system.
If your system is not FreeBSD, you need to get
nasm from its
home
page. You can still use it to assemble FreeBSD code.
Now you can assemble, link, and run the code:
&prompt.user; nasm -f elf hello.asm
&prompt.user; ld -s -o hello hello.o
&prompt.user; ./hello
Hello, World!
&prompt.user;Writing &unix; Filters
A common type of &unix; application is a filter—a program
that reads data from the stdin, processes it
somehow, then writes the result to stdout.
In this chapter, we shall develop a simple filter, and
learn how to read from stdin and write to
stdout. This filter will convert each byte
of its input into a hexadecimal number followed by a
blank space.
%include 'system.inc'
section .data
hex db '0123456789ABCDEF'
buffer db 0, 0, ' '
section .text
global _start
_start:
; read a byte from stdin
push dword 1
push dword buffer
push dword stdin
sys.read
add esp, byte 12
or eax, eax
je .done
; convert it to hex
movzx eax, byte [buffer]
mov edx, eax
shr dl, 4
mov dl, [hex+edx]
mov [buffer], dl
and al, 0Fh
mov al, [hex+eax]
mov [buffer+1], al
; print it
push dword 3
push dword buffer
push dword stdout
sys.write
add esp, byte 12
jmp short _start
.done:
push dword 0
sys.exit
In the data section we create an array called hex.
It contains the 16 hexadecimal digits in ascending order.
The array is followed by a buffer which we will use for
both input and output. The first two bytes of the buffer
are initially set to 0. This is where we will write
the two hexadecimal digits (the first byte also is
where we will read the input). The third byte is a
space.
The code section consists of four parts: Reading the byte,
converting it to a hexadecimal number, writing the result,
and eventually exiting the program.
To read the byte, we ask the system to read one byte
from stdin, and store it in the first byte
of the buffer. The system returns the number
of bytes read in EAX. This will be 1
while data is coming, or 0, when no more input
data is available. Therefore, we check the value of
EAX. If it is 0,
we jump to .done, otherwise we continue.
For simplicity sake, we are ignoring the possibility
of an error condition at this time.
The hexadecimal conversion reads the byte from the
buffer into EAX, or actually just
AL, while clearing the remaining bits of
EAX to zeros. We also copy the byte to
EDX because we need to convert the upper
four bits (nibble) separately from the lower
four bits. We store the result in the first two
bytes of the buffer.
Next, we ask the system to write the three bytes
of the buffer, i.e., the two hexadecimal digits and
the blank space, to stdout. We then
jump back to the beginning of the program and
process the next byte.
Once there is no more input left, we ask the system
to exit our program, returning a zero, which is
the traditional value meaning the program was
successful.
Go ahead, and save the code in a file named hex.asm,
then type the following (the ^D means press the
control key and type D while holding the
control key down):
&prompt.user; nasm -f elf hex.asm
&prompt.user; ld -s -o hex hex.o
&prompt.user; ./hexHello, World!
48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A Here I come!
48 65 72 65 20 49 20 63 6F 6D 65 21 0A ^D &prompt.user;
If you are migrating to &unix; from &ms-dos;,
you may be wondering why each line ends with 0A
instead of 0D 0A.
This is because &unix; does not use the cr/lf convention, but
a "new line" convention, which is 0A in hexadecimal.
Can we improve this? Well, for one, it is a bit confusing because
once we have converted a line of text, our input no longer
starts at the beginning of the line. We can modify it to print
a new line instead of a space after each 0A:
%include 'system.inc'
section .data
hex db '0123456789ABCDEF'
buffer db 0, 0, ' '
section .text
global _start
_start:
mov cl, ' '
.loop:
; read a byte from stdin
push dword 1
push dword buffer
push dword stdin
sys.read
add esp, byte 12
or eax, eax
je .done
; convert it to hex
movzx eax, byte [buffer]
mov [buffer+2], cl
cmp al, 0Ah
jne .hex
mov [buffer+2], al
.hex:
mov edx, eax
shr dl, 4
mov dl, [hex+edx]
mov [buffer], dl
and al, 0Fh
mov al, [hex+eax]
mov [buffer+1], al
; print it
push dword 3
push dword buffer
push dword stdout
sys.write
add esp, byte 12
jmp short .loop
.done:
push dword 0
sys.exit
We have stored the space in the CL register. We can
do this safely because, unlike µsoft.windows;, &unix; system
calls do not modify the value of any register they do not use
to return a value in.
That means we only need to set CL once. We have, therefore,
added a new label .loop and jump to it for the next byte
instead of jumping at _start. We have also added the
.hex label so we can either have a blank space or a
new line as the third byte of the buffer.
Once you have changed hex.asm to reflect
these changes, type:
&prompt.user; nasm -f elf hex.asm
&prompt.user; ld -s -o hex hex.o
&prompt.user; ./hexHello, World!
48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A
Here I come!
48 65 72 65 20 49 20 63 6F 6D 65 21 0A
^D &prompt.user;
That looks better. But this code is quite inefficient! We
are making a system call for every single byte twice (once
to read it, another time to write the output).
Buffered Input and Output
We can improve the efficiency of our code by buffering our
input and output. We create an input buffer and read a whole
sequence of bytes at one time. Then we fetch them one by one
from the buffer.
We also create an output buffer. We store our output in it until
it is full. At that time we ask the kernel to write the contents
of the buffer to stdout.
The program ends when there is no more input. But we still need
to ask the kernel to write the contents of our output buffer
to stdout one last time, otherwise some of our output
would make it to the output buffer, but never be sent out.
Do not forget that, or you will be wondering why some of your
output is missing.
%include 'system.inc'
%define BUFSIZE 2048
section .data
hex db '0123456789ABCDEF'
section .bss
ibuffer resb BUFSIZE
obuffer resb BUFSIZE
section .text
global _start
_start:
sub eax, eax
sub ebx, ebx
sub ecx, ecx
mov edi, obuffer
.loop:
; read a byte from stdin
call getchar
; convert it to hex
mov dl, al
shr al, 4
mov al, [hex+eax]
call putchar
mov al, dl
and al, 0Fh
mov al, [hex+eax]
call putchar
mov al, ' '
cmp dl, 0Ah
jne .put
mov al, dl
.put:
call putchar
jmp short .loop
align 4
getchar:
or ebx, ebx
jne .fetch
call read
.fetch:
lodsb
dec ebx
ret
read:
push dword BUFSIZE
mov esi, ibuffer
push esi
push dword stdin
sys.read
add esp, byte 12
mov ebx, eax
or eax, eax
je .done
sub eax, eax
ret
align 4
.done:
call write ; flush output buffer
push dword 0
sys.exit
align 4
putchar:
stosb
inc ecx
cmp ecx, BUFSIZE
je write
ret
align 4
write:
sub edi, ecx ; start of buffer
push ecx
push edi
push dword stdout
sys.write
add esp, byte 12
sub eax, eax
sub ecx, ecx ; buffer is empty now
ret
We now have a third section in the source code, named
.bss. This section is not included in our
executable file, and, therefore, cannot be initialized. We use
resb instead of db.
It simply reserves the requested size of uninitialized memory
for our use.
We take advantage of the fact that the system does not modify the
registers: We use registers for what, otherwise, would have to be
global variables stored in the .data section. This is
also why the &unix; convention of passing parameters to system calls
on the stack is superior to the Microsoft convention of passing
them in the registers: We can keep the registers for our own use.
We use EDI and ESI as pointers to the next byte
to be read from or written to. We use EBX and
ECX to keep count of the number of bytes in the
two buffers, so we know when to dump the output to, or read more
input from, the system.
Let us see how it works now:
&prompt.user; nasm -f elf hex.asm
&prompt.user; ld -s -o hex hex.o
&prompt.user; ./hexHello, World!Here I come!
48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A
48 65 72 65 20 49 20 63 6F 6D 65 21 0A
^D &prompt.user;
Not what you expected? The program did not print the output
until we pressed ^D. That is easy to fix by
inserting three lines of code to write the output every time
we have converted a new line to 0A. I have marked
the three lines with > (do not copy the > in your
hex.asm).
%include 'system.inc'
%define BUFSIZE 2048
section .data
hex db '0123456789ABCDEF'
section .bss
ibuffer resb BUFSIZE
obuffer resb BUFSIZE
section .text
global _start
_start:
sub eax, eax
sub ebx, ebx
sub ecx, ecx
mov edi, obuffer
.loop:
; read a byte from stdin
call getchar
; convert it to hex
mov dl, al
shr al, 4
mov al, [hex+eax]
call putchar
mov al, dl
and al, 0Fh
mov al, [hex+eax]
call putchar
mov al, ' '
cmp dl, 0Ah
jne .put
mov al, dl
.put:
call putchar
> cmp al, 0Ah
> jne .loop
> call write
jmp short .loop
align 4
getchar:
or ebx, ebx
jne .fetch
call read
.fetch:
lodsb
dec ebx
ret
read:
push dword BUFSIZE
mov esi, ibuffer
push esi
push dword stdin
sys.read
add esp, byte 12
mov ebx, eax
or eax, eax
je .done
sub eax, eax
ret
align 4
.done:
call write ; flush output buffer
push dword 0
sys.exit
align 4
putchar:
stosb
inc ecx
cmp ecx, BUFSIZE
je write
ret
align 4
write:
sub edi, ecx ; start of buffer
push ecx
push edi
push dword stdout
sys.write
add esp, byte 12
sub eax, eax
sub ecx, ecx ; buffer is empty now
ret
Now, let us see how it works:
&prompt.user; nasm -f elf hex.asm
&prompt.user; ld -s -o hex hex.o
&prompt.user; ./hexHello, World!
48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A
Here I come!
48 65 72 65 20 49 20 63 6F 6D 65 21 0A
^D &prompt.user;
Not bad for a 644-byte executable, is it!
This approach to buffered input/output still
contains a hidden danger. I will discuss—and
fix—it later, when I talk about the
dark
side of buffering.How to Unread a Character
This may be a somewhat advanced topic, mostly of interest to
programmers familiar with the theory of compilers. If you wish,
you may skip to the next
section, and perhaps read this later.
While our sample program does not require it, more sophisticated
filters often need to look ahead. In other words, they may need
to see what the next character is (or even several characters).
If the next character is of a certain value, it is part of the
token currently being processed. Otherwise, it is not.
For example, you may be parsing the input stream for a textual
string (e.g., when implementing a language compiler): If a
character is followed by another character, or perhaps a digit,
it is part of the token you are processing. If it is followed by
white space, or some other value, then it is not part of the
current token.
This presents an interesting problem: How to return the next
character back to the input stream, so it can be read again
later?
One possible solution is to store it in a character variable,
then set a flag. We can modify getchar to check the flag,
and if it is set, fetch the byte from that variable instead of the
input buffer, and reset the flag. But, of course, that slows us
down.
The C language has an ungetc() function, just for that
purpose. Is there a quick way to implement it in our code?
I would like you to scroll back up and take a look at the
getchar procedure and see if you can find a nice and
fast solution before reading the next paragraph. Then come back
here and see my own solution.
The key to returning a character back to the stream is in how
we are getting the characters to start with:
First we check if the buffer is empty by testing the value
of EBX. If it is zero, we call the
read procedure.
If we do have a character available, we use lodsb, then
decrease the value of EBX. The lodsb
instruction is effectively identical to:
mov al, [esi]
inc esi
The byte we have fetched remains in the buffer until the next
time read is called. We do not know when that happens,
but we do know it will not happen until the next call to
getchar. Hence, to "return" the last-read byte back
to the stream, all we have to do is decrease the value of
ESI and increase the value of EBX:
ungetc:
dec esi
inc ebx
ret
But, be careful! We are perfectly safe doing this if our look-ahead
is at most one character at a time. If we are examining more than
one upcoming character and call ungetc several times
in a row, it will work most of the time, but not all the time
(and will be tough to debug). Why?
Because as long as getchar does not have to call
read, all of the pre-read bytes are still in the buffer,
and our ungetc works without a glitch. But the moment
getchar calls read,
the contents of the buffer change.
We can always rely on ungetc working properly on the last
character we have read with getchar, but not on anything
we have read before that.
If your program reads more than one byte ahead, you have at least
two choices:
If possible, modify the program so it only reads one byte ahead.
This is the simplest solution.
If that option is not available, first of all determine the maximum
number of characters your program needs to return to the input
stream at one time. Increase that number slightly, just to be
sure, preferably to a multiple of 16—so it aligns nicely.
Then modify the .bss section of your code, and create
a small "spare" buffer right before your input buffer,
something like this:
section .bss
resb 16 ; or whatever the value you came up with
ibuffer resb BUFSIZE
obuffer resb BUFSIZE
You also need to modify your ungetc to pass the value
of the byte to unget in AL:
ungetc:
dec esi
inc ebx
mov [esi], al
ret
With this modification, you can call ungetc
up to 17 times in a row safely (the first call will still
be within the buffer, the remaining 16 may be either within
the buffer or within the "spare").
Command Line Arguments
Our hex program will be more useful if it can
read the names of an input and output file from its command
line, i.e., if it can process the command line arguments.
But... Where are they?
Before a &unix; system starts a program, it pushes some
data on the stack, then jumps at the _start
label of the program. Yes, I said jumps, not calls. That means the
data can be accessed by reading [esp+offset],
or by simply popping it.
The value at the top of the stack contains the number of
command line arguments. It is traditionally called
argc, for "argument count."
Command line arguments follow next, all argc of them.
These are typically referred to as argv, for
"argument value(s)." That is, we get argv[0],
argv[1], ...,
argv[argc-1]. These are not the actual
arguments, but pointers to arguments, i.e., memory addresses of
the actual arguments. The arguments themselves are
NUL-terminated character strings.
The argv list is followed by a NULL pointer,
which is simply a 0. There is more, but this is
enough for our purposes right now.
If you have come from the &ms-dos; programming
environment, the main difference is that each argument is in
a separate string. The second difference is that there is no
practical limit on how many arguments there can be.
Armed with this knowledge, we are almost ready for the next
version of hex.asm. First, however, we need to
add a few lines to system.inc:
First, we need to add two new entries to our list of system
call numbers:
%define SYS_open 5
%define SYS_close 6
Then we add two new macros at the end of the file:
%macro sys.open 0
system SYS_open
%endmacro
%macro sys.close 0
system SYS_close
%endmacro
Here, then, is our modified source code:
%include 'system.inc'
%define BUFSIZE 2048
section .data
fd.in dd stdin
fd.out dd stdout
hex db '0123456789ABCDEF'
section .bss
ibuffer resb BUFSIZE
obuffer resb BUFSIZE
section .text
align 4
err:
push dword 1 ; return failure
sys.exit
align 4
global _start
_start:
add esp, byte 8 ; discard argc and argv[0]
pop ecx
jecxz .init ; no more arguments
; ECX contains the path to input file
push dword 0 ; O_RDONLY
push ecx
sys.open
jc err ; open failed
add esp, byte 8
mov [fd.in], eax
pop ecx
jecxz .init ; no more arguments
; ECX contains the path to output file
push dword 420 ; file mode (644 octal)
push dword 0200h | 0400h | 01h
; O_CREAT | O_TRUNC | O_WRONLY
push ecx
sys.open
jc err
add esp, byte 12
mov [fd.out], eax
.init:
sub eax, eax
sub ebx, ebx
sub ecx, ecx
mov edi, obuffer
.loop:
; read a byte from input file or stdin
call getchar
; convert it to hex
mov dl, al
shr al, 4
mov al, [hex+eax]
call putchar
mov al, dl
and al, 0Fh
mov al, [hex+eax]
call putchar
mov al, ' '
cmp dl, 0Ah
jne .put
mov al, dl
.put:
call putchar
cmp al, dl
jne .loop
call write
jmp short .loop
align 4
getchar:
or ebx, ebx
jne .fetch
call read
.fetch:
lodsb
dec ebx
ret
read:
push dword BUFSIZE
mov esi, ibuffer
push esi
push dword [fd.in]
sys.read
add esp, byte 12
mov ebx, eax
or eax, eax
je .done
sub eax, eax
ret
align 4
.done:
call write ; flush output buffer
; close files
push dword [fd.in]
sys.close
push dword [fd.out]
sys.close
; return success
push dword 0
sys.exit
align 4
putchar:
stosb
inc ecx
cmp ecx, BUFSIZE
je write
ret
align 4
write:
sub edi, ecx ; start of buffer
push ecx
push edi
push dword [fd.out]
sys.write
add esp, byte 12
sub eax, eax
sub ecx, ecx ; buffer is empty now
ret
In our .data section we now have two new variables,
fd.in and fd.out. We store the input and
output file descriptors here.
In the .text section we have replaced the references
to stdin and stdout with
[fd.in] and [fd.out].
The .text section now starts with a simple error
handler, which does nothing but exit the program with a return
value of 1.
The error handler is before _start so we are
within a short distance from where the errors occur.
Naturally, the program execution still begins at _start.
First, we remove argc and argv[0] from the
stack: They are of no interest to us (in this program, that is).
We pop argv[1] to ECX. This
register is particularly suited for pointers, as we can handle
NULL pointers with jecxz. If argv[1]
is not NULL, we try to open the file named in the first
argument. Otherwise, we continue the program as before: Reading
from stdin, writing to stdout.
If we fail to open the input file (e.g., it does not exist),
we jump to the error handler and quit.
If all went well, we now check for the second argument. If
it is there, we open the output file. Otherwise, we send
the output to stdout. If we fail to open the output
file (e.g., it exists and we do not have the write permission),
we, again, jump to the error handler.
The rest of the code is the same as before, except we close
the input and output files before exiting, and, as mentioned,
we use [fd.in] and [fd.out].
Our executable is now a whopping 768 bytes long.
Can we still improve it? Of course! Every program can be improved.
Here are a few ideas of what we could do:
Have our error handler print a message to
stderr.
Add error handlers to the read
and write functions.
Close stdin when we open an input file,
stdout when we open an output file.
Add command line switches, such as -i
and -o, so we can list the input and
output files in any order, or perhaps read from
stdin and write to a file.
Print a usage message if command line arguments are incorrect.
I shall leave these enhancements as an exercise to the reader:
You already know everything you need to know to implement them.
&unix; Environment
An important &unix; concept is the environment, which is defined by
environment variables. Some are set by the system, others
by you, yet others by the shell, or any program
that loads another program.
How to Find Environment Variables
I said earlier that when a program starts executing, the stack
contains argc followed by the NULL-terminated
argv array, followed by something else. The
"something else" is the environment, or,
to be more precise, a NULL-terminated array of pointers to
environment variables. This is often referred
to as env.
The structure of env is the same as that of
argv, a list of memory addresses followed by a
NULL (0). In this case, there is no
"envc"—we figure out where the array ends
by searching for the final NULL.
The variables usually come in the name=value
format, but sometimes the =value part
may be missing. We need to account for that possibility.
webvars
I could just show you some code that prints the environment
the same way the &unix; env command does. But
I thought it would be more interesting to write a simple
assembly language CGI utility.
CGI: A Quick Overview
I have a
detailed
CGI tutorial on my web site,
but here is a very quick overview of CGI:
The web server communicates with the CGI
program by setting environment variables.
The CGI program
sends its output to stdout.
The web server reads it from there.
It must start with an HTTP
header followed by two blank lines.
It then prints the HTML
code, or whatever other type of data it is producing.
While certain environment variables use
standard names, others vary, depending on the web server. That
makes webvars
quite a useful diagnostic tool.
The Code
Our webvars program, then, must send out
the HTTP header followed by some
HTML mark-up. It then must read
the environment variables one by one
and send them out as part of the
HTML page.
The code follows. I placed comments and explanations
right inside the code:
;;;;;;; webvars.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Copyright (c) 2000 G. Adam Stanislav
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions
; are met:
; 1. Redistributions of source code must retain the above copyright
; notice, this list of conditions and the following disclaimer.
; 2. Redistributions in binary form must reproduce the above copyright
; notice, this list of conditions and the following disclaimer in the
; documentation and/or other materials provided with the distribution.
;
; THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
; SUCH DAMAGE.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Version 1.0
;
; Started: 8-Dec-2000
; Updated: 8-Dec-2000
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%include 'system.inc'
section .data
http db 'Content-type: text/html', 0Ah, 0Ah
db '<?xml version="1.0" encoding="utf-8"?>', 0Ah
db '<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML Strict//EN" '
db '"DTD/xhtml1-strict.dtd">', 0Ah
db '<html xmlns="http://www.w3.org/1999/xhtml" '
db 'xml.lang="en" lang="en">', 0Ah
db '<head>', 0Ah
db '<title>Web Environment</title>', 0Ah
db '<meta name="author" content="G. Adam Stanislav" />', 0Ah
db '</head>', 0Ah, 0Ah
db '<body bgcolor="#ffffff" text="#000000" link="#0000ff" '
db 'vlink="#840084" alink="#0000ff">', 0Ah
db '<div class="webvars">', 0Ah
db '<h1>Web Environment</h1>', 0Ah
db '<p>The following <b>environment variables</b> are defined '
db 'on this web server:</p>', 0Ah, 0Ah
db '<table align="center" width="80" border="0" cellpadding="10" '
db 'cellspacing="0" class="webvars">', 0Ah
httplen equ $-http
left db '<tr>', 0Ah
db '<td class="name"><tt>'
leftlen equ $-left
middle db '</tt></td>', 0Ah
db '<td class="value"><tt><b>'
midlen equ $-middle
undef db '<i>(undefined)</i>'
undeflen equ $-undef
right db '</b></tt></td>', 0Ah
db '</tr>', 0Ah
rightlen equ $-right
wrap db '</table>', 0Ah
db '</div>', 0Ah
db '</body>', 0Ah
db '</html>', 0Ah, 0Ah
wraplen equ $-wrap
section .text
global _start
_start:
; First, send out all the http and xhtml stuff that is
; needed before we start showing the environment
push dword httplen
push dword http
push dword stdout
sys.write
; Now find how far on the stack the environment pointers
; are. We have 12 bytes we have pushed before "argc"
mov eax, [esp+12]
; We need to remove the following from the stack:
;
; The 12 bytes we pushed for sys.write
; The 4 bytes of argc
; The EAX*4 bytes of argv
; The 4 bytes of the NULL after argv
;
; Total:
; 20 + eax * 4
;
; Because stack grows down, we need to ADD that many bytes
; to ESP.
lea esp, [esp+20+eax*4]
cld ; This should already be the case, but let's be sure.
; Loop through the environment, printing it out
.loop:
pop edi
or edi, edi ; Done yet?
je near .wrap
; Print the left part of HTML
push dword leftlen
push dword left
push dword stdout
sys.write
; It may be tempting to search for the '=' in the env string next.
; But it is possible there is no '=', so we search for the
; terminating NUL first.
mov esi, edi ; Save start of string
sub ecx, ecx
not ecx ; ECX = FFFFFFFF
sub eax, eax
repne scasb
not ecx ; ECX = string length + 1
mov ebx, ecx ; Save it in EBX
; Now is the time to find '='
mov edi, esi ; Start of string
mov al, '='
repne scasb
not ecx
add ecx, ebx ; Length of name
push ecx
push esi
push dword stdout
sys.write
; Print the middle part of HTML table code
push dword midlen
push dword middle
push dword stdout
sys.write
; Find the length of the value
not ecx
lea ebx, [ebx+ecx-1]
; Print "undefined" if 0
or ebx, ebx
jne .value
mov ebx, undeflen
mov edi, undef
.value:
push ebx
push edi
push dword stdout
sys.write
; Print the right part of the table row
push dword rightlen
push dword right
push dword stdout
sys.write
; Get rid of the 60 bytes we have pushed
add esp, byte 60
; Get the next variable
jmp .loop
.wrap:
; Print the rest of HTML
push dword wraplen
push dword wrap
push dword stdout
sys.write
; Return success
push dword 0
sys.exit
This code produces a 1,396-byte executable. Most of it is data,
i.e., the HTML mark-up we need to send out.
Assemble and link it as usual:
&prompt.user; nasm -f elf webvars.asm
&prompt.user; ld -s -o webvars webvars.o
To use it, you need to upload webvars to your
web server. Depending on how your web server is set up, you
may have to store it in a special cgi-bin directory,
or perhaps rename it with a .cgi extension.
Then you need to use your browser to view its output.
To see its output on my web server, please go to
http://www.int80h.org/webvars/.
If curious about the additional environment variables
present in a password protected web directory, go to
http://www.int80h.org/private/,
using the name asm and password
programmer.
Working with Files
We have already done some basic file work: We know how
to open and close them, how to read and write them using
buffers. But &unix; offers much more functionality when it
comes to files. We will examine some of it in this section,
and end up with a nice file conversion utility.
Indeed, let us start at the end, that is, with the file
conversion utility. It always makes programming easier
when we know from the start what the end product is
supposed to do.
One of the first programs I wrote for &unix; was
tuc,
a text-to-&unix; file converter. It converts a text
file from other operating systems to a &unix; text file.
In other words, it changes from different kind of line endings
to the newline convention of &unix;. It saves the output
in a different file. Optionally, it converts a &unix; text
file to a DOS text file.
I have used tuc extensively, but always
only to convert from some other OS
to &unix;, never the other way. I have always wished
it would just overwrite the file instead of me having
to send the output to a different file. Most of the time,
I end up using it like this:
&prompt.user; tuc myfile tempfile
&prompt.user; mv tempfile myfile
It would be nice to have a ftuc,
i.e., fast tuc, and use it like this:
&prompt.user; ftuc myfile
In this chapter, then, we will write
ftuc in assembly language
(the original tuc
is in C), and study various
file-oriented kernel services in the process.
At first sight, such a file conversion is very
simple: All you have to do is strip the carriage
returns, right?
If you answered yes, think again: That approach will
work most of the time (at least with MS
DOS text files), but will fail occasionally.
The problem is that not all non &unix; text files end their
line with the carriage return / line feed sequence. Some
use carriage returns without line feeds. Others combine several
blank lines into a single carriage return followed by several
line feeds. And so on.
A text file converter, then, must be able to handle
any possible line endings:
carriage return / line feed
carriage return
line feed / carriage return
line feed
It should also handle files that use some kind of a
combination of the above (e.g., carriage return followed
by several line feeds).
Finite State Machine
The problem is easily solved by the use of a technique
called finite state machine, originally developed
by the designers of digital electronic circuits. A
finite state machine is a digital circuit
whose output is dependent not only on its input but on
its previous input, i.e., on its state. The microprocessor
is an example of a finite state machine: Our
assembly language code is assembled to machine language in which
some assembly language code produces a single byte
of machine language, while others produce several bytes.
As the microprocessor fetches the bytes from the memory
one by one, some of them simply change its state rather than
produce some output. When all the bytes of the op code are
fetched, the microprocessor produces some output, or changes
the value of a register, etc.
Because of that, all software is essentially a sequence of state
instructions for the microprocessor. Nevertheless, the concept
of finite state machine is useful in software design as well.
Our text file converter can be designed as a finite state machine with three
possible states. We could call them states 0-2,
but it will make our life easier if we give them symbolic names:
ordinary
cr
lf
Our program will start in the ordinary
state. During this state, the program action depends on
its input as follows:
If the input is anything other than a carriage return
or line feed, the input is simply passed on to the output. The
state remains unchanged.
If the input is a carriage return, the state is changed
to cr. The input is then discarded, i.e.,
no output is made.
If the input is a line feed, the state is changed to
lf. The input is then discarded.
Whenever we are in the cr state, it is
because the last input was a carriage return, which was
unprocessed. What our software does in this state again
depends on the current input:
If the input is anything other than a carriage return
or line feed, output a line feed, then output the input, then
change the state to ordinary.
If the input is a carriage return, we have received
two (or more) carriage returns in a row. We discard the
input, we output a line feed, and leave the state unchanged.
If the input is a line feed, we output the line feed
and change the state to ordinary. Note that
this is not the same as the first case above – if we tried
to combine them, we would be outputting two line feeds
instead of one.
Finally, we are in the lf state after
we have received a line feed that was not preceded by a
carriage return. This will happen when our file already is
in &unix; format, or whenever several lines in a row are
expressed by a single carriage return followed by several
line feeds, or when line ends with a line feed /
carriage return sequence. Here is how we need to handle
our input in this state:
If the input is anything other than a carriage return or
line feed, we output a line feed, then output the input, then
change the state to ordinary. This is exactly
the same action as in the cr state upon
receiving the same kind of input.
If the input is a carriage return, we discard the input,
we output a line feed, then change the state to ordinary.
If the input is a line feed, we output the line feed,
and leave the state unchanged.
The Final State
The above finite state machine works for the entire file, but leaves
the possibility that the final line end will be ignored. That will
happen whenever the file ends with a single carriage return or
a single line feed. I did not think of it when I wrote
tuc, just to discover that
occasionally it strips the last line ending.
This problem is easily fixed by checking the state after the
entire file was processed. If the state is not
ordinary, we simply
need to output one last line feed.
Now that we have expressed our algorithm as a finite state machine,
we could easily design a dedicated digital electronic
circuit (a "chip") to do the conversion for us. Of course,
doing so would be considerably more expensive than writing
an assembly language program.
The Output Counter
Because our file conversion program may be combining two
characters into one, we need to use an output counter. We
initialize it to 0, and increase it
every time we send a character to the output. At the end of
the program, the counter will tell us what size we need
to set the file to.
Implementing FSM in Software
The hardest part of working with a finite state machine
is analyzing the problem and expressing it as a
finite state machine. That accomplished,
the software almost writes itself.
In a high-level language, such as C, there are several main
approaches. One is to use a switch statement
which chooses what function should be run. For example,
switch (state) {
default:
case REGULAR:
regular(inputchar);
break;
case CR:
cr(inputchar);
break;
case LF:
lf(inputchar);
break;
}
Another approach is by using an array of function pointers,
something like this:
(output[state])(inputchar);
Yet another is to have state be a
function pointer, set to point at the appropriate function:
(*state)(inputchar);
This is the approach we will use in our program because it is very easy to do in assembly language, and very fast, too. We will simply keep the address of the right procedure in EBX, and then just issue:
call ebx
This is possibly faster than hardcoding the address in the code
because the microprocessor does not have to fetch the address from
the memory—it is already stored in one of its registers. I said
possibly because with the caching modern
microprocessors do, either way may be equally fast.
Memory Mapped Files
Because our program works on a single file, we cannot use the
approach that worked for us before, i.e., to read from an input
file and to write to an output file.
&unix; allows us to map a file, or a section of a file,
into memory. To do that, we first need to open the file with the
appropriate read/write flags. Then we use the mmap
system call to map it into the memory. One nice thing about
mmap is that it automatically works with
virtual memory: We can map more of the file into the memory than
we have physical memory available, yet still access it through
regular memory op codes, such as mov,
lods, and stos.
Whatever changes we make to the memory image of the file will be
written to the file by the system. We do not even have to keep
the file open: As long as it stays mapped, we can
read from it and write to it.
The 32-bit Intel microprocessors can access up to four
gigabytes of memory – physical or virtual. The FreeBSD system
allows us to use up to a half of it for file mapping.
For simplicity sake, in this tutorial we will only convert files
that can be mapped into the memory in their entirety. There are
probably not too many text files that exceed two gigabytes in size.
If our program encounters one, it will simply display a message
suggesting we use the original
tuc instead.
If you examine your copy of syscalls.master,
you will find two separate syscalls named mmap.
This is because of evolution of &unix;: There was the traditional
BSD mmap,
syscall 71. That one was superseded by the &posix; mmap,
syscall 197. The FreeBSD system supports both because
older programs were written by using the original BSD
version. But new software uses the &posix; version,
which is what we will use.
The syscalls.master file lists
the &posix; version like this:
197 STD BSD { caddr_t mmap(caddr_t addr, size_t len, int prot, \
int flags, int fd, long pad, off_t pos); }
This differs slightly from what
mmap2
says. That is because
mmap2
describes the C version.
The difference is in the long pad argument, which is not present in the C version. However, the FreeBSD syscalls add a 32-bit pad after pushing a 64-bit argument. In this case, off_t is a 64-bit value.
When we are finished working with a memory-mapped file,
we unmap it with the munmap syscall:
For an in-depth treatment of mmap, see
W. Richard Stevens'
Unix
Network Programming, Volume 2, Chapter 12.
Determining File Size
Because we need to tell mmap how many bytes
of the file to map into the memory, and because we want to map
the entire file, we need to determine the size of the file.
We can use the fstat syscall to get all
the information about an open file that the system can give us.
That includes the file size.
Again, syscalls.master lists two versions
of fstat, a traditional one
(syscall 62), and a &posix; one
(syscall 189). Naturally, we will use the
&posix; version:
189 STD POSIX { int fstat(int fd, struct stat *sb); }
This is a very straightforward call: We pass to it the address
of a stat structure and the descriptor
of an open file. It will fill out the contents of the
stat structure.
I do, however, have to say that I tried to declare the
stat structure in the
.bss section, and
fstat did not like it: It set the carry
flag indicating an error. After I changed the code to allocate
the structure on the stack, everything was working fine.
Changing the File Size
Because our program may combine carriage return / line feed
sequences into straight line feeds, our output may be smaller
than our input. However, since we are placing our output into
the same file we read the input from, we may have to change the
size of the file.
The ftruncate system call allows us to do
just that. Despite its somewhat misleading name, the
ftruncate system call can be used to both
truncate the file (make it smaller) and to grow it.
And yes, we will find two versions of ftruncate
in syscalls.master, an older one
(130), and a newer one (201). We will use
the newer one:
201 STD BSD { int ftruncate(int fd, int pad, off_t length); }
Please note that this one contains a int pad again.
ftuc
We now know everything we need to write ftuc.
We start by adding some new lines in system.inc.
First, we define some constants and structures, somewhere at
or near the beginning of the file:
;;;;;;; open flags
%define O_RDONLY 0
%define O_WRONLY 1
%define O_RDWR 2
;;;;;;; mmap flags
%define PROT_NONE 0
%define PROT_READ 1
%define PROT_WRITE 2
%define PROT_EXEC 4
;;
%define MAP_SHARED 0001h
%define MAP_PRIVATE 0002h
;;;;;;; stat structure
struc stat
st_dev resd 1 ; = 0
st_ino resd 1 ; = 4
st_mode resw 1 ; = 8, size is 16 bits
st_nlink resw 1 ; = 10, ditto
st_uid resd 1 ; = 12
st_gid resd 1 ; = 16
st_rdev resd 1 ; = 20
st_atime resd 1 ; = 24
st_atimensec resd 1 ; = 28
st_mtime resd 1 ; = 32
st_mtimensec resd 1 ; = 36
st_ctime resd 1 ; = 40
st_ctimensec resd 1 ; = 44
st_size resd 2 ; = 48, size is 64 bits
st_blocks resd 2 ; = 56, ditto
st_blksize resd 1 ; = 64
st_flags resd 1 ; = 68
st_gen resd 1 ; = 72
st_lspare resd 1 ; = 76
st_qspare resd 4 ; = 80
endstruc
We define the new syscalls:
%define SYS_mmap 197
%define SYS_munmap 73
%define SYS_fstat 189
%define SYS_ftruncate 201
We add the macros for their use:
%macro sys.mmap 0
system SYS_mmap
%endmacro
%macro sys.munmap 0
system SYS_munmap
%endmacro
%macro sys.ftruncate 0
system SYS_ftruncate
%endmacro
%macro sys.fstat 0
system SYS_fstat
%endmacro
And here is our code:
;;;;;;; Fast Text-to-Unix Conversion (ftuc.asm) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Started: 21-Dec-2000
;; Updated: 22-Dec-2000
;;
;; Copyright 2000 G. Adam Stanislav.
;; All rights reserved.
;;
;;;;;;; v.1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%include 'system.inc'
section .data
db 'Copyright 2000 G. Adam Stanislav.', 0Ah
db 'All rights reserved.', 0Ah
usg db 'Usage: ftuc filename', 0Ah
usglen equ $-usg
co db "ftuc: Can't open file.", 0Ah
colen equ $-co
fae db 'ftuc: File access error.', 0Ah
faelen equ $-fae
ftl db 'ftuc: File too long, use regular tuc instead.', 0Ah
ftllen equ $-ftl
mae db 'ftuc: Memory allocation error.', 0Ah
maelen equ $-mae
section .text
align 4
memerr:
push dword maelen
push dword mae
jmp short error
align 4
toolong:
push dword ftllen
push dword ftl
jmp short error
align 4
facerr:
push dword faelen
push dword fae
jmp short error
align 4
cantopen:
push dword colen
push dword co
jmp short error
align 4
usage:
push dword usglen
push dword usg
error:
push dword stderr
sys.write
push dword 1
sys.exit
align 4
global _start
_start:
pop eax ; argc
pop eax ; program name
pop ecx ; file to convert
jecxz usage
pop eax
or eax, eax ; Too many arguments?
jne usage
; Open the file
push dword O_RDWR
push ecx
sys.open
jc cantopen
mov ebp, eax ; Save fd
sub esp, byte stat_size
mov ebx, esp
; Find file size
push ebx
push ebp ; fd
sys.fstat
jc facerr
mov edx, [ebx + st_size + 4]
; File is too long if EDX != 0 ...
or edx, edx
jne near toolong
mov ecx, [ebx + st_size]
; ... or if it is above 2 GB
or ecx, ecx
js near toolong
; Do nothing if the file is 0 bytes in size
jecxz .quit
; Map the entire file in memory
push edx
push edx ; starting at offset 0
push edx ; pad
push ebp ; fd
push dword MAP_SHARED
push dword PROT_READ | PROT_WRITE
push ecx ; entire file size
push edx ; let system decide on the address
sys.mmap
jc near memerr
mov edi, eax
mov esi, eax
push ecx ; for SYS_munmap
push edi
; Use EBX for state machine
mov ebx, ordinary
mov ah, 0Ah
cld
.loop:
lodsb
call ebx
loop .loop
cmp ebx, ordinary
je .filesize
; Output final lf
mov al, ah
stosb
inc edx
.filesize:
; truncate file to new size
push dword 0 ; high dword
push edx ; low dword
push eax ; pad
push ebp
sys.ftruncate
; close it (ebp still pushed)
sys.close
add esp, byte 16
sys.munmap
.quit:
push dword 0
sys.exit
align 4
ordinary:
cmp al, 0Dh
je .cr
cmp al, ah
je .lf
stosb
inc edx
ret
align 4
.cr:
mov ebx, cr
ret
align 4
.lf:
mov ebx, lf
ret
align 4
cr:
cmp al, 0Dh
je .cr
cmp al, ah
je .lf
xchg al, ah
stosb
inc edx
xchg al, ah
; fall through
.lf:
stosb
inc edx
mov ebx, ordinary
ret
align 4
.cr:
mov al, ah
stosb
inc edx
ret
align 4
lf:
cmp al, ah
je .lf
cmp al, 0Dh
je .cr
xchg al, ah
stosb
inc edx
xchg al, ah
stosb
inc edx
mov ebx, ordinary
ret
align 4
.cr:
mov ebx, ordinary
mov al, ah
; fall through
.lf:
stosb
inc edx
ret
Do not use this program on files stored on a disk formatted
by &ms-dos; or &windows;. There seems to be a
subtle bug in the FreeBSD code when using mmap
on these drives mounted under FreeBSD: If the file is over
a certain size, mmap will just fill the memory
with zeros, and then copy them to the file overwriting
its contents.
One-Pointed Mind
As a student of Zen, I like the idea of a one-pointed mind:
Do one thing at a time, and do it well.
This, indeed, is very much how &unix; works as well. While
a typical &windows; application is attempting to do everything
imaginable (and is, therefore, riddled with bugs), a
typical &unix; program does only one thing, and it does it
well.
The typical &unix; user then essentially assembles his own
applications by writing a shell script which combines the
various existing programs by piping the output of one
program to the input of another.
When writing your own &unix; software, it is generally a
good idea to see what parts of the problem you need to
solve can be handled by existing programs, and only
write your own programs for that part of the problem
that you do not have an existing solution for.
CSV
I will illustrate this principle with a specific real-life
example I was faced with recently:
I needed to extract the 11th field of each record from a
database I downloaded from a web site. The database was a
CSV file, i.e., a list of
comma-separated values. That is quite
a standard format for sharing data among people who may be
using different database software.
The first line of the file contains the list of various fields
separated by commas. The rest of the file contains the data
listed line by line, with values separated by commas.
I tried awk, using the comma as a separator.
But because several lines contained a quoted comma,
awk was extracting the wrong field
from those lines.
Therefore, I needed to write my own software to extract the 11th
field from the CSV file. However, going with the &unix;
spirit, I only needed to write a simple filter that would do the
following:
Remove the first line from the file;
Change all unquoted commas to a different character;
Remove all quotation marks.
Strictly speaking, I could use sed to remove
the first line from the file, but doing so in my own program
was very easy, so I decided to do it and reduce the size of
the pipeline.
At any rate, writing a program like this took me about
20 minutes. Writing a program that extracts the 11th field
from the CSV file would take a lot longer,
and I could not reuse it to extract some other field from some
other database.
This time I decided to let it do a little more work than
a typical tutorial program would:
It parses its command line for options;
It displays proper usage if it finds wrong arguments;
It produces meaningful error messages.
Here is its usage message:
Usage: csv [-t<delim>] [-c<comma>] [-p] [-o <outfile>] [-i <infile>]
All parameters are optional, and can appear in any order.
The -t parameter declares what to replace
the commas with. The tab is the default here.
For example, -t; will replace all unquoted
commas with semicolons.
I did not need the -c option, but it may
come in handy in the future. It lets me declare that I want a
character other than a comma replaced with something else.
For example, -c@ will replace all at signs
(useful if you want to split a list of email addresses
to their user names and domains).
The -p option preserves the first line, i.e.,
it does not delete it. By default, we delete the first
line because in a CSV file it contains the field
names rather than data.
The -i and -o
options let me specify the input and the output files. Defaults
are stdin and stdout,
so this is a regular &unix; filter.
I made sure that both -i filename and
-ifilename are accepted. I also made
sure that only one input and one output files may be
specified.
To get the 11th field of each record, I can now do:
&prompt.user; csv '-t;' data.csv | awk '-F;' '{print $11}'
The code stores the options (except for the file descriptors)
in EDX: The comma in DH, the new
separator in DL, and the flag for
the -p option in the highest bit of
EDX, so a check for its sign will give us a
quick decision what to do.
Here is the code:
;;;;;;; csv.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Convert a comma-separated file to a something-else separated file.
;
; Started: 31-May-2001
; Updated: 1-Jun-2001
;
; Copyright (c) 2001 G. Adam Stanislav
; All rights reserved.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%include 'system.inc'
%define BUFSIZE 2048
section .data
fd.in dd stdin
fd.out dd stdout
usg db 'Usage: csv [-t<delim>] [-c<comma>] [-p] [-o <outfile>] [-i <infile>]', 0Ah
usglen equ $-usg
iemsg db "csv: Can't open input file", 0Ah
iemlen equ $-iemsg
oemsg db "csv: Can't create output file", 0Ah
oemlen equ $-oemsg
section .bss
ibuffer resb BUFSIZE
obuffer resb BUFSIZE
section .text
align 4
ierr:
push dword iemlen
push dword iemsg
push dword stderr
sys.write
push dword 1 ; return failure
sys.exit
align 4
oerr:
push dword oemlen
push dword oemsg
push dword stderr
sys.write
push dword 2
sys.exit
align 4
usage:
push dword usglen
push dword usg
push dword stderr
sys.write
push dword 3
sys.exit
align 4
global _start
_start:
add esp, byte 8 ; discard argc and argv[0]
mov edx, (',' << 8) | 9
.arg:
pop ecx
or ecx, ecx
je near .init ; no more arguments
; ECX contains the pointer to an argument
cmp byte [ecx], '-'
jne usage
inc ecx
mov ax, [ecx]
.o:
cmp al, 'o'
jne .i
; Make sure we are not asked for the output file twice
cmp dword [fd.out], stdout
jne usage
; Find the path to output file - it is either at [ECX+1],
; i.e., -ofile --
; or in the next argument,
; i.e., -o file
inc ecx
or ah, ah
jne .openoutput
pop ecx
jecxz usage
.openoutput:
push dword 420 ; file mode (644 octal)
push dword 0200h | 0400h | 01h
; O_CREAT | O_TRUNC | O_WRONLY
push ecx
sys.open
jc near oerr
add esp, byte 12
mov [fd.out], eax
jmp short .arg
.i:
cmp al, 'i'
jne .p
; Make sure we are not asked twice
cmp dword [fd.in], stdin
jne near usage
; Find the path to the input file
inc ecx
or ah, ah
jne .openinput
pop ecx
or ecx, ecx
je near usage
.openinput:
push dword 0 ; O_RDONLY
push ecx
sys.open
jc near ierr ; open failed
add esp, byte 8
mov [fd.in], eax
jmp .arg
.p:
cmp al, 'p'
jne .t
or ah, ah
jne near usage
or edx, 1 << 31
jmp .arg
.t:
cmp al, 't' ; redefine output delimiter
jne .c
or ah, ah
je near usage
mov dl, ah
jmp .arg
.c:
cmp al, 'c'
jne near usage
or ah, ah
je near usage
mov dh, ah
jmp .arg
align 4
.init:
sub eax, eax
sub ebx, ebx
sub ecx, ecx
mov edi, obuffer
; See if we are to preserve the first line
or edx, edx
js .loop
.firstline:
; get rid of the first line
call getchar
cmp al, 0Ah
jne .firstline
.loop:
; read a byte from stdin
call getchar
; is it a comma (or whatever the user asked for)?
cmp al, dh
jne .quote
; Replace the comma with a tab (or whatever the user wants)
mov al, dl
.put:
call putchar
jmp short .loop
.quote:
cmp al, '"'
jne .put
; Print everything until you get another quote or EOL. If it
; is a quote, skip it. If it is EOL, print it.
.qloop:
call getchar
cmp al, '"'
je .loop
cmp al, 0Ah
je .put
call putchar
jmp short .qloop
align 4
getchar:
or ebx, ebx
jne .fetch
call read
.fetch:
lodsb
dec ebx
ret
read:
jecxz .read
call write
.read:
push dword BUFSIZE
mov esi, ibuffer
push esi
push dword [fd.in]
sys.read
add esp, byte 12
mov ebx, eax
or eax, eax
je .done
sub eax, eax
ret
align 4
.done:
call write ; flush output buffer
; close files
push dword [fd.in]
sys.close
push dword [fd.out]
sys.close
; return success
push dword 0
sys.exit
align 4
putchar:
stosb
inc ecx
cmp ecx, BUFSIZE
je write
ret
align 4
write:
jecxz .ret ; nothing to write
sub edi, ecx ; start of buffer
push ecx
push edi
push dword [fd.out]
sys.write
add esp, byte 12
sub eax, eax
sub ecx, ecx ; buffer is empty now
.ret:
ret
Much of it is taken from hex.asm above. But there
is one important difference: I no longer call write
whenever I am outputting a line feed. Yet, the code can be
used interactively.
I have found a better solution for the interactive problem
since I first started writing this chapter. I wanted to
make sure each line is printed out separately only when needed.
After all, there is no need to flush out every line when used
non-interactively.
The new solution I use now is to call write every
time I find the input buffer empty. That way, when running in
the interactive mode, the program reads one line from the user's
keyboard, processes it, and sees its input buffer is empty. It
flushes its output and reads the next line.
The Dark Side of Buffering
This change prevents a mysterious lockup
in a very specific case. I refer to it as the
dark side of buffering, mostly
because it presents a danger that is not
quite obvious.
It is unlikely to happen with a program like the
csv above, so let us consider yet
another filter: In this case we expect our input
to be raw data representing color values, such as
the red, green, and
blue intensities of a pixel. Our
output will be the negative of our input.
Such a filter would be very simple to write.
Most of it would look just like all the other
filters we have written so far, so I am only
going to show you its inner loop:
.loop:
call getchar
not al ; Create a negative
call putchar
jmp short .loop
Because this filter works with raw data,
it is unlikely to be used interactively.
But it could be called by image manipulation software.
And, unless it calls write before each call
to read, chances are it will lock up.
Here is what might happen:
The image editor will load our filter using the
C function popen().
It will read the first row of pixels from
a bitmap or pixmap.
It will write the first row of pixels to
the pipe leading to
the fd.in of our filter.
Our filter will read each pixel
from its input, turn it to a negative,
and write it to its output buffer.
Our filter will call getchar
to fetch the next pixel.
getchar will find an empty
input buffer, so it will call
read.
read will call the
SYS_read system call.
The kernel will suspend
our filter until the image editor
sends more data to the pipe.
The image editor will read from the
other pipe, connected to the
fd.out of our filter so it can set the first row of the
output image before
it sends us the second row of the input.
The kernel suspends
the image editor until it receives
some output from our filter, so it
can pass it on to the image editor.
At this point our filter waits for the image
editor to send it more data to process, while
the image editor is waiting for our filter
to send it the result of the processing
of the first row. But the result sits in
our output buffer.
The filter and the image editor will continue
waiting for each other forever (or, at least,
until they are killed). Our software has just
entered a
race condition.
This problem does not exist if our filter flushes
its output buffer before asking the
kernel for more input data.
Using the FPU
Strangely enough, most of assembly language literature does not
even mention the existence of the FPU,
or floating point unit, let alone discuss
programming it.
Yet, never does assembly language shine more than when
we create highly optimized FPU
code by doing things that can be done only in assembly language.Organization of the FPU
The FPU consists of 8 80–bit floating–point registers.
These are organized in a stack fashion—you can
push a value on TOS
(top of stack) and you can
pop it.
That said, the assembly language op codes are not push
and pop because those are already taken.
You can push a value on TOS
by using fld, fild,
and fbld. Several other op codes
let you push many common
constants—such as pi—on
the TOS.
Similarly, you can pop a value by
using fst, fstp,
fist, fistp, and
fbstp. Actually, only the op
codes that end with a p will
literally pop the value,
the rest will store it
somewhere else without removing it from
the TOS.
We can transfer the data between the
TOS and the computer memory either as
a 32–bit, 64–bit, or 80–bit real,
a 16–bit, 32–bit, or 64–bit integer,
or an 80–bit packed decimal.
The 80–bit packed decimal is
a special case of binary coded
decimal which is very convenient when
converting between the ASCII
representation of data and the internal
data of the FPU. It allows us to use
18 significant digits.
No matter how we represent data in the memory,
the FPU always stores it in the 80–bit
real format in its registers.
Its internal precision is at least 19 decimal
digits, so even if we choose to display results
as ASCII in the full
18–digit precision, we are still showing
correct results.
We can perform mathematical operations on the
TOS: We can calculate its
sine, we can scale it
(i.e., we can multiply or divide it by a power
of 2), we can calculate its base–2
logarithm, and many other things.
We can also multiply or
divide it by, add
it to, or subtract it from,
any of the FPU registers (including
itself).
The official Intel op code for the
TOS is st, and
for the registersst(0)–st(7).
st and st(0), then,
refer to the same register.
For whatever reasons, the original author of
nasm has decided to use
different op codes, namely
st0–st7.
In other words, there are no parentheses,
and the TOS is always
st0, never just st.
The Packed Decimal Format
The packed decimal format
uses 10 bytes (80 bits) of
memory to represent 18 digits. The
number represented there is always an
integer.
You can use it to get decimal places
by multiplying the TOS
by a power of 10 first.
The highest bit of the highest byte
(byte 9) is the sign bit:
If it is set, the number is negative,
otherwise, it is positive.
The rest of the bits of this byte are unused/ignored.
The remaining 9 bytes store the 18 digits
of the number: 2 digits per byte.
The more significant digit is
stored in the high nibble
(4 bits), the less significant
digit in the low nibble.
That said, you might think that -1234567
would be stored in the memory like this (using
hexadecimal notation):
80 00 00 00 00 00 01 23 45 67
Alas it is not! As with everything else of Intel make,
even the packed decimal is
little–endian.
That means our -1234567
is stored like this:
67 45 23 01 00 00 00 00 00 80
Remember that, or you will be pulling your hair out
in desperation!
The book to read—if you can find it—is Richard Startz'
8087/80287/80387
for the IBM PC & Compatibles.
Though it does seem to take the fact about the
little–endian storage of the packed
decimal for granted. I kid you not about the
desperation of trying to figure out what was wrong
with the filter I show below before
it occurred to me I should try the
little–endian order even for this type of data.
Excursion to Pinhole Photography
To write meaningful software, we must not only
understand our programming tools, but also the
field we are creating software for.
Our next filter will help us whenever we want
to build a pinhole camera,
so, we need some background in pinhole
photography before we can continue.
The Camera
The easiest way to describe any camera ever built
is as some empty space enclosed in some
lightproof material, with a small hole in the
enclosure.
The enclosure is usually sturdy (e.g., a box),
though sometimes it is flexible (the bellows).
It is quite dark inside the camera. However, the
hole lets light rays in through a single point
(though in some cases there may be several).
These light rays form an image, a representation
of whatever is outside the camera, in front of the
hole.
If some light sensitive material (such as film)
is placed inside the camera, it can capture the
image.
The hole often contains a lens, or
a lens assembly, often called the objective.
The Pinhole
But, strictly speaking, the lens is not necessary:
The original cameras did not use a lens but a
pinhole. Even today, pinholes
are used, both as a tool to study how cameras
work, and to achieve a special kind of image.
The image produced by the pinhole
is all equally sharp. Or blurred.
There is an ideal size for a pinhole: If it is
either larger or smaller, the image loses its
sharpness.Focal Length
This ideal pinhole diameter is a function
of the square root of focal
length, which is the distance of the
pinhole from the film.
D = PC * sqrt(FL)
In here, D is the
ideal diameter of the pinhole,
FL is the focal length,
and PC is a pinhole
constant. According to Jay Bender,
its value is 0.04, while
Kenneth Connors has determined it to
be 0.037. Others have
proposed other values. Plus, this
value is for the daylight only: Other types
of light will require a different constant,
whose value can only be determined by
experimentation.
The F–Number
The f–number is a very useful measure of
how much light reaches the film. A light
meter can determine that, for example,
to expose a film of specific sensitivity
with f5.6 may require the exposure to last
1/1000 sec.
It does not matter whether it is a 35–mm
camera, or a 6x9cm camera, etc.
As long as we know the f–number, we can determine
the proper exposure.
The f–number is easy to calculate:
F = FL / D
In other words, the f–number equals the focal
length divided by the diameter of the pinhole.
It also means a higher f–number either implies
a smaller pinhole or a larger focal distance,
or both. That, in turn, implies, the higher
the f–number, the longer the exposure has to be.
Furthermore, while pinhole diameter and focal
distance are one–dimensional measurements,
both, the film and the pinhole, are two–dimensional.
That means that
if you have measured the exposure at f–number
A as t, then the exposure
at f–number B is:
t * (B / A)²
Normalized F–Number
While many modern cameras can change the diameter
of their pinhole, and thus their f–number, quite
smoothly and gradually, such was not always the case.
To allow for different f–numbers, cameras typically
contained a metal plate with several holes of
different sizes drilled to them.
Their sizes were chosen according to the above
formula in such a way that the resultant f–number
was one of standard f–numbers used on all cameras
everywhere. For example, a very old Kodak Duaflex IV
camera in my possession has three such holes for
f–numbers 8, 11, and 16.
A more recently made camera may offer f–numbers of
2.8, 4, 5.6, 8, 11,
16, 22, and 32 (as well as others).
These numbers were not chosen arbitrarily: They all are
powers of the square root of 2, though they may
be rounded somewhat.
The F–Stop
A typical camera is designed in such a way that setting
any of the normalized f–numbers changes the feel of the
dial. It will naturally stop in that
position. Because of that, these positions of the dial
are called f–stops.
Since the f–numbers at each stop are powers of the
square root of 2, moving the dial by 1
stop will double the amount of light required for
proper exposure. Moving it by 2 stops will
quadruple the required exposure. Moving the dial by
3 stops will require the increase in exposure
8 times, etc.
Designing the Pinhole Software
We are now ready to decide what exactly we want our
pinhole software to do.
Processing Program Input
Since its main purpose is to help us design a working
pinhole camera, we will use the focal
length as the input to the program. This is something
we can determine without software: Proper focal length
is determined by the size of the film and by the need
to shoot "regular" pictures, wide angle pictures, or
telephoto pictures.
Most of the programs we have written so far worked with
individual characters, or bytes, as their input: The
hex program converted individual bytes
into a hexadecimal number, the csv
program either let a character through, or deleted it,
or changed it to a different character, etc.
One program, ftuc used the state machine
to consider at most two input bytes at a time.
But our pinhole program cannot just
work with individual characters, it has to deal with
larger syntactic units.
For example, if we want the program to calculate the
pinhole diameter (and other values we will discuss
later) at the focal lengths of 100 mm,
150 mm, and 210 mm, we may want
to enter something like this:100, 150, 210
Our program needs to consider more than a single byte of
input at a time. When it sees the first 1,
it must understand it is seeing the first digit of a
decimal number. When it sees the 0 and
the other 0, it must know it is seeing
more digits of the same number.
When it encounters the first comma, it must know it is
no longer receiving the digits of the first number.
It must be able to convert the digits of the first number
into the value of 100. And the digits of the
second number into the value of 150. And,
of course, the digits of the third number into the
numeric value of 210.
We need to decide what delimiters to accept: Do the
input numbers have to be separated by a comma? If so,
how do we treat two numbers separated by something else?
Personally, I like to keep it simple. Something either
is a number, so I process it. Or it is not a number,
so I discard it. I do not like the computer complaining
about me typing in an extra character when it is
obvious that it is an extra character. Duh!
Plus, it allows me to break up the monotony of computing
and type in a query instead of just a number:
What is the best pinhole diameter for the focal length of 150?
There is no reason for the computer to spit out
a number of complaints:
Syntax error: What
Syntax error: is
Syntax error: the
Syntax error: best
Et cetera, et cetera, et cetera.
Secondly, I like the # character to denote
the start of a comment which extends to the end of the
line. This does not take too much effort to code, and
lets me treat input files for my software as executable
scripts.
In our case, we also need to decide what units the
input should come in: We choose millimeters
because that is how most photographers measure
the focus length.
Finally, we need to decide whether to allow the use
of the decimal point (in which case we must also
consider the fact that much of the world uses a
decimal comma).
In our case allowing for the decimal point/comma
would offer a false sense of precision: There is
little if any noticeable difference between the
focus lengths of 50 and 51,
so allowing the user to input something like
50.5 is not a good idea. This is
my opinion, mind you, but I am the one writing
this program. You can make other choices in yours,
of course.
Offering Options
The most important thing we need to know when building
a pinhole camera is the diameter of the pinhole. Since
we want to shoot sharp images, we will use the above
formula to calculate the pinhole diameter from focal length.
As experts are offering several different values for the
PC constant, we will need to have the choice.
It is traditional in &unix; programming to have two main ways
of choosing program parameters, plus to have a default for
the time the user does not make a choice.
Why have two ways of choosing?
One is to allow a (relatively) permanent
choice that applies automatically each time the
software is run without us having to tell it over and
over what we want it to do.
The permanent choices may be stored in a configuration
file, typically found in the user's home directory.
The file usually has the same name as the application
but is started with a dot. Often "rc"
is added to the file name. So, ours could be
~/.pinhole or ~/.pinholerc.
(The ~/ means current user's
home directory.)
The configuration file is used mostly by programs
that have many configurable parameters. Those
that have only one (or a few) often use a different
method: They expect to find the parameter in an
environment variable. In our case,
we might look at an environment variable named
PINHOLE.
Usually, a program uses one or the other of the
above methods. Otherwise, if a configuration
file said one thing, but an environment variable
another, the program might get confused (or just
too complicated).
Because we only need to choose one
such parameter, we will go with the second method
and search the environment for a variable named
PINHOLE.
The other way allows us to make ad hoc
decisions: "Though I usually want
you to use 0.039, this time I want 0.03872."
In other words, it allows us to override
the permanent choice.
This type of choice is usually done with command
line parameters.
Finally, a program always needs a
default. The user may not make
any choices. Perhaps he does not know what
to choose. Perhaps he is "just browsing."
Preferably, the default will be the value
most users would choose anyway. That way
they do not need to choose. Or, rather, they
can choose the default without an additional
effort.
Given this system, the program may find conflicting
options, and handle them this way:
If it finds an ad hoc choice
(e.g., command line parameter), it should
accept that choice. It must ignore any permanent
choice and any default.
Otherwise, if it finds
a permanent option (e.g., an environment
variable), it should accept it, and ignore
the default.Otherwise, it should use
the default.
We also need to decide what format
our PC option should have.
At first site, it seems obvious to use the
PINHOLE=0.04 format for the
environment variable, and -p0.04
for the command line.
Allowing that is actually a security risk.
The PC constant is a very small
number. Naturally, we will test our software
using various small values of PC.
But what will happen if someone runs the program
choosing a huge value?
It may crash the program because we have not
designed it to handle huge numbers.
Or, we may spend more time on the program so
it can handle huge numbers. We might do that
if we were writing commercial software for
computer illiterate audience.
Or, we might say, "Tough!
The user should know better.""
Or, we just may make it impossible for the user
to enter a huge number. This is the approach we
will take: We will use an implied 0.
prefix.
In other words, if the user wants 0.04,
we will expect him to type -p04,
or set PINHOLE=04 in his environment.
So, if he says -p9999999, we will
interpret it as 0.9999999—still
ridiculous but at least safer.
Secondly, many users will just want to go with either
Bender's constant or Connors' constant.
To make it easier on them, we will interpret
-b as identical to -p04,
and -c as identical to -p037.
The Output
We need to decide what we want our software to
send to the output, and in what format.
Since our input allows for an unspecified number
of focal length entries, it makes sense to use
a traditional database–style output of showing
the result of the calculation for each
focal length on a separate line, while
separating all values on one line by a
tab character.
Optionally, we should also allow the user
to specify the use of the CSV
format we have studied earlier. In this case,
we will print out a line of comma–separated
names describing each field of every line,
then show our results as before, but substituting
a comma for the tab.
We need a command line option for the CSV
format. We cannot use -c because
that already means use Connors' constant.
For some strange reason, many web sites refer to
CSV files as "Excel
spreadsheet" (though the CSV
format predates Excel). We will, therefore, use
the -e switch to inform our software
we want the output in the CSV format.
We will start each line of the output with the
focal length. This may sound repetitious at first,
especially in the interactive mode: The user
types in the focal length, and we are repeating it.
But the user can type several focal lengths on one
line. The input can also come in from a file or
from the output of another program. In that case
the user does not see the input at all.
By the same token, the output can go to a file
which we will want to examine later, or it could
go to the printer, or become the input of another
program.
So, it makes perfect sense to start each line with
the focal length as entered by the user.
No, wait! Not as entered by the user. What if the user
types in something like this:00000000150
Clearly, we need to strip those leading zeros.
So, we might consider reading the user input as is,
converting it to binary inside the FPU,
and printing it out from there.
But...
What if the user types something like this:
17459765723452353453534535353530530534563507309676764423
Ha! The packed decimal FPU format
lets us input 18–digit numbers. But the
user has entered more than 18 digits. How
do we handle that?
Well, we could modify our code to read
the first 18 digits, enter it to the FPU,
then read more, multiply what we already have on the
TOS by 10 raised to the number
of additional digits, then add to it.
Yes, we could do that. But in this
program it would be ridiculous (in a different one it may be just the thing to do): Even the circumference of the Earth expressed in
millimeters only takes 11 digits. Clearly,
we cannot build a camera that large (not yet,
anyway).
So, if the user enters such a huge number, he is
either bored, or testing us, or trying to break
into the system, or playing games—doing
anything but designing a pinhole camera.
What will we do?
We will slap him in the face, in a manner of speaking:17459765723452353453534535353530530534563507309676764423 ??? ??? ??? ??? ???
To achieve that, we will simply ignore any leading zeros.
Once we find a non–zero digit, we will initialize a
counter to 0 and start taking three steps:
Send the digit to the output.
Append the digit to a buffer we will use later to
produce the packed decimal we can send to the
FPU.
Increase the counter.
Now, while we are taking these three steps,
we also need to watch out for one of two
conditions:
If the counter grows above 18,
we stop appending to the buffer. We
continue reading the digits and sending
them to the output.
If, or rather when,
the next input character is not
a digit, we are done inputting
for now.
Incidentally, we can simply
discard the non–digit, unless it
is a #, which we must
return to the input stream. It
starts a comment, so we must see it
after we are done producing output
and start looking for more input.
That still leaves one possibility
uncovered: If all the user enters
is a zero (or several zeros), we
will never find a non–zero to
display.
We can determine this has happened
whenever our counter stays at 0.
In that case we need to send 0
to the output, and perform another
"slap in the face":
0 ??? ??? ??? ??? ???
Once we have displayed the focal
length and determined it is valid
(greater than 0
but not exceeding 18 digits),
we can calculate the pinhole diameter.
It is not by coincidence that pinhole
contains the word pin. Indeed,
many a pinhole literally is a pin
hole, a hole carefully punched with the
tip of a pin.
That is because a typical pinhole is very
small. Our formula gets the result in
millimeters. We will multiply it by 1000,
so we can output the result in microns.
At this point we have yet another trap to face:
Too much precision.
Yes, the FPU was designed
for high precision mathematics. But we
are not dealing with high precision
mathematics. We are dealing with physics
(optics, specifically).
Suppose we want to convert a truck into
a pinhole camera (we would not be the
first ones to do that!). Suppose its box is
12
meters long, so we have the focal length
of 12000. Well, using Bender's constant, it gives us square root of
12000 multiplied by 0.04,
which is 4.381780460 millimeters,
or 4381.780460 microns.
Put either way, the result is absurdly precise.
Our truck is not exactly12000
millimeters long. We did not measure its length
with such a precision, so stating we need a pinhole
with the diameter of 4.381780460
millimeters is, well, deceiving. 4.4
millimeters would do just fine.
I "only" used ten digits in the above example.
Imagine the absurdity of going for all 18!
We need to limit the number of significant
digits of our result. One way of doing it
is by using an integer representing microns.
So, our truck would need a pinhole with the diameter
of 4382 microns. Looking at that number, we still decide that 4400 microns,
or 4.4 millimeters is close enough.
Additionally, we can decide that no matter how
big a result we get, we only want to display four
significant digits (or any other number
of them, of course). Alas, the FPU
does not offer rounding to a specific number
of digits (after all, it does not view the
numbers as decimal but as binary).
We, therefore, must devise an algorithm to reduce
the number of significant digits.
Here is mine (I think it is awkward—if
you know a better one, please, let me know):
Initialize a counter to 0.
While the number is greater than or equal to
10000, divide it by
10 and increase the counter.
Output the result.
While the counter is greater than 0,
output 0 and decrease the counter.
The 10000 is only good if you want
four significant digits. For any other
number of significant digits, replace
10000 with 10
raised to the number of significant digits.
We will, then, output the pinhole diameter
in microns, rounded off to four significant
digits.
At this point, we know the focal
length and the pinhole
diameter. That means we have enough
information to also calculate the
f–number.
We will display the f–number, rounded to
four significant digits. Chances are the
f–number will tell us very little. To make
it more meaningful, we can find the nearest
normalized f–number, i.e.,
the nearest power of the square root
of 2.
We do that by multiplying the actual f–number
by itself, which, of course, will give us
its square. We will then calculate
its base–2 logarithm, which is much
easier to do than calculating the
base–square–root–of–2 logarithm!
We will round the result to the nearest integer.
Next, we will raise 2 to the result. Actually,
the FPU gives us a good shortcut
to do that: We can use the fscale
op code to "scale" 1, which is
analogous to shifting an
integer left. Finally, we calculate the square
root of it all, and we have the nearest
normalized f–number.
If all that sounds overwhelming—or too much
work, perhaps—it may become much clearer
if you see the code. It takes 9 op
codes altogether:
fmul st0, st0
fld1
fld st1
fyl2x
frndint
fld1
fscale
fsqrt
fstp st1
The first line, fmul st0, st0, squares
the contents of the TOS
(top of the stack, same as st,
called st0 by nasm).
The fld1 pushes 1
on the TOS.
The next line, fld st1, pushes
the square back to the TOS.
At this point the square is both in st
and st(2) (it will become
clear why we leave a second copy on the stack
in a moment). st(1) contains
1.
Next, fyl2x calculates base–2
logarithm of st multiplied by
st(1). That is why we placed 1 on st(1) before.
At this point, st contains
the logarithm we have just calculated,
st(1) contains the square
of the actual f–number we saved for later.
frndint rounds the TOS
to the nearest integer. fld1 pushes
a 1. fscale shifts the
1 we have on the TOS
by the value in st(1),
effectively raising 2 to st(1).
Finally, fsqrt calculates
the square root of the result, i.e.,
the nearest normalized f–number.
We now have the nearest normalized
f–number on the TOS,
the base–2 logarithm rounded to the
nearest integer in st(1),
and the square of the actual f–number
in st(2). We are saving
the value in st(2) for later.
But we do not need the contents of
st(1) anymore. The last
line, fstp st1, places the
contents of st to
st(1), and pops. As a
result, what was st(1)
is now st, what was st(2)
is now st(1), etc.
The new st contains the
normalized f–number. The new
st(1) contains the square
of the actual f–number we have
stored there for posterity.
At this point, we are ready to output
the normalized f–number. Because it is
normalized, we will not round it off to
four significant digits, but will
send it out in its full precision.
The normalized f-number is useful as long
as it is reasonably small and can be found
on our light meter. Otherwise we need a
different method of determining proper
exposure.
Earlier we have figured out the formula
of calculating proper exposure at an arbitrary
f–number from that measured at a different
f–number.
Every light meter I have ever seen can determine
proper exposure at f5.6. We will, therefore,
calculate an "f5.6 multiplier,"
i.e., by how much we need to multiply the exposure measured
at f5.6 to determine the proper exposure
for our pinhole camera.
From the above formula we know this factor can be
calculated by dividing our f–number (the
actual one, not the normalized one) by
5.6, and squaring the result.
Mathematically, dividing the square of our
f–number by the square of 5.6
will give us the same result.
Computationally, we do not want to square
two numbers when we can only square one.
So, the first solution seems better at first.
But...5.6 is a constant.
We do not have to have our FPU
waste precious cycles. We can just tell it
to divide the square of the f–number by
whatever 5.6² equals to.
Or we can divide the f–number by 5.6,
and then square the result. The two ways
now seem equal.
But, they are not!
Having studied the principles of photography
above, we remember that the 5.6
is actually square root of 2 raised to
the fifth power. An irrational
number. The square of this number is
exactly32.
Not only is 32 an integer,
it is a power of 2. We do not need
to divide the square of the f–number by
32. We only need to use
fscale to shift it right by
five positions. In the FPU
lingo it means we will fscale it
with st(1) equal to
-5. That is much
faster than a division.
So, now it has become clear why we have
saved the square of the f–number on the
top of the FPU stack.
The calculation of the f5.6 multiplier
is the easiest calculation of this
entire program! We will output it rounded
to four significant digits.
There is one more useful number we can calculate:
The number of stops our f–number is from f5.6.
This may help us if our f–number is just outside
the range of our light meter, but we have
a shutter which lets us set various speeds,
and this shutter uses stops.
Say, our f–number is 5 stops from
f5.6, and the light meter says
we should use 1/1000 sec.
Then we can set our shutter speed to 1/1000
first, then move the dial by 5 stops.
This calculation is quite easy as well. All
we have to do is to calculate the base-2
logarithm of the f5.6 multiplier
we had just calculated (though we need its
value from before we rounded it off). We then
output the result rounded to the nearest integer.
We do not need to worry about having more than
four significant digits in this one: The result
is most likely to have only one or two digits
anyway.FPU Optimizations
In assembly language we can optimize the FPU
code in ways impossible in high languages,
including C.
Whenever a C function needs to calculate
a floating–point value, it loads all necessary
variables and constants into FPU
registers. It then does whatever calculation is
required to get the correct result. Good C
compilers can optimize that part of the code really
well.
It "returns" the value by leaving
the result on the TOS.
However, before it returns, it cleans up.
Any variables and constants it used in its
calculation are now gone from the FPU.
It cannot do what we just did above: We calculated
the square of the f–number and kept it on the
stack for later use by another function.
We knew we would need that value
later on. We also knew we had enough room on the
stack (which only has room for 8 numbers)
to store it there.
A C compiler has no way of knowing
that a value it has on the stack will be
required again in the very near future.
Of course, the C programmer may know it.
But the only recourse he has is to store the
value in a memory variable.
That means, for one, the value will be changed
from the 80-bit precision used internally
by the FPU to a C double
(64 bits) or even single (32
bits).
That also means that the value must be moved
from the TOS into the memory,
and then back again. Alas, of all FPU
operations, the ones that access the computer
memory are the slowest.
So, whenever programming the FPU
in assembly language, look for the ways of keeping
intermediate results on the FPU
stack.
We can take that idea even further! In our
program we are using a constant
(the one we named PC).
It does not matter how many pinhole diameters
we are calculating: 1, 10, 20,
1000, we are always using the same constant.
Therefore, we can optimize our program by keeping
the constant on the stack all the time.
Early on in our program, we are calculating the
value of the above constant. We need to divide
our input by 10 for every digit in the
constant.
It is much faster to multiply than to divide.
So, at the start of our program, we divide 10
into 1 to obtain 0.1, which we
then keep on the stack: Instead of dividing the
input by 10 for every digit,
we multiply it by 0.1.
By the way, we do not input 0.1 directly,
even though we could. We have a reason for that:
While 0.1 can be expressed with just one
decimal place, we do not know how many binary
places it takes. We, therefore, let the FPU
calculate its binary value to its own high precision.
We are using other constants: We multiply the pinhole
diameter by 1000 to convert it from
millimeters to microns. We compare numbers to
10000 when we are rounding them off to
four significant digits. So, we keep both, 1000
and 10000, on the stack. And, of course,
we reuse the 0.1 when rounding off numbers
to four digits.
Last but not least, we keep -5 on the stack.
We need it to scale the square of the f–number,
instead of dividing it by 32. It is not
by coincidence we load this constant last. That makes
it the top of the stack when only the constants
are on it. So, when the square of the f–number is
being scaled, the -5 is at st(1),
precisely where fscale expects it to be.
It is common to create certain constants from
scratch instead of loading them from the memory.
That is what we are doing with -5:
fld1 ; TOS = 1
fadd st0, st0 ; TOS = 2
fadd st0, st0 ; TOS = 4
fld1 ; TOS = 1
faddp st1, st0 ; TOS = 5
fchs ; TOS = -5
We can generalize all these optimizations into one rule:
Keep repeat values on the stack!&postscript; is a stack–oriented
programming language. There are many more books
available about &postscript; than about the
FPU assembly language: Mastering
&postscript; will help you master the FPU.
pinhole—The Code
;;;;;;; pinhole.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Find various parameters of a pinhole camera construction and use
;
; Started: 9-Jun-2001
; Updated: 10-Jun-2001
;
; Copyright (c) 2001 G. Adam Stanislav
; All rights reserved.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%include 'system.inc'
%define BUFSIZE 2048
section .data
align 4
ten dd 10
thousand dd 1000
tthou dd 10000
fd.in dd stdin
fd.out dd stdout
envar db 'PINHOLE=' ; Exactly 8 bytes, or 2 dwords long
pinhole db '04,', ; Bender's constant (0.04)
connors db '037', 0Ah ; Connors' constant
usg db 'Usage: pinhole [-b] [-c] [-e] [-p <value>] [-o <outfile>] [-i <infile>]', 0Ah
usglen equ $-usg
iemsg db "pinhole: Can't open input file", 0Ah
iemlen equ $-iemsg
oemsg db "pinhole: Can't create output file", 0Ah
oemlen equ $-oemsg
pinmsg db "pinhole: The PINHOLE constant must not be 0", 0Ah
pinlen equ $-pinmsg
toobig db "pinhole: The PINHOLE constant may not exceed 18 decimal places", 0Ah
biglen equ $-toobig
huhmsg db 9, '???'
separ db 9, '???'
sep2 db 9, '???'
sep3 db 9, '???'
sep4 db 9, '???', 0Ah
huhlen equ $-huhmsg
header db 'focal length in millimeters,pinhole diameter in microns,'
db 'F-number,normalized F-number,F-5.6 multiplier,stops '
db 'from F-5.6', 0Ah
headlen equ $-header
section .bss
ibuffer resb BUFSIZE
obuffer resb BUFSIZE
dbuffer resb 20 ; decimal input buffer
bbuffer resb 10 ; BCD buffer
section .text
align 4
huh:
call write
push dword huhlen
push dword huhmsg
push dword [fd.out]
sys.write
add esp, byte 12
ret
align 4
perr:
push dword pinlen
push dword pinmsg
push dword stderr
sys.write
push dword 4 ; return failure
sys.exit
align 4
consttoobig:
push dword biglen
push dword toobig
push dword stderr
sys.write
push dword 5 ; return failure
sys.exit
align 4
ierr:
push dword iemlen
push dword iemsg
push dword stderr
sys.write
push dword 1 ; return failure
sys.exit
align 4
oerr:
push dword oemlen
push dword oemsg
push dword stderr
sys.write
push dword 2
sys.exit
align 4
usage:
push dword usglen
push dword usg
push dword stderr
sys.write
push dword 3
sys.exit
align 4
global _start
_start:
add esp, byte 8 ; discard argc and argv[0]
sub esi, esi
.arg:
pop ecx
or ecx, ecx
je near .getenv ; no more arguments
; ECX contains the pointer to an argument
cmp byte [ecx], '-'
jne usage
inc ecx
mov ax, [ecx]
inc ecx
.o:
cmp al, 'o'
jne .i
; Make sure we are not asked for the output file twice
cmp dword [fd.out], stdout
jne usage
; Find the path to output file - it is either at [ECX+1],
; i.e., -ofile --
; or in the next argument,
; i.e., -o file
or ah, ah
jne .openoutput
pop ecx
jecxz usage
.openoutput:
push dword 420 ; file mode (644 octal)
push dword 0200h | 0400h | 01h
; O_CREAT | O_TRUNC | O_WRONLY
push ecx
sys.open
jc near oerr
add esp, byte 12
mov [fd.out], eax
jmp short .arg
.i:
cmp al, 'i'
jne .p
; Make sure we are not asked twice
cmp dword [fd.in], stdin
jne near usage
; Find the path to the input file
or ah, ah
jne .openinput
pop ecx
or ecx, ecx
je near usage
.openinput:
push dword 0 ; O_RDONLY
push ecx
sys.open
jc near ierr ; open failed
add esp, byte 8
mov [fd.in], eax
jmp .arg
.p:
cmp al, 'p'
jne .c
or ah, ah
jne .pcheck
pop ecx
or ecx, ecx
je near usage
mov ah, [ecx]
.pcheck:
cmp ah, '0'
jl near usage
cmp ah, '9'
ja near usage
mov esi, ecx
jmp .arg
.c:
cmp al, 'c'
jne .b
or ah, ah
jne near usage
mov esi, connors
jmp .arg
.b:
cmp al, 'b'
jne .e
or ah, ah
jne near usage
mov esi, pinhole
jmp .arg
.e:
cmp al, 'e'
jne near usage
or ah, ah
jne near usage
mov al, ','
mov [huhmsg], al
mov [separ], al
mov [sep2], al
mov [sep3], al
mov [sep4], al
jmp .arg
align 4
.getenv:
; If ESI = 0, we did not have a -p argument,
; and need to check the environment for "PINHOLE="
or esi, esi
jne .init
sub ecx, ecx
.nextenv:
pop esi
or esi, esi
je .default ; no PINHOLE envar found
; check if this envar starts with 'PINHOLE='
mov edi, envar
mov cl, 2 ; 'PINHOLE=' is 2 dwords long
rep cmpsd
jne .nextenv
; Check if it is followed by a digit
mov al, [esi]
cmp al, '0'
jl .default
cmp al, '9'
jbe .init
; fall through
align 4
.default:
; We got here because we had no -p argument,
; and did not find the PINHOLE envar.
mov esi, pinhole
; fall through
align 4
.init:
sub eax, eax
sub ebx, ebx
sub ecx, ecx
sub edx, edx
mov edi, dbuffer+1
mov byte [dbuffer], '0'
; Convert the pinhole constant to real
.constloop:
lodsb
cmp al, '9'
ja .setconst
cmp al, '0'
je .processconst
jb .setconst
inc dl
.processconst:
inc cl
cmp cl, 18
ja near consttoobig
stosb
jmp short .constloop
align 4
.setconst:
or dl, dl
je near perr
finit
fild dword [tthou]
fld1
fild dword [ten]
fdivp st1, st0
fild dword [thousand]
mov edi, obuffer
mov ebp, ecx
call bcdload
.constdiv:
fmul st0, st2
loop .constdiv
fld1
fadd st0, st0
fadd st0, st0
fld1
faddp st1, st0
fchs
; If we are creating a CSV file,
; print header
cmp byte [separ], ','
jne .bigloop
push dword headlen
push dword header
push dword [fd.out]
sys.write
.bigloop:
call getchar
jc near done
; Skip to the end of the line if you got '#'
cmp al, '#'
jne .num
call skiptoeol
jmp short .bigloop
.num:
; See if you got a number
cmp al, '0'
jl .bigloop
cmp al, '9'
ja .bigloop
; Yes, we have a number
sub ebp, ebp
sub edx, edx
.number:
cmp al, '0'
je .number0
mov dl, 1
.number0:
or dl, dl ; Skip leading 0's
je .nextnumber
push eax
call putchar
pop eax
inc ebp
cmp ebp, 19
jae .nextnumber
mov [dbuffer+ebp], al
.nextnumber:
call getchar
jc .work
cmp al, '#'
je .ungetc
cmp al, '0'
jl .work
cmp al, '9'
ja .work
jmp short .number
.ungetc:
dec esi
inc ebx
.work:
; Now, do all the work
or dl, dl
je near .work0
cmp ebp, 19
jae near .toobig
call bcdload
; Calculate pinhole diameter
fld st0 ; save it
fsqrt
fmul st0, st3
fld st0
fmul st5
sub ebp, ebp
; Round off to 4 significant digits
.diameter:
fcom st0, st7
fstsw ax
sahf
jb .printdiameter
fmul st0, st6
inc ebp
jmp short .diameter
.printdiameter:
call printnumber ; pinhole diameter
; Calculate F-number
fdivp st1, st0
fld st0
sub ebp, ebp
.fnumber:
fcom st0, st6
fstsw ax
sahf
jb .printfnumber
fmul st0, st5
inc ebp
jmp short .fnumber
.printfnumber:
call printnumber ; F number
; Calculate normalized F-number
fmul st0, st0
fld1
fld st1
fyl2x
frndint
fld1
fscale
fsqrt
fstp st1
sub ebp, ebp
call printnumber
; Calculate time multiplier from F-5.6
fscale
fld st0
; Round off to 4 significant digits
.fmul:
fcom st0, st6
fstsw ax
sahf
jb .printfmul
inc ebp
fmul st0, st5
jmp short .fmul
.printfmul:
call printnumber ; F multiplier
; Calculate F-stops from 5.6
fld1
fxch st1
fyl2x
sub ebp, ebp
call printnumber
mov al, 0Ah
call putchar
jmp .bigloop
.work0:
mov al, '0'
call putchar
align 4
.toobig:
call huh
jmp .bigloop
align 4
done:
call write ; flush output buffer
; close files
push dword [fd.in]
sys.close
push dword [fd.out]
sys.close
finit
; return success
push dword 0
sys.exit
align 4
skiptoeol:
; Keep reading until you come to cr, lf, or eof
call getchar
jc done
cmp al, 0Ah
jne .cr
ret
.cr:
cmp al, 0Dh
jne skiptoeol
ret
align 4
getchar:
or ebx, ebx
jne .fetch
call read
.fetch:
lodsb
dec ebx
clc
ret
read:
jecxz .read
call write
.read:
push dword BUFSIZE
mov esi, ibuffer
push esi
push dword [fd.in]
sys.read
add esp, byte 12
mov ebx, eax
or eax, eax
je .empty
sub eax, eax
ret
align 4
.empty:
add esp, byte 4
stc
ret
align 4
putchar:
stosb
inc ecx
cmp ecx, BUFSIZE
je write
ret
align 4
write:
jecxz .ret ; nothing to write
sub edi, ecx ; start of buffer
push ecx
push edi
push dword [fd.out]
sys.write
add esp, byte 12
sub eax, eax
sub ecx, ecx ; buffer is empty now
.ret:
ret
align 4
bcdload:
; EBP contains the number of chars in dbuffer
push ecx
push esi
push edi
lea ecx, [ebp+1]
lea esi, [dbuffer+ebp-1]
shr ecx, 1
std
mov edi, bbuffer
sub eax, eax
mov [edi], eax
mov [edi+4], eax
mov [edi+2], ax
.loop:
lodsw
sub ax, 3030h
shl al, 4
or al, ah
mov [edi], al
inc edi
loop .loop
fbld [bbuffer]
cld
pop edi
pop esi
pop ecx
sub eax, eax
ret
align 4
printnumber:
push ebp
mov al, [separ]
call putchar
; Print the integer at the TOS
mov ebp, bbuffer+9
fbstp [bbuffer]
; Check the sign
mov al, [ebp]
dec ebp
or al, al
jns .leading
; We got a negative number (should never happen)
mov al, '-'
call putchar
.leading:
; Skip leading zeros
mov al, [ebp]
dec ebp
or al, al
jne .first
cmp ebp, bbuffer
jae .leading
; We are here because the result was 0.
; Print '0' and return
mov al, '0'
jmp putchar
.first:
; We have found the first non-zero.
; But it is still packed
test al, 0F0h
jz .second
push eax
shr al, 4
add al, '0'
call putchar
pop eax
and al, 0Fh
.second:
add al, '0'
call putchar
.next:
cmp ebp, bbuffer
jb .done
mov al, [ebp]
push eax
shr al, 4
add al, '0'
call putchar
pop eax
and al, 0Fh
add al, '0'
call putchar
dec ebp
jmp short .next
.done:
pop ebp
or ebp, ebp
je .ret
.zeros:
mov al, '0'
call putchar
dec ebp
jne .zeros
.ret:
ret
The code follows the same format as all the other
filters we have seen before, with one subtle
exception:
We are no longer assuming that the end of input
implies the end of things to do, something we
took for granted in the character–oriented
filters.
This filter does not process characters. It
processes a language
(albeit a very simple
one, consisting only of numbers).
When we have no more input, it can mean one
of two things:
We are done and can quit. This is the
same as before.
The last character we have read was a digit.
We have stored it at the end of our
ASCII–to–float conversion
buffer. We now need to convert
the contents of that buffer into a
number and write the last line of our
output.
For that reason, we have modified our getchar
and our read routines to return with
the carry flagclear whenever we are
fetching another character from the input, or the
carry flagset whenever there is no more
input.
Of course, we are still using assembly language magic
to do that! Take a good look at getchar.
It always returns with the
carry flagclear.
Yet, our main code relies on the carry
flag to tell it when to quit—and it works.
The magic is in read. Whenever it
receives more input from the system, it just
returns to getchar, which
fetches a character from the input buffer,
clears the carry flag
and returns.
But when read receives no more
input from the system, it does not
return to getchar at all.
Instead, the add esp, byte 4
op code adds 4 to ESP,
sets the carry
flag, and returns.
So, where does it return to? Whenever a
program uses the call op code,
the microprocessor pushes the
return address, i.e., it stores it on
the top of the stack (not the FPU
stack, the system stack, which is in the memory).
When a program uses the ret
op code, the microprocessor pops
the return value from the stack, and jumps
to the address that was stored there.
But since we added 4 to
ESP (which is the stack
pointer register), we have effectively
given the microprocessor a minor case
of amnesia: It no longer
remembers it was getchar
that called read.
And since getchar never
pushed anything before
calling read,
the top of the stack now contains the
return address to whatever or whoever
called getchar.
As far as that caller is concerned,
he called getchar,
which returned with the
carry flag set!
When the FS block size is 4 KB, triple indirect
blocks work and everything should be limited by the maximum FS
block number that can be represented using triple indirect
blocks (approx.
10243 + 10242 + 1024),
but everything is limited by a (wrong) limit of
1 G - 1 on FS block numbers. The limit on FS
block numbers should be 2 G - 1. There are
some bugs for FS block numbers near 2 G - 1,
but such block numbers are unreachable when the FS block
size is 4 KB.For block sizes of 8 KB and larger, everything
should be limited by the 2 G - 1 limit on FS
block numbers, but is actually limited by the
1 G - 1 limit on FS block numbers. Using the
correct limit of 2 G - 1 blocks does cause
problems.Why do I get an error message,
readin failed after compiling
and booting a new kernel?Because your world and kernel are out of sync. This is
not supported. Be sure you use make buildworld
and make buildkernel
to update your kernel.You can boot by specifying the kernel directly at the
second stage, pressing any key when the |
shows up before loader is started.Is there a tool to perform post-installation
configuration tasks?Yes, &rel.head.releng; users can set
WITH_BSDCONFIG in
/etc/src.conf. Users of &rel.relx;
and higher may also install
sysutils/bsdconfig.Hardware CompatibilityGeneralI want to get a piece of hardware for my &os; system.
Which model/brand/type is best?This is discussed continually on the &os; mailing
lists. Since hardware changes so quickly, however, we
expect this. We still strongly
recommend that you read through the Hardware Notes
for &os; &rel.current; or
&rel2.current; and
search the mailing list archives
before asking about the latest and greatest hardware.
Chances are a discussion about the type of hardware you
are looking for took place just last week.If you are looking for a laptop, check the &a.mobile;
archives. Otherwise, you probably want the archives for
the &a.questions;, or possibly a specific mailing list for
a particular hardware type.Does &os; support more than 4 GB of memory (RAM)?
More than 16 GB? More than 48 GB?Yes. &os; as an operating system generally supports
as much physical memory (RAM) as the platform it is running
on does. Keep in mind that different platforms have
different limits for memory; for example &i386; without
PAE supports at most 4 GB of
memory (and usually less than that because of PCI address
space) and &i386; with PAE supports at most 64 GB
memory. AMD64 platforms currently deployed support up to
1 TB of physical memory.Why does &os; report less than 4 GB memory when
installed on an &i386; machine?The total address space on &i386; machines is 32-bit,
meaning that at most 4 GB of memory is addressable (can
be accessed). Furthermore, some addresses in this range
are reserved by hardware for different purposes, for
example for using and controlling PCI devices, for
accessing video memory, and so on. Therefore, the total
amount of memory usable by the operating system for its
kernel and applications is limited to significantly less
than 4 GB. Usually, 3.2 GB to 3.7 GB is
the maximum usable physical memory in this
configuration.To access more than 3.2 GB to 3.7 GB of
installed memory (meaning up to 4 GB but also more than
4 GB), a special tweak called PAE
must be used. PAE stands for Physical Address Extension
and is a way for 32-bit x86 CPUs to address more than
4 GB of memory. It remaps the memory that would
otherwise be overlaid by address reservations for
hardware devices above the 4 GB range and uses it as
additional physical memory (see &man.pae.4;). Using PAE
has some drawbacks; this mode of memory access is a little
bit slower than the normal (without PAE) mode and loadable
modules (see &man.kld.4;) are not supported. This means
all drivers must be compiled into the kernel.The most common way to enable PAE is to build a new
kernel with the special ready-provided kernel configuration
file called PAE, which is already
configured to build a safe kernel. Note that some entries
in this kernel configuration file are too conservative and
some drivers marked as unready to be used with PAE are
actually usable. A rule of thumb is that if the driver is
usable on 64-bit architectures (like AMD64), it is also
usable with PAE. If you wish to create your own kernel
configuration file, you can enable PAE by adding the
following line to your configuration:options PAEPAE is not much used nowadays because most new x86
hardware also supports running in 64-bit mode, known as
AMD64 or &intel; 64. It has a much larger address
space and does not need such tweaks. &os; supports AMD64
and it is recommended that this version of &os; be used
instead of the &i386; version if 4 GB or more memory
is required.Architectures and ProcessorsDoes &os; support architectures other than the
x86?Yes. &os; divides support into multiple tiers.
Tier 1 architectures, such as i386 or amd64; are
fully supported. Tiers 2 and 3 are supported on an
if-possible basis. A full explanation of the tier
system is available in the
Committer's Guide.A complete list of supported architectures can be
found on the
platforms page.Does &os; support Symmetric Multiprocessing
(SMP)?&os; supports symmetric multi-processor (SMP) on all
non-embedded platforms (e.g, &arch.i386;, &arch.amd64;,
etc.). SMP is also
supported in arm and MIPS kernels, although some CPUs
may not support this. &os;'s SMP implementation uses
fine-grained locking, and performance scales nearly
linearly with number of CPUs.&man.smp.4; has more details.What is microcode?
How do I install &intel; CPU microcode updates?Microcode is a method of programmatically
implementating hardware level instructions. This allows
for CPU bugs to be fixed without replacing the on board chip.Install sysutils/devcpu-data,
then add:microcode_update_enable="YES"to /etc/rc.confHard Drives, Tape Drives, and CD and DVD DrivesWhat kind of hard drives does &os; support?&os; supports EIDE, SATA, SCSI, and SAS drives (with a
compatible controller; see the next section), and all
drives using the original Western Digital
interface (MFM, RLL, ESDI, and of course IDE). A few ESDI
controllers that use proprietary interfaces may not work:
stick to WD1002/3/6/7 interfaces and clones.Which SCSI or SAS controllers are supported?See the complete list in the Hardware Notes for &os;
&rel.current;
or &rel2.current;.What types of tape drives are supported?&os; supports all standard SCSI tape interfaces.Does &os; support tape changers?&os; supports SCSI changers using the &man.ch.4; device
and the &man.chio.1; command. The details of how you
actually control the changer can be found in the
&man.chio.1; manual page.If you are not using AMANDA
or some other product that already understands changers,
remember that they only know how to move a tape from one
point to another, so you need to keep track of which slot a
tape is in, and which slot the tape currently in the drive
needs to go back to.Which CD-ROM drives are supported by &os;?Any SCSI drive connected to a supported controller is
supported. Most ATAPI compatible IDE CD-ROMs are
supported.Which CD-RW drives are supported by &os;?&os; supports any ATAPI-compatible IDE CD-R or CD-RW
drive. See &man.burncd.8; for details.&os; also supports any SCSI CD-R or CD-RW drives.
Install and use cdrecord
from the ports or packages system, and make sure that you
have the pass device compiled in
your kernel.Keyboards and MiceIs it possible to use a mouse in any way outside the X
Window system?If you are using the default console driver,
&man.syscons.4;, you can use a mouse pointer in text
consoles to cut & paste text. Run the mouse daemon,
&man.moused.8;, and turn on the mouse pointer in the
virtual console:&prompt.root; moused -p /dev/xxxx -t yyyy
&prompt.root; vidcontrol -m onWhere xxxx is the mouse
device name and yyyy is a
protocol type for the mouse. The mouse daemon can
automatically determine the protocol type of most mice,
except old serial mice. Specify the
auto protocol to invoke automatic
detection. If automatic detection does not work, see the
&man.moused.8; manual page for a list of supported
protocol types.If you have a PS/2 mouse, just add
moused_enable="YES" to
/etc/rc.conf to start the mouse
daemon at boot-time. Additionally, if you would like to
use the mouse daemon on all virtual terminals instead of
just the console, add
allscreens_flags="-m on" to
/etc/rc.conf.When the mouse daemon is running, access to the mouse
must be coordinated between the mouse daemon and other
programs such as X Windows. Refer to the FAQ Why does my mouse not work with X?
for more details on this issue.How do I cut and paste text with a mouse in the text
console?It is not possible to remove data using the mouse.
However, it is possible to copy and
paste.
Once you get the mouse daemon running (see the
previous question)
hold down
button 1 (left button) and move the mouse to select a region
of text. Then, press button 2 (middle button) to paste
it at the text cursor. Pressing button 3 (right button)
will extend the selected region of
text.If your mouse does not have a middle button, you may
wish to emulate one or remap buttons using mouse daemon
options. See the &man.moused.8; manual page for
details.My mouse has a fancy wheel and buttons. Can I use
them in &os;?The answer is, unfortunately, It
depends. These mice with additional features
require specialized driver in most cases. Unless the
mouse device driver or the user program has specific
support for the mouse, it will act just like a standard
two, or three button mouse.For the possible usage of wheels in the X Window
environment, refer to that section.How do I use my delete key in sh
and csh?For the Bourne Shell, add
the following lines to your .shrc. See
&man.sh.1; and &man.editrc.5;.bind ^? ed-delete-next-char # for console
bind ^[[3~ ed-delete-next-char # for xtermFor the C Shell, add the
following lines to your .cshrc. See
&man.csh.1;.bindkey ^? delete-char # for console
bindkey ^[[3~ delete-char # for xtermFor more information, see this page.Other HardwareWorkarounds for no sound from my &man.pcm.4; sound
card?Some sound cards set their output volume to 0 at every
boot. Run the following command every time the machine
boots:&prompt.root; mixer pcm 100 vol 100 cd 100Does &os; support power management on my
laptop?&os; supports the ACPI
features found in modern hardware. Further
information can be found in &man.acpi.4;.TroubleshootingWhy is &os; finding the wrong amount of memory on &i386;
hardware?The most likely reason is the difference between
physical memory addresses and virtual addresses.The convention for most PC hardware is to use the memory
area between 3.5 GB and 4 GB for a special purpose
(usually for PCI). This address space is used to access PCI
hardware. As a result real, physical memory can not be
accessed by that address space.What happens to the memory that should appear in that
location is dependent on your hardware. Unfortunately, some
hardware does nothing and the ability to use that last
500 MB of RAM is entirely lost.Luckily, most hardware remaps the memory to a higher
location so that it can still be used. However, this can
cause some confusion if you watch the boot messages.On a 32-bit version of &os;, the memory appears
lost, since it will be remapped above 4 GB, which a
32-bit kernel is unable to access. In this case, the
solution is to build a PAE enabled kernel. See the entry on memory limits
and about different
memory limits on different platforms for more
information.On a 64-bit version of &os;, or when running a
PAE-enabled kernel, &os; will correctly detect and remap the
memory so it is usable. During boot, however, it may seem
as if &os; is detecting more memory than the system really
has, due to the described remapping. This is normal and the
available memory will be corrected as the boot process
completes.Why do my programs occasionally die with
Signal 11 errors?Signal 11 errors are caused when your process has
attempted to access memory which the operating system has not
granted it access to. If something like this is happening
at seemingly random intervals then you need to start
investigating things very carefully.These problems can usually be attributed to
either:If the problem is occurring only in a specific
application that you are developing yourself it is
probably a bug in your code.If it is a problem with part of the base &os;
system, it may also be buggy code, but more often than not
these problems are found and fixed long before us
general FAQ readers get to use these bits of code (that
is what -CURRENT is for).In particular, a dead giveaway that this is
not a &os; bug is if you see the
problem when you are compiling a program, but the activity
that the compiler is carrying out changes each time.For example, suppose you are running
make buildworld,
and the compile fails while trying to compile
ls.c into ls.o.
If you then run
make buildworld
again, and the compile fails in the same place then this is
a broken build — try updating your sources and try
again. If the compile fails elsewhere then this is almost
certainly hardware.What you should do:In the first case you can use a debugger e.g.,
&man.gdb.1; to find the point in the program which is
attempting to access a bogus address and then fix it.In the second case you need to verify that it is not
your hardware at fault.Common causes of this include:Your hard disks might be overheating: Check the fans
in your case are still working, as your disk (and perhaps
other hardware might be overheating).The processor running is overheating: This might be
because the processor has been overclocked, or the fan
on the processor might have died. In either case you
need to ensure that you have hardware running at what it
is specified to run at, at least while trying to solve
this problem (in other words, clock it back to the default
settings.)If you are overclocking then note that it is far
cheaper to have a slow system than a fried system that
needs replacing! Also the wider community is not often
sympathetic to problems on overclocked systems, whether
you believe it is safe or not.Dodgy memory: If you have multiple memory
SIMMS/DIMMS installed then pull them all out and try
running the machine with each SIMM or DIMM individually
and narrow the problem down to either the problematic
DIMM/SIMM or perhaps even a combination.Over-optimistic Motherboard settings: In your BIOS
settings, and some motherboard jumpers you have options
to set various timings, mostly the defaults will be
sufficient, but sometimes, setting the wait states on
RAM too low, or setting the RAM Speed:
Turbo option, or similar in the BIOS will cause
strange behavior. A possible idea is to set to BIOS
defaults, but it might be worth noting down your
settings first!Unclean or insufficient power to the motherboard.
If you have any unused I/O boards, hard disks, or CD-ROMs
in your system, try temporarily removing them or
disconnecting the power cable from them, to see if your
power supply can manage a smaller load. Or try another
power supply, preferably one with a little more power
(for instance, if your current power supply is rated at
250 Watts try one rated at 300 Watts).You should also read the SIG11 FAQ (listed below) which
has excellent explanations of all these problems, albeit from
a &linux; viewpoint. It also discusses how memory testing
software or hardware can still pass faulty memory.Finally, if none of this has helped it is possible that
you have just found a bug in &os;, and you should follow the
instructions to send a problem report.There is an extensive FAQ on this at the SIG11 problem FAQ.My system crashes with either Fatal trap 12:
page fault in kernel mode, or
panic:, and spits out a bunch of
information. What should I do?The &os; developers are very interested in these
errors, but need some more information than just the error
you see. Copy your full crash message. Then consult the
FAQ section on kernel panics,
build a debugging kernel, and get a backtrace. This might
sound difficult, but you do not need any programming skills;
you just have to follow the instructions.Why do I get the error maxproc limit
exceeded by uid %i, please see tuning(7) and
login.conf(5)?The &os; kernel will only allow a certain number of
processes to exist at one time. The number is based on the
kern.maxusers &man.sysctl.8; variable.
kern.maxusers also affects various other
in-kernel limits, such as network buffers.
If your machine is heavily loaded, you probably
want to increase kern.maxusers. This
will increase these other system limits in addition to the
maximum number of processes.To adjust your kern.maxusers value,
see the File/Process Limits
section of the Handbook. (While that section refers to open
files, the same limits apply to processes.)If your machine is lightly loaded, and you are simply
running a very large number of processes, you can adjust
this with the kern.maxproc tunable. If
this tunable needs adjustment it needs to be defined in
/boot/loader.conf. The tunable will
not get adjusted until the system is rebooted. For more
information about tuning tunables, see
&man.loader.conf.5;.
If these processes are being run by a single user, you will
also need to adjust kern.maxprocperuid to
be one less than your new kern.maxproc
value. (It must be at least one less because one system
program, &man.init.8;, must always be running.)Why does sendmail give me an
error reading mail loops back to
myself?You can find a detailed answer for this question in the
Handbook.Why do full screen applications on remote machines
misbehave?The remote machine may be setting your terminal type to
something other than the cons25 terminal
type required by the &os; console.There are a number of possible work-arounds for this
problem:After logging on to the remote machine, set your
TERM shell variable to
ansi or sco if
the remote machine knows about these terminal
types.Use a VT100 emulator like
screen at the &os; console.
screen offers you the
ability to run multiple concurrent sessions from one
terminal, and is a neat program in its own right.
Each screen window behaves
like a VT100 terminal, so the TERM
variable at the remote end should be set to
vt100.Install the cons25 terminal
database entry on the remote machine. The way to do
this depends on the operating system on the remote
machine. The system administration manuals for the
remote system should be able to help you here.Fire up an X server at the &os; end and login to the
remote machine using an X based terminal emulator such
as xterm or rxvt.
The TERM variable at the remote host
should be set to xterm or
vt100.Why does it take so long to connect to my computer via
ssh or telnet?The symptom: there is a long delay between the time the
TCP connection is established and the time when the client
software asks for a password (or, in &man.telnet.1;'s case,
when a login prompt appears).The problem: more likely than not, the delay is caused
by the server software trying to resolve the client's IP
address into a hostname. Many servers, including the
Telnet and
SSH servers that come with &os;,
do this to store the hostname
in a log file for future reference by the
administrator.The remedy: if the problem occurs whenever you connect
from your computer (the client) to any server, the problem is
with the client; likewise, if the problem only occurs when
someone connects to your computer (the server) the problem
is with the server.If the problem is with the client, the only remedy is to
fix the DNS so the server can resolve it. If this is on a
local network, consider it a server problem and keep
reading; conversely, if this is on the global Internet, you
will most likely need to contact your ISP and ask them to
fix it for you.If the problem is with the server, and this is on a
local network, you need to configure the server to be able to
resolve address-to-hostname queries for your local address
range. See the &man.hosts.5; and &man.named.8; manual pages
for more information. If this is on the global Internet,
the problem may be that your server's resolver is not
functioning correctly. To check, try to look up another
host — say, www.yahoo.com. If it
does not work, that is your problem.Following a fresh install of &os;, it is also possible
that domain and name server information is missing from
/etc/resolv.conf. This will often
cause a delay in SSH, as the
option UseDNS is set to
yes by default in
/etc/ssh/sshd_config.
If this is causing the
problem, you will either need to fill in the missing
information in /etc/resolv.conf or set
UseDNS to no in
sshd_config as a temporary
workaround.Why does file: table is full show
up repeatedly in &man.dmesg.8;?This error message indicates you have exhausted the
number of available file descriptors on your system. Please
see the kern.maxfiles
section of the Tuning Kernel Limits
section of the Handbook for a discussion and
solution.Why does the clock on my computer keep incorrect time?Your computer has two or more clocks, and &os; has
chosen to use the wrong one.Run &man.dmesg.8;, and check for lines that contain
Timecounter. The one with the highest
quality value that &os; chose.&prompt.root; dmesg | grep Timecounter
Timecounter "i8254" frequency 1193182 Hz quality 0
Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000
Timecounter "TSC" frequency 2998570050 Hz quality 800
Timecounters tick every 1.000 msecYou can confirm this by checking the
kern.timecounter.hardware
&man.sysctl.3;.&prompt.root; sysctl kern.timecounter.hardware
kern.timecounter.hardware: ACPI-fastIt may be a broken ACPI timer. The simplest solution is
to disable the ACPI timer in
/boot/loader.conf:debug.acpi.disabled="timer"Or the BIOS may modify the TSC clock—perhaps to
change the speed of the processor when running from batteries,
or going into a power saving mode, but &os; is unaware of
these adjustments, and appears to gain or lose time.In this example, the i8254 clock is
also available, and can be selected by writing its name to the
kern.timecounter.hardware
&man.sysctl.3;.&prompt.root; sysctl kern.timecounter.hardware=i8254
kern.timecounter.hardware: TSC -> i8254Your computer should now start keeping more accurate
time.To have this change automatically run at boot time, add
the following line to
/etc/sysctl.conf:kern.timecounter.hardware=i8254What does the error swap_pager: indefinite
wait buffer: mean?This means that a process is trying to page memory to
disk, and the page attempt has hung trying to access the
disk for more than 20 seconds. It might be caused by bad
blocks on the disk drive, disk wiring, cables, or any other
disk I/O-related hardware. If the drive itself is actually
bad, you will also see disk errors in
/var/log/messages and in the output of
dmesg. Otherwise, check your cables and
connections.What is a lock order
reversal?The &os; kernel uses a number of resource locks to
arbitrate contention for certain resources. When multiple
kernel threads try to obtain multiple resource locks,
there's always the potential for a deadlock,
where two threads have each obtained one of the locks and
blocks forever waiting for the other thread to release one
of the other locks. This sort of locking problem can be
avoided if all threads obtain the locks in the same
order.A run-time lock diagnostic system called &man.witness.4;,
enabled in &os.current; and disabled by default for stable
branches and releases, detects the potential for deadlocks due to
locking errors, including errors caused by obtaining multiple
resource locks with a different order from different parts of the
kernel. The &man.witness.4; framework tries to detect this
problem as it happens, and reports it by printing a message to the
system console about a lock order reversal
(often referred to also as LOR).It is possible to get false positives, as &man.witness.4;
is conservative. A true positive report does
not mean that a system is dead-locked; instead
it should be understood as a warning of the form if
you were unlucky, a deadlock would have happened
here.Problematic LORs tend to get fixed
quickly, so check &a.current.url; before posting to the
mailing lists.What does Called ... with the following
non-sleepable locks held mean?This means that a function that may sleep was called
while a mutex (or other unsleepable) lock was held.The reason this is an error is because mutexes are not
intended to be held for long periods of time; they are
supposed to only be held to maintain short periods of
synchronization. This programming contract allows device
drivers to use mutexes to synchronize with the rest of the
kernel during interrupts. Interrupts (under &os;) may not
sleep. Hence it is imperative that no subsystem in the
kernel block for an extended period while holding a
mutex.To catch such errors, assertions may be added to the
kernel that interact with the &man.witness.4; subsystem to
emit a warning or fatal error (depending on the system
configuration) when a potentially blocking call is made
while holding a mutex.In summary, such warnings are non-fatal, however with
unfortunate timing they could cause undesirable effects
ranging from a minor blip in the system's responsiveness to
a complete system lockup.For additional information about locking in &os; see
&man.locking.9;.Why does
buildworld/installworld
die with the message touch: not
found?This error does not mean that the &man.touch.1; utility
is missing. The error is instead probably due to the dates
of the files being set sometime in the future. If your
CMOS-clock is set to local time you need to run the command
adjkerntz -i to adjust the kernel
clock when booting into single user mode.User ApplicationsSo, where are all the user applications?Please take a look at the ports page
for info on software packages ported to &os;. The list
currently tops &os.numports; and is growing daily, so come
back to check often or subscribe to the &a.announce; for
periodic updates on new entries.Most ports should work on the
&rel2.relx;, and &rel.relx; branches.
Each time a &os;
release is made, a snapshot of the ports tree at the time of
release in also included in the ports/
directory.We also support the concept of a package,
essentially no more than a compressed binary distribution
with a little extra intelligence embedded in it for doing
whatever custom installation work is required. A package
can be installed and uninstalled again easily without having
to know the gory details of which files it includes.Use
&man.pkg.add.1; on the specific package files
you are interested in installing. Package files can usually
be identified by their .tbz suffix and
CD-ROM distribution people will have a
packages/All directory on their CD
which contains such files. They can also be downloaded over
the net for various versions of &os; at the following
locations:for &rel2.relx; -RELEASE/&rel2.stable;ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/&rel2.packages;for &rel.relx; -RELEASE/&rel.stable;ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/&rel.packages;or your nearest local mirror site.Note that all ports may not be available as packages
since new ones are constantly being added. It is always a
good idea to check back periodically to see which packages
are available at the ftp.FreeBSD.org
master site.How do I download the Ports tree? Should I be using
SVN?Any of the methods listed here work:Use portsnap for most use cases.Use SVN directly if you need custom patches
to the ports tree.Use CTM if you prefer getting patches
by email (this is a rarer use case).Any other method should be considered a
legacy method. If you do not already use them,
do not start.Does &os; support &java;?Yes. Please see http://www.FreeBSD.org/java/.Why can I not build this port on my
&rel2.relx; -, or
&rel.relx; -STABLE machine?If you are running a &os; version that lags
significantly behind -CURRENT or
-STABLE, you may need to update your
Ports Collection; see the Keeping Up
section of the Porter's Handbook for further information on
how to do this. If you are up to date, then someone might
have committed a change to the port which works for
-CURRENT but which broke the port for
-STABLE. Please submit a bug report on
this with the &man.send-pr.1; command, since the Ports
Collection is supposed to work for both the
-CURRENT and
-STABLE branches.I just tried to build INDEX using
make index, and
it failed. Why?First, always make sure that you have a complete
up-to-date Ports Collection. Errors that affect building
INDEX from an up-to-date copy of the
Ports Collection are high-visibility and are thus almost
always fixed immediately.There are rare cases where INDEX
will not build due to odd cases involving
WITH_* or
WITHOUT_*
variables being set in make.conf. If
you suspect that this is the case, please try to make
INDEX with those make variables turned
off before reporting it to &a.ports;.I updated the sources, now how do I update my installed
ports?&os; does not include a port upgrading tool, but it does
have some tools to make the upgrade process somewhat easier.
You can also install additional tools to simplify port
handling, see the Upgrading Ports
section in the &os; Handbook.Do I need to recompile every port each time I perform a
major version update?By all means! While a recent system will run with
software compiled under an older release, you will end up with
things randomly crashing and failing to work once you start
installing other ports or updating a portion of what you
already have.When the system is upgraded, various shared libraries,
loadable modules, and other parts of the system will be
replaced with newer versions. Applications linked against
the older versions may fail to start or, in other cases,
fail to function properly.For more information, see the section on upgrades
in the &os; Handbook.Do I need to recompile every port each time I perform a
minor version update?In general, no. &os; developers do their utmost to
guarantee binary compatibility across all releases with the
same major version number. Any exceptions will be
documented in the Release Notes, and advice given there
should be followed.Why is /bin/sh so minimal? Why
does &os; not use bash or another
shell?Many people need to write shell scripts which will be
portable across many systems. That is why &posix;
specifies the shell and utility commands in great detail.
Most scripts are written in Bourne shell (&man.sh.1;), and
because several important programming interfaces
(&man.make.1;, &man.system.3;, &man.popen.3;, and
analogues in higher-level scripting languages like Perl
and Tcl) are specified to use the Bourne shell to
interpret commands. Because the Bourne shell is so often
and widely used, it is important for it to be quick to
start, be deterministic in its behavior, and have a small
memory footprint.The existing implementation is our best effort at
meeting as many of these requirements simultaneously as we
can. To keep /bin/sh small,
we have not provided many of the convenience features that
other shells have. That is why other more
featureful shells like
bash, scsh,
&man.tcsh.1;, and zsh are available.
(You can
compare for yourself the memory utilization of all these
shells by looking at the VSZ and
RSS columns in a ps
listing.)How do I create audio CDs from my MIDI files?To create audio CDs from MIDI files, first install
audio/timidity++ from
ports then install manually the GUS patches set by Eric A.
Welsh, available at .
After TiMidity++ has been installed
properly, MIDI files may be converted to WAV files with the
following command line:&prompt.user; timidity -Ow -s 44100 -o /tmp/juke/01.wav01.midThe WAV files can then be converted to other formats or
burned onto audio CDs, as described in the &os; Handbook.Where can I get an Office Suite for &os;?The open-source Apache OpenOffice
and LibreOffice
office suites work natively on &os;.&os; also includes a variety of text editors,
spreadsheets, and drawing programs in the Ports
Collection.How can I convert from pkgng to the old package
tools?Short answer: it is not possible.Longer answer: if you have made any changes using
pkg converting back is non-trivial and
requires lots of manual editing of internal package
database files. However, if you have just run
pkg2ng then you may remove
/var/db/pkg/local.sqlite
and extract
/var/backups/pkgdb.bak.tbz.Kernel ConfigurationI would like to customize my kernel. Is it
difficult?Not at all! Check out the kernel config section of the Handbook.The new kernel will be installed
to the /boot/kernel directory along
with its modules, while the old kernel and its modules
will be moved to the /boot/kernel.old
directory, so if you make a mistake the next time you play
with your configuration you can boot the previous version
of your kernel.Why is my kernel so big?GENERIC kernels shipped with &os;
and later are compiled in debug mode.
Kernels built in debug mode
contain many symbols in separate files that are used for
debugging, thus greatly increasing the size of
/boot/kernel/.
Note that there will be little or no performance loss
from running a debug kernel, and it is useful to keep one
around in case of a system panic.However, if you are running low on disk space, there
are different options to reduce the size of /boot/kernel/.If you do not want the symbol files to be installed,
make sure you have the following line present in
/etc/src.conf:WITHOUT_KERNEL_SYMBOLS=yesFor more information see &man.src.conf.5;.If you do not want to build a debug kernel, make
sure that both of the following are true:You do not have a line in your kernel configuration
file that reads:makeoptions DEBUG=-gYou are not running &man.config.8; with
.Either of the above settings will cause your kernel to
be built in debug mode. As long as you make sure you follow
the steps above, you can build your kernel normally.If you want only the modules you use to be built
and installed, make sure you have a line like below in
/etc/make.conf:MODULES_OVERRIDE= accf_http ipfwReplace accf_httpd ipfw with
a list of modules you need. Only these modules will be
built. This does not only reduce the size of the kernel
directory but also decreases the amount of time needed to
build your kernel. For more information see
/usr/share/examples/etc/make.conf.You can also remove unneeded devices from your kernel
to further reduce the size. See
for more information.To put any of these options into effect you will have
to build and install
your new kernel.Most kernels (/boot/kernel/kernel)
tend to be around 12 MB to 16 MB.Why does every kernel I try to build fail to compile,
even GENERIC?There are a number of possible causes for this problem.
They are, in no particular order:You are not using the
make buildkernel and
make installkernel
targets, and your source tree is different from the one
used to build the currently running system (e.g., you
are compiling &rel.current;-RELEASE on a
&rel2.current;-RELEASE system). If you are attempting
an upgrade, please read
/usr/src/UPDATING, paying
particular attention to the COMMON ITEMS
section at the end.You are using the
make buildkernel
and
make installkernel
targets, but you failed to assert the completion of the
make buildworld
target. The
make buildkernel
target relies on files generated by the
make buildworld
target to complete its job correctly.Even if you are trying to build &os;-STABLE, it is possible that
you fetched the source tree at a time when it was either
being modified, or broken for other reasons; only
releases are absolutely guaranteed to be buildable,
although &os;-STABLE
builds fine the majority of the time. If you have not
already done so, try re-fetching the source tree and see
if the problem goes away. Try using a different server
in case the one you are using is having problems.How can I verify which scheduler is in use on a running
system?The name of the scheduler currently being used is
directly available as the value of the
kern.sched.name sysctl:&prompt.user; sysctl kern.sched.name
kern.sched.name: ULEWhat is kern.sched.quantum?kern.sched.quantum is the maximum
number of ticks a process can run without being preempted
in the 4BSD scheduler.Disks, File Systems, and Boot LoadersHow can I add my new hard disk to my &os; system?See the Adding Disks
section in the &os; Handbook.How do I move my system over to my huge new disk?The best way is to reinstall the OS on the new disk,
then move the user data over. This is highly recommended if
you have been tracking -STABLE for more
than one release, or have updated a release instead of
installing a new one. You can install booteasy on both
disks with &man.boot0cfg.8;, and dual boot them until you
are happy with the new configuration. Skip the next
paragraph to find out how to move the data after doing
this.Alternatively, partition and label the new disk with either
&man.sade.8; or &man.gpart.8;. If the disks are MBR-formatted,
you can also install booteasy on both disks with
&man.boot0cfg.8;, so that you can dual boot to the old or
new system after the copying is done.Now you have the new disk set up, and are ready to move
the data. Unfortunately, you cannot just blindly copy the
data. Things like device files (in
/dev), flags, and links tend to screw
that up. You need to use tools that understand these
things, which means &man.dump.8;. Although it is suggested
that you move the data in single user mode, it is not
required.You should never use anything but &man.dump.8; and
&man.restore.8; to move the root file system. The
&man.tar.1; command may work — then again, it may not.
You should also use &man.dump.8; and &man.restore.8; if you
are moving a single partition to another empty partition.
The sequence of steps to use dump to move
a partitions data to a new partition is:newfs the new partition.mount it on a temporary mount
point.cd to that directory.dump the old partition, piping
output to the new one.For example, if you are going to move root to
/dev/ada1s1a,
with /mnt as
the temporary mount point, it is:&prompt.root; newfs /dev/ada1s1a
&prompt.root; mount /dev/ada1s1a/mnt
&prompt.root; cd /mnt
&prompt.root; dump 0af - / | restore rf -Rearranging your partitions with dump
takes a bit more work. To merge a partition like
/var into its parent, create the new
partition large enough for both, move the parent partition
as described above, then move the child partition into the
empty directory that the first move created:&prompt.root; newfs /dev/ada1s1a
&prompt.root; mount /dev/ada1s1a/mnt
&prompt.root; cd /mnt
&prompt.root; dump 0af - / | restore rf -
&prompt.root; cd var
&prompt.root; dump 0af - /var | restore rf -To split a directory from its parent, say putting
/var on its own partition when it was
not before, create both partitions, then mount the child
partition on the appropriate directory in the temporary
mount point, then move the old single partition:&prompt.root; newfs /dev/ada1s1a
&prompt.root; newfs /dev/ada1s1d
&prompt.root; mount /dev/ada1s1a/mnt
&prompt.root; mkdir /mnt/var
&prompt.root; mount /dev/ada1s1d/mnt/var
&prompt.root; cd /mnt
&prompt.root; dump 0af - / | restore rf -You might prefer &man.cpio.1;, &man.pax.1;, &man.tar.1;
to &man.dump.8; for user data. At the time of this writing,
these are known to lose file flag information, so use them
with caution.Which partitions can safely use Soft Updates? I have
heard that Soft Updates on / can cause
problems. What about Journaled Soft Updates?Short answer: you can usually use Soft Updates safely on
all partitions.Long answer: Soft Updates has two
characteristics that may be undesirable on certain
paritions. First, a Soft Updates
partition has a small chance of losing data during a system
crash. (The partition will not be corrupted; the data will
simply be lost.) Second, Soft Updates can cause temporary
space shortages.When using Soft Updates, the kernel can take up to
thirty seconds to write changes to the physical
disk. When a large file is deleted the file still
resides on
disk until the kernel actually performs the deletion. This
can cause a very simple race condition. Suppose you delete
one large file and immediately create another large file.
The first large file is not yet actually removed from the
physical disk, so the disk might not have enough room for
the second large file. You get an error that the partition
does not have enough space, although you know perfectly well
that you just released a large chunk of space! When you try
again mere seconds later, the file creation works as you
expect. This has left more than one user scratching his
head and doubting his sanity, the &os; file system, or
both.If a system should crash after the kernel accepts a
chunk of data for writing to disk, but before that data is
actually written out, data could be lost. This
risk is extremely small, but generally manageable.These issues affect all partitions using Soft Updates.
So, what does this mean for the root partition?Vital information on the root partition changes very
rarely. If the
system crashed during the thirty-second window after such a
change is made, it is possible that data could be lost.
This risk is negligible for most applications, but you
should be aware that it exists. If your system cannot
tolerate this much risk, do not use Soft Updates on the root
file system!/ is traditionally one of the
smallest partitions. If you put the
/tmp directory on
/ and you have a busy
/tmp, you might see intermittent space
problems. Symlinking /tmp to
/var/tmp will solve this
problem.Finally, &man.dump.8; does not work in live mode (-L)
on a filesystem, with Journaled Soft Updates
(SU+J).Can I mount other foreign file systems under
&os;?&os; supports a variety of other file systems.UFSUFS CD-ROMs can be mounted directly on &os;.
Mounting disk partitions from Digital UNIX and other
systems that support UFS may be more complex,
depending on the details of the disk partitioning for
the operating system in question.ext2/ext3&os; supports ext2fs and
ext3fs partitions. See
&man.ext2fs.5; for more information.NTFSFUSE based NTFS support is available as a port
(sysutils/fusefs-ntfs).
For more information see ntfs-3g.FAT&os; includes a read-write FAT driver. For more
information, see &man.mount.msdosfs.8;.ZFS&os; includes a port of
&sun;'s ZFS driver. The current recommendation is to
use it only on &arch.amd64; platforms with sufficient
memory. For more information, see &man.zfs.8;.&os; also supports network file systems such as NFS (see
&man.mount.nfs.8;), NetWare (see &man.mount.nwfs.8;), and
Microsoft-style SMB file systems (see &man.mount.smbfs.8;).
You can find ports based on FUSE (sysutils/fusefs-kmod) for many
other file systems.How do I mount a secondary DOS partition?The secondary DOS partitions are found after
all the primary partitions. For
example, if you have an E partition as the
second DOS partition on the second SCSI drive, there will be
a device file for slice 5 in
/dev, so simply mount it:&prompt.root; mount -t msdosfs /dev/da1s5 /dos/eIs there a cryptographic file system for &os;?Yes. You can use either &man.gbde.8; or &man.geli.8;,
see the Encrypting Disk Partitions
section of the &os; Handbook.How can I use the &windowsnt; loader to boot
&os;?The general idea is that you copy the first sector of
your native root &os; partition into a file in the
DOS/&windowsnt; partition. Assuming you name that file
something like c:\bootsect.bsd
(inspired by c:\bootsect.dos), you can
then edit c:\boot.ini to come
up with something like this:[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows NT"
C:\BOOTSECT.BSD="&os;"
C:\="DOS"If &os; is installed on the same disk as the &windowsnt;
boot partition simply copy /boot/boot1 to
C:\BOOTSECT.BSD. However, if &os; is
installed on a different disk
/boot/boot1 will not work,
/boot/boot0 is needed./boot/boot0 needs to be installed
using &man.sysinstall.8; by selecting the &os; boot manager
on the screen which asks if you wish to use a boot manager.
This is because /boot/boot0 has the
partition table area filled with NULL characters but
&man.sysinstall.8; copies the partition table before copying
/boot/boot0 to the MBR.Do not simply copy
/boot/boot0 instead of
/boot/boot1; you will overwrite
your partition table and render your computer
un-bootable!When the &os; boot manager runs it records the last OS
booted by setting the active flag on the partition table
entry for that OS and then writes the whole 512-bytes of
itself back to the MBR so if you just copy
/boot/boot0 to
C:\BOOTSECT.BSD then it writes an empty
partition table, with the active flag set on one entry, to
the MBR.How do I boot &os; and &linux; from LILO?If you have &os; and &linux; on the same disk, just
follow LILO's installation instructions for booting a
non-&linux; operating system. Very briefly, these
are:Boot &linux;, and add the following lines to
/etc/lilo.conf:other=/dev/hda2
table=/dev/hda
label=&os;(the above assumes that your &os; slice is known to
&linux; as /dev/hda2; tailor to
suit your setup). Then, run lilo as
root and you should be done.If &os; resides on another disk, you need to add
loader=/boot/chain.b to the LILO entry.
For example:other=/dev/dab4
table=/dev/dab
loader=/boot/chain.b
label=&os;In some cases you may need to specify the BIOS drive
number to the &os; boot loader to successfully boot off the
second disk. For example, if your &os; SCSI disk is probed
by BIOS as BIOS disk 1, at the &os; boot loader prompt you
need to specify:Boot: 1:da(0,a)/boot/kernel/kernelYou can configure &man.boot.8; to automatically do this
for you at boot time.The &linux;+&os; mini-HOWTO
is a good reference for &os; and &linux; interoperability
issues.How do I boot &os; and &linux; using GRUB?Booting &os; using GRUB is very simple. Just add the
following to your configuration file
/boot/grub/menu.lst (or
/boot/grub/grub.conf in some systems,
e.g., Red Hat Linux and its derivatives).title &os; 6.1
root (hd0,a)
kernel /boot/loaderWhere hd0,a points to your
root partition on the first disk. If you need to specify
which slice number should be used, use something like this
(hd0,2,a). By default, if the
slice number is omitted, GRUB searches the first slice which
has a partition.How do I boot &os; and &linux; using
BootEasy?Install LILO at the start of your &linux; boot partition
instead of in the Master Boot Record. You can then boot
LILO from BootEasy.If you are running &windows; and &linux; this is
recommended anyway, to make it simpler to get &linux; booting
again if you should need to reinstall &windows; (which is a
Jealous Operating System, and will bear no other Operating
Systems in the Master Boot Record).How do I change the boot prompt from
??? to something more meaningful?You can not do that with the standard boot manager
without rewriting it. There are a number of other boot
managers in the sysutils ports category
that provide this functionality.I have a new removable drive, how do I use it?If the drive already has a
file system on it, you can use a command like this:&prompt.root; mount -t msdosfs /dev/da0s1 /mntIf the drive will only be used with &os;
systems it is better idea to
stick a BSD file system on it, like UFS or ZFS.
You will get long filename
support, at least a 2X improvement in performance,
and a lot more stability. If the drive will be
used by other operating systems a more portable
choice, such as msdosfs, is better.&prompt.root; dd if=/dev/zero of=/dev/da0 count=2
&prompt.root; gpart create -s GPT /dev/da0
&prompt.root; gpart add -t freebsd-ufs /dev/da0Finally, create a new file system:&prompt.root; newfs /dev/da0p1and mount it:&prompt.root; mount /dev/da0s1 /mntIt is a good idea to add a line
to /etc/fstab (see &man.fstab.5;) so
you can just type mount /mnt in the
future:/dev/da0p1 /mnt ufs rw,noauto 0 0Why do I get Incorrect super
block when mounting a CD-ROM?You have to tell &man.mount.8; the type of the device
that you want to mount. This is described in the Handbook section on optical media,
specifically the section Using Data CDs.Why do I get Device not
configured when mounting a CD-ROM?This generally means that there is no CD-ROM in the
CD-ROM drive, or the drive is not visible on the bus.
Please see the Using Data CDs
section of the Handbook for a detailed discussion of this
issue.Why do all non-English characters in filenames show up
as ? on my CDs when mounted in &os;?Your CD-ROM probably uses the Joliet
extension for storing information about files and
directories. This is discussed in the Handbook chapter on
creating and using CD-ROMs,
specifically the section on Using Data CD-ROMs.I burned a CD under &os; and now I can not read it under
any other operating system. Why?You most likely burned a raw file to your CD, rather
than creating an ISO 9660 file system. Take a look at
the Handbook chapter on creating CD-ROMs,
particularly the section on burning raw data CDs.How can I create an image of a data CD?This is discussed in the Handbook section on duplicating data CDs.
For more on working with CD-ROMs, see the Creating CDs Section
in the Storage chapter in the Handbook.Why can I not mount an audio
CD?If you try to mount an audio CD, you will get an error
like cd9660: /dev/acd0c: Invalid
argument. This is because
mount only works on file systems. Audio
CDs do not have file systems; they just have data. You need
a program that reads audio CDs, such as the audio/xmcd port.How do I mount a multi-session
CD?By default, &man.mount.8; will attempt to mount the last
data track (session) of a CD. If you would like to load an
earlier session, you must use the
command line argument. Please see &man.mount.cd9660.8; for
specific examples.How do I let ordinary users mount CD-ROMs, DVDs,
USB drives, and other removable media?As root set the sysctl variable
vfs.usermount to
1.&prompt.root; sysctl vfs.usermount=1To make this persist across reboots, add the line
vfs.usermount=1 to
/etc/sysctl.conf so that
it is reset at system boot time.Users can only mount devices they have read
permissions to. To allow users to mount a device
permissions must be set in
/etc/devfs.conf.For example, to allow users to mount the first USB
drive add:# Allow all users to mount a USB drive.
own /dev/da0 root:operator
perm /dev/da00 0666All users can now mount devices they could read
onto a directory that they own:&prompt.user; mkdir ~/my-mount-point
&prompt.user; mount -t msdosfs /dev/da0~/my-mount-pointUnmounting the device is simple:&prompt.user; umount ~/my-mount-pointEnabling vfs.usermount, however, has
negative security implications. A better way to access
&ms-dos; formatted media is to use the emulators/mtools package in the
Ports Collection.The device name used in the previous examples must be
changed according to your configuration.The du and df
commands show different amounts of disk space available.
What is going on?You need to understand what du and
df really do. du goes
through the directory tree, measures how large each file is,
and presents the totals. df just asks
the file system how much space it has left. They seem to be
the same thing, but a file without a directory entry will
affect df but not
du.When a program is using a file, and you delete the file,
the file is not really removed from the file system until
the program stops using it. The file is immediately deleted
from the directory listing, however. You can see this
easily enough with a program such as
more. Assume you have a file large
enough that its presence affects the output of
du and df. (Since
disks can be so large today, this might be a
very large file!) If you delete this
file while using more on it,
more does not immediately choke and
complain that it cannot view the file. The entry is simply
removed from the directory so no other program or user can
access it. du shows that it is gone
— it has walked the directory tree and the file is not
listed. df shows that it is still there,
as the file system knows that more is
still using that space. Once you end the
more session, du and
df will agree.This situation is common on web servers. Many people
set up a &os; web server and forget to rotate the log files.
The access log fills up /var. The new
administrator deletes the file, but the system still
complains that the partition is full. Stopping and
restarting the web server program would free the file,
allowing the system to release the disk space. To prevent
this from happening, set up &man.newsyslog.8;.Note that Soft Updates can delay the freeing of disk
space; you might need to wait up to 30 seconds for the
change to be visible!How can I add more swap space?In the Configuration and Tuning
section of the Handbook, you will find a section
describing how to do this.Why does &os; see my disk as smaller than the
manufacturer says it is?Disk manufacturers calculate gigabytes as a billion
bytes each, whereas &os; calculates them as
1,073,741,824 bytes each. This explains why, for
example, &os;'s boot messages will report a disk that
supposedly has 80 GB as holding 76,319 MB.Also note that &os; will (by default) reserve 8% of the disk
space.How is it possible for a partition to be more than 100%
full?A portion of each UFS partition (8%, by default) is
reserved for use by the operating system and the
root user. &man.df.1; does not count
that space when calculating the Capacity
column, so it can exceed 100%. Also, you will notice that
the Blocks column is always greater than
the sum of the Used and
Avail columns, usually by a factor of
8%.For more details, look up
in &man.tunefs.8;.ZFSWhat is the minimum amount of RAM one should have to
run ZFS?A minimum of 4GB of RAM is required for comfortable
usage, but individual workloads can vary widely.What is the ZIL and when does it get used?The ZIL ((ZFS
intent log) is a write log used to implement posix write
commitment semantics across crashes. Normally writes
are bundled up into transaction groups
and written to disk when filled (Transaction Group
Commit). However syscalls like &man.fsync.2;
require a commitment that the data is written to stable
storage before returning.
The ZIL is needed for writes that have been acknowledged
as written but which are not yet on disk as part of a
transaction. The transaction groups are timestamped.
In the event of a crash the last valid timestamp is
found and missing data is merged in from the ZIL.Do I need a SSD for ZIL?By default, ZFS stores the ZIL in the pool with all
the data. If your application has a heavy write load,
storing the ZIL in a separate device that has very fast
synchronous, sequential write performance can improve
overall system. For other workloads, a SSD is unlikely
to make much of an improvement.What is the L2ARC?The L2ARC is a read cache stored
on a fast device such as an SSD.
This cache is not persisent across
reboots. Note that RAM is used as the first layer
of cache and the L2ARC is only needed if there is
insufficient RAM.L2ARC needs space in the ARC to index it. So,
perversely, a working set that fits perfectly in the
ARC will not fit perfectly any more if a L2ARC is used
because part of the ARC is holding the L2ARC index,
pushing part of the working set into the
L2ARC which is slower than RAM.Is enabling deduplication advisable?Generally speaking, no.Deduplication takes up a significant amount
of RAM and may slow down read and write
disk access times. Unless one is storing data that is
very heavily duplicated (such as virtual machine images,
or user backups) it is possible that deduplication will
do more harm than good. Another consideration is the
inability to revert deduplication status. If data is
written when deduplication is enabled, disabling dedup
will not cause those blocks which were deduplicated to
be replicated until they are next modified.Deduplication can also lead to some unexpected
situations. In particular deleting files may become much
slower.I can not delete or create files on my ZFS pool.
How can I fix this?This could happen because the pool is 100% full.
ZFS requires space on the disk to write
transaction metadata. To restore the pool
to a usable state, truncate a file you want to
delete.&prompt.user; truncate -s 0 unimportant-fileFile truncation works because a new transaction is
not started, new spare blocks are created instead.On systems with additional ZFS dataset tuning,
such as deduplication, the space may not be immediately
availableDoes ZFS support TRIM for Solid State Drives?ZFS TRIM support was added to &os; 10-CURRENT
with revision r240868. ZFS TRIM
support is not yet available on the -STABLE
branches.ZFS TRIM is enabled by default, and can be turned
off by adding this line to
/etc/sysctl.conf:vfs.zfs.trim_disable=1ZFS TRIM may not work with all configurations,
such as a ZFS filesystem on a GELI-backed
device.System AdministrationWhere are the system start-up configuration
files?The primary configuration file is
/etc/defaults/rc.conf (see
&man.rc.conf.5;). System startup scripts such as
/etc/rc and
/etc/rc.d (see &man.rc.8;) just include
this file. Do not edit this file!
Instead, if there is any entry in
/etc/defaults/rc.conf that you want to
change, you should copy the line into
/etc/rc.conf and change it
there.For example, if you wish to start &man.named.8;, the
included DNS server, all you need to do is:&prompt.root; echo 'named_enable="YES"' >> /etc/rc.confTo start up local services, place shell scripts in the
/usr/local/etc/rc.d directory. These
shell scripts should be set executable, the default file
mode is 555.How do I add a user easily?Use the &man.adduser.8; command, or the &man.pw.8;
command for more complicated situations.To remove the user, use the &man.rmuser.8; command or,
if necessary, &man.pw.8;.Why do I keep getting messages like root: not
found after editing
/etc/crontabThis is normally caused by editing the system crontab
(/etc/crontab) and then using
&man.crontab.1; to install it:&prompt.root; crontab /etc/crontabThis is not the correct way to do things. The system
crontab has a different format to the per-user crontabs
which &man.crontab.1; updates (the &man.crontab.5; manual
page explains the differences in more detail).If this is what you did, the extra crontab is simply a
copy of /etc/crontab in the wrong
format it. Delete it with the command:&prompt.root; crontab -rNext time, when you edit
/etc/crontab, you should not do
anything to inform &man.cron.8; of the changes, since it
will notice them automatically.If you want something to be run once per day, week, or
month, it is probably better to add shell scripts
/usr/local/etc/periodic, and let the
&man.periodic.8; command run from the system
cron schedule it with the other periodic
system tasks.The actual reason for the error is that the system
crontab has an extra field, specifying which user to run the
command as. In the default system crontab provided with
&os;, this is root for all entries.
When this crontab is used as the root
user's crontab (which is not the same
as the system crontab), &man.cron.8; assumes the string
root is the first word of the command to
execute, but no such command exists.Why do I get the error, you are not in the
correct group to su root when I try to
su to root?This is a security feature. To
su to root (or any
other account with superuser privileges), you must be in the
wheel group. If this feature were
not there, anybody with an account on a system who also
found out root's password would be able
to gain superuser level access to the system. With this
feature, this is not strictly true; &man.su.1; will prevent
them from even trying to enter the password if they are not
in wheel.To allow someone to su to
root, simply put them in the
wheel group. Use &man.pw.8;
for this purpose.&prompt.root; pw groupmod wheel -m lisaThe above example will add user
lisa to the group
wheel.I made a mistake in rc.conf, or
another startup file, and now I cannot edit it because the
file system is read-only. What should I do?Restart the system using boot -s
at the loader prompt to enter Single User mode. When
prompted for a shell pathname, simply press
Enter, and run
mount -urw / to re-mount the root file
system in read/write mode. You may also need to run
mount -a -t ufs to mount the file system
where your favorite editor is defined. If your favorite
editor is on a network file system, you will need to either
configure the network manually before you can mount network
file systems, or use an editor which resides on a local file
system, such as &man.ed.1;.If you intend to use a full screen editor such as
&man.vi.1; or &man.emacs.1;, you may also need to run
export TERM=xterm on &os; 9.0+, or
export TERM=cons25 on &os; 8.X
so that these editors
can load the correct data from the &man.termcap.5;
database.Once you have performed these steps, you can edit
/etc/rc.conf as you usually would to
fix the syntax error. The error message displayed
immediately after the kernel boot messages should tell you
the number of the line in the file which is at fault.Why am I having trouble setting up my printer?See the Handbook entry on printing.
It should cover most of your problem.Some printers require a host-based driver to do any kind
of printing. These so-called WinPrinters are
not natively supported by &os;. If your printer does not
work in DOS or &windows;, it is probably a WinPrinter. Your
only hope of getting one of these to work is to check if the
print/pnm2ppa port
supports it.How can I correct the keyboard mappings for my
system?Please see the Handbook section on using localization,
specifically the section on console setup.Why can I not get user quotas to work properly?It is possible that your kernel is not configured
to use quotas. If this is the case, you will need to
add the following line to your kernel configuration
file and recompile:options QUOTAPlease read the Handbook entry on quotas
for full details.Do not turn on quotas on
/.Put the quota file on the file system that the
quotas are to be enforced on, i.e.:File SystemQuota file/usr/usr/admin/quotas/home/home/admin/quotas……Does &os; support System V IPC primitives?Yes, &os; supports System V-style IPC, including shared
memory, messages and semaphores, in the
GENERIC kernel. With a custom kernel,
support may be loaded with the sysvshm.ko,
sysvsem.ko and
sysvmsg.ko kernel modules, or
enabled in the custom kernel by adding the following lines to your
kernel config:options SYSVSHM # enable shared memory
options SYSVSEM # enable for semaphores
options SYSVMSG # enable for messagingRecompile and install your kernel.What other mail-server software can I use instead of
sendmail?The sendmail
server is the default mail-server software for &os;, but you
can easily replace it with one of the other MTA (for
instance, an MTA installed from the ports).There are various alternative MTAs in the ports tree
already, with mail/exim,
mail/postfix, mail/qmail, and mail/zmailer being some of the
most popular choices.Diversity is nice, and the fact that you have many
different mail-servers to chose from is considered a good
thing; therefore try to avoid asking questions like
Is sendmail better than
qmail? in the mailing
lists. If you do feel like asking, first check the mailing
list archives. The advantages and disadvantages of each and
every one of the available MTAs have already been discussed
a few times.I have forgotten the root password!
What do I do?Do not panic! Restart the system, type
boot -s at the
Boot: prompt to enter Single User mode.
At the question about the shell to use, hit
Enter. You will be dropped to a
&prompt.root; prompt. Enter mount -urw /
to remount your root file system read/write, then run
mount -a to remount all the file systems.
Run passwd root to change the
root password then run &man.exit.1; to
continue booting.If you are still prompted to give the
root password when entering the
Single User mode, it means that the console has been
marked as insecure in
/etc/ttys. In this case it will be
required to boot from a &os; installation disk, choose
the Live CD or
Shell at the beginning of the install
process and issue the commands mentioned above. You will need to
mount the specific partition in this case and then chroot to it,
i.e., replace mount -urw / by
mount /dev/ada0p1 /mnt; chroot /mnt for
a system on ada0p1.If you cannot mount your root partition from Single
User mode, it is possible that the partitions are
encrypted and it is impossible to mount them without the
access keys. Your chances depend on the chosen
implementation. For more information see the section
about encrypted disks in the &os; Handbook.How do I keep ControlAltDelete
from rebooting the system?If you are using &man.syscons.4; (the default console
driver) build and install a new kernel with the line in the
configuration file:options SC_DISABLE_REBOOTThis can also be done by setting the following
&man.sysctl.8; which does not require a reboot or kernel
recompile:&prompt.root; sysctl hw.syscons.kbd_reboot=0The above two methods are exclusive: The &man.sysctl.8;
does not exist if you compile your kernel with the
SC_DISABLE_REBOOT option.How do I reformat DOS text files to &unix; ones?Use this &man.perl.1; command:&prompt.user; perl -i.bak -npe 's/\r\n/\n/g' file(s)where file(s) is one or more
files to process. The modification is done in-place, with the
original file stored with a .bak
extension.Alternatively you can use the &man.tr.1; command:&prompt.user; tr -d '\r' < dos-text-file > unix-filedos-text-file is the file
containing DOS text while
unix-file will contain the
converted output. This can be quite a bit faster than using
perl.Yet another way to reformat DOS text files is to use the
converters/dosunix port
from the Ports Collection. Consult its documentation about
the details.How do I kill processes by name?Use &man.pkill.1;.How do I re-read /etc/rc.conf and
re-start /etc/rc without a
reboot?Go into single user mode and then back to multi user
mode.On the console do:&prompt.root; shutdown now
(Note: without -r or -h)
&prompt.root; return
&prompt.root; exitI tried to update my system to the latest
-STABLE, but got
-BETAx,
-RC or
-PRERELEASE! What is going on?Short answer: it is just a name.
RC stands for Release
Candidate. It signifies that a release is imminent.
In &os;, -PRERELEASE is typically
synonymous with the code freeze before a release. (For some
releases, the -BETA label was used in
the same way as -PRERELEASE.)Long answer: &os; derives its releases from one of two
places. Major, dot-zero, releases, such as 9.0-RELEASE
are branched from the head of the development
stream, commonly referred to as -CURRENT. Minor releases, such as
6.3-RELEASE or 5.2-RELEASE, have been snapshots of the
active -STABLE branch.
Starting with 4.3-RELEASE, each release also now has its own
branch which can be tracked by people requiring an extremely
conservative rate of development (typically only security
advisories).When a release is about to be made, the branch from
which it will be derived from has to undergo a certain
process. Part of this process is a code freeze. When a
code freeze is initiated, the name of the branch is changed
to reflect that it is about to become a release. For
example, if the branch used to be called 6.2-STABLE, its
name will be changed to 6.3-PRERELEASE to signify the code
freeze and signify that extra pre-release testing should be
happening. Bug fixes can still be committed to be part of
the release. When the source code is in shape for the
release the name will be changed to 6.3-RC to signify that a
release is about to be made from it. Once in the RC stage,
only the most critical bugs found can be fixed. Once the
release (6.3-RELEASE in this example) and release branch
have been made, the branch will be renamed to
6.3-STABLE.For more information on version numbers and the various
Subversion branches, refer to the Release Engineering
article.I tried to install a new kernel, and the &man.chflags.1;
failed. How do I get around this?Short answer: You are probably at security level greater
than 0. Reboot directly to Single User mode to install the
kernel.Long answer: &os; disallows changing system flags at
security levels greater than 0. You can check your security
level with the command:&prompt.root; sysctl kern.securelevelYou cannot lower the security level; you have to boot to
Single Mode to install the kernel, or change the security
level in /etc/rc.conf then reboot. See
the &man.init.8; manual page for details on
securelevel, and see
/etc/defaults/rc.conf and the
&man.rc.conf.5; manual page for more information on
rc.conf.I cannot change the time on my system by more than one
second! How do I get around this?Short answer: You are probably at security level greater
than 1. Reboot directly to Single User mode to change the
date.Long answer: &os; disallows changing the time by more
that one second at security levels greater than 1. You can
check your security level with the command:&prompt.root; sysctl kern.securelevelYou cannot lower the security level; you have to boot to
Single User mode to change the date, or change the security
level in /etc/rc.conf then reboot. See
the &man.init.8; manual page for details on
securelevel, and see
/etc/defaults/rc.conf and the
&man.rc.conf.5; manual page for more information on
rc.conf.Why is rpc.statd using 256 MB of
memory?No, there is no memory leak, and it is not using
256 MB of memory. For convenience,
rpc.statd maps an obscene amount of
memory into its address space. There is nothing terribly
wrong with this from a technical standpoint; it just throws
off things like &man.top.1; and &man.ps.1;.&man.rpc.statd.8; maps its status file (resident on
/var) into its address space; to save
worrying about remapping it later when it needs to grow, it
maps it with a generous size. This is very evident from the
source code, where one can see that the length argument to
&man.mmap.2; is 0x10000000, or one
sixteenth of the address space on an IA32, or exactly
256 MB.Why can I not unset the schg file
flag?You are running at an elevated (i.e., greater than 0)
securelevel. Lower the securelevel and try again. For more
information, see the FAQ entry
on securelevel and the &man.init.8; manual
page.Why does SSH authentication
through .shosts not work by default in
recent versions of &os;?The reason why .shosts
authentication does not work by default in more recent
versions of &os; is because &man.ssh.1; is not installed
suid root by default. To
fix this, you can do one of the
following:As a permanent fix, set
ENABLE_SUID_SSH to
true in
/etc/make.conf then rebuild and
reinstall &man.ssh.1;.As a temporary fix, change the mode on
/usr/bin/ssh to
4555 by running
chmod 4555 /usr/bin/ssh as
root.What is vnlru?vnlru flushes and frees vnodes when
the system hits the kern.maxvnodes limit.
This kernel thread sits mostly idle, and only activates if
you have a huge amount of RAM and are accessing tens of
thousands of tiny files.What do the various memory states displayed by
top mean?Active: pages recently
statistically used.Inactive: pages recently
statistically unused.Cache: (most often) pages that
have percolated from inactive to a status where they
maintain their data, but can often be immediately reused
(either with their old association, or reused with a new
association). There can be certain immediate transitions
from active to
cache state if the page is known to
be clean (unmodified), but that transition is a matter
of policy, depending upon the algorithm choice of the VM
system maintainer.Free: pages without data content,
and can be immediately used in certain circumstances
where cache pages might be ineligible. Free pages can
be reused at interrupt or process
state.Wired: pages that are fixed into
memory, usually for kernel purposes, but also sometimes
for special use in processes.Pages are most often written to disk (sort of a VM sync)
when they are in the inactive state, but active pages can
also be synced. This depends upon the CPU tracking of the
modified bit being available, and in certain situations
there can be an advantage for a block of VM pages to be
synced, whether they are active or inactive. In most common
cases, it is best to think of the inactive queue to be a
queue of relatively unused pages that might or might not be
in the process of being written to disk. Cached pages are
already synced, not mapped, but available for immediate
process use with their old association or with a new
association. Free pages are available at interrupt level,
but cached or free pages can be used at process state for
reuse. Cache pages are not adequately locked to be
available at interrupt level.There are some other flags (e.g., busy flag or busy
count) that might modify some of the described rules.How much free memory is available?There are a couple of kinds of free
memory. One kind is the amount of memory
immediately available without paging anything else out.
That is approximately the size of cache queue + size of free
queue (with a derating factor, depending upon system
tuning). Another kind of free memory is the
total amount of VM space. That can be
complex, but is dependent upon the amount of swap space and
memory. Other kinds of free memory
descriptions are also possible, but it is relatively useless
to define these, but rather it is important to make sure
that the paging rate is kept low, and to avoid running out
of swap space.What is /var/empty? I can not
delete it!/var/empty is a directory that the
&man.sshd.8; program uses when performing privilege separation.
The /var/empty directory is empty, owned by
root and has the schg
flag set.Although it is not recommended to delete this directory, to
do so you will need to unset the schg flag
first. See the &man.chflags.1; manual page for more information
(and bear in mind the answer to
the question on unsetting the schg flag).I just changed
/etc/newsyslog.conf. How can I check
if it does what I expect?To see what &man.newsyslog.8; will do use the
following:&prompt.user; newsyslog -nrvvMy time is wrong, how can I change the
timezone?Use &man.tzsetup.8;.The X Window System and Virtual ConsolesWhat is the X Window System?The X Window System (commonly X11) is
the most widely available windowing system capable of running
on &unix; or &unix; like systems, including &os;.
The X.Org Foundation
administers the X protocol standards,
with the current reference implementation, version 11
release &xorg.version;, so you will often see references
shortened to X11.Many implementations are available for different
architectures and operating systems. An implementation of
the server-side code is properly known as an X
server.I want to run &xorg;, how do I go about it?To install &xorg; do one of the following:Use the x11/xorg
meta-port, which builds and installs every &xorg;
component.Use x11/xorg-minimal, which builds
and installs only the necessary &xorg; components.Install &xorg; from &os; packages:&prompt.root; pkg_add -r xorgor on systems using pkg:&prompt.root; pkg install xorgAfter the installation of &xorg;, follow
the instructions from the X11 Configuration section of
the &os; Handbook.I tried to run X, but I get a
No devices detected. error when I
type
startx. What do I do now?Your system is probably running at a raised
securelevel. It is not possible to start X
at a raised securelevel because X
requires write access to &man.io.4;. For more information,
see at the &man.init.8; manual page.There are two solutions to the problem:
Set your
securelevel back down to zero (usually
in /etc/rc.conf), or run &man.xdm.1;
(or an alternative display manager)
at boot time (before the securelevel is
raised).See for more information about
running &man.xdm.1; at boot time.Why does my mouse not work with X?If you are using &man.syscons.4; (the default console
driver), you can configure &os; to support a mouse pointer on
each virtual screen. To avoid conflicting with X,
&man.syscons.4; supports a virtual device called
/dev/sysmouse. All mouse events
received from the real mouse device are written to the
&man.sysmouse.4; device via &man.moused.8;. To use your
mouse on one or more virtual consoles,
and use X, see and set up
&man.moused.8;.Then edit /etc/X11/xorg.conf and
make sure you have the following lines:Section "InputDevice"
Option "Protocol" "SysMouse"
Option "Device" "/dev/sysmouse"
.....Starting with &xorg; version 7.4, the
InputDevice sections in
xorg.conf are ignored in favor of
autodetected devices. To restore the old behavior, add the
following line to the ServerLayout or
ServerFlags section:Option "AutoAddDevices" "false"Some people prefer to use
/dev/mouse under X. To make this
work, /dev/mouse should be linked
to /dev/sysmouse (see
&man.sysmouse.4;) by adding the following line to
/etc/devfs.conf (see
&man.devfs.conf.5;):link sysmouse mouseThis link can be created by restarting &man.devfs.5;
with the following command (as
root):&prompt.root; service devfs restartMy mouse has a fancy wheel. Can I use it in X?Yes.You need to tell X that you have a 5 button mouse. To
do this, simply add the lines Buttons 5
and ZAxisMapping 4 5 to the
InputDevice section of
/etc/X11/xorg.conf. For example, you
might have the following InputDevice section
in /etc/X11/xorg.conf.InputDevice Section for Wheeled Mouse
in &xorg; Configuration FileSection "InputDevice"
Identifier "Mouse1"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/sysmouse"
Option "Buttons" "5"
Option "ZAxisMapping" "4 5"
EndSection.emacs Example for Naive Page
Scrolling with Wheeled Mouse (optional);; wheel mouse
(global-set-key [mouse-4] 'scroll-down)
(global-set-key [mouse-5] 'scroll-up)My laptop has a Synaptics touchpad. Can I use
it in X?Yes, you will have to configure a few things to
make it work.If you plan to use the Xorg synaptics driver you
must remove moused_enable from
rc.conf. Xorg can not use
the synaptics mouse if the moused already sits on
/dev/psm0.To enable synaptics in the &man.psm.4; driver you need
to add the following into
/boot/loader.conf:hw.psm.synaptics_support="1"You also need the following into
xorg.conf:Section "InputDevice"
Identifier "Touchpad0"
Driver "synaptics"
Option "Protocol" "psm"
Option "Device" "/dev/psm0"
EndSectionAnd be sure to add the following into the
ServerLayout section:InputDevice "Touchpad0" "SendCoreEvents"How do I use remote X displays?For security reasons, the default setting is to not
allow a machine to remotely open a window.To enable this feature, simply start
X with the optional
argument:&prompt.user; startx -listen_tcpWhat is a virtual console and how do I make more?Virtual consoles, put simply, enable you to have several
simultaneous sessions on the same machine without doing
anything complicated like setting up a network or running
X.When the system starts, it will display a login prompt
on the monitor after displaying all the boot messages. You
can then type in your login name and password and start
working (or playing!) on the first virtual console.At some point, you will probably wish to start another
session, perhaps to look at documentation for a program you
are running or to read your mail while waiting for an FTP
transfer to finish. Just do AltF2
(hold down Alt and press
F2), and you will find a login prompt
waiting for you on the second virtual
console! When you want to go back to the original
session, do AltF1.The default &os; installation has eight virtual consoles
enabled. AltF1,
AltF2,
AltF3,
and so on will switch between these virtual consoles.To enable more of them, edit
/etc/ttys (see &man.ttys.5;) and add
entries for ttyv8 to
ttyvc after the comment on
Virtual terminals:# Edit the existing entry for ttyv8 in /etc/ttys and change
# "off" to "on".
ttyv8 "/usr/libexec/getty Pc" xterm on secure
ttyv9 "/usr/libexec/getty Pc" xterm on secure
ttyva "/usr/libexec/getty Pc" xterm on secure
ttyvb "/usr/libexec/getty Pc" xterm on secureUse as many or as few as you want. The more virtual
terminals you have, the more resources that are used; this
can be important if you have 8 MB RAM or less. You may
also want to change the secure to
insecure.Versions of &os; prior to 9.0 used the
cons25 terminal type, and not
xterm. Existing entries in
/etc/ttys can be used on which to
base new additions.If you want to run an X server you
must leave at least one virtual
terminal unused (or turned off) for it to use. That is to
say that if you want to have a login prompt pop up for all
twelve of your Alt-function keys, you are out of luck
— you can only do this for eleven of them if you
also want to run an X server on the same machine.The easiest way to disable a console is by turning it
off. For example, if you had the full 12 terminal
allocation mentioned above and you wanted to run X, you
would change settings for virtual terminal 12 from:ttyvb "/usr/libexec/getty Pc" xterm on secureto:ttyvb "/usr/libexec/getty Pc" xterm off secureIf your keyboard has only ten function keys, you would
end up with:ttyv9 "/usr/libexec/getty Pc" xterm off secure
ttyva "/usr/libexec/getty Pc" xterm off secure
ttyvb "/usr/libexec/getty Pc" xterm off secure(You could also just delete these lines.)Next, the easiest (and cleanest) way to activate the
virtual consoles is to reboot. However, if you really do
not want to reboot, you can just shut down the X Window
system and execute (as root):&prompt.root; kill -HUP 1It is imperative that you completely shut down X Window
if it is running, before running this command. If you do not,
your system will probably appear to hang or lock up after
executing kill.How do I access the virtual consoles from X?Use CtrlAltFn
to switch back to a virtual console. CtrlAltF1
would return you to the first virtual console.Once you are back to a text console, you can then use
AltFn
as normal to move between them.To return to the X session, you must switch to the
virtual console running X. If you invoked X from the
command line, (e.g., using startx) then
the X session will attach to the next unused virtual
console, not the text console from which it was invoked. If
you have eight active virtual terminals then X will be
running on the ninth, and you would use AltF9
to return.How do I start XDM on
boot?There are two schools of thought on how to start
&man.xdm.1;. One school starts xdm from
/etc/ttys (see &man.ttys.5;) using the
supplied example, while the other simply runs
xdm from
rc.local (see &man.rc.8;) or from an
X script in
/usr/local/etc/rc.d. Both are equally
valid, and one may work in situations where the other does
not. In both cases the result is the same: X will pop up a
graphical login prompt.The &man.ttys.5; method has the advantage of documenting
which vty X will start on and passing the responsibility of
restarting the X server on logout to &man.init.8;. The
&man.rc.8; method makes it easy to killxdm if there is a problem starting the X
server.If loaded from &man.rc.8;, xdm should
be started without any arguments (i.e., as a daemon).
xdm must start
after &man.getty.8; runs, or else
getty and xdm will
conflict, locking out the console. The best way around this
is to have the script sleep 10 seconds or so then launch
xdm.If you are to start xdm from
/etc/ttys, there still is a chance of
conflict between xdm and &man.getty.8;.
One way to avoid this is to add the vt
number in
/usr/local/lib/X11/xdm/Xservers:0 local /usr/local/bin/X vt4The above example will direct the X server to run in
/dev/ttyv3. Note the number is
offset by one. The X server counts the vty from one,
whereas the &os; kernel numbers the vty from zero.Why do I get Couldn't open
console when I run
xconsole?If you start X with
startx, the permissions on
/dev/console will
not get changed, resulting in things
like xterm -C and
xconsole not working.This is because of the way console permissions are set
by default. On a multi-user system, one does not
necessarily want just any user to be able to write on the
system console. For users who are logging directly onto a
machine with a VTY, the &man.fbtab.5; file exists to solve
such problems.In a nutshell, make sure an uncommented line of the form
is in /etc/fbtab (see
&man.fbtab.5;):/dev/ttyv0 0600 /dev/consoleIt will ensure that whomever logs in on
/dev/ttyv0 will own the
console.Why does my PS/2 mouse misbehave under X?Your mouse and the mouse driver may have somewhat become
out of synchronization. In rare cases the driver may erroneously report
synchronization problem and you may see the kernel
message:psmintr: out of sync (xxxx != yyyy)and notice that your mouse does not work
properly.If this happens, disable the synchronization check code
by setting the driver flags for the PS/2 mouse driver to
0x100. This can be easiest achieved
by adding
hint.psm.0.flags="0x100"
to
/boot/loader.conf and rebooting.How do I reverse the mouse buttons?Run the command xmodmap -e "pointer = 3 2 1"
from .xinitrc or
.xsession.How do I install a splash screen and where do I find
them?The detailed answer for this question can be found in
the Boot Time Splash Screens
section of the &os; Handbook.Can I use the Windows keys on my
keyboard in X?Yes. All you need to do is use &man.xmodmap.1; to
define what function you wish them to perform.Assuming all Windows keyboards are
standard then the keycodes for these three keys are the
following:115 —
Windows key, between the left-hand
Ctrl and Alt
keys116 —
Windows key, to the right of
AltGr117 — Menu,
to the left of the right-hand CtrlTo have the left Windows key print a
comma, try this.&prompt.root; xmodmap -e "keycode 115 = comma"To have the Windows key-mappings
enabled automatically every time you start X either put the
xmodmap commands in
~/.xinitrc or, preferably, create
a ~/.xmodmaprc and include the
xmodmap options, one per line, then add
the following line to
~/.xinitrc:xmodmap $HOME/.xmodmaprcFor example, you could map the 3 keys to be
F13, F14, and
F15, respectively. This would make it easy
to map them to useful functions within applications or your
window manager, as demonstrated further down.To do this put the following in
~/.xmodmaprc.keycode 115 = F13
keycode 116 = F14
keycode 117 = F15If you use the x11-wm/fvwm2 port, for example,
you could map the keys so that F13
iconifies (or de-iconifies) the window the cursor is in,
F14 brings the window the cursor is in to
the front or, if it is already at the front, pushes it to
the back, and F15 pops up the main
Workplace (application) menu even if the cursor is not on
the desktop, which is useful if you do not have any part of
the desktop visible (and the logo on the key matches its
functionality).The following entries in ~/.fvwmrc
implement the aforementioned setup:Key F13 FTIWS A Iconify
Key F14 FTIWS A RaiseLower
Key F15 A A Menu Workplace NopHow can I get 3D hardware acceleration for
&opengl;?The availability of 3D acceleration depends on the
version of &xorg; that you are using and the type of video
chip you have. If you have an nVidia chip, you can use the
binary drivers provided for &os; by installing one of the
following ports:The latest versions of nVidia cards are supported by
the x11/nvidia-driver
port.nVidia cards like the GeForce2 MX/3/4 series
are supported by the 96XX series of drivers, available
in the x11/nvidia-driver-96xx
port.Even older cards, like GeForce and RIVA TNT are
supported by the 71XX series of drivers, available in
the x11/nvidia-driver-71xx
port.nVidia provides detailed information on which
card is supported by which driver
on their web site: .For Matrox G200/G400, check the
x11-servers/mga_hal
port.For ATI Rage 128 and Radeon see
&man.ati.4x;, &man.r128.4x; and &man.radeon.4x;.NetworkingWhere can I get information on diskless
booting?Diskless booting means that the &os;
box is booted over a network, and reads the necessary
files from a server instead of its hard disk. For full
details, please read the Handbook entry on diskless booting.Can a &os; box be used as a dedicated network
router?Yes. Please see the Handbook entry on advanced networking,
specifically the section on routing and gateways.Can I connect my &windows; box to the Internet via
&os;?Typically, people who ask this question have two PCs at
home, one with &os; and one with some version of &windows;
the idea is to use the &os; box to connect to the Internet
and then be able to access the Internet from the &windows;
box through the &os; box. This is really just a special
case of the previous question and works perfectly
well.Dialup users must use
and set
gateway_enable to
YES in
/etc/rc.conf.
For
more information, please see the &man.ppp.8; manual page or
the Handbook entry on user PPP.If you are using kernel-mode PPP or have an Ethernet
connection to the Internet, you need to use &man.natd.8;.
Please look at the natd
section of the Handbook for a tutorial.Does &os; support PPP?Yes. &man.ppp.8; provides support for both
incoming and outgoing connections.For more information on how to use this, please see the
Handbook chapter on PPP.Does &os; support NAT or Masquerading?Yes. If you want to use NAT over a user PPP connection,
please see the Handbook entry on user PPP.
If you want to use NAT over some other sort of network
connection, please look at the natd
section of the Handbook.How can I set up Ethernet aliases?If the alias is on the same subnet as an address already
configured on the interface, then add netmask
0xffffffff to your &man.ifconfig.8; command-line,
as in the following:&prompt.root; ifconfig ed0 alias 192.0.2.2 netmask 0xffffffffOtherwise, just specify the network address and netmask
as usual:&prompt.root; ifconfig ed0 alias 172.16.141.5 netmask 0xffffff00You can read more about this in the &os; Handbook.Why can I not NFS-mount from a &linux; box?Some versions of the &linux; NFS code only accept mount
requests from a privileged port; try to issue the following
command:&prompt.root; mount -o -P linuxbox:/blah/mntWhy does mountd keep telling me it
can't change attributes and that I
have a bad exports list on my &os;
NFS server?The most frequent problem is not understanding the
correct format of /etc/exports. Please
review &man.exports.5; and the NFS
entry in the Handbook, especially the section on configuring NFS.How do I enable IP multicast support?&os; supports multicast host operations by default. If
you want your box to run as a multicast router, you need to
recompile your kernel with the MROUTING
option and run &man.mrouted.8;. &os; will start
&man.mrouted.8; at boot time if the flag
mrouted_enable is set to
YES in
/etc/rc.conf.In recent &os; releases, the &man.mrouted.8; multicast
routing daemon, the &man.map-mbone.8; and &man.mrinfo.8;
utilities have been removed from the base system. These
programs are now available in the &os; Ports Collection as
net/mrouted.Why do I have to use the FQDN for hosts on my
site?See the answer in the &os; Handbook.Why do I get an error, Permission
denied, for all networking operations?If you have compiled your kernel with the
IPFIREWALL option, you need to be aware
that the default policy is to deny all packets that are not
explicitly allowed.If you had unintentionally misconfigured your system for
firewalling, you can restore network operability by typing
the following while logged in as
root:&prompt.root; ipfw add 65534 allow all from any to anyYou can also set firewall_type="open"
in /etc/rc.conf.For further information on configuring a &os; firewall,
see the Handbook chapter.Why is my ipfwfwd
rule to redirect a service to another machine not
working?Possibly because you want to do network address
translation (NAT) and not just forward packets. A
fwd rule does exactly what it says; it
forwards packets. It does not actually change the data
inside the packet. Say we have a rule like:01000 fwd 10.0.0.1 from any to foo 21When a packet with a destination address of
foo arrives at the machine with
this rule, the packet is forwarded to
10.0.0.1, but it still has the
destination address of foo! The
destination address of the packet is
not changed to
10.0.0.1. Most machines would
probably drop a packet that they receive with a destination
address that is not their own. Therefore, using a
fwd rule does not often work the way the user
expects. This behavior is a feature and not a bug.See the FAQ about redirecting services,
the &man.natd.8; manual, or one of the several port
redirecting utilities in the Ports Collection
for a correct way to do this.How can I redirect service requests from one machine to
another?You can redirect FTP (and other service) request with
the sysutils/socket
port. Simply replace the service's command line to call
socket instead, like so:ftp stream tcp nowait nobody /usr/local/bin/socket socket ftp.example.comftpwhere ftp.example.com and
ftp are the host and port to
redirect to, respectively.Where can I get a bandwidth management tool?There are three bandwidth management tools available for
&os;. &man.dummynet.4; is integrated into &os; as part of
&man.ipfw.4;. ALTQ
has been integrated into &os; as part of &man.pf.4;.
Bandwidth Manager from Emerging Technologies
is a commercial product.Why do I get /dev/bpf0: device not
configured?You are running a program that requires the Berkeley
Packet Filter (&man.bpf.4;), but it is not in your kernel.
Add this to your kernel config file and build a new
kernel:device bpf # Berkeley Packet FilterHow do I mount a disk from a &windows; machine that is
on my network, like smbmount in &linux;?Use the SMBFS toolset. It
includes a set of kernel modifications and a set of userland
programs. The programs and information are available as
&man.mount.smbfs.8; in the base system.What are these messages about: Limiting
icmp/open port/closed port response in my log
files?This is the kernel telling you that some activity is
provoking it to send more ICMP or TCP reset (RST) responses
than it thinks it should. ICMP responses are often
generated as a result of attempted connections to unused UDP
ports. TCP resets are generated as a result of attempted
connections to unopened TCP ports. Among others, these are
the kinds of activities which may cause these
messages:Brute-force denial of service (DoS) attacks (as
opposed to single-packet attacks which exploit a
specific vulnerability).Port scans which attempt to connect to a large
number of ports (as opposed to only trying a few
well-known ports).The first number in the message tells you how many
packets the kernel would have sent if the limit was not in
place, and the second number tells you the limit. You can
control the limit using the
net.inet.icmp.icmplim sysctl variable
like this, where 300 is the limit in
packets per second:&prompt.root; sysctl net.inet.icmp.icmplim=300If you do not want to see messages about this in your
log files, but you still want the kernel to do response
limiting, you can use the
net.inet.icmp.icmplim_output sysctl
variable to disable the output like this:&prompt.root; sysctl net.inet.icmp.icmplim_output=0Finally, if you want to disable response limiting, you
can set the net.inet.icmp.icmplim sysctl
variable (see above for an example) to 0.
Disabling response limiting is discouraged for the reasons
listed above.What are these arp: unknown hardware address
format error messages?This means that some device on your local Ethernet is
using a MAC address in a format that &os; does not
recognize. This is probably caused by someone experimenting
with an Ethernet card somewhere else on the network. You
will see this most commonly on cable modem networks. It is
harmless, and should not affect the performance of your &os;
machine.Why do I keep seeing messages like: 192.168.0.10 is on
fxp1 but got reply from 00:15:17:67:cf:82 on rl0, and how do I
disable it?Because a packet is coming from outside the network
unexpectedly. To disable them, set
net.link.ether.inet.log_arp_wrong_iface
to 0.SecurityWhat is a sandbox?Sandbox is a security term. It can mean
two things:A process which is placed inside a set of virtual
walls that are designed to prevent someone who breaks
into the process from being able to break into the wider
system.The process is said to be able to
play inside the walls. That is, nothing
the process does in regards to executing code is
supposed to be able to breech the walls so you do not
have to do a detailed audit of its code to be able to
say certain things about its security.The walls might be a user ID, for example.
This is the definition used in the &man.security.7; and
&man.named.8; man pages.Take the ntalk service, for
example (see &man.inetd.8;). This service used to run
as user ID root. Now it runs
as user ID tty. The
tty user is a sandbox designed to
make it more difficult for someone who has successfully
hacked into the system via ntalk from
being able to hack beyond that user ID.A process which is placed inside a simulation of the
machine. It means
that someone who is able to break into the process may
believe that he can break into the wider machine but is,
in fact, only breaking into a simulation of that machine
and not modifying any real data.The most common way to accomplish this is to build a
simulated environment in a subdirectory and then run the
processes in that directory chrooted (i.e., / for that process is this
directory, not the real / of the system).Another common use is to mount an underlying file
system read-only and then create a file system layer on
top of it that gives a process a seemingly writeable
view into that file system. The process may believe it
is able to write to those files, but only the process
sees the effects — other processes in the system
do not, necessarily.An attempt is made to make this sort of sandbox so
transparent that the user (or hacker) does not realize
that he is sitting in it.&unix; implements two core sandboxes. One is at the
process level, and one is at the userid level.Every &unix; process is completely firewalled off from
every other &unix; process. One process cannot modify the
address space of another.A &unix; process is owned by a particular userid. If
the user ID is not the root user,
it serves to firewall the process off from processes owned
by other users. The user ID is also used to firewall
off on-disk data.What is securelevel?securelevel is a security
mechanism implemented in the kernel. When the securelevel
is positive, the
kernel restricts certain tasks; not even the superuser
(i.e., root) is allowed to do them.
The securelevel mechanism limits the ability to:Unset certain file flags, such as
schg (the system immutable
flag).Write to kernel memory via
/dev/mem and
/dev/kmem.Load kernel modules.Alter firewall rules.To check the status of the securelevel on a running
system, simply execute the following command:&prompt.root; sysctl -n kern.securelevelThe output contains the current value of the
securelevel. If it is positive (i.e., greater than 0), at
least some of the securelevel's protections are
enabled.The securelevel of a running system can not be
lowered as this would defeat its purpose. If you need
to do a task that requires that the securelevel be
non-positive (e.g., an installworld
or changing the date), you will have to change the
securelevel setting in /etc/rc.conf
(you want to look for the
kern_securelevel and
kern_securelevel_enable variables) and
reboot.For more information on securelevel and the specific
things all the levels do, please consult the &man.init.8;
manual page.Securelevel is not a silver bullet; it has many known
deficiencies. More often than not, it provides a false
sense of security.One of its biggest problems is that in order for it to
be at all effective, all files used in the boot process up
until the securelevel is set must be protected. If an
attacker can get the system to execute their code prior to
the securelevel being set (which happens quite late in the
boot process since some things the system must do at
start-up cannot be done at an elevated securelevel), its
protections are invalidated. While this task of
protecting all files used in the boot process is not
technically impossible, if it is achieved, system
maintenance will become a nightmare since one would have
to take the system down, at least to single-user mode, to
modify a configuration file.This point and others are often discussed on the
mailing lists, particularly the &a.security;. Please
search the archives here for an
extensive discussion. A more fine-grained mechanism
is preferred.BIND (named) is listening on
some high-numbered ports. What is going on?BIND uses a random high-numbered port for outgoing
queries. Recent versions of it choose a new, random UDP
port for each query. This may cause problems for some
network configurations, especially if a firewall blocks
incoming UDP packets on particular ports. If you want to
get past that firewall, you can try the
avoid-v4-udp-ports and
avoid-v6-udp-ports options to avoid
selecting random port numbers within a blocked range.If a port number (like 53) is specified via the
query-source or
query-source-v6 options in
/etc/namedb/named.conf, randomized
port selection will not be used. It is strongly
recommended that these options not be used to specify
fixed port numbers.Congratulations, by the way. It is good practice to
read your &man.sockstat.1; output and notice odd
things!The sendmail daemon is
listening on port 587 as well as the standard port 25! What
is going on?Recent versions of sendmail
support a mail submission feature that runs over port 587.
This is not yet widely supported, but is growing in
popularity.What is this UID 0 toor account?
Have I been compromised?Do not worry. toor is an
alternative superuser account (toor is root
spelt backwards). Previously it was created when the
&man.bash.1; shell was installed but now it is created by
default. It is intended to be used with a non-standard
shell so you do not have to change
root's default shell. This is
important as shells which are not part of the base
distribution (for example a shell installed from ports or
packages) are likely to be installed in
/usr/local/bin which, by default,
resides on a different file system. If
root's shell is located in
/usr/local/bin and
/usr (or whatever file system contains
/usr/local/bin) is not mounted for some
reason, root will not be able to log in
to fix a problem (although if you reboot into single user
mode you will be prompted for the path to a shell).Some people use toor for day-to-day
root tasks with a non-standard shell,
leaving root, with a standard shell,
for single user mode or emergencies. By default you cannot
log in using toor as it does not have a
password, so log in as root and set a
password for toor if you want to use
it.PPPI cannot make &man.ppp.8; work. What am I doing
wrong?You should first read the &man.ppp.8; manual page and
the PPP section of the handbook.
Enable logging with the following command:set log Phase Chat Connect Carrier lcp ipcp ccp commandThis command may be typed at the &man.ppp.8; command
prompt or it may be entered in the
/etc/ppp/ppp.conf configuration file
(the start of the default section is the
best place to put it). Make sure that
/etc/syslog.conf (see
&man.syslog.conf.5;) contains the lines below and the file
/var/log/ppp.log exists:!ppp
*.* /var/log/ppp.logYou can now find out a lot about what is going on from
the log file. Do not worry if it does not all make sense.
If you need to get help from someone, it may make sense to
them.Why does &man.ppp.8; hang when I run it?This is usually because your hostname will not resolve.
The best way to fix this is to make sure that
/etc/hosts is consulted by your
resolver first by editing
/etc/host.conf and putting the
hosts line first. Then, simply put an
entry in /etc/hosts for your local
machine. If you have no local network, change your
localhost line:127.0.0.1 foo.example.com foo localhostOtherwise, simply add another entry for your host.
Consult the relevant manual pages for more details.You should be able to successfully
ping -c1 `hostname` when you are
done.Why will &man.ppp.8; not dial in
-auto mode?First, check that you have got a default route. By
running netstat -rn (see
&man.netstat.1;), you should see two entries like
this:Destination Gateway Flags Refs Use Netif Expire
default 10.0.0.2 UGSc 0 0 tun0
10.0.0.2 10.0.0.1 UH 0 0 tun0This is assuming that you have used the addresses from
the handbook, the manual page, or from
ppp.conf.sample. If you do not
have a default route, it may be because you forgot to add
the HISADDR line to
ppp.conf.Another reason for the default route line being missing
is that you have mistakenly set up a default router in your
/etc/rc.conf (see &man.rc.conf.5;) file
and you have omitted the line below from
ppp.conf:delete ALLIf this is the case, go back to the Final System Configuration
section of the handbook.What does No route to host
mean?This error is usually due that the following section is
missing in your /etc/ppp/ppp.linkup:MYADDR:
delete ALL
add 0 0 HISADDRThis is only necessary if you have a dynamic IP address
or do not know the address of your gateway. If you are
using interactive mode, you can type the following after
entering packet mode (packet mode is
indicated by the capitalized PPP in the
prompt):delete ALL
add 0 0 HISADDRRefer to the PPP and Dynamic IP addresses
section of the handbook for further details.Why does my connection drop after about 3
minutes?The default PPP timeout is 3 minutes. This can be
adjusted with the following line:set timeout NNNwhere NNN is the number of
seconds of inactivity before the connection is closed. If
NNN is zero, the connection is
never closed due to a timeout. It is possible to put this
command in ppp.conf, or to
type it at the prompt in interactive mode. It is also
possible to adjust it on the fly while the line is active by
connecting to ppp's server socket
using &man.telnet.1; or &man.pppctl.8;. Refer to the
&man.ppp.8; man page for further details.Why does my connection drop under heavy load?If you have Link Quality Reporting (LQR) configured, it
is possible that too many LQR packets are lost between your
machine and the peer. &man.ppp.8; deduces that
the line must therefore be bad, and disconnects.
LQR is disabled by default and can be enabled with the
following line:enable lqrWhy does my connection drop after a random amount of
time?Sometimes, on a noisy phone line or even on a line with
call waiting enabled, your modem may hang up because it
thinks (incorrectly) that it lost carrier.There is a setting on most modems for determining how
tolerant it should be to temporary losses of carrier.
Refer to the modem manual for details.Why does my connection hang after a random amount of
time?Many people experience hung connections with no apparent
explanation. The first thing to establish is which side of
the link is hung.If you are using an external modem, you can simply try
using &man.ping.8; to see if the TD light
is flashing when you transmit data. If it flashes (and the
RD light does not), the problem is with
the remote end. If TD does not flash,
the problem is local. With an internal modem, you will need
to use the set server command in
ppp.conf. When the hang occurs,
connect to &man.ppp.8; using &man.pppctl.8;. If your
network connection suddenly revives (PPP was revived due to
the activity on the diagnostic socket) or if you cannot
connect (assuming the set socket command
succeeded at startup time), the problem is local. If you
can connect and things are still hung, enable local async
logging with set log local async and use
&man.ping.8; from another window or terminal to make use of
the link. The async logging will show you the data being
transmitted and received on the link. If data is going out
and not coming back, the problem is remote.Having established whether the problem is local or
remote, you now have two possibilities:If the problem is remote, read on entry .If the problem is local, read on entry .The remote end is not responding. What can I do?There is very little you can do about this. Most ISPs
will refuse to help if you are not running a µsoft; OS.
You can enable lqr in your
ppp.conf, allowing &man.ppp.8; to
detect the remote failure and hang up, but this detection is
relatively slow and therefore not that useful. You may want
to avoid telling your ISP that you are running
user-PPP.First, try disabling all local compression by adding the
following to your configuration:disable pred1 deflate deflate24 protocomp acfcomp shortseq vj
deny pred1 deflate deflate24 protocomp acfcomp shortseq vjThen reconnect to ensure that this makes no difference.
If things improve or if the problem is solved completely,
determine which setting makes the difference through trial
and error. This will provide good ammunition when you
contact your ISP (although it may make it apparent that you
are not running a µsoft; product).Before contacting your ISP, enable async logging locally
and wait until the connection hangs again. This may use up
quite a bit of disk space. The last data read from the port
may be of interest. It is usually ASCII data, and may even
describe the problem (Memory fault,
Core dumped).If your ISP is helpful, they should be able to enable
logging on their end, then when the next link drop occurs,
they may be able to tell you why their side is having a
problem.&man.ppp.8; has hung. What can I do?Your best bet here is to rebuild &man.ppp.8; with
debugging information, and then use &man.gdb.1; to grab a
stack trace from the ppp process
that is stuck. To rebuild the
ppp utility with debugging
information, you can type:&prompt.root; cd /usr/src/usr.sbin/ppp
&prompt.root; env DEBUG_FLAGS='-g' make clean
&prompt.root; env DEBUG_FLAGS='-g' make installThen you should restart ppp
and wait until it hangs again. When the debug build of
ppp hangs, start
gdb on the stuck process by
typing:&prompt.root; gdb ppp `pgrep ppp`At the gdb prompt, you can
use the bt or where
commands to get a stack trace. Save the output of your
gdb session, and
detach from the running process by typing
quit.I keep seeing errors about magic being the same. What
does it mean?Occasionally, just after connecting, you may see
messages in the log that say Magic is
same. Sometimes, these messages are harmless,
and sometimes one side or the other exits. Most PPP
implementations cannot survive this problem, and even if the
link seems to come up, you will see repeated configure
requests and configure acknowledgments in the log file until
&man.ppp.8; eventually gives up and closes the
connection.This normally happens on server machines with slow disks
that are spawning a &man.getty.8; on the port, and executing
&man.ppp.8; from a login script or program after login.
There were reports of it happening consistently when using
slirp. The reason is that in the time taken between
&man.getty.8; exiting and &man.ppp.8; starting, the
client-side &man.ppp.8; starts sending Line Control Protocol
(LCP) packets. Because ECHO is still switched on for the
port on the server, the client &man.ppp.8; sees these
packets reflect back.One part of the LCP negotiation is to establish a magic
number for each side of the link so that
reflections can be detected. The protocol
says that when the peer tries to negotiate the same magic
number, a NAK should be sent and a new magic number should
be chosen. During the period that the server port has ECHO
turned on, the client &man.ppp.8; sends LCP packets, sees
the same magic in the reflected packet and NAKs it. It also
sees the NAK reflect (which also means &man.ppp.8; must
change its magic). This produces a potentially enormous
number of magic number changes, all of which are happily
piling into the server's tty buffer. As soon as &man.ppp.8;
starts on the server, it is flooded with magic number
changes and almost immediately decides it has tried enough
to negotiate LCP and gives up. Meanwhile, the client, who
no longer sees the reflections, becomes happy just in time
to see a hangup from the server.This can be avoided by allowing the peer to start
negotiating with the following line in
ppp.conf:set openmode passiveThis tells &man.ppp.8; to wait for the server to
initiate LCP negotiations. Some servers however may never
initiate negotiations. If this is the case, you can do
something like:set openmode active 3This tells &man.ppp.8; to be passive for 3 seconds, and
then to start sending LCP requests. If the peer starts
sending requests during this period, &man.ppp.8; will
immediately respond rather than waiting for the full 3
second period.LCP negotiations continue until the connection is
closed. What is wrong?There is currently an implementation mis-feature in
&man.ppp.8; where it does not associate LCP, CCP & IPCP
responses with their original requests. As a result, if one
PPP implementation is more than 6 seconds slower than the
other side, the other side will send two additional LCP
configuration requests. This is fatal.Consider two implementations, A and
B. A starts sending LCP
requests immediately after connecting and B
takes 7 seconds to start. When B starts,
A has sent 3 LCP REQs. We are assuming the
line has ECHO switched off, otherwise we would see magic
number problems as described in the previous section.
B sends a REQ, then an ACK to the first of
A's REQs. This results in
A entering the OPENED
state and sending and ACK (the first) back to
B. In the meantime, B
sends back two more ACKs in response to the two additional
REQs sent by A before B
started up. B then receives the first ACK
from A and enters the
OPENED state. A
receives the second ACK from B and goes
back to the REQ-SENT state, sending
another (forth) REQ as per the RFC. It then receives the
third ACK and enters the OPENED state.
In the meantime, B receives the forth REQ
from A, resulting in it reverting to the
ACK-SENT state and sending another
(second) REQ and (forth) ACK as per the RFC.
A gets the REQ, goes into
REQ-SENT and sends another REQ. It
immediately receives the following ACK and enters
OPENED.This goes on until one side figures out that they are
getting nowhere and gives up.The best way to avoid this is to configure one side to
be passive — that is, make one side
wait for the other to start negotiating. This can be done
with the following command:set openmode passiveCare should be taken with this option. You should also
use this command to limit the amount of time that
&man.ppp.8; waits for the peer to begin negotiations:set stopped NAlternatively, the following command (where
N is the number of seconds to
wait before starting negotiations) can be used:set openmode active NCheck the manual page for details.Why does &man.ppp.8; lock up when I shell out to test
it?When you execute the shell or
! command, &man.ppp.8; executes a shell
(or if you have passed any arguments, &man.ppp.8; will
execute those arguments). The
ppp program will wait for the
command to complete before continuing. If you attempt to
use the PPP link while running the command, the link will
appear to have frozen. This is because &man.ppp.8; is
waiting for the command to complete.To execute commands like this, use
!bg instead. This will execute
the given command in the background, and &man.ppp.8; can
continue to service the link.Why does &man.ppp.8; over a null-modem cable never
exit?There is no way for &man.ppp.8; to automatically
determine that a direct connection has been dropped. This
is due to the lines that are used in a null-modem serial
cable. When using this sort of connection, LQR should
always be enabled with the following line:enable lqrLQR is accepted by default if negotiated by the
peer.Why does &man.ppp.8; dial for no reason in
mode?If &man.ppp.8; is dialing unexpectedly, you must
determine the cause, and set up Dial filters (dfilters) to
prevent such dialing.To determine the cause, use the following line:set log +tcp/ipThis will log all traffic through the connection. The
next time the line comes up unexpectedly, you will see the
reason logged with a convenient timestamp next to it.You can now disable dialing under these circumstances.
Usually, this sort of problem arises due to DNS lookups. To
prevent DNS lookups from establishing a connection (this
will not prevent &man.ppp.8; from
passing the packets through an established connection), use
the following:set dfilter 1 deny udp src eq 53
set dfilter 2 deny udp dst eq 53
set dfilter 3 permit 0/0 0/0This is not always suitable, as it will effectively
break your demand-dial capabilities — most programs
will need a DNS lookup before doing any other network
related things.In the DNS case, you should try to determine what is
actually trying to resolve a host name. A lot of the time,
&man.sendmail.8; is the culprit. You should make sure that
you tell sendmail not to do any
DNS lookups in its configuration file. See the section on
using email with a dialup connection
in the &os; Handbook for details on how to create your own
configuration file and what should go into it. You may also
want to add the following line to
.mc:define(`confDELIVERY_MODE', `d')dnlThis will make sendmail queue
everything until the queue is run (usually, sendmail is
run with , telling it to run
the queue every 30 minutes) or until a sendmail
is done (perhaps from your
ppp.linkup).What do these CCP errors mean?I keep seeing the following errors in my log
file:CCP: CcpSendConfigReq
CCP: Received Terminate Ack (1) state = Req-Sent (6)This is because &man.ppp.8; is trying to negotiate
Predictor1 compression, and the peer does not want to
negotiate any compression at all. The messages are
harmless, but if you wish to remove them, you can disable
Predictor1 compression locally too:disable pred1Why does &man.ppp.8; not log my connection speed?To log all lines of your modem
conversation, you must enable the
following:set log +connectThis will make &man.ppp.8; log everything up until the
last requested expect string.If you wish to see your connect speed and are using PAP
or CHAP (and therefore do not have anything to
chat after the CONNECT in the dial script
— no set login script), you must
make sure that you instruct &man.ppp.8; to
expect the whole CONNECT line, something like
this:set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 4 \
\"\" ATZ OK-ATZ-OK ATDT\\T TIMEOUT 60 CONNECT \\c \\n"Here, we get our CONNECT, send nothing, then expect a
line-feed, forcing &man.ppp.8; to read the whole CONNECT
response.Why does &man.ppp.8; ignore the \
character in my chat script?The ppp utility parses each
line in your config files so that it can interpret strings
such as set phone "123 456 789" correctly
and realize that the number is actually only
one argument. To specify a
" character, you must escape it
using a backslash (\).When the chat interpreter parses each argument, it
re-interprets the argument to find any special
escape sequences such as \P or
\T (see the manual page). As a result of
this double-parsing, you must remember to use the correct
number of escapes.If you wish to actually send a \
character to (say) your modem, you would need something
like:set dial "\"\" ATZ OK-ATZ-OK AT\\\\X OK"It will result in the following sequence:ATZ
OK
AT\X
OKOr:set phone 1234567
set dial "\"\" ATZ OK ATDT\\T"It will result in the following sequence:ATZ
OK
ATDT1234567Why does &man.ppp.8; get a Segmentation
fault, but I see no
ppp.coreThe ppp utility (or any other
program for that matter) should never dump core. Because
&man.ppp.8; runs setuid (with an effective user ID of
0), the operating system will not write
core image of &man.ppp.8; to disk before terminating it.
If, however &man.ppp.8; is actually terminating due to a
segmentation violation or some other signal that normally
causes core to be dumped, and you are
sure you are using the latest version (see the start of this
section), then you should install the system sources and do
the following:&prompt.root; cd/usr/src/usr.sbin/ppp
&prompt.root; echoSTRIP= >> /etc/make.conf
&prompt.root; echoCFLAGS+= >> /etc/make.conf
&prompt.root; makeinstallcleanYou will now have a debuggable version of &man.ppp.8;
installed. You will have to be root to
run &man.ppp.8; as all of its privileges have been revoked.
When you start &man.ppp.8;, take a careful note of what your
current directory was at the time.Now, if and when &man.ppp.8; receives the segmentation
violation, it will dump a core file called
ppp.core. You should then do the
following:&prompt.user; su
&prompt.root; gdb /usr/sbin/ppp ppp.core(gdb)bt
.....
(gdb)f 0
....
(gdb)i args
....
(gdb)l
.....All of this information should be given alongside your
question, making it possible to diagnose the problem.If you are familiar with &man.gdb.1;, you may wish to
find out some other bits and pieces such as what actually
caused the dump or the addresses and values of the relevant
variables.Why does the process that forces a dial in
mode never connect?This was a known problem with &man.ppp.8; set up to
negotiate a dynamic local IP number with the peer in
mode. It has been fixed a long time
ago — search the manual page for
iface.The problem was that when that initial program calls
&man.connect.2;, the IP number of the &man.tun.4; interface
is assigned to the socket endpoint. The kernel creates the
first outgoing packet and writes it to the &man.tun.4;
device. &man.ppp.8; then reads the packet and establishes a
connection. If, as a result of &man.ppp.8;'s dynamic IP
assignment, the interface address is changed, the original
socket endpoint will be invalid. Any subsequent packets
sent to the peer will usually be dropped. Even if they are
not, any responses will not route back to the originating
machine as the IP number is no longer owned by that
machine.There are several theoretical ways to approach this
problem. It would be nicest if the peer would re-assign the
same IP number if possible. The current version of
&man.ppp.8; does this, but most other implementations do
not.The easiest method from our side would be to never
change the &man.tun.4; interface IP number, but instead to
change all outgoing packets so that the source IP number is
changed from the interface IP to the negotiated IP on the
fly. This is essentially what the
iface-alias option in the latest version
of &man.ppp.8; is doing (with the help of &man.libalias.3;
and &man.ppp.8;'s switch) — it
is maintaining all previous interface addresses and NATing
them to the last negotiated address.Another alternative (and probably the most reliable)
would be to implement a system call that changes all bound
sockets from one IP to another. &man.ppp.8; would use this
call to modify the sockets of all existing programs when a
new IP number is negotiated. The same system call could be
used by DHCP clients when they are forced
to call the bind() function for their
sockets.Yet another possibility is to allow an interface to be
brought up without an IP number. Outgoing packets would be
given an IP number of 255.255.255.255 up until the first
SIOCAIFADDR &man.ioctl.2; is done. This
would result in fully binding the socket. It would be up to
&man.ppp.8; to change the source IP number, but only if it
is set to 255.255.255.255,
and only the IP number and IP checksum would need to change.
This, however is a bit of a hack as the kernel would be
sending bad packets to an improperly configured interface,
on the assumption that some other mechanism is capable of
fixing things retrospectively.Why do most games not work with the
switch?The reason games and the like do not work when
&man.libalias.3; is in use is that the machine on the outside
will try to open a connection or send (unsolicited) UDP
packets to the machine on the inside. The NAT software does
not know that it should send these packets to the interior
machine.To make things work, make sure that the only thing
running is the software that you are having problems with,
then either run &man.tcpdump.1; on the &man.tun.4; interface
of the gateway or enable &man.ppp.8; TCP/IP logging
(set log +tcp/ip) on the gateway.When you start the offending software, you should see
packets passing through the gateway machine. When something
comes back from the outside, it will be dropped (that is the
problem). Note the port number of these packets then shut
down the offending software. Do this a few times to see if
the port numbers are consistent. If they are, then the
following line in the relevant section of
/etc/ppp/ppp.conf will make the
software functional:nat port protointernalmachine:portportwhere proto is either
tcp or udp,
internalmachine is the machine
that you want the packets to be sent to and
port is the destination port
number of the packets.You will not be able to use the software on other
machines without changing the above command, and running the
software on two internal machines at the same time is out of
the question — after all, the outside world is seeing
your entire internal network as being just a single
machine.If the port numbers are not consistent, there are three
more options:Submit support in &man.libalias.3;. Examples of
special cases can be found in
/usr/src/sys/netinet/libalias/alias_*.c
(alias_ftp.c is a good prototype).
This usually involves reading certain recognized
outgoing packets, identifying the instruction that tells
the outside machine to initiate a connection back to the
internal machine on a specific (random) port and setting
up a route in the alias table so that the
subsequent packets know where to go.This is the most difficult solution, but it is the
best and will make the software work with multiple
machines.Use a proxy. The application may support
socks5 for example, or
may have a
passive option that avoids ever
requesting that the peer open connections back to the
local machine.Redirect everything to the internal machine using
nat addr. This is the sledge-hammer
approach.What are FCS errors?FCS stands for Frame Check Sequence. Each
PPP packet has a checksum attached to ensure that the data
being received is the data being sent. If the FCS of an
incoming packet is incorrect, the packet is dropped and the
HDLC FCS count is increased. The HDLC error values can be
displayed using the show hdlc
command.If your link is bad (or if your serial driver is
dropping packets), you will see the occasional FCS error.
This is not usually worth worrying about although it does
slow down the compression protocols substantially. If you
have an external modem, make sure your cable is properly
shielded from interference — this may eradicate the
problem.If your link freezes as soon as you have connected and
you see a large number of FCS errors, this may be because your
link is not 8-bit clean. Make sure your modem is not using
software flow control (XON/XOFF). If your datalink
must use software flow control, use the
command set accmap 0x000a0000 to tell
&man.ppp.8; to escape the ^Q and
^S characters.Another reason for seeing too many FCS errors may be
that the remote end has stopped talking
PPP. You may want to enable
async logging at this point to determine
if the incoming data is actually a login or shell prompt.
If you have a shell prompt at the remote end, it is possible
to terminate &man.ppp.8; without dropping the line by using
close lcp (a following
term) will reconnect you to the
shell on the remote machine.If nothing in your log file indicates why the link might
have been terminated, you should ask the remote
administrator (your ISP?) why the session was
terminated.None of this helps — I am desperate! What can I
do?If all else fails, send as much information as you can,
including your config files, how you are starting
&man.ppp.8;, the relevant parts of your log file and the
output of netstat -rn (before
and after connecting) to the &a.questions;
and someone should point you in the right
direction.Serial CommunicationsThis section answers common questions about serial
communications with &os;. PPP is covered in the Networking section.Which multi-port serial cards are supported by
&os;?There is a list of these in the Serial Communications
chapter of the handbook.Most multi-port PCI cards that are based on 16550 or
clones are supported with no extra effort.Some unnamed clone cards have also been known to work,
especially those that claim to be AST compatible.Check &man.uart.4; and &man.sio.4; to get more
information on configuring such cards.How do I get the boot: prompt to show on the serial
console?See this section of the handbook.How do I tell if &os; found my serial ports or modem
cards?As the &os; kernel boots, it will probe for the serial
ports in your system for which the kernel was configured.
You can either watch your system closely for the messages it
prints or run this command after your system is up and
running:&prompt.user; dmesg | grep -E "^sio[0-9]"Here is some example output from the above
command:sio0: <16550A-compatible COM port> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
sio0: type 16550A
sio1: <16550A-compatible COM port> port 0x2f8-0x2ff irq 3 on acpi0
sio1: type 16550AThis shows two serial ports. The first is on
IRQ 4, is using port address 0x3f8,
and has a 16550A-type UART chip. The second uses the same
kind of chip but is on IRQ 3 and is at port address
0x2f8. Internal modem cards are treated
just like serial ports — except that they always have
a modem attached to the port.The GENERIC kernel includes support
for two serial ports using the same IRQ and port address
settings in the above example. If these settings are not
right for your system, or if you have added modem cards or
have more serial ports than your kernel is configured for,
just reconfigure your kernel. See section about building a kernel for
more details.How do I access the serial ports on &os;?The third serial port, sio2
(see &man.sio.4;, known as COM3 in
DOS), is on /dev/cuad2 for dial-out
devices, and on /dev/ttyd2 for
dial-in devices. What is the difference between these two
classes of devices?You use
ttydX
for dial-ins. When opening
/dev/ttydX
in blocking mode, a process will wait for the corresponding
cuadX
device to become inactive, and then wait for the carrier
detect line to go active. When you open the
cuadX
device, it makes sure the serial port is not already in use
by the
ttydX
device. If the port is available, it steals
it from the
ttydX
device. Also, the
cuadX
device does not care about carrier detect. With this scheme
and an auto-answer modem, you can have remote users log in
and you can still dial out with the same modem and the
system will take care of all the conflicts.How do I enable support for a multiport serial
card?Again, the section on kernel configuration provides
information about configuring your kernel. For a multiport
serial card, place an &man.sio.4; line for each serial port
on the card in the &man.device.hints.5; file. But place the
IRQ specifiers on only one of the entries. All of the ports
on the card should share one IRQ. For consistency, use the
last serial port to specify the IRQ. Also, specify the
following option in the kernel configuration file:options COM_MULTIPORTThe following /boot/device.hints
example is for an AST 4-port serial card on
IRQ 12:hint.sio.4.at="isa"
hint.sio.4.port="0x2a0"
hint.sio.4.flags="0x701"
hint.sio.5.at="isa"
hint.sio.5.port="0x2a8"
hint.sio.5.flags="0x701"
hint.sio.6.at="isa"
hint.sio.6.port="0x2b0"
hint.sio.6.flags="0x701"
hint.sio.7.at="isa"
hint.sio.7.port="0x2b8"
hint.sio.7.flags="0x701"
hint.sio.7.irq="12"The flags indicate that the master port has minor number
7 (0x700), and all the
ports share an IRQ (0x001).Can I set the default serial parameters for a
port?See the Serial Communications
section in the &os; Handbook.How can I enable dialup logins on my modem?Please read the section about Dial-in Services
in the &os; Handbook.How can I connect a dumb terminal to my &os; box?You can find this information in the Terminals
section of the &os; Handbook.Why can I not run tip or
cu?On your system, the programs &man.tip.1; and &man.cu.1;
can only access the /var/spool/lock
directory via user uucp and group
dialer. You can use the group
dialer to control who has access to
your modem or remote systems. Just add yourself to group
dialer.Alternatively, you can let everyone on your system run
&man.tip.1; and &man.cu.1; by typing:&prompt.root; chmod 4511 /usr/bin/cu
&prompt.root; chmod 4511 /usr/bin/tipMiscellaneous Questions&os; a lot of swap space even when the computer has
free memory left. Why?&os; will proactively
move entirely idle, unused pages of main memory into swap in
order to make more main memory available for active use.
This heavy use of swap is balanced by using the extra free
memory for cacheing.Note that while &os; is proactive in this regard, it
does not arbitrarily decide to swap pages when the system is
truly idle. Thus you will not find your system all paged
out when you get up in the morning after leaving it idle
overnight.Why does top show very little free
memory even when I have very few programs running?The simple answer is that free memory is wasted memory.
Any memory that your programs do not actively allocate is
used within the &os; kernel as disk cache. The values shown
by &man.top.1; labeled as Inact,
Cache, and Buf are all
cached data at different aging levels. This cached data
means the system does not have to access a slow disk again
for data it has accessed recently, thus increasing overall
performance. In general, a low value shown for
Free memory in &man.top.1; is good,
provided it is not very low.Why will chmod not change the
permissions on symlinks?Symlinks do not have permissions, and by default,
&man.chmod.1; will follow symlinks to change the
permissions on the source file, if possible. So if you have a file,
foo, and a symlink to that file,
bar, then this command will always
succeed.&prompt.user; chmod g-w barHowever, the permissions on bar
will not have changed.When changing modes of the file hierarchies rooted in the
files instead of the files themselves,
you have to use either or
together with
to make this work. See &man.chmod.1; and
&man.symlink.7; for more information. does a
recursive &man.chmod.1;. Be careful
about specifying directories or symlinks to directories to
&man.chmod.1;. If you want to change the permissions of a
directory referenced by a symlink, use &man.chmod.1;
without any options and follow the symlink with a trailing
slash (/). For example, if
foo is a symlink to directory
bar, and you want to change the
permissions of foo (actually
bar), you would do something
like:&prompt.user; chmod 555 foo/With the trailing slash, &man.chmod.1; will follow the
symlink, foo, to change the
permissions of the directory,
bar.Can I run DOS binaries under &os;?Yes, you can use emulators/doscmd, a DOS
emulation program, available in the &os; Ports
Collection.If doscmd will not suffice,
the add-on utility emulators/pcemu emulates an 8088
and enough BIOS services to run many DOS text mode
applications. It requires the X Window System.You may also try emulators/dosbox from the &os;
Ports Collection. The main focus of this application is
emulating old DOS games using the local file system for
files.What do I need to do to translate a &os; document into
my native language?See the Translation FAQ
in the &os; Documentation Project Primer.Why does my email to any address at FreeBSD.org bounce?The FreeBSD.org mail
system implements some
Postfix checks on incoming mail
and rejects mail that is either from misconfigured relays or
otherwise appears likely to be spam. Some of the
specific requirements are: The IP address of the SMTP client must
"reverse-resolve" to a forward
confirmed hostname.The fully-qualified hostname given in the
SMTP conversation (either HELO or EHLO) must resolve
to the IP address of the client.Other advice to help your mail reach its destination
include:Mail should be sent in plain text, and messages
sent to mailing lists should generally be no more than
200KB in length.Avoid excessive cross posting. Choose
one mailing list which seems most
relevant and send it there.If you still have trouble with email infrastructure at
FreeBSD.org send a note
with the details to
postmaster@freebsd.org; Include a
date/time interval so that logs may be reviewed —
and note that we only keep one week's worth of mail logs.
(Be sure to specify the time zone or offset from
UTC.)Where can I find a free &os; account?While &os; does not provide open access to any of their
servers, others do provide open access &unix; systems. The
charge varies and limited services may be available.Arbornet, Inc,
also known as M-Net, has been providing
open access to &unix; systems since 1983. Starting on an
Altos running System III, the site switched to BSD/OS in
1991. In June of 2000, the site switched again to &os;.
M-Net can be accessed via
telnet and
SSH and provides basic access to
the entire &os; software suite. However, network access is
limited to members and patrons who donate to the system,
which is run as a non-profit organization.
M-Net also provides an bulletin board
system and interactive chat.What is the cute little red guy's name?He does not have one, and is just called the BSD
daemon. If you insist upon using a name, call him
beastie. Note that beastie is
pronounced BSD.You can learn more about the BSD daemon on his home page.Can I use the BSD daemon image?Perhaps. The BSD daemon is copyrighted by Marshall Kirk
McKusick. You will want to check his Statement on the Use of the BSD Daemon Figure
for detailed usage terms.In summary, you are free to use the image in a tasteful
manner, for personal use, so long as appropriate credit is
given. If you want to use him commercially, you must
- contact &a.mckusick;. More details are available on the
+ contact &a.mckusick.email;. More details are available on the
BSD Daemon's home page.Do you have any BSD daemon images I could use?You will find eps and Xfig drawings under
/usr/share/examples/BSD_daemon/.I have seen an acronym or other term on the mailing
lists and I do not understand what it means. Where should I
look?Please see the &os; Glossary.Why should I care what color the bikeshed is?The really, really short answer is that you should not.
The somewhat longer answer is that just because you are
capable of building a bikeshed does not mean you should stop
others from building one just because you do not like the
color they plan to paint it. This is a metaphor indicating
that you need not argue about every little feature just
because you know enough to do so. Some people have
commented that the amount of noise generated by a change is
inversely proportional to the complexity of the
change.The longer and more complete answer is that after a very
long argument about whether &man.sleep.1; should take
- fractional second arguments, &a.phk; posted a long message
+ fractional second arguments, &a.phk.email; posted a long message
entitled A bike shed (any color will do) on greener grass....
The appropriate portions of that message are quoted
below.
- &a.phk; on &a.hackers.name;, October 2,
+ &a.phk.email; on &a.hackers.name;, October 2,
1999What is it about this bike shed? Some
of you have asked me.It is a long story, or rather it is an old story, but
it is quite short actually. C. Northcote Parkinson wrote
a book in the early 1960s, called Parkinson's
Law, which contains a lot of insight into the
dynamics of management.[snip a bit of commentary on the
book]In the specific example involving the bike shed, the
other vital component is an atomic power-plant, I guess
that illustrates the age of the book.Parkinson shows how you can go into the board of
directors and get approval for building a multi-million or
even billion dollar atomic power plant, but if you want to
build a bike shed you will be tangled up in endless
discussions.Parkinson explains that this is because an atomic
plant is so vast, so expensive and so complicated that
people cannot grasp it, and rather than try, they fall
back on the assumption that somebody else checked all the
details before it got this far. Richard P. Feynmann
gives a couple of interesting, and very much to the point,
examples relating to Los Alamos in his books.A bike shed on the other hand. Anyone can build one
of those over a weekend, and still have time to watch the
game on TV. So no matter how well prepared, no matter how
reasonable you are with your proposal, somebody will seize
the chance to show that he is doing his job, that he is
paying attention, that he is
here.In Denmark we call it setting your
fingerprint. It is about personal pride and
prestige, it is about being able to point somewhere and
say There! I did
that. It is a strong trait in politicians, but
present in most people given the chance. Just think about
footsteps in wet cement.
The &os; FunniesHow cool is &os;?Q. Has anyone done any temperature testing while
running &os;? I know &linux; runs cooler than DOS, but have
never seen a mention of &os;. It seems to run really
hot.A. No, but we have done numerous taste tests on
blindfolded volunteers who have also had 250 micrograms of
LSD-25 administered beforehand. 35% of the volunteers said
that &os; tasted sort of orange, whereas &linux; tasted like
purple haze. Neither group mentioned any significant
variances in temperature. We eventually had to throw the
results of this survey out entirely anyway when we found
that too many volunteers were wandering out of the room
during the tests, thus skewing the results. We think most
of the volunteers are at Apple now, working on their new
scratch and sniff GUI. It is a funny old
business we are in!Seriously, &os; uses the
HLT (halt) instruction when the system is
idle thus lowering its energy consumption and therefore the
heat it generates. Also if you have
ACPI (Advanced
Configuration and Power Interface)
configured, then &os; can also put the CPU into
a low power mode.Who is scratching in my memory banks??Q. Is there anything odd that &os; does
when compiling the kernel which would cause the memory to
make a scratchy sound? When compiling (and for a brief
moment after recognizing the floppy drive upon startup, as
well), a strange scratchy sound emanates from what appears
to be the memory banks.A. Yes! You will see frequent references to
daemons in the BSD documentation, and what
most people do not know is that this refers to genuine,
non-corporeal entities that now possess your computer. The
scratchy sound coming from your memory is actually
high-pitched whispering exchanged among the daemons as they
best decide how to deal with various system administration
tasks.If the noise gets to you, a good
fdisk /mbr from DOS will get rid of them,
but do not be surprised if they react adversely and try to
stop you. In fact, if at any point during the exercise you
hear the satanic voice of Bill Gates coming from the
built-in speaker, take off running and do not ever look
back! Freed from the counterbalancing influence of the BSD
daemons, the twin demons of DOS and &windows; are often able
to re-assert total control over your machine to the eternal
damnation of your soul. Now that you know, given a choice
you would probably prefer to get used to the scratchy
noises, no?How many &os; hackers does it take to change a
lightbulb?One thousand, one hundred and sixty-nine:Twenty-three to complain to -CURRENT about the lights
being out;Four to claim that it is a configuration problem, and
that such matters really belong on -questions;Three to submit PRs about it, one of which is misfiled
under doc and consists only of it's
dark;One to commit an untested lightbulb which breaks
buildworld, then back it out five minutes later;Eight to flame the PR originators for not including
patches in their PRs;Five to complain about buildworld being broken;Thirty-one to answer that it works for them, and they
must have updated at a bad time;One to post a patch for a new lightbulb to
-hackers;One to complain that he had patches for this three years
ago, but when he sent them to -CURRENT they were just
ignored, and he has had bad experiences with the PR system;
besides, the proposed new lightbulb is non-reflexive;Thirty-seven to scream that lightbulbs do not belong in
the base system, that committers have no right to do things
like this without consulting the Community, and WHAT IS
-CORE DOING ABOUT IT!?Two hundred to complain about the color of the bicycle
shed;Three to point out that the patch breaks
&man.style.9;;Seventeen to complain that the proposed new lightbulb is
under GPL;Five hundred and eighty-six to engage in a flame war
about the comparative advantages of the GPL, the BSD
license, the MIT license, the NPL, and the personal hygiene
of unnamed FSF founders;Seven to move various portions of the thread to -chat
and -advocacy;One to commit the suggested lightbulb, even though it
shines dimmer than the old one;Two to back it out with a furious flame of a commit
message, arguing that &os; is better off in the dark than
with a dim lightbulb;Forty-six to argue vociferously about the backing out of
the dim lightbulb and demanding a statement from
-core;Eleven to request a smaller lightbulb so it will fit
their Tamagotchi if we ever decide to port &os; to that
platform;Seventy-three to complain about the SNR on -hackers and
-chat and unsubscribe in protest;Thirteen to post unsubscribe, How
do I unsubscribe?, or Please remove me from
the list, followed by the usual footer;One to commit a working lightbulb while everybody is too
busy flaming everybody else to notice;Thirty-one to point out that the new lightbulb would
shine 0.364% brighter if compiled with TenDRA (although it
will have to be reshaped into a cube), and that &os; should
therefore switch to TenDRA instead of GCC;One to complain that the new lightbulb lacks
fairings;Nine (including the PR originators) to ask what
is MFC?;Fifty-seven to complain about the lights being out two
weeks after the bulb has been changed.
- &a.nik; adds:
+ &a.nik.email; adds:I was laughing quite hard at
this.And then I thought, Hang on, shouldn't
there be '1 to document it.' in that list
somewhere?And then I was enlightened
:-)
- &a.tabthorpe; says: None,
+ &a.tabthorpe.email; says: None,
real &os; hackers are not afraid of the
dark!Where does data written to
/dev/null go?It goes into a special data sink in the CPU where it is
converted to heat which is vented through the heatsink / fan
assembly. This is why CPU cooling is increasingly
important; as people get used to faster processors, they
become careless with their data and more and more of it ends
up in /dev/null, overheating their
CPUs. If you delete /dev/null (which
effectively disables the CPU data sink) your CPU may run
cooler but your system will quickly become constipated with
all that excess data and start to behave erratically. If
you have a fast network connection you can cool down your
CPU by reading data out of /dev/random
and sending it off somewhere; however you run the risk of
overheating your network connection and
/ or angering your ISP, as most of the
data will end up getting converted to heat by their
equipment, but they generally have good cooling, so if you
do not overdo it you should be OK.Paul Robinson adds:There are other methods. As every good sysadmin knows,
it is part of standard practice to send data to the screen
of interesting variety to keep all the pixies that make up
your picture happy. Screen pixies (commonly mis-typed or
re-named as pixels) are categorized by the
type of hat they wear (red, green or blue) and will hide or
appear (thereby showing the color of their hat) whenever
they receive a little piece of food. Video cards turn data
into pixie-food, and then send them to the pixies —
the more expensive the card, the better the food, so the
better behaved the pixies are. They also need constant
stimulation — this is why screen savers exist.To take your suggestions further, you could just throw
the random data to console, thereby letting the pixies
consume it. This causes no heat to be produced at all,
keeps the pixies happy and gets rid of your data quite
quickly, even if it does make things look a bit messy on
your screen.Incidentally, as an ex-admin of a large ISP who
experienced many problems attempting to maintain a stable
temperature in a server room, I would strongly discourage
people sending the data they do not want out to the network.
The fairies who do the packet switching and routing get
annoyed by it as well.My colleague sits at the computer too much, how
can I prank her?Install games/sl and wait
for her to mistype sl for
ls.Advanced TopicsHow can I learn more about &os;'s internals?See the
&os; Architecture Handbook.Additionally, much general &unix; knowledge is directly
applicable to &os;.How can I contribute to &os;?Please see the article on Contributing to &os;
for specific advice on how to do this. Assistance is more
than welcome!What are snapshots and releases?There are currently four active/semi-active branches in
the &os; Subversion Repository.
(Earlier branches are only changed very rarely, which is why
there are only four active branches of development):&rel2.releng; AKA
&rel2.stable;&rel.releng; AKA
&rel.stable;&rel.head.releng; AKA
-CURRENT AKA
&rel.head;HEAD is not an actual branch tag,
like the others; it is simply a symbolic constant for
the current, non-branched development
stream which we simply refer to as
-CURRENT.Right now, -CURRENT is the
&rel.head.relx; development stream; the
&rel.stable; branch,
&rel.releng;, forked off from
-CURRENT in &rel.relengdate; and the
&rel2.stable; branch,
&rel2.releng;, forked off from
-CURRENT in &rel2.relengdate;.Can I follow -CURRENT with limited
Internet access?Yes, you can do this without
downloading the whole source tree by using the CTM facility.I have written a kernel extension, who do I send it
to?Please take a look at the article on Contributing to &os;
to learn how to submit code.And thanks for the thought!How can I make the most of the data I see when my kernel
panics?Here is typical kernel panic:Fatal trap 12: page fault while in kernel mode
fault virtual address = 0x40
fault code = supervisor read, page not present
instruction pointer = 0x8:0xf014a7e5
stack pointer = 0x10:0xf4ed6f24
frame pointer = 0x10:0xf4ed6f28
code segment = base 0x0, limit 0xfffff, type 0x1b
= DPL 0, pres 1, def32 1, gran 1
processor eflags = interrupt enabled, resume, IOPL = 0
current process = 80 (mount)
interrupt mask =
trap number = 12
panic: page faultWhen you see a message like this, it is not enough to
just reproduce it and send it in. The instruction pointer
value is important;
unfortunately, it is also configuration dependent. In other
words, the value varies depending on the exact kernel image
that you are using. If you are using a
GENERIC kernel image from one of the
snapshots, then it is possible for somebody else to track
down the offending function, but if you are running a custom
kernel then only you can tell us where
the fault occurred.What you should do is this:Write down the instruction pointer value. Note
that the 0x8: part at the beginning
is not significant in this case: it is the
0xf0xxxxxx part that we
want.When the system reboots, do the following:&prompt.user; nmkernel.that.caused.the.panic | grep f0xxxxxxwhere f0xxxxxx is the
instruction pointer value. The odds are you will not
get an exact match since the symbols in the kernel
symbol table are for the entry points of functions and
the instruction pointer address will be somewhere
inside a function, not at the start. If you do not
get an exact match, omit the last digit from the
instruction pointer value and try again, i.e.:&prompt.user; nmkernel.that.caused.the.panic | grep f0xxxxxIf that does not yield any results, chop off another
digit. Repeat until you get some sort of output. The
result will be a possible list of functions which caused
the panic. This is a less than exact mechanism for
tracking down the point of failure, but it is better
than nothing.However, the best way to track down the cause of a panic
is by capturing a crash dump, then using &man.kgdb.1; to
generate a stack trace on the crash dump.In any case, the method is this:Make sure that the following line is included in
your kernel configuration file
(/usr/src/sys/arch/conf/MYKERNEL):makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbolsChange to the /usr/src
directory:&prompt.root; cd/usr/srcCompile the kernel:&prompt.root; makebuildkernelKERNCONF=MYKERNELWait for &man.make.1; to finish compiling.&prompt.root; makeinstallkernelKERNCONF=MYKERNELReboot.If you do not use the KERNCONF
make variable a GENERIC kernel will
be built and installed.The &man.make.1; process will have built two kernels.
/usr/obj/usr/src/sys/MYKERNEL/kernel
and
/usr/obj/usr/src/sys/MYKERNEL/kernel.debug.
kernel was installed as
/boot/kernel/kernel, while
kernel.debug can be used as the source
of debugging symbols for &man.kgdb.1;.To make sure you capture a crash dump, you need edit
/etc/rc.conf and set
dumpdev to point to your swap partition
(or AUTO). This will cause the
&man.rc.8; scripts to use the &man.dumpon.8; command to
enable crash dumps. You can also run &man.dumpon.8;
manually. After a panic, the crash dump can be recovered
using &man.savecore.8;; if dumpdev is set
in /etc/rc.conf, the &man.rc.8; scripts
will run &man.savecore.8; automatically and put the crash
dump in /var/crash.&os; crash dumps are usually the same size as the
physical RAM size of your machine. That is, if you have
512 MB of RAM, you will get a 512 MB crash dump.
Therefore you must make sure there is enough space in
/var/crash to hold the dump.
Alternatively, you run &man.savecore.8; manually and have
it recover the crash dump to another directory where you
have more room. It is possible to limit the size of the
crash dump by using options
MAXMEM=N where
N is the size of kernel's
memory usage in KBs. For example, if you have 1 GB
of RAM, you can limit the kernel's memory usage to
128 MB by this way, so that your crash dump size will
be 128 MB instead of 1 GB.Once you have recovered the crash dump, you can get a
stack trace with &man.kgdb.1; as follows:&prompt.user; kgdb/usr/obj/usr/src/sys/MYKERNEL/kernel.debug/var/crash/vmcore.0(kgdb)backtraceNote that there may be several screens worth of
information; ideally you should use &man.script.1; to
capture all of them. Using the unstripped kernel image with
all the debug symbols should show the exact line of kernel
source code where the panic occurred. Usually you have to
read the stack trace from the bottom up to trace
the exact sequence of events that lead to the crash. You
can also use &man.kgdb.1; to print out the contents of
various variables or structures to examine the
system state at the time of the crash.Now, if you are really insane and have a second
computer, you can also configure &man.kgdb.1; to do remote
debugging such that you can use &man.kgdb.1; on one system
to debug the kernel on another system, including setting
breakpoints, single-stepping through the kernel code, just
like you can do with a normal user-mode program.If you have DDB enabled and the
kernel drops into the debugger, you can force a panic (and
a crash dump) just by typing panic at
the ddb prompt. It may stop in the
debugger again during the panic phase. If it does, type
continue and it will finish the crash
dump.Why has dlsym() stopped working for
ELF executables?The ELF toolchain does not, by default, make the symbols
defined in an executable visible to the dynamic linker.
Consequently dlsym() searches on
handles obtained from calls to dlopen(NULL,
flags) will fail to find such symbols.If you want to search, using
dlsym(), for symbols present in the
main executable of a process, you need to link the
executable using the
option to the ELF linker (&man.ld.1;).How can I increase or reduce the kernel address space on
i386?By default, the kernel address space is 1 GB
(2 GB for PAE) for i386. If you run a
network-intensive server (e.g., a FTP or HTTP server),
or you want to use ZFS, you might find that is not
enough.Add the following line to your kernel configuration file
to increase available space and rebuild your kernel:options KVA_PAGES=NTo find the correct value of
N, divide the desired address
space size (in megabytes) by four. (For example, it is
512 for 2 GB.)AcknowledgmentsThis innocent little Frequently Asked Questions document has
been written, rewritten, edited, folded, spindled, mutilated,
eviscerated, contemplated, discombobulated, cogitated,
regurgitated, rebuilt, castigated, and reinvigorated over the last
decade, by a cast of hundreds if not thousands.
Repeatedly.We wish to thank every one of the people responsible, and we
encourage you to join them
in making this FAQ even better.
&bibliography;
diff --git a/en_US.ISO8859-1/books/handbook/bsdinstall/chapter.xml b/en_US.ISO8859-1/books/handbook/bsdinstall/chapter.xml
index 1fed435480..818dc7c981 100644
--- a/en_US.ISO8859-1/books/handbook/bsdinstall/chapter.xml
+++ b/en_US.ISO8859-1/books/handbook/bsdinstall/chapter.xml
@@ -1,2753 +1,2753 @@
JimMockRestructured, reorganized, and parts
rewritten by RandyPrattThe sysinstall walkthrough, screenshots, and general
copy by GavinAtkinsonUpdated for bsdinstall by WarrenBlockInstalling &os; 9.X and
LaterSynopsisinstallation&os; comes with a text-based, easy to use installation
program. &os; 9.0-RELEASE and later use an installation
program called bsdinstall, while
releases prior to &os; 9.0-RELEASE using
sysinstall for installation. This
chapter describes the use of
bsdinstall. The use of
sysinstall is covered in .After reading this chapter, you will know:How to create the &os; installation media.How &os; subdivides and refers to hard disks.How to start
bsdinstall.The questions bsdinstall will
ask you, what they mean, and how to answer them.Before reading this chapter, you should:Read the supported hardware list that shipped with the
version of &os; you are installing, and verify that your
hardware is supported.In general, these installation instructions are written
for &i386; (PC compatible) architecture
computers. Where applicable, instructions specific to other
platforms will be listed. There may be minor differences
between the installer and what is shown here, so use this
chapter as a general guide rather than as exact literal
instructions.Hardware RequirementsMinimal ConfigurationThe minimal configuration to install &os; varies with the
&os; version and the hardware architecture.A summary of this information is given in the following
sections. Depending on the method you choose to install &os;,
you may also need a supported CDROM drive, and in some cases a
network adapter. This will be covered by .&os;/&arch.i386;&os;/&arch.i386; requires a 486 or better processor and
at least 64 MB of RAM. At least 1.1 GB of free
hard drive space is needed for the most minimal
installation.On old computers, increasing RAM and hard drive space
is usually more effective at improving performance than
installing a faster processor.&os;/&arch.amd64;There are two classes of processors capable of running
&os;/&arch.amd64;. The first are AMD64 processors,
including the &amd.athlon;64,
&amd.athlon;64-FX, &amd.opteron; or better
processors.The second class of processors that can use
&os;/&arch.amd64; includes those using the
&intel; EM64T architecture. Examples of these
processors include the &intel; &core; 2 Duo, Quad,
Extreme processor families, the &intel; &xeon; 3000,
5000, and 7000 sequences of processors, and the
&intel; &core; i3, i5 and i7 processors.If you have a machine based on an nVidia nForce3
Pro-150, you must use the BIOS setup to
disable the IO APIC. If you do not have an option to do
this, you will likely have to disable ACPI instead. There
are bugs in the Pro-150 chipset for which we have not yet
found a workaround.&os;/&arch.powerpc; &apple; &macintosh;All New World &apple; &macintosh; systems with built-in
USB are supported. SMP is supported on machines with
multiple CPUs.A 32-bit kernel can only use the first 2 GB of RAM.
&firewire; is not supported on the Blue & White PowerMac
G3.&os;/&arch.sparc64;Systems supported by &os;/&arch.sparc64; are listed at
the
FreeBSD/sparc64 Project.A dedicated disk is required for &os;/&arch.sparc64;.
It is not possible to share a disk with another operating
system at this time.Supported HardwareHardware architectures and devices supported by a &os;
release are listed in the Hardware Notes file. Usually named
HARDWARE.TXT, the file is located in the
root directory of the release media. Copies of the supported
hardware list are also available on the Release
Information page of the &os; web site.Pre-Installation TasksBack Up Your DataBack up all important data on the target computer
where &os; will be installed. Test the backups before
continuing. The &os; installer will ask before making changes
to the disk, but once the process has started it cannot be
undone.Decide Where to Install &os;If &os; will be the only operating system installed, and
will be allowed to use the entire hard disk, the rest of
this section can be skipped. But if &os; will share the disk
with other operating systems, an understanding of disk
layout is useful during the installation.Disk Layouts for &os;/&arch.i386; and
&os;/&arch.amd64;Hard disks can be divided into multiple sections. These
sections are called
partitions.There are two ways of dividing a disk into partitions.
A traditional Master Boot Record
(MBR) holds a
partition table defining up to four primary
partitions. (For historical reasons, &os;
calls primary partitions slices.) A
limit of only four partitions is restrictive for large
disks, so one of these primary partitions can be made into
an extended partition. Multiple
logical partitions may then be
created inside the extended partition. This may sound a
little unwieldy, and it is.The GUID Partition Table
(GPT) is a
newer and simpler method of partitioning a disk. GPT is far more
versatile than the traditional MBR partition table. Common
GPT implementations allow up to 128
partitions per disk, eliminating the need for inconvenient
workarounds like logical partitions.Some older operating systems like &windows; XP
are not compatible with the GPT
partition scheme. If &os; will be sharing a disk with
such an operating system, MBR partitioning is required.&os;'s standard boot loader requires either a primary or
GPT partition. (See for more information about the &os;
booting process.) If all of the primary or
GPT partitions are already in use, one
must be freed for &os;.A minimal installation of &os; takes as little as
1 GB of disk space. However, that is a
very minimal install, leaving almost no
free space. A more realistic minimum is 3 GB without a
graphical environment, and 5 GB or more if a graphical
user interface will be used. Third-party application
software requires more space.A variety of
free and commercial partition resizing tools are
available. GParted
Live is a free Live CD which includes the GParted
partition editor. GParted is also included with many other
Linux Live CD distributions.Disk partition applications can destroy data. Make a
full backup and verify its integrity before modifying disk
partitions.Resizing µsoft; Vista partitions can be
difficult. A Vista installation CDROM can be useful when
attempting such an operation.Using an Existing PartitionA &windows; computer has a single 40 GB disk that
has been split into two 20 GB partitions. &windows;
calls them C: and
D:. The
C: partition contains 10 GB
of data, and the D: partition
contains 5 GB of data.Moving the data from D: to
C: frees up the second partition
to be used for &os;.Shrinking an Existing PartitionA &windows; computer has a single 40 GB disk and
one large partition using the whole disk. &windows; shows
this 40 GB partition as a single
C:. 15 GB of space is being
used. The goal is to end up with &windows; in a
20 GB partition, and have another 20 GB
partition for &os;.There are two ways to do this:Back up your &windows; data. Then reinstall
&windows;, creating a 20 GB partition during the
install.Use a partition resizing tool like
GParted to shrink the
&windows; partition and create a new partition in the
freed space for &os;.Disk partitions containing different operating systems
make it possible to run any one of those operating systems
at a time. An alternative method that allows running
multiple operating systems at the same time is covered in
.Collect Network InformationSome &os; installation methods need a network connection
to download files. To connect to an Ethernet network (or
cable or DSL modem with an Ethernet interface), the installer
will request some information about the network.DHCP is commonly used to
provide automatic network configuration. If
DHCP is not available, this network
information must be obtained from the local network
administrator or service provider:Network InformationIP
addressSubnet maskDefault router IP addressDomain name of the local networkDNS
server IP address(es)Check for &os; ErrataAlthough the &os; Project strives to ensure that each
release of &os; is as stable as possible, bugs occasionally
creep into the process. On very rare occasions those bugs
affect the installation process. As these problems are
discovered and fixed, they are noted in the FreeBSD
Errata on the &os; web site. Check the errata before
installing to make sure that there are no problems that might
affect the installation.Information and errata for all the releases can be found
on the release
information section of the &os; web site.Prepare the Installation MediaA &os; installation is started by booting the computer
with a &os; installation CD, DVD, or USB memory stick. The
installer is not a program that can be run from within another
operating system.In addition to the standard installation media which
contains copies of all the &os; installation files, there is a
bootonly variant. Bootonly install media
does not have copies of the installation files, but downloads
them from the network during an install. The bootonly install
CD is consequently much smaller, and reduces bandwidth usage
during the install by only downloading required files.Copies of &os; installation media are available at the
&os; web
site.If you already have a copy of &os; on CDROM, DVD, or USB
memory stick, this section can be skipped.&os; CD and DVD images are bootable ISO files. Only one
CD or DVD is needed for an install. Burn the ISO image to a
bootable CD or DVD using the CD recording applications
available with your current operating system.To create a bootable memory stick, follow these
steps:Acquire the Memory Stick ImageMemory stick images for &os; 9.0-RELEASE and
later can be downloaded from the
ISO-IMAGES/
directory at
ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/arch/arch/ISO-IMAGES/version/&os;-version-RELEASE-arch-memstick.img.
Replace arch and
version with the
architecture and the version number which you want to
install, respectively. For example, the memory stick
images for &os;/&arch.i386; 9.0-RELEASE are
available from .A different directory path is used for
&os; 8.X and earlier
versions. Details of download and installation of
&os; 8.X and earlier is
covered in .The memory stick image has a .img
extension. The ISO-IMAGES/ directory
contains a number of different images, and the one needed
depends on the version of &os; being installed, and in
some cases, the target hardware.Before proceeding, back up the
data on the USB stick, as this procedure will
erase it.Write the Image File to the Memory StickUsing &os; to Write the ImageThe example below shows /dev/da0 as the target
device where the image will be written. Be very
careful that the correct device is used as the output
target, or you may destroy existing data.Writing the Image with &man.dd.1;The .img file is
not a regular file. It is an
image of the complete contents of
the memory stick. It cannot
simply be copied like a regular file, but must be
written directly to the target device with
&man.dd.1;:&prompt.root; dd if=&os;-9.0-RELEASE-&arch.i386;-memstick.img of=/dev/da0 bs=64kUsing &windows; to Write the ImageBe sure to give the correct drive letter as the
output target, or you may overwrite and destroy
existing data.Obtaining Image Writer for
&windows;Image Writer for
&windows; is a free application that
can correctly write an image file to a memory stick.
Download it from
and extract it into a folder.Writing the Image with Image WriterDouble-click the
Win32DiskImager icon to
start the program. Verify that the drive letter shown
under Device is the
drive with the memory stick. Click the folder icon
and select the image to be written to the memory
stick. Click
[ Save ] to accept
the image file name. Verify that everything is
correct, and that no folders on the memory stick are
open in other windows. When everything is ready,
click [ Write ] to
write the image file to the memory stick.Installation from floppy disks is no longer
supported.You are now ready to start installing &os;.Starting the InstallationBy default, the installation will not make any changes to
your disk(s) until you see the following message:Your changes will now be written to disk. If you
have chosen to overwrite existing data, it will
be PERMANENTLY ERASED. Are you sure you want to
commit your changes?The install can be exited at any time prior to this
warning without changing the contents of the hard drive. If
you are concerned that you have configured something
incorrectly you can just turn the computer off before this
point, and no damage will be done.BootingBooting on &i386; and &arch.amd64;If you prepared a bootable USB stick,
as described in
, then
plug in your USB stick before turning on the
computer.If you are booting from CDROM, then you will need to
turn on the computer, and insert the CDROM at the first
opportunity.Configure your machine to boot from either the CDROM
or from USB, depending on the media being used for the
installation. BIOS configurations allow the
selection of a specific boot device. Most systems also
provide for selecting a boot device during startup,
typically by pressing F10,
F11, F12, or
Escape.If your computer starts up as normal and loads your
existing operating system, then either:The disks were not inserted early enough in the
boot process. Leave them in, and try restarting
your computer.The BIOS changes earlier did
not work correctly. You should redo that step until
you get the right option.Your particular BIOS does not
support booting from the desired media. The Plop
Boot Manager can be used to boot older
computers from CD or USB media.&os; will start to boot. If you are booting from
CDROM you will see a display similar to this (version
information omitted):Booting from CD-ROM...
645MB medium detected
CD Loader 1.2
Building the boot loader arguments
Looking up /BOOT/LOADER... Found
Relocating the loader and the BTX
Starting the BTX loader
BTX loader 1.00 BTX version is 1.02
Consoles: internal video/keyboard
BIOS CD is cd0
BIOS drive C: is disk0
BIOS drive D: is disk1
BIOS 636kB/261056kB available memory
FreeBSD/i386 bootstrap loader, Revision 1.1
Loading /boot/defaults/loader.conf
/boot/kernel/kernel text=0x64daa0 data=0xa4e80+0xa9e40 syms=[0x4+0x6cac0+0x4+0x88e9d]
\The &os; boot loader is displayed:&os; Boot Loader MenuEither wait ten seconds, or press
Enter.Booting for &macintosh; &powerpc;On most machines, holding C on the
keyboard during boot will boot from the CD. Otherwise, hold
CommandOptionOF,
or
WindowsAltOF
on non-&apple; keyboards. At the 0 >
prompt, enterboot cd:,\ppc\loader cd:0For Xserves without keyboards, see
&apple;'s
support web site about booting into Open
Firmware.Booting for &sparc64;Most &sparc64; systems are set up to boot automatically
from disk. To install &os;, you need to boot over the
network or from a CDROM, which requires you to break into
the PROM (OpenFirmware).To do this, reboot the system, and wait until the boot
message appears. It depends on the model, but should look
about like:Sun Blade 100 (UltraSPARC-IIe), Keyboard Present
Copyright 1998-2001 Sun Microsystems, Inc. All rights reserved.
OpenBoot 4.2, 128 MB memory installed, Serial #51090132.
Ethernet address 0:3:ba:b:92:d4, Host ID: 830b92d4.If your system proceeds to boot from disk at this point,
you need to press
L1A
or
StopA
on the keyboard, or send a BREAK over the
serial console (using for example ~# in
&man.tip.1; or &man.cu.1;) to get to the PROM
prompt. It looks like this:ok ok {0} This is the prompt used on systems with just one
CPU.This is the prompt used on SMP systems, the digit
indicates the number of the active CPU.At this point, place the CDROM into your drive, and from
the PROM prompt, type
boot cdrom.Reviewing the Device Probe ResultsThe last few hundred lines that have been displayed on
screen are stored and can be reviewed.To review the buffer, press Scroll Lock.
This turns on scrolling in the display. You can then use the
arrow keys, or PageUp and
PageDown to view the results. Press
Scroll Lock again to stop scrolling.Do this now, to review the text that scrolled off the
screen when the kernel was carrying out the device probes.
You will see text similar to , although the precise text
will differ depending on the devices that you have in your
computer.Typical Device Probe ResultsCopyright (c) 1992-2011 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 9.0-RELEASE #0 r225473M: Sun Sep 11 16:07:30 BST 2011
root@psi:/usr/obj/usr/src/sys/GENERIC amd64
CPU: Intel(R) Core(TM)2 Duo CPU T9400 @ 2.53GHz (2527.05-MHz K8-class CPU)
Origin = "GenuineIntel" Id = 0x10676 Family = 6 Model = 17 Stepping = 6
Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
Features2=0x8e3fd<SSE3,DTES64,MON,DS_CPL,VMX,SMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1>
AMD Features=0x20100800<SYSCALL,NX,LM>
AMD Features2=0x1<LAHF>
TSC: P-state invariant, performance statistics
real memory = 3221225472 (3072 MB)
avail memory = 2926649344 (2791 MB)
Event timer "LAPIC" quality 400
ACPI APIC Table: <TOSHIB A0064 >
FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs
FreeBSD/SMP: 1 package(s) x 2 core(s)
cpu0 (BSP): APIC ID: 0
cpu1 (AP): APIC ID: 1
ioapic0: Changing APIC ID to 1
ioapic0 <Version 2.0> irqs 0-23 on motherboard
kbd1 at kbdmux0
acpi0: <TOSHIB A0064> on motherboard
acpi0: Power Button (fixed)
acpi0: reservation of 0, a0000 (3) failed
acpi0: reservation of 100000, b6690000 (3) failed
Timecounter "ACPI-safe" frequency 3579545 Hz quality 850
acpi_timer0: <24-bit timer at 3.579545MHz> port 0xd808-0xd80b on acpi0
cpu0: <ACPI CPU> on acpi0
ACPI Warning: Incorrect checksum in table [ASF!] - 0xFE, should be 0x9A (20110527/tbutils-282)
cpu1: <ACPI CPU> on acpi0
pcib0: <ACPI Host-PCI bridge> port 0xcf8-0xcff on acpi0
pci0: <ACPI PCI bus> on pcib0
vgapci0: <VGA-compatible display> port 0xcff8-0xcfff mem 0xff400000-0xff7fffff,0xe0000000-0xefffffff irq 16 at device 2.0 on pci0
agp0: <Intel GM45 SVGA controller> on vgapci0
agp0: aperture size is 256M, detected 131068k stolen memory
vgapci1: <VGA-compatible display> mem 0xffc00000-0xffcfffff at device 2.1 on pci0
pci0: <simple comms> at device 3.0 (no driver attached)
em0: <Intel(R) PRO/1000 Network Connection 7.2.3> port 0xcf80-0xcf9f mem 0xff9c0000-0xff9dffff,0xff9fe000-0xff9fefff irq 20 at device 25.0 on pci0
em0: Using an MSI interrupt
em0: Ethernet address: 00:1c:7e:6a:ca:b0
uhci0: <Intel 82801I (ICH9) USB controller> port 0xcf60-0xcf7f irq 16 at device 26.0 on pci0
usbus0: <Intel 82801I (ICH9) USB controller> on uhci0
uhci1: <Intel 82801I (ICH9) USB controller> port 0xcf40-0xcf5f irq 21 at device 26.1 on pci0
usbus1: <Intel 82801I (ICH9) USB controller> on uhci1
uhci2: <Intel 82801I (ICH9) USB controller> port 0xcf20-0xcf3f irq 19 at device 26.2 on pci0
usbus2: <Intel 82801I (ICH9) USB controller> on uhci2
ehci0: <Intel 82801I (ICH9) USB 2.0 controller> mem 0xff9ff800-0xff9ffbff irq 19 at device 26.7 on pci0
usbus3: EHCI version 1.0
usbus3: <Intel 82801I (ICH9) USB 2.0 controller> on ehci0
hdac0: <Intel 82801I High Definition Audio Controller> mem 0xff9f8000-0xff9fbfff irq 22 at device 27.0 on pci0
pcib1: <ACPI PCI-PCI bridge> irq 17 at device 28.0 on pci0
pci1: <ACPI PCI bus> on pcib1
iwn0: <Intel(R) WiFi Link 5100> mem 0xff8fe000-0xff8fffff irq 16 at device 0.0 on pci1
pcib2: <ACPI PCI-PCI bridge> irq 16 at device 28.1 on pci0
pci2: <ACPI PCI bus> on pcib2
pcib3: <ACPI PCI-PCI bridge> irq 18 at device 28.2 on pci0
pci4: <ACPI PCI bus> on pcib3
pcib4: <ACPI PCI-PCI bridge> at device 30.0 on pci0
pci5: <ACPI PCI bus> on pcib4
cbb0: <RF5C476 PCI-CardBus Bridge> at device 11.0 on pci5
cardbus0: <CardBus bus> on cbb0
pccard0: <16-bit PCCard bus> on cbb0
isab0: <PCI-ISA bridge> at device 31.0 on pci0
isa0: <ISA bus> on isab0
ahci0: <Intel ICH9M AHCI SATA controller> port 0x8f58-0x8f5f,0x8f54-0x8f57,0x8f48-0x8f4f,0x8f44-0x8f47,0x8f20-0x8f3f mem 0xff9fd800-0xff9fdfff irq 19 at device 31.2 on pci0
ahci0: AHCI v1.20 with 4 3Gbps ports, Port Multiplier not supported
ahcich0: <AHCI channel> at channel 0 on ahci0
ahcich1: <AHCI channel> at channel 1 on ahci0
ahcich2: <AHCI channel> at channel 4 on ahci0
acpi_lid0: <Control Method Lid Switch> on acpi0
battery0: <ACPI Control Method Battery> on acpi0
acpi_button0: <Power Button> on acpi0
acpi_acad0: <AC Adapter> on acpi0
acpi_toshiba0: <Toshiba HCI Extras> on acpi0
acpi_tz0: <Thermal Zone> on acpi0
attimer0: <AT timer> port 0x40-0x43 irq 0 on acpi0
Timecounter "i8254" frequency 1193182 Hz quality 0
Event timer "i8254" frequency 1193182 Hz quality 100
atkbdc0: <Keyboard controller (i8042)> port 0x60,0x64 irq 1 on acpi0
atkbd0: <AT Keyboard> irq 1 on atkbdc0
kbd0 at atkbd0
atkbd0: [GIANT-LOCKED]
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: [GIANT-LOCKED]
psm0: model GlidePoint, device ID 0
atrtc0: <AT realtime clock> port 0x70-0x71 irq 8 on acpi0
Event timer "RTC" frequency 32768 Hz quality 0
hpet0: <High Precision Event Timer> iomem 0xfed00000-0xfed003ff on acpi0
Timecounter "HPET" frequency 14318180 Hz quality 950
Event timer "HPET" frequency 14318180 Hz quality 450
Event timer "HPET1" frequency 14318180 Hz quality 440
Event timer "HPET2" frequency 14318180 Hz quality 440
Event timer "HPET3" frequency 14318180 Hz quality 440
uart0: <16550 or compatible> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
sc0: <System console> at flags 0x100 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
ppc0: cannot reserve I/O port range
est0: <Enhanced SpeedStep Frequency Control> on cpu0
p4tcc0: <CPU Frequency Thermal Control> on cpu0
est1: <Enhanced SpeedStep Frequency Control> on cpu1
p4tcc1: <CPU Frequency Thermal Control> on cpu1
Timecounters tick every 1.000 msec
hdac0: HDA Codec #0: Realtek ALC268
hdac0: HDA Codec #1: Lucent/Agere Systems (Unknown)
pcm0: <HDA Realtek ALC268 PCM #0 Analog> at cad 0 nid 1 on hdac0
pcm1: <HDA Realtek ALC268 PCM #1 Analog> at cad 0 nid 1 on hdac0
usbus0: 12Mbps Full Speed USB v1.0
usbus1: 12Mbps Full Speed USB v1.0
usbus2: 12Mbps Full Speed USB v1.0
usbus3: 480Mbps High Speed USB v2.0
ugen0.1: <Intel> at usbus0
uhub0: <Intel UHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus0
ugen1.1: <Intel> at usbus1
uhub1: <Intel UHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus1
ugen2.1: <Intel> at usbus2
uhub2: <Intel UHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus2
ugen3.1: <Intel> at usbus3
uhub3: <Intel EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus3
uhub0: 2 ports with 2 removable, self powered
uhub1: 2 ports with 2 removable, self powered
uhub2: 2 ports with 2 removable, self powered
uhub3: 6 ports with 6 removable, self powered
ugen2.2: <vendor 0x0b97> at usbus2
uhub8: <vendor 0x0b97 product 0x7761, class 9/0, rev 1.10/1.10, addr 2> on usbus2
ugen1.2: <Microsoft> at usbus1
ada0 at ahcich0 bus 0 scbus1 target 0 lun 0
ada0: <Hitachi HTS543225L9SA00 FBEOC43C> ATA-8 SATA 1.x device
ada0: 150.000MB/s transfers (SATA 1.x, UDMA6, PIO 8192bytes)
ada0: Command Queueing enabled
ada0: 238475MB (488397168 512 byte sectors: 16H 63S/T 16383C)
ada0: Previously was known as ad4
ums0: <Microsoft Microsoft 3-Button Mouse with IntelliEyeTM, class 0/0, rev 1.10/3.00, addr 2> on usbus1
SMP: AP CPU #1 Launched!
cd0 at ahcich1 bus 0 scbus2 target 0 lun 0
cd0: <TEAC DV-W28S-RT 7.0C> Removable CD-ROM SCSI-0 device
cd0: 150.000MB/s transfers (SATA 1.x, ums0: 3 buttons and [XYZ] coordinates ID=0
UDMA2, ATAPI 12bytes, PIO 8192bytes)
cd0: cd present [1 x 2048 byte records]
ugen0.2: <Microsoft> at usbus0
ukbd0: <Microsoft Natural Ergonomic Keyboard 4000, class 0/0, rev 2.00/1.73, addr 2> on usbus0
kbd2 at ukbd0
uhid0: <Microsoft Natural Ergonomic Keyboard 4000, class 0/0, rev 2.00/1.73, addr 2> on usbus0
Trying to mount root from cd9660:/dev/iso9660/FREEBSD_INSTALL [ro]...Check the probe results carefully to make sure that &os;
found all the devices you expected. If a device was not
found, then it will not be listed. Kernel modules allows
you to add in support for devices which are not in the
GENERIC kernel.After the procedure of device probing, you will see
. The install media
can be used in three ways: to install &os;, as a
live CD, or
to simply access a &os; shell. Use the arrow keys to choose
an option, and Enter to select.Selecting Installation Media ModeSelecting [ Install ]
here will enter the installer.Introducing bsdinstallbsdinstall is a text-based &os;
- installer program written by &a.nwhitehorn; and introduced in
+ installer program written by &a.nwhitehorn.email; and introduced in
2011 for &os; 9.0.
- &a.kmoore;'s pc-sysinstall is
+ &a.kmoore.email;'s pc-sysinstall is
included with PC-BSD,
and can also be used to
install &os;. Although sometimes confused with
bsdinstall, the two are not
related.The bsdinstall menu system is
controlled by the arrow keys, Enter,
Tab, Space, and other
keys.Selecting the Keymap MenuDepending on the system console being used,
bsdinstall may initially prompt to
select a non-default keyboard layout.Keymap SelectionIf [ YES ] is selected,
the following keyboard selection screen will be displayed.
Otherwise, this selection menu will not be displayed, and a
default keyboard mapping will be used.Selecting Keyboard MenuSelect the keymap that most closely represents the mapping
of the keyboard attached to the system, using the up/down
arrow keys and pressing Enter.Pressing Esc will use the default
keymap. United States of America
ISO-8859-1 is also a safe option if the
choice of keymap is not clear.Setting the HostnameNext, bsdinstall will prompt
for the hostname to be given to the newly installed
system.Setting the HostnameThe entered hostname should be a fully-qualified hostname,
such as
machine3.example.comSelecting Components to InstallNext, bsdinstall will prompt to
select optional components to install.Selecting Components to InstallDeciding which components to install will depend largely
on the intended use of the system and the amount of disk space
available. The &os; Kernel and userland (collectively the
base system) are always installed.Depending on the type of installation, some of these
components may not appear.Optional Componentsdoc - Additional documentation,
mostly of historical interest. Documentation provided by
the &os; Documentation Project may be installed
later.games - Several traditional BSD
games, including fortune,
rot13, and others.lib32 - Compatibility libraries for
running 32-bit applications on a 64-bit version of
&os;.ports - The &os; Ports
Collection.The ports collection is an easy and convenient way to
install software. The Ports Collection does not contain
the source code necessary to compile the software.
Instead, it is a collection of files which automates the
downloading, compiling and installation of third-party
software packages. discusses how
to use the ports collection.The installation program does not check to see if
you have adequate space. Select this option only if you
have adequate hard disk space. As of &os; 9.0, the
&os; Ports Collection takes up about &ports.size; of
disk space. You can safely assume a larger value for
more recent versions of &os;.src - System source code.&os; comes with full source code for both the kernel
and the userland. Although not required for the majority
of applications, it may be required to build certain
software supplied as source (for example, device drivers
or kernel modules), or for developing &os; itself.The full source tree requires 1 GB of disk space,
and recompiling the entire &os; system requires an
additional 5 GB of space.Installing from the NetworkThe bootonly installation media does
not hold copies of the installation files. When a
bootonly installation method is used, the
files must be retrieved over a network connection as they are
needed.Installing from the NetworkAfter the network connection has been configured as shown in
, a mirror site
is selected. Mirror sites cache copies of the &os; files.
Choose a mirror site located in the same region of the world as
the computer on which &os; is being installed. Files can be
retrieved more quickly when the mirror is close to the target
computer, and installation time will be reduced.Choosing a MirrorInstallation will continue as if the installation files
were located on local media.Allocating Disk SpaceThere are three ways to allocate disk space for &os;.
Guided partitioning automatically sets up
disk partitions, while Manual partitioning
allows advanced users to create customized partitions. Finally,
there's the option of starting a shell where command-line
programs like &man.gpart.8;, &man.fdisk.8;, and &man.bsdlabel.8;
can be used directly.Selecting Guided or Manual PartitioningGuided PartitioningIf multiple disks are connected, choose the one where &os;
is to be installed.Selecting from Multiple DisksThe entire disk can be allocated to &os;, or just a
portion of it. If
[ Entire Disk ] is
chosen, a general partition layout filling the whole disk is
created. Selecting
[ Partition ] creates a
partition layout in unused space on the disk.Selecting Entire Disk or PartitionAfter the partition layout has been created, review it
carefully for accuracy. If a mistake has been made, selecting
[ Revert ] will reset the
partitions as they were previously, or
[ Auto ] will recreate the
automatic &os; partitions. Partitions can be manually
created, modified, or deleted. When the partitioning is
correct, select [ Finish ] to
continue with the installation.Review Created PartitionsManual PartitioningManual partitioning goes straight to the partition
editor.Manually Create PartitionsHighlighting a drive (ada0 in
this example) and selecting
[ Create ] displays a menu
for choosing the type of partitioning
scheme.Manually Create PartitionsGPT partitioning is usually the most
appropriate choice for PC-compatible computers. Older PC
operating systems that are not compatible with
GPT may require MBR
partitioning instead. The other partitioning schemes are
generally used for uncommon or older computer systems.
Partitioning SchemesAbbreviationDescriptionAPMApple
Partition Map, used by &powerpc;
&macintosh;.BSDBSD Labels without an MBR, sometimes called
"dangerously dedicated mode". See
&man.bsdlabel.8;.GPTGUID
Partition Table.MBRMaster
Boot Record.PC98MBR
variant, used by NEC PC-98
computers.VTOC8Volume Table Of Contents, used by Sun SPARC64 and
UltraSPARC computers.
After the partitioning scheme has been selected and
created, selecting [ Create ]
again will create new partitions.Manually Create PartitionsA standard &os; GPT installation uses
at least three partitions:Standard &os; GPT Partitionsfreebsd-boot - &os; boot
code.freebsd-ufs - A &os; UFS
filesystem.freebsd-swap - &os; swap
space.Another partition type worth noting is
freebsd-zfs, used for partitions that will
contain a &os; ZFS filesystem. See
. &man.gpart.8; shows more
of the available GPT partition
types.Multiple filesystem partitions can be used, and some
people may prefer a traditional layout with separate
partitions for the /,
/var, /tmp, and
/usr filesystems. See
for an
example.Size may be entered with common abbreviations:
K for kilobytes, M
for megabytes, or G for gigabytes.Proper sector alignment provides the best performance,
and making partition sizes even multiples of 4K bytes helps
to ensure alignment on drives with either 512-byte or
4K-byte sectors. Generally, using partition sizes that are
even multiples of 1M or 1G is the easiest way to make sure
every partition starts at an even multiple of 4K. One
exception: at present, the freebsd-boot
partition should be no larger than 512K due to boot code
limitations.A mountpoint is needed if this partition will contain a
filesystem. If only a single UFS partition will be created,
the mountpoint should be /.A label is also requested. A label
is a name by which this partition will be known. Drive
names or numbers can change if the drive is connected to
a different controller or port, but the partition label does
not change. Referring to labels instead of drive names
and partition numbers in files like
/etc/fstab makes the system more tolerant
of changing hardware. GPT labels appear in
/dev/gpt/ when a disk is attached.
Other partitioning schemes have different label
capabilities, and their labels appear in different directories
in /dev/.Use a unique label on every filesystem to avoid
conflicts from identical labels. A few letters from the
computer's name, use, or location can be added to the label.
"labroot" or "rootfs-lab" for the UFS root partition on the
lab's computer, for example.Creating Traditional Split Filesystem
PartitionsFor a traditional partition layout where the
/, /var,
/tmp, and /usr
directories are separate filesystems on their own
partitions, create a GPT partitioning scheme, then create
the partitions as shown. Partition sizes shown are typical
for a 20G target disk. If more space is available on the
target disk, larger swap or /var
partitions may be useful. Labels shown here are prefixed
with ex for "example", but readers
should use other unique label values as described
above.By default, &os;'s gptboot expects
the first UFS partition found to be the
/ partition.Partition TypeSizeMountpointLabelfreebsd-boot512Kfreebsd-ufs2G/exrootfsfreebsd-swap4Gexswapfreebsd-ufs2G/varexvarfsfreebsd-ufs1G/tmpextmpfsfreebsd-ufsaccept the default (remainder of the
disk)/usrexusrfsAfter the custom partitions have been created, select
[ Finish ] to continue with
the installation.Committing to the InstallationThis is the last chance for aborting the installation to
prevent changes to the hard drive.Final ConfirmationSelect [ Commit ] and press
Enter to proceed. If changes need to be made,
select [ Back ] to return to
the partition editor.
[ Revert & Exit ]
will exit the installer without making any changes
to the hard drive.Installation time will vary depending on the distributions
chosen, installation media, and speed of the computer.
There will be a series of
messages displayed indicating progress.Firstly, the installer will write the partitions to the
disk, and perform a newfs to initialise the
partitions.If doing a network install,
bsdinstall will then proceed to
download the required distribution files.Fetching Distribution FilesNext, the integrity of the distribution files is verified,
to ensure they have not been corrupted during download or
misread from the installation media.Verifying Distribution FilesFinally, the verified distribution files are extracted to
the disk.Extracting Distribution FilesOnce all requested distribution files have been extracted,
bsdinstall will then drop straight
into the post-installation configuration tasks (see
).Post-InstallationConfiguration of various options follows a successful
installation of &os;. An option can be configured by
re-entering the configuration options from the final menu before
booting into the newly installed &os; system.Setting the root PasswordThe root password must be set. Note
that while entering the password, the characters being typed
are not displayed on the screen. After the password has been
entered, it must be entered again. This helps prevent typing
errors.Setting the root PasswordAfter the password has been successfully entered, the
installation will continue.Configuring Network InterfacesNetwork configuration will be skipped if it has already
been done as part of a bootonly
installation.A list of all the network interfaces found on the computer
is shown next. Select one to be configured.Choose a Network InterfaceConfiguring a Wireless Network InterfaceIf a wireless network interface is chosen, wireless
identification and security parameters must be entered to
allow it to connect to the network.Wireless networks are identified by a Service Set
Identifier, or
SSID. The SSID is a short, unique name given to
each network.Most wireless networks encrypt transmitted data to
protect information from unauthorized viewing. WPA2 encryption
is strongly recommended. Older encryption types, like
WEP,
offer very little security.The first step in connecting to a wireless network is to
scan for wireless access points.Scanning for Wireless Access PointsSSIDs
found during the scan are listed, followed by a description
of the encryption types available for that network. If the
desired SSID does not appear in the list,
select [ Rescan ] to scan
again. If the desired network still does not appear, check
for problems with antenna connections or try moving the
computer closer to the access point. Rescan after each
change is made.Choosing a Wireless NetworkThe encryption information for connecting to the
selected wireless network is entered after selecting the
network. With WPA2, only a password (also known as the
Pre-Shared Key, or PSK) is needed. Characters typed into the
input box are shown as asterisks for security.WPA2 SetupNetwork configuration continues after selection of the
wireless network and entry of the connection
information.Configuring IPv4 NetworkingChoose whether IPv4 networking is to be used. This is
the most common type of network connection.Choose IPv4 NetworkingThere are two methods of IPv4 configuration.
DHCP will automatically
configure the network interface correctly, and is the
preferred method. Static
configuration requires manual entry of network
information.Do not enter random network information, as it will
not work. Obtain the information shown in
from the network administrator or service provider.IPv4 DHCP Network ConfigurationIf a DHCP server is available, select
[ Yes ] to automatically
configure the network interface.Choose IPv4 DHCP ConfigurationIPv4 Static Network ConfigurationStatic configuration of the network interface requires
entry of some IPv4 information.IPv4 Static ConfigurationIP Address - The
manually-assigned IPv4 address to be assigned to this
computer. This address must be unique and not already
in use by another piece of equipment on the local
network.Subnet Mask - The subnet mask
used for the local network. Typically, this is
255.255.255.0.Default Router - The IP address
of the default router on this network. Usually this
is the address of the router or other network
equipment that connects the local network to the
Internet. Also known as the default
gateway.Configuring IPv6 NetworkingIPv6 is a newer method of network configuration. If
IPv6 is available and desired, choose
[ Yes ] to select
it.Choose IPv6 NetworkingIPv6 also has two methods of configuration.
SLAAC , or
StateLess Address AutoConfiguration,
will automatically configure the network interface
correctly. Static configuration
requires manual entry of network information.IPv6 Stateless Address AutoconfigurationSLAAC allows an IPv6 network
component to request autoconfiguration information from a
local router. See RFC4862
for more information.Choose IPv6 SLAAC ConfigurationIPv6 Static Network ConfigurationStatic configuration of the network interface requires
entry of the IPv6 configuration information.IPv6 Static ConfigurationIPv6 Address - The
manually-assigned IP address to be
assigned to this computer. This address must be
unique and not already in use by another piece of
equipment on the local network.Default Router - The IPv6
address of the default router on this network.
Usually this is the address of the router or other
network equipment that connects the local network to
the Internet. Also known as the default
gateway.Configuring DNSThe Domain Name System (or
DNS) Resolver converts
hostnames to and from network addresses. If
DHCP or SLAAC was used
to autoconfigure the network interface, the Resolver
Configuration values may already be present. Otherwise,
enter the local network's domain name in the Search field.
DNS #1 and DNS #2 are
the IP addresses for the local
DNS servers. At least one
DNS server is required.DNS ConfigurationSetting the Time ZoneSetting the time zone for your machine will allow it to
automatically correct for any regional time changes and
perform other time zone related functions properly.The example shown is for a machine located in the Eastern
time zone of the United States. Your selections will vary
according to your geographical location.Select Local or UTC ClockSelect [ Yes ]
or [ No ] according to how
the machine's clock is configured and press
Enter. If you do not know whether the system
uses UTC or local time, select
[ No ] to choose the more
commonly-used local time.Select a RegionThe appropriate region is selected using the arrow keys
and then pressing Enter.Select a CountrySelect the appropriate country using the arrow keys
and press Enter.Select a Time ZoneThe appropriate time zone is selected using the arrow
keys and pressing Enter.Confirm Time ZoneConfirm the abbreviation for the time zone is correct.
If it looks okay, press Enter to continue
with the post-installation configuration.Selecting Services to EnableAdditional system services which will be started at boot
can be enabled. All of these services are optional.Selecting Additional Services to EnableAdditional Servicessshd - Secure Shell
(SSH) daemon for
secure remote access.moused - Provides mouse usage
within the system console.ntpd - Network Time Protocol
(NTP)
daemon for automatic clock synchronization.powerd - System power control
utility for power control and energy saving.Enabling Crash Dumpsbsdinstall will prompt if crash
dumps should be enabled on the target system. Enabling crash
dumps can be very useful in debugging issues with the system,
so users are encouraged to enable crash dumps whenever
possible. Select [ Yes ] to
enable crash dumps, or [ No ]
to proceed without crash dumps enabled.Enabling Crash DumpsAdd UsersAdding at least one user during the installation allows
the system to be used without being logged in as
root. When logged in as
root, there are essentially no limits or
protection on what can be done. Logging in as a normal user
is safer and more secure.Select [ Yes ] to add new
users.Add User AccountsEnter the information for the user to be added.Enter User InformationUser InformationUsername - The name the user will
enter to log in. Typically the first letter of their
first name combined with their last name.Full name - The user's full
name.Uid - User ID. Typically, this
is left blank so the system will assign a value.Login group - The user's group.
Typically left blank to accept the default.Invite user into
other groups? - Additional groups to which the
user will be added as a member.Login class - Typically left blank
for the default.Shell - The interactive shell for
this user. In the example, &man.csh.1; has been
chosen.Home directory - The user's home
directory. The default is usually correct.Home directory permissions -
Permissions on the user's home directory. The default is
usually correct.Use password-based authentication?
- Typically "yes".Use an empty password? -
Typically "no".Use a random password? - Typically
"no".Enter password - The actual
password for this user. Characters typed will not show on
the screen.Enter password again - The password
must be typed again for verification.Lock out the account after
creation? - Typically "no".After entering everything, a summary is shown, and the
system asks if it is correct. If a mistake was made during
entry, enter no and try again. If
everything is correct, enter yes to create
the new user.Exit User and Group ManagementIf there are more users to add, answer the "Add another
user?" question with yes. Enter
no to finish adding users and continue the
installation.For more information on adding users and user management,
see .Final ConfigurationAfter everything has been installed and configured, a
final chance is provided to modify settings.Final ConfigurationUse this menu to make any changes or do any additional
configuration before completing the installation.Final Configuration OptionsAdd User - Described in
.Root Password - Described in
.Hostname - Described in
.Network - Described in
.Services - Described in
.Time Zone - Described in
.Handbook - Download and install the
&os; Handbook (which is what you are reading now).After any final configuration is complete, select
Exit to leave the installation.Manual Configurationbsdinstall will prompt if there
are any additional configuration that needs to be done before
rebooting into the new system. Select
[ Yes ] to exit to a shell
within the new system, or
[ No ] to proceed to the last
step of the installation.Complete the InstallationIf further configuration or special setup is needed,
selecting [ Live CD ]
will boot the install media into Live CD mode.When the installation is complete, select
[ Reboot ] to reboot the
computer and start the new &os; system. Do not forget to
remove the &os; install CD, DVD, or USB memory stick, or the
computer may boot from it again.&os; Booting and Shutdown&os;/&arch.i386; BootingAs &os; boots, many informational messages are
displayed. Most will scroll off the screen; this is normal.
After the system finishes booting, a login prompt is
displayed. Messages that scrolled off the screen can be
reviewed by pressing Scroll-Lock to turn on
the scroll-back buffer. The
PgUp, PgDn, and arrow keys
can be used to scroll back through the messages. Pressing
Scroll-Lock again unlocks the display and
returns to the normal screen.At the login: prompt, enter the
username added during the installation,
asample in the example. Avoid logging
in as root except when
necessary.The scroll-back buffer examined above is limited in
size, so not all of the messages may have been visible.
After logging in, most of them can be seen from the command
line by typing dmesg | less at the
prompt. Press q to return to the command
line after viewing.Typical boot messages (version information
omitted):Copyright (c) 1992-2011 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
root@farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64
CPU: Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz (3007.77-MHz K8-class CPU)
Origin = "GenuineIntel" Id = 0x10676 Family = 6 Model = 17 Stepping = 6
Features=0x783fbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,MMX,FXSR,SSE,SSE2>
Features2=0x209<SSE3,MON,SSSE3>
AMD Features=0x20100800<SYSCALL,NX,LM>
AMD Features2=0x1<LAHF>
real memory = 536805376 (511 MB)
avail memory = 491819008 (469 MB)
Event timer "LAPIC" quality 400
ACPI APIC Table: <VBOX VBOXAPIC>
ioapic0: Changing APIC ID to 1
ioapic0 <Version 1.1> irqs 0-23 on motherboard
kbd1 at kbdmux0
acpi0: <VBOX VBOXXSDT> on motherboard
acpi0: Power Button (fixed)
acpi0: Sleep Button (fixed)
Timecounter "ACPI-fast" frequency 3579545 Hz quality 900
acpi_timer0: <32-bit timer at 3.579545MHz> port 0x4008-0x400b on acpi0
cpu0: <ACPI CPU> on acpi0
pcib0: <ACPI Host-PCI bridge> port 0xcf8-0xcff on acpi0
pci0: <ACPI PCI bus> on pcib0
isab0: <PCI-ISA bridge> at device 1.0 on pci0
isa0: <ISA bus> on isab0
atapci0: <Intel PIIX4 UDMA33 controller> port 0x1f0-0x1f7,0x3f6,0x170-0x177,0x376,0xd000-0xd00f at device 1.1 on pci0
ata0: <ATA channel 0> on atapci0
ata1: <ATA channel 1> on atapci0
vgapci0: <VGA-compatible display> mem 0xe0000000-0xe0ffffff irq 18 at device 2.0 on pci0
em0: <Intel(R) PRO/1000 Legacy Network Connection 1.0.3> port 0xd010-0xd017 mem 0xf0000000-0xf001ffff irq 19 at device 3.0 on pci0
em0: Ethernet address: 08:00:27:9f:e0:92
pci0: <base peripheral> at device 4.0 (no driver attached)
pcm0: <Intel ICH (82801AA)> port 0xd100-0xd1ff,0xd200-0xd23f irq 21 at device 5.0 on pci0
pcm0: <SigmaTel STAC9700/83/84 AC97 Codec>
ohci0: <OHCI (generic) USB controller> mem 0xf0804000-0xf0804fff irq 22 at device 6.0 on pci0
usbus0: <OHCI (generic) USB controller> on ohci0
pci0: <bridge> at device 7.0 (no driver attached)
acpi_acad0: <AC Adapter> on acpi0
atkbdc0: <Keyboard controller (i8042)> port 0x60,0x64 irq 1 on acpi0
atkbd0: <AT Keyboard> irq 1 on atkbdc0
kbd0 at atkbd0
atkbd0: [GIANT-LOCKED]
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: [GIANT-LOCKED]
psm0: model IntelliMouse Explorer, device ID 4
attimer0: <AT timer> port 0x40-0x43,0x50-0x53 on acpi0
Timecounter "i8254" frequency 1193182 Hz quality 0
Event timer "i8254" frequency 1193182 Hz quality 100
sc0: <System console> at flags 0x100 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
atrtc0: <AT realtime clock> at port 0x70 irq 8 on isa0
Event timer "RTC" frequency 32768 Hz quality 0
ppc0: cannot reserve I/O port range
Timecounters tick every 10.000 msec
pcm0: measured ac97 link rate at 485193 Hz
em0: link state changed to UP
usbus0: 12Mbps Full Speed USB v1.0
ugen0.1: <Apple> at usbus0
uhub0: <Apple OHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus0
cd0 at ata1 bus 0 scbus1 target 0 lun 0
cd0: <VBOX CD-ROM 1.0> Removable CD-ROM SCSI-0 device
cd0: 33.300MB/s transfers (UDMA2, ATAPI 12bytes, PIO 65534bytes)
cd0: Attempt to query device size failed: NOT READY, Medium not present
ada0 at ata0 bus 0 scbus0 target 0 lun 0
ada0: <VBOX HARDDISK 1.0> ATA-6 device
ada0: 33.300MB/s transfers (UDMA2, PIO 65536bytes)
ada0: 12546MB (25694208 512 byte sectors: 16H 63S/T 16383C)
ada0: Previously was known as ad0
Timecounter "TSC" frequency 3007772192 Hz quality 800
Root mount waiting for: usbus0
uhub0: 8 ports with 8 removable, self powered
Trying to mount root from ufs:/dev/ada0p2 [rw]...
Setting hostuuid: 1848d7bf-e6a4-4ed4-b782-bd3f1685d551.
Setting hostid: 0xa03479b2.
Entropy harvesting: interrupts ethernet point_to_point kickstart.
Starting file system checks:
/dev/ada0p2: FILE SYSTEM CLEAN; SKIPPING CHECKS
/dev/ada0p2: clean, 2620402 free (714 frags, 327461 blocks, 0.0% fragmentation)
Mounting local file systems:.
vboxguest0 port 0xd020-0xd03f mem 0xf0400000-0xf07fffff,0xf0800000-0xf0803fff irq 20 at device 4.0 on pci0
vboxguest: loaded successfully
Setting hostname: machine3.example.com.
Starting Network: lo0 em0.
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=3<RXCSUM,TXCSUM>
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet 127.0.0.1 netmask 0xff000000
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
ether 08:00:27:9f:e0:92
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
Starting devd.
Starting Network: usbus0.
DHCPREQUEST on em0 to 255.255.255.255 port 67
DHCPACK from 10.0.2.2
bound to 192.168.1.142 -- renewal in 43200 seconds.
add net ::ffff:0.0.0.0: gateway ::1
add net ::0.0.0.0: gateway ::1
add net fe80::: gateway ::1
add net ff02::: gateway ::1
ELF ldconfig path: /lib /usr/lib /usr/lib/compat /usr/local/lib
32-bit compatibility ldconfig path: /usr/lib32
Creating and/or trimming log files.
Starting syslogd.
No core dumps found.
Clearing /tmp (X related).
Updating motd:.
Configuring syscons: blanktime.
Generating public/private rsa1 key pair.
Your identification has been saved in /etc/ssh/ssh_host_key.
Your public key has been saved in /etc/ssh/ssh_host_key.pub.
The key fingerprint is:
10:a0:f5:af:93:ae:a3:1a:b2:bb:3c:35:d9:5a:b3:f3 root@machine3.example.com
The key's randomart image is:
+--[RSA1 1024]----+
| o.. |
| o . . |
| . o |
| o |
| o S |
| + + o |
|o . + * |
|o+ ..+ . |
|==o..o+E |
+-----------------+
Generating public/private dsa key pair.
Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
The key fingerprint is:
7e:1c:ce:dc:8a:3a:18:13:5b:34:b5:cf:d9:d1:47:b2 root@machine3.example.com
The key's randomart image is:
+--[ DSA 1024]----+
| .. . .|
| o . . + |
| . .. . E .|
| . . o o . . |
| + S = . |
| + . = o |
| + . * . |
| . . o . |
| .o. . |
+-----------------+
Starting sshd.
Starting cron.
Starting background file system checks in 60 seconds.
Thu Oct 6 19:15:31 MDT 2011
FreeBSD/amd64 (machine3.example.com) (ttyv0)
login:Generating the RSA and DSA keys may take some time on
slower machines. This happens only on the initial boot-up
of a new installation, and only if
sshd is set to start
automatically. Subsequent boots will be faster.&os; does not install graphical environments by default,
but many are available. See for more
information.&os; ShutdownProper shutdown of a &os; computer helps protect data and
even hardware from damage. Do not just turn off the power.
If the user is a member of the wheel
group, become the superuser by typing su at
the command line and entering the root
password. Otherwise, log in as root and
use shutdown -p now. The system will close
down cleanly and turn itself off.The
CtrlAltDel
key combination can be used to reboot the system, but is not
recommended during normal operation.TroubleshootinginstallationtroubleshootingThe following section covers basic installation
troubleshooting, such as common problems people have
reported.What to Do If Something Goes WrongDue to various limitations of the PC architecture, it is
impossible for probing to be 100% reliable, however, there are
a few things you can do if it fails.Check the Hardware
Notes document for your version of &os; to make sure
your hardware is supported.If your hardware is supported and you still experience
lock-ups or other problems, you will need to build a
custom kernel. This will
allow you to add in support for devices which are not present
in the GENERIC kernel. The kernel on the
boot disks is configured assuming that most hardware devices
are in their factory default configuration in terms of IRQs,
IO addresses, and DMA channels. If your hardware has been
reconfigured, you will most likely need to edit the kernel
configuration and recompile to tell &os; where to find
things.It is also possible that a probe for a device not present
will cause a later probe for another device that is present to
fail. In that case, the probes for the conflicting driver(s)
should be disabled.Some installation problems can be avoided or alleviated
by updating the firmware on various hardware components,
most notably the motherboard. Motherboard firmware is
usually referred to as the BIOS. Most
motherboard and computer manufacturers have a website for
upgrades and upgrade information.Manufacturers generally advise against upgrading the
motherboard BIOS unless there is a good
reason for doing so, like a critical update. The upgrade
process can go wrong, leaving the
BIOS incomplete and the computer
inoperative.Troubleshooting Questions and AnswersMy system hangs while probing hardware during boot,
or it behaves strangely during install.&os; makes extensive use of the system
ACPI service on the i386, amd64, and ia64 platforms to
aid in system configuration if it is detected during
boot. Unfortunately, some bugs still exist in both the
ACPI driver and within system motherboards and
BIOS
firmware. ACPI can be disabled by setting
the hint.acpi.0.disabled hint in the
third stage boot loader:set hint.acpi.0.disabled="1"This is reset each time the system is booted, so it
is necessary to
add hint.acpi.0.disabled="1" to the
file
/boot/loader.conf. More
information about the boot loader can be found
in .Using the Live CDA live CD of &os; is available on the same CD as the main
installation program. This is useful for those who are still
wondering whether &os; is the right operating system for them
and want to test some of the features before installing.The following points should be noted while using the live
CD:To gain access to the system, authentication is
required. The username is root, and
the password is blank.As the system runs directly from the CD, performance
will be significantly slower than that of a system
installed on a hard disk.The live CD provides a command prompt and not a
graphical interface.
diff --git a/en_US.ISO8859-1/books/handbook/disks/chapter.xml b/en_US.ISO8859-1/books/handbook/disks/chapter.xml
index 10cfa6f943..59b56fbbaa 100644
--- a/en_US.ISO8859-1/books/handbook/disks/chapter.xml
+++ b/en_US.ISO8859-1/books/handbook/disks/chapter.xml
@@ -1,3989 +1,3989 @@
StorageSynopsisThis chapter covers the use of disks in &os;. This
includes memory-backed disks, network-attached disks,
standard SCSI/IDE storage devices, and devices using the USB
interface.After reading this chapter, you will know:The terminology &os; uses to describe the organization
of data on a physical disk.How to add additional hard disks to a &os;
system.How to configure &os; to use USB storage devices.How to set up virtual file systems, such as memory
disks.How to use quotas to limit disk space usage.How to encrypt disks to secure them against
attackers.How to create and burn CDs and DVDs on &os;.How to use the backup programs available under
&os;.What file system snapshots are and how to use them
efficiently.Before reading this chapter, you should:Know how to configure and
install a new &os; kernel.Device NamesThe following is a list of physical storage devices
supported in &os; and their associated device names.
Physical Disk Naming ConventionsDrive typeDrive device nameIDE hard drivesad or
adaIDE CD-ROM drivesacd or
cdSATA hard drivesad or
adaSATA CD-ROM drivesacd or
cdSCSI hard drives and USB Mass storage
devicesdaSCSI CD-ROM drivescdAssorted non-standard CD-ROM drivesmcd for Mitsumi CD-ROM and
scd for Sony CD-ROM devicesFloppy drivesfdSCSI tape drivessaIDE tape drivesastFlash drivesfla for &diskonchip; Flash
deviceRAID drivesaacd for &adaptec; AdvancedRAID,
mlxd and mlyd
for &mylex;,
amrd for AMI &megaraid;,
idad for Compaq Smart RAID,
twed for &tm.3ware; RAID.
DavidO'BrienOriginally contributed by Adding DisksdisksaddingThis section describes how to add a new
SATA disk to a machine that currently only
has a single drive. First, turn off the computer and install
the drive in the computer following the instructions of the
computer, controller, and drive manufacturers. Reboot
the system and become root.Inspect /var/run/dmesg.boot to ensure
the new disk was found. In this example, the newly added
SATA drive will appear as
ada1.partitionsgpartFor this example, a single large partition will be created
on the new disk. The
GPT partitioning scheme will be
used in preference to the older and less versatile
MBR scheme.If the disk to be added is not blank, old partition
information can be removed with
gpart delete. See &man.gpart.8; for
details.The partition scheme is created, and then a single partition
is added:&prompt.root; gpart create -s GPT ada1
&prompt.root; gpart add -t freebsd-ufs ada1Depending on use, several smaller partitions may be desired.
See &man.gpart.8; for options to create partitions smaller than
a whole disk.A file system is created on the new blank disk:&prompt.root; newfs -U /dev/ada1p1An empty directory is created as a
mountpoint, a location for mounting the new
disk in the original disk's file system:&prompt.root; mkdir /newdiskFinally, an entry is added to
/etc/fstab so the new disk will be mounted
automatically at startup:/dev/ada1p1 /newdisk ufs rw 2 2The new disk can be mounted manually, without restarting the
system:&prompt.root; mount /newdiskMarcFonvieilleContributed by USB Storage DevicesUSBdisksMany external storage solutions, such as hard drives, USB
thumbdrives, and CD/DVD burners, use the Universal Serial Bus
(USB). &os; provides support for these devices.ConfigurationThe USB mass storage devices driver, &man.umass.4;,
is built into the GENERIC kernel
and provides support for USB storage devices. For a custom
kernel, be sure that the following lines are present in the
kernel configuration file:device scbus
device da
device pass
device uhci
device ohci
device ehci
device usb
device umassSince the &man.umass.4; driver uses the SCSI subsystem to
access the USB storage devices, any USB device will be seen as
a SCSI device by the system. Depending on the USB chipset on
the motherboard, device uhci or
device ohci is used to provide USB 1.X
support. Support for USB 2.0 controllers is provided by
device ehci.If the USB device is a CD or DVD burner, &man.cd.4;,
must be added to the kernel via the line:device cdSince the burner is seen as a SCSI drive, the driver
&man.atapicam.4; should not be used in the kernel
configuration.Testing the ConfigurationTo test the USB configuration, plug in the USB device. In
the system message buffer, &man.dmesg.8;, the drive should
appear as something like:umass0: USB Solid state disk, rev 1.10/1.00, addr 2
GEOM: create disk da0 dp=0xc2d74850
da0 at umass-sim0 bus 0 target 0 lun 0
da0: <Generic Traveling Disk 1.11> Removable Direct Access SCSI-2 device
da0: 1.000MB/s transfers
da0: 126MB (258048 512 byte sectors: 64H 32S/T 126C)The brand, device node (da0), and
other details will differ according to the device.Since the USB device is seen as a SCSI one,
camcontrol can be used to list the USB
storage devices attached to the system:&prompt.root; camcontrol devlist
<Generic Traveling Disk 1.11> at scbus0 target 0 lun 0 (da0,pass0)If the drive comes with a file system, it can be mounted.
Refer to for
instructions on how to format and create partitions on the USB
drive.Allowing untrusted users to mount arbitrary media, by
enabling vfs.usermount as
described below, should not be considered safe from a
security point of view. Most file systems in &os; were not
built to safeguard against malicious devices.To make the device mountable as a normal user, one
solution is to make all users of the device a member of the
operator group using &man.pw.8;.
Next, ensure that the operator group is
able to read and write the device by adding these lines to
/etc/devfs.rules:[localrules=5]
add path 'da*' mode 0660 group operatorIf SCSI disks are installed in the system, change
the second line as follows:add path 'da[3-9]*' mode 0660 group operatorThis will exclude the first three SCSI disks
(da0 to
da2)from belonging to the
operator group.Next, enable the &man.devfs.rules.5; ruleset in
/etc/rc.conf:devfs_system_ruleset="localrules"Next, instruct the running kernel to allow regular users
to mount file systems. The easiest way is to add the
following line to
/etc/sysctl.conf:vfs.usermount=1Since this only takes effect after the next reboot use
&man.sysctl.8; to set this variable now.The final step is to create a directory where the file
system is to be mounted. This directory needs to be owned by
the user that is to mount the file system. One way to do that
is for root to create a subdirectory
owned by that user as /mnt/username.
In the following example, replace
username with the login name of the
user and usergroup with the user's
primary group:&prompt.root; mkdir /mnt/username
&prompt.root; chown username:usergroup /mnt/usernameSuppose a USB thumbdrive is plugged in, and a device
/dev/da0s1 appears. If the device is
preformatted with a FAT file system, it can be mounted
using:&prompt.user; mount -t msdosfs -o -m=644,-M=755 /dev/da0s1 /mnt/usernameBefore the device can be unplugged, it
must be unmounted first. After device
removal, the system message buffer will show messages similar
to the following:umass0: at uhub0 port 1 (addr 2) disconnected
(da0:umass-sim0:0:0:0): lost device
(da0:umass-sim0:0:0:0): removing device entry
GEOM: destroy disk da0 dp=0xc2d74850
umass0: detachedFurther ReadingBeside the Adding
Disks and Mounting and
Unmounting File Systems sections, reading various
manual pages may be also useful: &man.umass.4;,
&man.camcontrol.8;, and &man.usbconfig.8; under &os; 8.X
or &man.usbdevs.8; under earlier versions of &os;.MikeMeyerContributed by Creating and Using CD MediaCD-ROMscreatingIntroductionCD media provide a number of features that differentiate
them from conventional disks. Initially, they were not
writable by the user. They are designed so that they can be
read continuously without delays to move the head between
tracks. They are also much easier to transport between
systems.CD media do have tracks, but this refers to a section of
data to be read continuously and not a physical property of
the disk. For example, to produce a CD on &os;, prepare the
data files that are going to make up the tracks on the CD,
then write the tracks to the CD.ISO 9660file systemsISO 9660The ISO 9660 file system was designed to deal with these
differences. To overcome the original file system limits, it
provides an extension mechanism that allows properly written
CDs to exceed those limits while still working with systems
that do not support those extensions.sysutils/cdrtoolsThe sysutils/cdrtools
port includes &man.mkisofs.8;, a program that can be used to
produce a data file containing an ISO 9660 file system. It
has options that support various extensions, and is described
below.CD burnerATAPIWhich tool to use to burn the CD depends on whether the
CD burner is ATAPI or something else. ATAPI CD burners use
burncd
which is part of the base system. SCSI and USB CD burners
should use cdrecord from the
sysutils/cdrtools port.
It is also possible to use cdrecord and other tools
for SCSI drives on ATAPI hardware with the ATAPI/CAM module.For CD burning software with a graphical user
interface, consider X-CD-Roast or
K3b. These tools are available as
packages or from the
sysutils/xcdroast and
sysutils/k3b ports.
X-CD-Roast and
K3b require the
ATAPI/CAM module with ATAPI
hardware.mkisofsThe sysutils/cdrtools
port also installs &man.mkisofs.8;, which produces an ISO 9660
file system that is an image of a directory tree in the &unix;
file system name space. The simplest usage is:&prompt.root; mkisofs -o imagefile.iso/path/to/treefile systemsISO 9660This command creates an
imagefile.iso containing an ISO
9660 file system that is a copy of the tree at
/path/to/tree. In the process, it
maps the file names to names that fit the limitations of
the standard ISO 9660 file system, and will exclude files that
have names uncharacteristic of ISO file systems.file systemsHFSfile systemsJolietA number of options are available to overcome these
restrictions. In particular, enables the
Rock Ridge extensions common to &unix; systems,
enables Joliet extensions used by
Microsoft systems, and can be used to
create HFS file systems used by &macos;.For CDs that are going to be used only on &os; systems,
can be used to disable all filename
restrictions. When used with , it produces
a file system image that is identical to the specified &os;
tree, though it may violate the ISO 9660 standard in a number
of ways.CD-ROMscreating bootableThe last option of general use is .
This is used to specify the location of the boot image for use
in producing an El Torito bootable CD. This
option takes an argument which is the path to a boot image
from the top of the tree being written to the CD. By default,
&man.mkisofs.8; creates an ISO image in floppy disk
emulation mode, and thus expects the boot image to
be exactly 1200, 1440 or 2880 KB in size. Some boot
loaders, like the one used by the &os; distribution disks, do
not use emulation mode. In this case,
should be used. So, if
/tmp/myboot holds a
bootable &os; system with the boot image in /tmp/myboot/boot/cdboot, this
command would produce the image of an ISO 9660 file system as
/tmp/bootable.iso:&prompt.root; mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/mybootIf md is configured in the
kernel, the file system can be mounted as a memory disk
with:&prompt.root; mdconfig -a -t vnode -f /tmp/bootable.iso -u 0
&prompt.root; mount -t cd9660 /dev/md0 /mntOne can then verify that /mnt and /tmp/myboot are
identical.There are many other options available for
&man.mkisofs.8; to fine-tune its behavior. Refer to
&man.mkisofs.8; for details.burncdCD-ROMsburningFor an ATAPI CD burner, burncd can be
used to burn an ISO image onto a CD.
burncd is part of the base system,
installed as /usr/sbin/burncd. Usage is
very simple, as it has few options:&prompt.root; burncd -f cddevice data imagefile.iso fixateThis command will burn a copy of
imagefile.iso on
cddevice. The default device is
/dev/acd0. See &man.burncd.8; for
options to set the write speed, eject the CD after burning,
and write audio data.cdrecordFor systems without an ATAPI CD burner,
cdrecord can be used to burn CDs.
cdrecord is not part of the base system and
must be installed from either the sysutils/cdrtools package or port.
Changes to the base system can cause binary versions of this
program to fail, possibly resulting in a
coaster. It is recommended to either upgrade
the port when the system is upgraded, or for users
tracking -STABLE, to upgrade the
port when a new version becomes available.While cdrecord has many options, basic
usage is simple. Burning an ISO 9660 image is done
with:&prompt.root; cdrecord dev=deviceimagefile.isoThe tricky part of using cdrecord is
finding the to use. To find the proper
setting, use which might produce
results like this:CD-ROMsburning&prompt.root; cdrecord -scanbus
Cdrecord-Clone 2.01 (i386-unknown-freebsd7.0) Copyright (C) 1995-2004 Jörg Schilling
Using libscg version 'schily-0.1'
scsibus0:
0,0,0 0) 'SEAGATE ' 'ST39236LW ' '0004' Disk
0,1,0 1) 'SEAGATE ' 'ST39173W ' '5958' Disk
0,2,0 2) *
0,3,0 3) 'iomega ' 'jaz 1GB ' 'J.86' Removable Disk
0,4,0 4) 'NEC ' 'CD-ROM DRIVE:466' '1.26' Removable CD-ROM
0,5,0 5) *
0,6,0 6) *
0,7,0 7) *
scsibus1:
1,0,0 100) *
1,1,0 101) *
1,2,0 102) *
1,3,0 103) *
1,4,0 104) *
1,5,0 105) 'YAMAHA ' 'CRW4260 ' '1.0q' Removable CD-ROM
1,6,0 106) 'ARTEC ' 'AM12S ' '1.06' Scanner
1,7,0 107) *This lists the appropriate value for
the devices on the list. Locate the CD burner, and use the
three numbers separated by commas as the value for
. In this case, the CRW device is 1,5,0,
so the appropriate input is .
Refer to &man.cdrecord.1; for easier ways to specify this
value and for information on writing audio tracks and
controlling the write speed.Duplicating Audio CDsTo duplicate an audio CD, extract the audio data from the
CD to a series of files, then write these files to a blank CD.
The process is slightly different for ATAPI and SCSI
drives.SCSI DrivesUse cdda2wav to extract the
audio:&prompt.user; cdda2wav -vall -D2,0 -B -OwavUse cdrecord to write the
.wav files:&prompt.user; cdrecord -v dev=2,0 -dao -useinfo *.wavMake sure that 2,0 is set
appropriately, as described in .ATAPI DrivesWith the help of the
ATAPI/CAM module,
cdda2wav can also be used on ATAPI
drives. This tool is usually a better choice for most of
users, as it supports jitter correction and endianness,
than the method proposed below.The ATAPI CD driver makes each track available as
/dev/acddtnn,
where d is the drive number,
and nn is the track number
written with two decimal digits, prefixed with zero as
needed. So the first track on the first disk is
/dev/acd0t01, the second is
/dev/acd0t02, the third is
/dev/acd0t03, and so on.Make sure the appropriate files exist in
/dev. If the entries are missing,
force the system to retaste the media:&prompt.root; dd if=/dev/acd0 of=/dev/null count=1Extract each track using &man.dd.1;, making sure to
specify a block size when extracting the files:&prompt.root; dd if=/dev/acd0t01 of=track1.cdr bs=2352
&prompt.root; dd if=/dev/acd0t02 of=track2.cdr bs=2352
...Burn the extracted files to disk using
burncd. Specify that these are audio
files, and that burncd should fixate
the disk when finished:&prompt.root; burncd -f /dev/acd0 audio track1.cdr track2.cdr ... fixateDuplicating Data CDsIt is possible to copy a data CD to an image file that is
functionally equivalent to the image file created with
&man.mkisofs.8;, and then use it to duplicate any data CD.
The example given here assumes that the CD-ROM device is
acd0. Substitute the correct CD-ROM
device.&prompt.root; dd if=/dev/acd0 of=file.iso bs=2048Now that there is an image, it can be burned to CD as
described above.Using Data CDsIt is possible to mount and read the data on a standard
data CD. By default, &man.mount.8; assumes that a file system
is of type ufs. Running this
command:&prompt.root; mount /dev/cd0 /mntwill generate an error about Incorrect super
block, and will fail to mount the CD. The CD
does not use the UFS file system, so
attempts to mount it as such will fail. Instead, tell
&man.mount.8; that the file system is of type
ISO9660 by specifying
to &man.mount.8;. For example,
to mount the CD-ROM device, /dev/cd0,
under /mnt,
use:&prompt.root; mount -t cd9660 /dev/cd0 /mntReplace /dev/cd0 with the device
name for the CD device. Also,
executes &man.mount.cd9660.8;, meaning the above command is
equivalent to:&prompt.root; mount_cd9660 /dev/cd0 /mntWhile data CD-ROMs from any vendor can be mounted this way,
disks with certain ISO 9660 extensions might behave oddly.
For example, Joliet disks store all filenames in two-byte
Unicode characters. The &os; kernel does not speak Unicode,
but the &os; CD9660 driver is able to convert Unicode
characters on the fly. If some non-English characters show up
as question marks, specify the local charset with
. For more information, refer to
&man.mount.cd9660.8;.In order to do this character conversion with the help
of , the kernel requires the
cd9660_iconv.ko module to be loaded.
This can be done either by adding this line to
loader.conf:cd9660_iconv_load="YES"and then rebooting the machine, or by directly loading
the module with &man.kldload.8;.Occasionally, Device not configured
will be displayed when trying to mount a CD-ROM. This
usually means that the CD-ROM drive thinks that there is no
disk in the tray, or that the drive is not visible on the bus.
It can take a couple of seconds for a CD-ROM drive to realize
that a media is present, so be patient.Sometimes, a SCSI CD-ROM may be missed because it did not
have enough time to answer the bus reset. To resolve this,add
the following option to the kernel configuration and rebuild the
kernel.options SCSI_DELAY=15000This tells the SCSI bus to pause 15 seconds during boot,
to give the CD-ROM drive every possible chance to answer the
bus reset.Burning Raw Data CDsIt is possible to burn a file directly to CD, without
creating an ISO 9660 file system. Some people do this for
backup purposes. This command runs more quickly than burning
a standard CD:&prompt.root; burncd -f /dev/acd1 -s 12 data archive.tar.gz fixateIn order to retrieve the data burned to such a CD, the
data must be read from the raw device node:&prompt.root; tar xzvf /dev/acd1This type of disk can not be mounted as a normal CD-ROM and
the data cannot be read under any operating system except
&os;. In order to mount the CD, or to share the data with
another operating system, &man.mkisofs.8; must be used as
described above.MarcFonvieilleContributed by Using the ATAPI/CAM DriverCD burnerATAPI/CAM driverThis driver allows ATAPI devices, such as CD/DVD drives,
to be accessed through the SCSI subsystem, and so allows the
use of applications like sysutils/cdrdao or
&man.cdrecord.1;.To use this driver, add the following line to
/boot/loader.conf:atapicam_load="YES"then, reboot the system.Users who prefer to statically compile &man.atapicam.4;
support into the kernel, should add this line to the
kernel configuration file:device atapicamEnsure the following lines are still in the kernel
configuration file:device ata
device scbus
device cd
device passThen rebuild, install the new kernel, and reboot the
machine.During the boot process, the burner should show up, like
so:acd0: CD-RW <MATSHITA CD-RW/DVD-ROM UJDA740> at ata1-master PIO4
cd0 at ata1 bus 0 target 0 lun 0
cd0: <MATSHITA CDRW/DVD UJDA740 1.00> Removable CD-ROM SCSI-0 device
cd0: 16.000MB/s transfers
cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closedThe drive can now be accessed via the
/dev/cd0 device name. For example, to
mount a CD-ROM on /mnt,
type the following:&prompt.root; mount -t cd9660 /dev/cd0 /mntAs root, run the following command
to get the SCSI address of the burner:&prompt.root; camcontrol devlist
<MATSHITA CDRW/DVD UJDA740 1.00> at scbus1 target 0 lun 0 (pass0,cd0)In this example, 1,0,0 is the SCSI
address to use with &man.cdrecord.1; and other SCSI
applications.For more information about ATAPI/CAM and SCSI system,
refer to &man.atapicam.4; and &man.cam.4;.MarcFonvieilleContributed by AndyPolyakovWith inputs from Creating and Using DVD MediaDVDburningIntroductionCompared to the CD, the DVD is the next generation of
optical media storage technology. The DVD can hold more data
than any CD and is the standard for video publishing.Five physical recordable formats can be defined for a
recordable DVD:DVD-R: This was the first DVD recordable format
available. The DVD-R standard is defined by the
DVD
Forum. This format is write once.DVD-RW: This is the rewritable version of the
DVD-R standard. A DVD-RW can be rewritten about 1000
times.DVD-RAM: This is a rewritable format which can be seen
as a removable hard drive. However, this media is not
compatible with most DVD-ROM drives and DVD-Video players
as only a few DVD writers support the DVD-RAM format.
Refer to for more
information on DVD-RAM use.DVD+RW: This is a rewritable format defined by
the DVD+RW
Alliance. A DVD+RW can be rewritten about 1000
times.DVD+R: This format is the write once variation
of the DVD+RW format.A single layer recordable DVD can hold up to
4,700,000,000 bytes which is actually 4.38 GB or
4485 MB as 1 kilobyte is 1024 bytes.A distinction must be made between the physical media
and the application. For example, a DVD-Video is a specific
file layout that can be written on any recordable DVD
physical media such as DVD-R, DVD+R, or DVD-RW. Before
choosing the type of media, ensure that both the burner and
the DVD-Video player are compatible with the media under
consideration.ConfigurationTo perform DVD recording, use &man.growisofs.1;. This
command is part of the sysutils/dvd+rw-tools utilities
which support all DVD media types.These tools use the SCSI subsystem to access the devices,
therefore ATAPI/CAM support
must be loaded or statically compiled into the kernel. This
support is not needed if the burner uses the USB interface.
Refer to for more details
on USB device configuration.DMA access must also be enabled for ATAPI devices, by
adding the following line to
/boot/loader.conf:hw.ata.atapi_dma="1"Before attempting to use
dvd+rw-tools, consult the
Hardware
Compatibility Notes.For a graphical user interface, consider using sysutils/k3b which provides a
user friendly interface to &man.growisofs.1; and many other
burning tools.Burning Data DVDsSince &man.growisofs.1; is a front-end to mkisofs, it will invoke
&man.mkisofs.8; to create the file system layout and perform
the write on the DVD. This means that an image of the data
does not need to be created before the burning process.To burn to a DVD+R or a DVD-R the data in
/path/to/data,
use the following command:&prompt.root; growisofs -dvd-compat -Z /dev/cd0 -J -R /path/to/dataIn this example, is passed to
&man.mkisofs.8; to create an ISO 9660 file system with Joliet
and Rock Ridge extensions. Refer to &man.mkisofs.8; for more
details.For the initial session recording, is
used for both single and multiple sessions. Replace
/dev/cd0, with the name of the DVD
device. Using indicates that the
disk will be closed and that the recording will be
unappendable. This should also provide better media
compatibility with DVD-ROM drives.To burn a pre-mastered image, such as
imagefile.iso, use:&prompt.root; growisofs -dvd-compat -Z /dev/cd0=imagefile.isoThe write speed should be detected and automatically set
according to the media and the drive being used. To force the
write speed, use . Refer to
&man.growisofs.1; for example usage.In order to support working files larger than 4.38GB, an
UDF/ISO-9660 hybrid filesystem must be created by passing
to &man.mkisofs.8; and
all related programs, such as &man.growisofs.1;. This is
required only when creating an ISO image file or when
writing files directly to a disk. Since a disk created this
way must be mounted as an UDF filesystem with
&man.mount.udf.8;, it will be usable only on an UDF aware
operating system. Otherwise it will look as if it contains
corrupted files.To create this type of ISO file:&prompt.user; mkisofs -R -J -udf -iso-level 3 -o imagefile.iso/path/to/dataTo burn files directly to a disk:&prompt.root; growisofs -dvd-compat -udf -iso-level 3 -Z /dev/cd0 -J -R /path/to/dataWhen an ISO image already contains large files, no
additional options are required for &man.growisofs.1; to
burn that image on a disk.Be sure to use an up-to-date version of sysutils/cdrtools, which
contains &man.mkisofs.8;, as an older version may not
contain large files support. If the latest version does
not work, install sysutils/cdrtools-devel and read
its &man.mkisofs.8;.Burning a DVD-VideoDVDDVD-VideoA DVD-Video is a specific file layout based on the ISO
9660 and micro-UDF (M-UDF) specifications. Since DVD-Video
presents a specific data structure hierarchy, a particular
program such as multimedia/dvdauthor is needed to
author the DVD.If an image of the DVD-Video file system already exists,
it can be burned in the same way as any other image. If
dvdauthor was used to make the DVD and the
result is in /path/to/video, the following
command should be used to burn the DVD-Video:&prompt.root; growisofs -Z /dev/cd0 -dvd-video /path/to/video is passed to &man.mkisofs.8;
to instruct it to create a DVD-Video file system layout.
This option implies the
&man.growisofs.1; option.Using a DVD+RWDVDDVD+RWUnlike CD-RW, a virgin DVD+RW needs to be formatted before
first use. It is recommended to let
&man.growisofs.1; take care of this automatically whenever
appropriate. However, it is possible to use
dvd+rw-format to format the DVD+RW:&prompt.root; dvd+rw-format /dev/cd0Only perform this operation once and keep in mind that
only virgin DVD+RW medias need to be formatted. Once
formatted, the DVD+RW can be burned as usual.To burn a totally new file system and not just append some
data onto a DVD+RW, the media does not need to be blanked
first. Instead, write over the previous recording like
this:&prompt.root; growisofs -Z /dev/cd0 -J -R /path/to/newdataThe DVD+RW format supports appending data to a previous
recording. This operation consists of merging a new session
to the existing one as it is not considered to be
multi-session writing. &man.growisofs.1; will
grow the ISO 9660 file system present on
the media.For example, to append data to a DVD+RW, use the
following:&prompt.root; growisofs -M /dev/cd0 -J -R /path/to/nextdataThe same &man.mkisofs.8; options used to burn the
initial session should be used during next writes.Use for better media
compatibility with DVD-ROM drives. When using DVD+RW, this
option will not prevent the addition of data.To blank the media, use:&prompt.root; growisofs -Z /dev/cd0=/dev/zeroUsing a DVD-RWDVDDVD-RWA DVD-RW accepts two disc formats: incremental sequential
and restricted overwrite. By default, DVD-RW discs are in
sequential format.A virgin DVD-RW can be directly written without being
formatted. However, a non-virgin DVD-RW in sequential format
needs to be blanked before writing a new initial
session.To blank a DVD-RW in sequential mode:&prompt.root; dvd+rw-format -blank=full /dev/cd0A full blanking using will
take about one hour on a 1x media. A fast blanking can be
performed using , if the DVD-RW will
be recorded in Disk-At-Once (DAO) mode. To burn the DVD-RW
in DAO mode, use the command:&prompt.root; growisofs -use-the-force-luke=dao -Z /dev/cd0=imagefile.isoSince &man.growisofs.1; automatically attempts to detect
fast blanked media and engage DAO write,
should not be
required.One should instead use restricted overwrite mode with
any DVD-RW as this format is more flexible than the default
of incremental sequential.To write data on a sequential DVD-RW, use the same
instructions as for the other DVD formats:&prompt.root; growisofs -Z /dev/cd0 -J -R /path/to/dataTo append some data to a previous recording, use
with &man.growisofs.1;. However, if data
is appended on a DVD-RW in incremental sequential mode, a new
session will be created on the disc and the result will be a
multi-session disc.A DVD-RW in restricted overwrite format does not need to
be blanked before a new initial session. Instead, overwrite
the disc with . It is also possible to
grow an existing ISO 9660 file system written on the disc with
. The result will be a one-session
DVD.To put a DVD-RW in restricted overwrite format, the
following command must be used:&prompt.root; dvd+rw-format /dev/cd0To change back to sequential format, use:&prompt.root; dvd+rw-format -blank=full /dev/cd0Multi-SessionFew DVD-ROM drives support multi-session DVDs and most of
the time only read the first session. DVD+R, DVD-R and DVD-RW
in sequential format can accept multiple sessions. The notion
of multiple sessions does not exist for the DVD+RW and the
DVD-RW restricted overwrite formats.Using the following command after an initial non-closed
session on a DVD+R, DVD-R, or DVD-RW in sequential format,
will add a new session to the disc:&prompt.root; growisofs -M /dev/cd0 -J -R /path/to/nextdataUsing this command with a DVD+RW or a DVD-RW in restricted
overwrite mode will append data while merging the new session
to the existing one. The result will be a single-session
disc. Use this method to add data after an initial write on
these types of media.Since some space on the media is used between each
session to mark the end and start of sessions, one should
add sessions with a large amount of data to optimize media
space. The number of sessions is limited to 154 for a
DVD+R, about 2000 for a DVD-R, and 127 for a DVD+R Double
Layer.For More InformationTo obtain more information about a DVD, use
dvd+rw-mediainfo
/dev/cd0 while the disc
in the specified drive.More information about
dvd+rw-tools can be found in
&man.growisofs.1;, on the dvd+rw-tools
web site, and in the cdwrite mailing
list archives.When creating a problem report related to the use of
dvd+rw-tools, always include the
output of dvd+rw-mediainfo.Using a DVD-RAMDVDDVD-RAMConfigurationDVD-RAM writers can use either a SCSI or ATAPI
interface. For ATAPI devices, DMA access has to be
enabled by adding the following line to
/boot/loader.conf:hw.ata.atapi_dma="1"Preparing the MediaA DVD-RAM can be seen as a removable hard drive. Like
any other hard drive, the DVD-RAM must be formatted before
it can be used. In this example, the whole disk space will
be formatted with a standard UFS2 file system:&prompt.root; dd if=/dev/zero of=/dev/acd0 bs=2k count=1
&prompt.root; bsdlabel -Bw acd0
&prompt.root; newfs /dev/acd0The DVD device, acd0, must be
changed according to the configuration.Using the MediaOnce the DVD-RAM has been formatted, it can be mounted
as a normal hard drive:&prompt.root; mount /dev/acd0/mntOnce mounted, the DVD-RAM will be both readable and
writeable.JulioMerinoOriginal work by MartinKarlssonRewritten by Creating and Using Floppy DisksStoring data on floppy disks is sometimes useful, for
example when one does not have any other removable storage media
or when one needs to transfer small amounts of data to another
computer.This section explains how to use floppy disks in &os;. It
covers formatting and usage of 3.5inch DOS floppies, but the
concepts are similar for other floppy disk formats.Formatting FloppiesThe DeviceFloppy disks are accessed through entries in
/dev, just like other
devices. To access the raw floppy disk, simply use
/dev/fdN.FormattingA floppy disk needs to be low-level formatted before it
can be used. This is usually done by the vendor, but
formatting is a good way to check media integrity. Although
it is possible to force other disk sizes, 1440kB is what
most floppy disks are designed for.To low-level format the floppy disk, use
&man.fdformat.1;. This utility expects the device name as
an argument.Make note of any error messages, as these can help
determine if the disk is good or bad.Formatting Floppy DisksTo format the floppy, insert a new 3.5inch floppy
disk into the first floppy drive and issue:&prompt.root; /usr/sbin/fdformat -f 1440 /dev/fd0The Disk LabelAfter low-level formatting the disk, a disk label needs to
placed on it. This disk label will be destroyed later, but
it is needed by the system to determine the size of the disk
and its geometry.The new disk label will take over the whole disk and will
contain all the proper information about the geometry of the
floppy. The geometry values for the disk label are listed in
/etc/disktab.To write the disk label, use &man.bsdlabel.8;:&prompt.root; /sbin/bsdlabel -B -w /dev/fd0 fd1440The File SystemThe floppy is now ready to be high-level formatted. This
will place a new file system on it so that &os; can read and
write to the disk. Since creating the new file system
destroys the disk label, the disk label needs to be recreated
whenever the disk is reformatted.The floppy's file system can be either UFS or FAT.
FAT is generally a better choice for floppies.To put a new file system on the floppy, issue:&prompt.root; /sbin/newfs_msdos /dev/fd0The disk is now ready for use.Using the FloppyTo use the floppy, mount it with &man.mount.msdosfs.8;.
One can also use
emulators/mtools from the
Ports Collection.Creating and Using Data Tapestape mediaTape technology has continued to evolve but is less likely
to be used in a modern system. Modern backup systems tend to
use off site combined with local removable disk drive
technologies. Still, &os; will support any tape drive that
uses SCSI, such as LTO and older devices such as DAT. There is
limited support for SATA and USB tape drives.Serial Access with &man.sa.4;tape drives&os; uses the &man.sa.4; driver, providing
/dev/sa0,
/dev/nsa0, and
/dev/esa0. In normal use, only
/dev/sa0 is needed.
/dev/nsa0 is the same physical drive
as /dev/sa0 but does not rewind the
tape after writing a file. This allows writing more than one
file to a tape. Using /dev/esa0
ejects the tape after the device is closed, if
applicable.Controlling the Tape Drive with
&man.mt.1;tape mediamt&man.mt.1; is the &os; utility for controlling other
operations of the tape drive, such as seeking through files on
a tape or writing tape control marks to the tape.For example, the first three files on a tape can be
preserved by skipping past them before writing a new
file:&prompt.root; mt -f /dev/nsa0 fsf 3Using &man.tar.1; to Read and
Write Tape BackupsAn example of writing a single file to tape using
&man.tar.1;:&prompt.root; tar cvf /dev/sa0 fileRecovering files from a &man.tar.1; archive on tape into
the current directory:&prompt.root; tar xvf /dev/sa0Using &man.dump.8; and
&man.restore.8; to Create and Restore BackupsA simple backup of /usr with &man.dump.8;:&prompt.root; dump -0aL -b64 -f /dev/nsa0 /usrInteractively restoring files from a &man.dump.8; file on
tape into the current directory:&prompt.root; restore -i -f /dev/nsa0Other Tape SoftwareHigher-level programs are available to simplify tape
backup. The most popular are
Amanda and
Bacula. These programs aim to make
backups easier and more convenient, or to automate complex
backups of multiple machines. The Ports Collection contains
both these and other tape utility applications.LowellGilbertOriginal work by Backup StrategiesThe first requirement in devising a backup plan is to make
sure that all of the following problems are covered:Disk failure.Accidental file deletion.Random file corruption.Complete machine destruction, say by fire, including
destruction of any on-site backups.Some systems will be best served by having each of these
problems covered by a completely different technique. Except
for strictly personal systems with low-value data, it is
unlikely that one technique will cover all of them.Some possible techniques include:Archives of the whole system, backed up onto permanent,
off-site media. This provides protection against all of the
problems listed above, but is slow and inconvenient to
restore from. Copies of the backups can be stored on site
or online, but there will still be inconveniences in
restoring files, especially for non-privileged users.Filesystem snapshots, which are really only helpful in
the accidental file deletion scenario, but can be
very helpful in that case, as well as
quick and easy to deal with.Copies of whole file systems or disks which can be
created with a periodic net/rsync of the whole machine.
This is generally most useful in networks with unique
requirements. For general protection against disk failure,
this is usually inferior to RAID. For
restoring accidentally deleted files, it can be comparable
to UFS snapshots.RAID, which minimizes or avoids
downtime when a disk fails at the expense of having to deal
with disk failures more often, because there are more disks,
albeit at a much lower urgency.Checking fingerprints of files using &man.mtree.8;.
Although this is not a backup, this technique indicates
when one needs to resort to backups. This is particularly
important for offline backups, and should be checked
periodically.It is quite easy to come up with more techniques, many
of them variations on the ones listed above. Specialized
requirements usually lead to specialized techniques. For
example, backing up a live database usually requires a method
particular to the database software as an intermediate step.
The important thing is to know which dangers should be protected
against, and how each will be handled.Backup BasicsThe major backup programs built into &os; are
&man.dump.8;, &man.tar.1;, &man.cpio.1;, and
&man.pax.1;.Dump and Restorebackup softwaredump / restoredumprestoreThe traditional &unix; backup programs are
dump and restore. They
operate on the drive as a collection of disk blocks, below the
abstractions of files, links and directories that are created
by the file systems. Unlike other backup software,
dump backs up an entire file system on a
device. It is unable to backup only part of a file system or
a directory tree that spans more than one file system.
dump does not write files and directories,
but rather writes the raw data blocks that comprise files and
directories. When used to extract data,
restore stores temporary
files in /tmp/ by
default. When using a recovery disk with a small /tmp, set
TMPDIR to a directory with more free space in
order for the restore to succeed.If dump is used on the root
directory, it will not back up /home,
/usr or many other
directories since these are typically mount points for other
file systems or symbolic links into those file
systems.dump has quirks that remain from its
early days in Version 6 of AT&T &unix;,circa 1975. The
default parameters are suitable for 9-track tapes (6250 bpi),
not the high-density media available today (up to 62,182
ftpi). These defaults must be overridden on the command line
to utilize the capacity of current tape drives..rhostsIt is also possible to backup data across the network to a
tape drive attached to another computer with
rdump and rrestore.
Both programs rely upon &man.rcmd.3; and &man.ruserok.3; to
access the remote tape drive. Therefore, the user performing
the backup must be listed in .rhosts on
the remote computer. The arguments to
rdump and rrestore must
be suitable to use on the remote computer. For example, to
rdump from a &os; computer to an Exabyte
tape drive connected to a host called
komodo, use:&prompt.root; /sbin/rdump 0dsbfu 54000 13000 126 komodo:/dev/nsa8 /dev/da0a 2>&1There are security implications to allowing
.rhosts authentication, so use
with caution.It is also possible to use dump and
restore in a more secure fashion over
ssh.Using dump over
ssh&prompt.root; /sbin/dump -0uan -f - /usr | gzip -2 | ssh -c blowfish \
targetuser@targetmachine.example.com dd of=/mybigfiles/dump-usr-l0.gzOr, use the built-in RSH:Using dump over
ssh with RSH
Set&prompt.root; env RSH=/usr/bin/ssh /sbin/dump -0uan -f targetuser@targetmachine.example.com:/dev/sa0 /usrtarbackup softwaretar&man.tar.1; also dates back to Version 6 of AT&T
&unix;, circa 1975. tar operates in
cooperation with the file system and writes files and
directories to tape. tar does not support
the full range of options that are available from
&man.cpio.1;, but it does not require the unusual command
pipeline that cpio uses.tarTo tar to an Exabyte tape drive
connected to a host called komodo:&prompt.root; tar cf - . | rsh komodo dd of=tape-device obs=20bWhen backing up over an insecure network, instead use
ssh.cpiobackup softwarecpio&man.cpio.1; is the original &unix; file interchange tape
program for magnetic media. cpio includes
options to perform byte-swapping, write a number of different
archive formats, and pipe the data to other programs. This
last feature makes cpio an excellent choice
for installation media. cpio does not know
how to walk the directory tree and a list of files must be
provided through stdin.cpioSince cpio does not support backups
across the network, use a pipeline and ssh
to send the data to a remote tape drive.&prompt.root; for f in directory_list; dofind $f >> backup.listdone
&prompt.root; cpio -v -o --format=newc < backup.list | ssh user@host "cat > backup_device"Where directory_list is the
list of directories to back up,
user@host
is the user/hostname combination that will be performing the
backups, and backup_device is where
the backups should be written to, such as
/dev/nsa0).paxbackup softwarepaxpaxPOSIXIEEE&man.pax.1; is the IEEE/&posix; answer to
tar and cpio. Over the
years the various versions of tar and
cpio have become slightly incompatible. So
rather than fight it out to fully standardize them, &posix;
created a new archive utility. pax
attempts to read and write many of the various
cpio and tar formats,
plus new formats of its own. Its command set more resembles
cpio than tar.Amandabackup softwareAmandaAmandaAmanda (Advanced Maryland
Network Disk Archiver) is a client/server backup system,
rather than a single program. An
Amanda server will backup to a
single tape drive any number of computers that have
Amanda clients and a network
connection to the Amanda server. A
common problem at sites with a number of large disks is that
the length of time required to backup to data directly to tape
exceeds the amount of time available for the task.
Amanda solves this problem by using
a holding disk to backup several file systems
at the same time. Amanda creates
archive sets: a group of tapes used over a
period of time to create full backups of all the file systems
listed in Amanda's configuration
file. The archive set also contains nightly
incremental, or differential, backups of all the file systems.
Restoring a damaged file system requires the most recent full
backup and the incremental backups.The configuration file provides fine grained control of
backups and the network traffic that
Amanda generates.
Amanda will use any of the above
backup programs to write the data to tape.
Amanda is not installed by
but is available as either a port or package.Do NothingDo nothing is not a computer program, but
it is the most widely used backup strategy. There are no
initial costs. There is no backup schedule to follow. Just
say no. If something happens to your data, grin and bear
it!If your time and data is worth little to nothing, then
Do nothing is the most suitable backup program
for the computer. But beware, &os; is a useful tool and
over time it can be used to create a valuable collection of
files.Do nothing is the correct backup method for
/usr/obj and other
directory trees that can be exactly recreated by the computer.
An example is the files that comprise the HTML or &postscript;
version of this Handbook. These document formats have been
created from XML input files. Creating backups of the HTML or
&postscript; files is not necessary if the XML files are
backed up regularly.Which Backup Program Is Best?LISA&man.dump.8; Period. Elizabeth D.
Zwicky torture tested all the backup programs discussed here.
The clear choice for preserving all your data and all the
peculiarities of &unix; file systems is
dump. Elizabeth created file systems
containing a large variety of unusual conditions (and some not
so unusual ones) and tested each program by doing a backup and
restore of those file systems. The peculiarities included:
files with holes, files with holes and a block of nulls, files
with funny characters in their names, unreadable and
unwritable files, devices, files that change size during the
backup, files that are created/deleted during the backup and
more. She presented the results at LISA V in Oct. 1991. See
torture-testing
Backup and Archive Programs.Emergency Restore ProcedureBefore the DisasterThere are four steps which should be performed in
preparation for any disaster that may occur.bsdlabelFirst, print the bsdlabel of each disk using a command
such as bsdlabel da0 | lpr. Also print a
copy of /etc/fstab and all boot
messages.livefs CDSecond, burn a livefs CD. This CD
contains support for booting into a &os;
livefs rescue mode, allowing the user to
perform many tasks like running &man.dump.8;,
&man.restore.8;, &man.fdisk.8;, &man.bsdlabel.8;,
&man.newfs.8;, &man.mount.8;, and more. The livefs CD image
for &os;/&arch.i386; &rel2.current;-RELEASE is
available from .Livefs CD images are not available for
&os; &rel.current;-RELEASE and later. In addition to
the CD-ROM installation images, flash drive installation
images may be used to recover a system. The
memstick image for
&os;/&arch.i386; &rel.current;-RELEASE is available
from .Third, create backup tapes regularly. Any changes that
made after the last backup may be irretrievably lost.
Write-protect the backup media.Fourth, test the livefs CD and the
backups. Make notes of the procedure. Store these notes
with the CD, the printouts, and the backups. These notes
may prevent the inadvertent destruction of the backups while
under the stress of performing an emergency
recovery.For an added measure of security, store an extra
livefs CD and the latest backup at a
remote location, where a remote location is
not the basement of the same building.
A remote location should be physically separated from the
computers and disk drives by a significant distance.After the DisasterFirst, determine if the hardware survived. Thanks
to regular, off-site backups, there is no need to worry
about the software.If the hardware has been damaged, the parts should be
replaced before attempting to use the computer.If the hardware is okay, insert the
livefs CD and boot the computer. The
original install menu will be displayed on the screen.
Select the correct country, then choose
Fixit -- Repair mode with CD-ROM/DVD/floppy or
start a shell. then select
CD-ROM/DVD -- Use the live filesystem
CD-ROM/DVD.
restore and the other needed programs
are located in /mnt2/rescue.Recover each file system separately.mountroot partitionbsdlabelnewfsTry to mount the root partition
of the first disk using mount /dev/da0a
/mnt. If the bsdlabel was damaged, use
bsdlabel to re-partition and label the
disk to match the label that was printed and saved. Use
newfs to re-create the file systems.
Re-mount the root partition of the disk read-write using
mount -u -o rw /mnt. Use the backups
to recover the data for this file system. Unmount the file
system with umount /mnt. Repeat for each
file system that was damaged.Once the system is running, backup the data onto new
media as whatever caused the crash or data loss may strike
again. Another hour spent now may save further distress
later.MarcFonvieilleReorganized and enhanced by Network, Memory, and File-Backed File Systemsvirtual disksdisksvirtualIn addition to physical disks such as floppies, CDs, and
hard drives, &os; also supports virtual
disks.NFSCodadisksmemoryThese include network file systems such as the
Network File System and Coda,
memory-based file systems, and file-backed file systems.According to the &os; version, the tools used for the
creation and use of file-backed and memory-based file systems
differ.Use &man.devfs.5; to allocate device nodes transparently
for the user.File-Backed File Systemdisksfile-backed&man.mdconfig.8; is used to configure and enable memory
disks, &man.md.4;, under &os;. To use &man.mdconfig.8;,
&man.md.4; must be first loaded. When using a custom kernel
configuration file, ensure it includes this line:device md&man.mdconfig.8; supports several types of memory backed
virtual disks: memory disks allocated with &man.malloc.9; and
memory disks using a file or swap space as backing. One
possible use is the mounting of CD images.To mount an existing file system image:Using mdconfig to Mount an Existing
File System Image&prompt.root; mdconfig -a -t vnode -f diskimage -u 0
&prompt.root; mount /dev/md0/mntTo create a new file system image with
&man.mdconfig.8;:Creating a New File-Backed Disk with
mdconfig&prompt.root; dd if=/dev/zero of=newimage bs=1k count=5k
5120+0 records in
5120+0 records out
&prompt.root; mdconfig -a -t vnode -f newimage -u 0
&prompt.root; bsdlabel -w md0 auto
&prompt.root; newfs md0a
/dev/md0a: 5.0MB (10224 sectors) block size 16384, fragment size 2048
using 4 cylinder groups of 1.25MB, 80 blks, 192 inodes.
super-block backups (for fsck -b #) at:
160, 2720, 5280, 7840
&prompt.root; mount /dev/md0a /mnt
&prompt.root; df /mnt
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/md0a 4710 4 4330 0% /mntIf unit number is not specified with
, &man.mdconfig.8; uses the
&man.md.4; automatic allocation to select an unused device.
The name of the allocated unit will be output to stdout, such
as md4. Refer to &man.mdconfig.8;
for more details about.While &man.mdconfig.8; is useful, it takes several
command lines to create a file-backed file system. &os; also
comes with &man.mdmfs.8; which automatically configures a
&man.md.4; disk using &man.mdconfig.8;, puts a UFS file system
on it using &man.newfs.8;, and mounts it using &man.mount.8;.
For example, to create and mount the same file system image as
above, type the following:Configure and Mount a File-Backed Disk with
mdmfs&prompt.root; dd if=/dev/zero of=newimage bs=1k count=5k
5120+0 records in
5120+0 records out
&prompt.root; mdmfs -F newimage -s 5m md0/mnt
&prompt.root; df /mnt
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/md0 4718 4 4338 0% /mntWhen is used without a unit number,
&man.mdmfs.8; uses the &man.md.4; auto-unit feature to
automatically select an unused device. For more details
about &man.mdmfs.8;, refer to its manual page.Memory-Based File Systemdisksmemory file systemFor a memory-based file system, swap
backing should normally be used. This does not mean
that the memory disk will be swapped out to disk by default,
but rather that the memory disk will be allocated from a
memory pool which can be swapped out to disk if needed. It is
also possible to create memory-based disks which are
&man.malloc.9; backed, but using large malloc backed memory
disks can result in a system panic if the kernel runs out of
memory.Creating a New Memory-Based Disk with
mdconfig&prompt.root; mdconfig -a -t swap -s 5m -u 1
&prompt.root; newfs -U md1
/dev/md1: 5.0MB (10240 sectors) block size 16384, fragment size 2048
using 4 cylinder groups of 1.27MB, 81 blks, 192 inodes.
with soft updates
super-block backups (for fsck -b #) at:
160, 2752, 5344, 7936
&prompt.root; mount /dev/md1/mnt
&prompt.root; df /mnt
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/md1 4718 4 4338 0% /mntCreating a New Memory-Based Disk with
mdmfs&prompt.root; mdmfs -s 5m md2/mnt
&prompt.root; df /mnt
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/md2 4846 2 4458 0% /mntDetaching a Memory Disk from the Systemdisksdetaching a memory diskWhen a memory-based or file-based file system is no
longer in use, its resources should be released back to
the system. First, unmount the file system, then use
&man.mdconfig.8; to detach the disk from the system and
release the resources.For example, to detach and free all resources used by
/dev/md4:&prompt.root; mdconfig -d -u 4It is possible to list information about configured
&man.md.4; devices by running
mdconfig -l.TomRhodesContributed by File System Snapshotsfile systemssnapshots&os; offers a feature in conjunction with
Soft Updates: file system
snapshots.UFS snapshots allow a user to create images of specified
file systems, and treat them as a file. Snapshot files must be
created in the file system that the action is performed on, and
a user may create no more than 20 snapshots per file system.
Active snapshots are recorded in the superblock so they are
persistent across unmount and remount operations along with
system reboots. When a snapshot is no longer required, it can
be removed using &man.rm.1;. While snapshots may be removed in
any order, all the used space may not be acquired because
another snapshot will possibly claim some of the released
blocks.The un-alterable file flag is set
by &man.mksnap.ffs.8; after initial creation of a snapshot file.
&man.unlink.1; makes an exception for snapshot files since it
allows them to be removed.Snapshots are created using &man.mount.8;. To place a
snapshot of /var in the
file /var/snapshot/snap, use the following
command:&prompt.root; mount -u -o snapshot /var/snapshot/snap /varAlternatively, use &man.mksnap.ffs.8; to create the
snapshot:&prompt.root; mksnap_ffs /var /var/snapshot/snapOne can find snapshot files on a file system, such as
/var, using
&man.find.1;:&prompt.root; find /var -flags snapshotOnce a snapshot has been created, it has several
uses:Some administrators will use a snapshot file for backup
purposes, because the snapshot can be transferred to CDs or
tape.The file system integrity checker, &man.fsck.8;, may be
run on the snapshot. Assuming that the file system was
clean when it was mounted, this should always provide a
clean and unchanging result.Running &man.dump.8; on the snapshot will produce a dump
file that is consistent with the file system and the
timestamp of the snapshot. &man.dump.8; can also take a
snapshot, create a dump image, and then remove the snapshot
in one command by using .The snapshot can be mounted as a frozen image of the
file system. To &man.mount.8; the snapshot
/var/snapshot/snap run:&prompt.root; mdconfig -a -t vnode -f /var/snapshot/snap -u 4
&prompt.root; mount -r /dev/md4 /mntThe frozen /var is
now available through /mnt. Everything will initially
be in the same state it was during the snapshot creation time.
The only exception is that any earlier snapshots will appear as
zero length files. To unmount the snapshot, use:&prompt.root; umount /mnt
&prompt.root; mdconfig -d -u 4For more information about and
file system snapshots, including technical papers, visit
Marshall Kirk McKusick's website at
.File System Quotasaccountingdisk spacedisk quotasQuotas are an optional feature of the operating system that
can be used to limit the amount of disk space or the number of
files a user or members of a group may allocate on a per-file
system basis. This is used most often on timesharing systems
where it is desirable to limit the amount of resources any one
user or group of users may allocate. This prevents one user or
group of users from consuming all of the available disk
space.Configuring the System to Enable Disk QuotasBefore using disk quotas, quota support must be added to
the kernel by adding the following line to the kernel
configuration file:options QUOTAThe GENERIC kernel does not
have this enabled by default, so a custom kernel must be
compiled in order to use disk quotas. Refer to for more information on
kernel configuration.Next, enable disk quotas in
/etc/rc.conf:quota_enable="YES"disk quotascheckingFor finer control over quota startup, an additional
configuration variable is available. Normally on bootup, the
quota integrity of each file system is checked by
&man.quotacheck.8;. This program insures that the data in the
quota database properly reflects the data on the file system.
This is a time consuming process that will significantly
affect the time the system takes to boot. To skip this step,
add this variable to /etc/rc.conf:check_quotas="NO"Finally, edit /etc/fstab to enable
disk quotas on a per-file system basis. This is when user or
group quotas can be enabled on the file systems.To enable per-user quotas on a file system, add
to the options field in the
/etc/fstab entry for the file system to
enable quotas on. For example:/dev/da1s2g /home ufs rw,userquota 1 2To enable group quotas, instead use
. To enable both user and group
quotas, change the entry as follows:/dev/da1s2g /home ufs rw,userquota,groupquota 1 2By default, the quota files are stored in the root
directory of the file system as
quota.user and
quota.group. Refer to &man.fstab.5; for
more information. Even though an alternate location for the
quota files can be specified, this is not recommended because
the various quota utilities do not seem to handle this
properly.Once the configuration is complete, reboot the system
with the new kernel. /etc/rc will
automatically run the appropriate commands to create the
initial quota files for all of the quotas enabled in
/etc/fstab. There is no need to
manually create any zero length quota files.In the normal course of operations, there should be no
need to manually run &man.quotacheck.8;, &man.quotaon.8;, or
&man.quotaoff.8;. However, one should read their manual pages
to be familiar with their operation.Setting Quota Limitsdisk quotaslimitsOnce the system has been configured to enable quotas,
verify they really are enabled by running:&prompt.root; quota -vThere should be a one line summary of disk usage and
current quota limits for each file system that quotas are
enabled on.The system is now ready to be assigned quota limits with
&man.edquota.8;.Several options are available to enforce limits on the
amount of disk space a user or group may allocate, and how
many files they may create. Allocations can be limited based
on disk space (block quotas), number of files (inode quotas),
or a combination of both. Each limits is further broken down
into two categories: hard and soft limits.hard limitA hard limit may not be exceeded. Once a user reaches a
hard limit, no further allocations can be made on that file
system by that user. For example, if the user has a hard
limit of 500 kbytes on a file system and is currently using
490 kbytes, the user can only allocate an additional 10
kbytes. Attempting to allocate an additional 11 kbytes will
fail.soft limitSoft limits can be exceeded for a limited amount of time,
known as the grace period, which is one week by default. If a
user stays over their limit longer than the grace period, the
soft limit turns into a hard limit and no further allocations
are allowed. When the user drops back below the soft limit,
the grace period is reset.The following is an example output from &man.edquota.8;.
When &man.edquota.8; is invoked, the editor specified by
EDITOR is opened in order to edit the quota
limits. The default editor is set to
vi.&prompt.root; edquota -u testQuotas for user test:
/usr: kbytes in use: 65, limits (soft = 50, hard = 75)
inodes in use: 7, limits (soft = 50, hard = 60)
/usr/var: kbytes in use: 0, limits (soft = 50, hard = 75)
inodes in use: 0, limits (soft = 50, hard = 60)There are normally two lines for each file system that
has quotas enabled. One line represents the block limits and
the other represents the inode limits. Change the value to
modify the quota limit. For example, to raise this
user's block limit from a soft limit of 50 and a hard limit of
75 to a soft limit of 500 and a hard limit of 600,
change:/usr: kbytes in use: 65, limits (soft = 50, hard = 75)to:/usr: kbytes in use: 65, limits (soft = 500, hard = 600)The new quota limits take affect upon exiting the
editor.Sometimes it is desirable to set quota limits on a range
of UIDs. This can be done by passing to
&man.edquota.8;. First, assign the desired quota limit to a
user, then run edquota -p protouser
startuid-enduid. For example, if
test has the desired quota limits, the
following command will duplicate those quota limits for UIDs
10,000 through 19,999:&prompt.root; edquota -p test 10000-19999For more information, refer to &man.edquota.8;.Checking Quota Limits and Disk Usagedisk quotascheckingEither &man.quota.1; or &man.repquota.8; can be used to
check quota limits and disk usage. To check individual user
or group quotas and disk usage, use &man.quota.1;. A user
may only examine their own quota and the quota of a group they
are a member of. Only the superuser may view all user and
group quotas. To get a summary of all quotas and disk usage
for file systems with quotas enabled, use
&man.repquota.8;.The following is sample output from
quota -v for a user that has quota limits
on two file systems.Disk quotas for user test (uid 1002):
Filesystem usage quota limit grace files quota limit grace
/usr 65* 50 75 5days 7 50 60
/usr/var 0 50 75 0 50 60grace periodIn this example, the user is currently 15 kbytes over the
soft limit of 50 kbytes on /usr and has 5 days of grace
period left. The asterisk * indicates that
the user is currently over the quota limit.Normally, file systems that the user is not using any disk
space on will not show in the output of &man.quota.1;, even if
the user has a quota limit assigned for that file system. Use
to display those file systems, such as
/usr/var in the above
example.Quotas over NFSNFSQuotas are enforced by the quota subsystem on the NFS
server. The &man.rpc.rquotad.8; daemon makes quota
information available to &man.quota.1; on NFS clients,
allowing users on those machines to see their quota
statistics.Enable rpc.rquotad in
/etc/inetd.conf like so:rquotad/1 dgram rpc/udp wait root /usr/libexec/rpc.rquotad rpc.rquotadNow restart inetd:&prompt.root; service inetd restartLuckyGreenContributed by shamrock@cypherpunks.toEncrypting Disk Partitionsdisksencrypting&os; offers excellent online protections against
unauthorized data access. File permissions and Mandatory Access Control (MAC) help
prevent unauthorized users from accessing data while the
operating system is active and the computer is powered up.
However, the permissions enforced by the operating system are
irrelevant if an attacker has physical access to a computer and
can move the computer's hard drive to another system to copy and
analyze the data.Regardless of how an attacker may have come into possession
of a hard drive or powered-down computer, both the GEOM Based
Disk Encryption (gbde) and
geli cryptographic subsystems in &os; are
able to protect the data on the computer's file systems against
even highly-motivated attackers with significant resources.
Unlike cumbersome encryption methods that encrypt only
individual files, gbde and
geli transparently encrypt entire file
systems. No cleartext ever touches the hard drive's
platter.Disk Encryption with
gbdeConfiguring gbde requires
superuser privileges.&prompt.user; su -
Password:If using a custom kernel configuration file, ensure it
contains this line:options GEOM_BDEIf the kernel already contains this support, use
kldload to load &man.gbde.4;:&prompt.root; kldload geom_bdePreparing the Encrypted Hard DriveThe following example demonstrates adding a new hard
drive to a system that will hold a single encrypted
partition. This partition will be mounted as
/private.
gbde can also be used to encrypt
/home and
/var/mail, but this
requires more complex instructions which exceed the scope of
this introduction.Add the New Hard DriveInstall the new drive to the system as explained in
. For the purposes
of this example, a new hard drive partition has been
added as /dev/ad4s1c and
/dev/ad0s1*
represents the existing standard &os; partitions.&prompt.root; ls /dev/ad*
/dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1
/dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c
/dev/ad0s1a /dev/ad0s1d /dev/ad4Create a Directory to Hold gbde
Lock Files&prompt.root; mkdir /etc/gbdeThe gbde lock file
contains information that
gbde requires to access
encrypted partitions. Without access to the lock file,
gbde will not be able to
decrypt the data contained in the encrypted partition
without significant manual intervention which is not
supported by the software. Each encrypted partition
uses a separate lock file.Initialize the gbde
PartitionA gbde partition must be
initialized before it can be used. This initialization
needs to be performed only once:&prompt.root; gbde init /dev/ad4s1c -i -L /etc/gbde/ad4s1c.lock&man.gbde.8; will open the default editor, in order
to set various configuration options in a template. For
use with UFS1 or UFS2, set the sector_size to
2048:# $FreeBSD: src/sbin/gbde/template.txt,v 1.1.36.1 2009/08/03 08:13:06 kensmith Exp $
#
# Sector size is the smallest unit of data which can be read or written.
# Making it too small decreases performance and decreases available space.
# Making it too large may prevent filesystems from working. 512 is the
# minimum and always safe. For UFS, use the fragment size
#
sector_size = 2048
[...]&man.gbde.8; will ask the user twice to type the
passphrase used to secure the data. The passphrase must
be the same both times. The ability of
gbde to protect data depends
entirely on the quality of the passphrase. For tips on
how to select a secure passphrase that is easy to
remember, see the Diceware
Passphrase website.gbde initcreates a lock file for
the gbde partition. In this
example, it is stored as
/etc/gbde/ad4s1c.lock.
gbde lock files must end in
.lock in order to be correctly detected
by the /etc/rc.d/gbde start up
script.gbde lock files
must be backed up together with
the contents of any encrypted partitions. While
deleting a lock file alone cannot prevent a determined
attacker from decrypting a
gbde partition, without the
lock file, the legitimate owner will be unable to
access the data on the encrypted partition without a
significant amount of work that is totally unsupported
by &man.gbde.8;.Attach the Encrypted Partition to the
Kernel&prompt.root; gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lockThis command will prompt to input the passphrase
that was selected during the initialization of the
encrypted partition. The new encrypted device will
appear in
/dev as
/dev/device_name.bde:&prompt.root; ls /dev/ad*
/dev/ad0 /dev/ad0s1b /dev/ad0s1e /dev/ad4s1
/dev/ad0s1 /dev/ad0s1c /dev/ad0s1f /dev/ad4s1c
/dev/ad0s1a /dev/ad0s1d /dev/ad4 /dev/ad4s1c.bdeCreate a File System on the Encrypted
DeviceOnce the encrypted device has been attached to the
kernel, a file system can be created on the device using
&man.newfs.8;. This example creates a UFS2 file
system with soft updates enabled.&prompt.root; newfs -U /dev/ad4s1c.bde&man.newfs.8; must be performed on an attached
gbde partition which is
identified by a
*.bde
extension to the device name.Mount the Encrypted PartitionCreate a mount point for the encrypted file
system:&prompt.root; mkdir /privateMount the encrypted file system:&prompt.root; mount /dev/ad4s1c.bde /privateVerify That the Encrypted File System is
AvailableThe encrypted file system should now be visible to
&man.df.1; and be available for use.&prompt.user; df -H
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 1037M 72M 883M 8% /
/devfs 1.0K 1.0K 0B 100% /dev
/dev/ad0s1f 8.1G 55K 7.5G 0% /home
/dev/ad0s1e 1037M 1.1M 953M 0% /tmp
/dev/ad0s1d 6.1G 1.9G 3.7G 35% /usr
/dev/ad4s1c.bde 150G 4.1K 138G 0% /privateMounting Existing Encrypted File SystemsAfter each boot, any encrypted file systems must be
re-attached to the kernel, checked for errors, and mounted,
before the file systems can be used. The required commands
must be executed as root.Attach the gbde Partition to the
Kernel&prompt.root; gbde attach /dev/ad4s1c -l /etc/gbde/ad4s1c.lockThis command will prompt for the passphrase that was
selected during initialization of the encrypted
gbde partition.Check the File System for ErrorsSince encrypted file systems cannot yet be listed in
/etc/fstab for automatic mounting,
the file systems must be checked for errors by running
&man.fsck.8; manually before mounting:&prompt.root; fsck -p -t ffs /dev/ad4s1c.bdeMount the Encrypted File System&prompt.root; mount /dev/ad4s1c.bde /privateThe encrypted file system is now available for
use.Automatically Mounting Encrypted PartitionsIt is possible to create a script to automatically
attach, check, and mount an encrypted partition, but for
security reasons the script should not contain the
&man.gbde.8; password. Instead, it is recommended that
such scripts be run manually while providing the password
via the console or &man.ssh.1;.As an alternative, an rc.d script
is provided. Arguments for this script can be passed via
&man.rc.conf.5;:gbde_autoattach_all="YES"
gbde_devices="ad4s1c"
gbde_lockdir="/etc/gbde"This requires that the
gbde passphrase be entered at
boot time. After typing the correct passphrase, the
gbde encrypted partition will
be mounted automatically. This can be useful when using
gbde on laptops.Cryptographic Protections Employed by
gbde&man.gbde.8; encrypts the sector payload using 128-bit
AES in CBC mode. Each sector on the disk is encrypted with
a different AES key. For more information on the
cryptographic design, including how the sector keys are
derived from the user-supplied passphrase, refer to
&man.gbde.4;.Compatibility Issues&man.sysinstall.8; is incompatible with
gbde-encrypted devices. All
*.bde
devices must be detached from the kernel before starting
&man.sysinstall.8; or it will crash during its initial
probing for devices. To detach the encrypted device used in
the example, use the following command:&prompt.root; gbde detach /dev/ad4s1cDanielGerzoContributed by Disk Encryption with geliAn alternative cryptographic GEOM class is available
through &man.geli.8;. geli differs from
gbde; offers different features, and uses
a different scheme for doing cryptographic work.&man.geli.8; provides the following features:Utilizes the &man.crypto.9; framework and, when
cryptographic hardware is available,
geli uses it automatically.Supports multiple cryptographic algorithms such as
AES, Blowfish, and 3DES.Allows the root partition to be encrypted. The
passphrase used to access the encrypted root partition
will be requested during system boot.Allows the use of two independent keys such as a
key and a
company key.geli is fast as it performs simple
sector-to-sector encryption.Allows backup and restore of master keys. If a user
destroys their keys, it is still possible to get access
to the data by restoring keys from the backup.Allows a disk to attach with a random, one-time key
which is useful for swap partitions and temporary file
systems.More geli features can be found in
&man.geli.8;.This section describes how to enable support for
geli in the &os; kernel and explains how
to create and use a geli encryption
provider.Superuser privileges are required since modifications
to the kernel are necessary.Adding geli Support to the
KernelFor a custom kernel, ensure the kernel configuration
file contains these lines:options GEOM_ELI
device cryptoAlternatively, the geli module can
be loaded at boot time by adding the following line to
/boot/loader.conf:geom_eli_load="YES"&man.geli.8; should now be supported by the
kernel.Generating the Master KeyThe following example describes how to generate a
key file which will be used as part of the master key for
the encrypted provider mounted under
/private. The key
file will provide some random data used to encrypt the
master key. The master key will also be protected by a
passphrase. The provider's sector size will be 4kB.
The example will describe how to attach to the
geli provider, create a file system on
it, mount it, work with it, and finally, how to detach
it.It is recommended to use a bigger sector size, such as
4kB, for better performance.The master key will be protected with a passphrase and
the data source for the key file will be
/dev/random. The sector size of
the provider /dev/da2.eli will be
4kB.&prompt.root; dd if=/dev/random of=/root/da2.key bs=64 count=1
&prompt.root; geli init -s 4096 -K /root/da2.key /dev/da2
Enter new passphrase:
Reenter new passphrase:It is not mandatory to use both a passphrase and a key
file as either method of securing the master key can be
used in isolation.If the key file is given as -, standard
input will be used. This example shows how more than one
key file can be used:&prompt.root; cat keyfile1 keyfile2 keyfile3 | geli init -K - /dev/da2Attaching the Provider with the Generated Key&prompt.root; geli attach -k /root/da2.key /dev/da2
Enter passphrase:The new plaintext device will be named
/dev/da2.eli.&prompt.root; ls /dev/da2*
/dev/da2 /dev/da2.eliCreating the New File System&prompt.root; dd if=/dev/random of=/dev/da2.eli bs=1m
&prompt.root; newfs /dev/da2.eli
&prompt.root; mount /dev/da2.eli /privateThe encrypted file system should now be visible to
&man.df.1; and be available for use:&prompt.root; df -H
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 248M 89M 139M 38% /
/devfs 1.0K 1.0K 0B 100% /dev
/dev/ad0s1f 7.7G 2.3G 4.9G 32% /usr
/dev/ad0s1d 989M 1.5M 909M 0% /tmp
/dev/ad0s1e 3.9G 1.3G 2.3G 35% /var
/dev/da2.eli 150G 4.1K 138G 0% /privateUnmounting and Detaching the ProviderOnce the work on the encrypted partition is done, and
the /private
partition is no longer needed, it is prudent to consider
unmounting and detaching the geli
encrypted partition from the kernel:&prompt.root; umount /private
&prompt.root; geli detach da2.eliMore information about the use of &man.geli.8; can be
found in its manual page.Using the gelirc.d Scriptgeli comes with a
rc.d script which can be used to
simplify the usage of geli. An example
of configuring geli through
&man.rc.conf.5; follows:geli_devices="da2"
geli_da2_flags="-p -k /root/da2.key"This configures /dev/da2 as a
geli provider of which the master key
file is located in /root/da2.key.
geli will not use a passphrase when
attaching to the provider if
was given during the
geli init phase. The system will detach
the geli provider from the kernel before
the system shuts down.More information about configuring
rc.d is provided in the
rc.d section of the
Handbook.ChristianBrüfferWritten by Encrypting Swap SpaceswapencryptingLike the encryption of disk partitions, encryption of swap
space is used to protect sensitive information. Consider an
application that deals with passwords. As long as these
passwords stay in physical memory, these passwords will not
be written to disk and be cleared after a reboot. If &os;
starts swapping out memory pages to free
space for other applications, the passwords may be written to
the disk platters unencrypted. Encrypting swap space can be a
solution for this scenario.The &man.gbde.8; or &man.geli.8; encryption systems may be
used for swap encryption. Both systems use the
encswap
rc.d script.For the remainder of this section,
ad0s1b will be the swap
partition.Swap partitions are not encrypted by default and should
be cleared of any sensitive data before continuing. To
overwrite the current swap parition with random garbage,
execute the following command:&prompt.root; dd if=/dev/random of=/dev/ad0s1b bs=1mSwap Encryption with &man.gbde.8;The .bde suffix should be added to the
device in the respective /etc/fstab swap
line:# Device Mountpoint FStype Options Dump Pass#
/dev/ad0s1b.bde none swap sw 0 0Swap Encryption with &man.geli.8;The procedure for instead using &man.geli.8; for swap
encryption is similar to that of using &man.gbde.8;. The
.eli suffix should be added to the device
in the respective /etc/fstab swap
line:# Device Mountpoint FStype Options Dump Pass#
/dev/ad0s1b.eli none swap sw 0 0&man.geli.8; uses the AES algorithm
with a key length of 128 bit by default. These defaults can
be altered by using geli_swap_flags in
/etc/rc.conf. The following line tells
the encswap rc.d script to create
&man.geli.8; swap partitions using the Blowfish algorithm with
a key length of 128 bits and a sectorsize of 4 kilobytes, and
sets detach on last close:geli_swap_flags="-e blowfish -l 128 -s 4096 -d"Refer to the description of
onetime in &man.geli.8; for a list of
possible options.Encrypted Swap VerificationOnce the system has rebooted, proper operation of the
encrypted swap can be verified using
swapinfo.If &man.gbde.8; is being used:&prompt.user; swapinfo
Device 1K-blocks Used Avail Capacity
/dev/ad0s1b.bde 542720 0 542720 0%If &man.geli.8; is being used:&prompt.user; swapinfo
Device 1K-blocks Used Avail Capacity
/dev/ad0s1b.eli 542720 0 542720 0%DanielGerzoContributed by FreddieCashWith inputs from Pawel JakubDawidekMichael W.LucasViktorPeterssonHighly Available Storage (HAST)HASThigh availabilitySynopsisHigh availability is one of the main requirements in
serious business applications and highly-available storage is
a key component in such environments. Highly Available
STorage, or HASTHighly
Available STorage, was developed by
- &a.pjd; as a framework which allows transparent storage of the
+ &a.pjd.email; as a framework which allows transparent storage of the
same data across several physically separated machines
connected by a TCP/IP network. HAST can be
understood as a network-based RAID1 (mirror), and is similar
to the DRBD® storage system known from the GNU/&linux;
platform. In combination with other high-availability
features of &os; like CARP,
HAST makes it possible to build a
highly-available storage cluster that is resistant to hardware
failures.After reading this section, you will know:What HAST is, how it works and
which features it provides.How to set up and use HAST on
&os;.How to integrate CARP and
&man.devd.8; to build a robust storage system.Before reading this section, you should:Understand &unix; and &os; basics.Know how to configure network
interfaces and other core &os; subsystems.Have a good understanding of &os;
networking.The HAST project was sponsored by The
&os; Foundation with support from OMCnet Internet Service
GmbH and TransIP
BV.HAST FeaturesThe main features of the HAST system
are:Can be used to mask I/O errors on local hard
drives.File system agnostic as it works with any file
system supported by &os;.Efficient and quick resynchronization, synchronizing
only blocks that were modified during the downtime of a
node.Can be used in an already deployed environment to add
additional redundancy.Together with CARP,
Heartbeat, or other tools, it
can be used to build a robust and durable storage
system.HAST OperationAs HAST provides a synchronous
block-level replication of any storage media to several
machines, it requires at least two physical machines:
the primary, also known as the
master node, and the
secondary or slave
node. These two machines together are referred to as a
cluster.HAST is currently limited to two cluster nodes in
total.Since HAST works in a
primary-secondary configuration, it allows only one of the
cluster nodes to be active at any given time. The
primary node, also called
active, is the one which will handle all
the I/O requests to HAST-managed
devices. The secondary node is
automatically synchronized from the primary
node.The physical components of the HAST
system are:local disk on primary node, anddisk on remote, secondary node.HAST operates synchronously on a block
level, making it transparent to file systems and applications.
HAST provides regular GEOM providers in
/dev/hast/ for use by
other tools or applications, thus there is no difference
between using HAST-provided devices and
raw disks or partitions.Each write, delete, or flush operation is sent to the
local disk and to the remote disk over TCP/IP. Each read
operation is served from the local disk, unless the local disk
is not up-to-date or an I/O error occurs. In such case, the
read operation is sent to the secondary node.Synchronization and Replication ModesHAST tries to provide fast failure
recovery. For this reason, it is very important to reduce
synchronization time after a node's outage. To provide fast
synchronization, HAST manages an on-disk
bitmap of dirty extents and only synchronizes those during a
regular synchronization, with an exception of the initial
sync.There are many ways to handle synchronization.
HAST implements several replication modes
to handle different synchronization methods:memsync: report write operation
as completed when the local write operation is finished
and when the remote node acknowledges data arrival, but
before actually storing the data. The data on the
remote node will be stored directly after sending the
acknowledgement. This mode is intended to reduce
latency, but still provides very good reliability.fullsync: report write
operation as completed when local write completes and
when remote write completes. This is the safest and the
slowest replication mode. This mode is the
default.async: report write operation
as completed when local write completes. This is the
fastest and the most dangerous replication mode. It
should be used when replicating to a distant node where
latency is too high for other modes.HAST ConfigurationHAST requires
GEOM_GATE support which is not present in
the default GENERIC kernel. However, the
geom_gate.ko loadable module is available
in the default &os; installation. Alternatively, to build
GEOM_GATE support into the kernel
statically, add this line to the custom kernel configuration
file:options GEOM_GATEThe HAST framework consists of several
parts from the operating system's point of view:the &man.hastd.8; daemon responsible for data
synchronization,the &man.hastctl.8; userland management
utility,and the &man.hast.conf.5; configuration file.The following example describes how to configure two nodes
in master-slave /
primary-secondary
operation using HAST to replicate the data
between the two. The nodes will be called
hasta with an IP
address of 172.16.0.1 and
hastb with an IP
of address 172.16.0.2. Both nodes
will have a dedicated hard drive
/dev/ad6
of the same size for HAST operation. The
HAST pool, sometimes also referred to as a
resource or the GEOM provider in /dev/hast/, will be
called
test.Configuration of HAST is done using
/etc/hast.conf. This file should be the
same on both nodes. The simplest configuration possible
is:resource test {
on hasta {
local /dev/ad6
remote 172.16.0.2
}
on hastb {
local /dev/ad6
remote 172.16.0.1
}
}For more advanced configuration, refer to
&man.hast.conf.5;.It is also possible to use host names in the
remote statements. In such a case, make
sure that these hosts are resolvable and are defined in
/etc/hosts or in the local
DNS.Now that the configuration exists on both nodes,
the HAST pool can be created. Run these
commands on both nodes to place the initial metadata onto the
local disk and to start &man.hastd.8;:&prompt.root; hastctl create test
&prompt.root; service hastd onestartIt is not possible to use GEOM
providers with an existing file system or to convert an
existing storage to a HAST-managed pool.
This procedure needs to store some metadata on the provider
and there will not be enough required space
available on an existing provider.A HAST node's primary or
secondary role is selected by an
administrator, or software like
Heartbeat, using &man.hastctl.8;.
On the primary node,
hasta, issue
this command:&prompt.root; hastctl role primary testSimilarly, run this command on the secondary node,
hastb:&prompt.root; hastctl role secondary testWhen the nodes are unable to communicate with each
other, and both are configured as primary nodes, the
condition is called split-brain. To
troubleshoot this situation, follow the steps described in
.Verify the result by running &man.hastctl.8; on each
node:&prompt.root; hastctl status testThe important text is the status line,
which should say complete
on each of the nodes. If it says degraded,
something went wrong. At this point, the synchronization
between the nodes has already started. The synchronization
completes when hastctl status
reports 0 bytes of dirty extents.The next step is to create a filesystem on the
/dev/hast/test
GEOM provider and mount it. This must be done on the
primary node, as
/dev/hast/test
appears only on the primary node. Creating
the filesystem can take a few minutes, depending on the size
of the hard drive:&prompt.root; newfs -U /dev/hast/test
&prompt.root; mkdir /hast/test
&prompt.root; mount /dev/hast/test /hast/testOnce the HAST framework is configured
properly, the final step is to make sure that
HAST is started automatically during
system boot. Add this line to
/etc/rc.conf:hastd_enable="YES"Failover ConfigurationThe goal of this example is to build a robust storage
system which is resistant to the failure of any given node.
The scenario is that a primary node of
the cluster fails. If this happens, the
secondary node is there to take over
seamlessly, check and mount the file system, and continue to
work without missing a single bit of data.To accomplish this task, another &os; feature,
CARP, provides for automatic failover on
the IP layer. CARP (Common
Address Redundancy Protocol) allows multiple hosts on the
same network segment to share an IP address. Set up
CARP on both nodes of the cluster
according to the documentation available in
. After setup, each node will
have its own carp0 interface with a
shared IP address of
172.16.0.254. The primary
HAST node of the cluster must be the
master CARP node.The HAST pool created in the previous
section is now ready to be exported to the other hosts on
the network. This can be accomplished by exporting it
through NFS or
Samba, using the shared IP
address 172.16.0.254. The only
problem which remains unresolved is an automatic failover
should the primary node fail.In the event of CARP interfaces going
up or down, the &os; operating system generates a
&man.devd.8; event, making it possible to watch for state
changes on the CARP interfaces. A state
change on the CARP interface is an
indication that one of the nodes failed or came back online.
These state change events make it possible to run a script
which will automatically handle the HAST failover.To be able to catch state changes on the
CARP interfaces, add this
configuration to
/etc/devd.conf on each node:notify 30 {
match "system" "IFNET";
match "subsystem" "carp0";
match "type" "LINK_UP";
action "/usr/local/sbin/carp-hast-switch master";
};
notify 30 {
match "system" "IFNET";
match "subsystem" "carp0";
match "type" "LINK_DOWN";
action "/usr/local/sbin/carp-hast-switch slave";
};Restart &man.devd.8; on both nodes to put the new
configuration into effect:&prompt.root; service devd restartWhen the carp0 interface state
changes by going up or down , the system generates a
notification, allowing the &man.devd.8; subsystem to run an
arbitrary script, in this case
/usr/local/sbin/carp-hast-switch. This
script handles the automatic failover. For further
clarification about the above &man.devd.8; configuration,
refer to &man.devd.conf.5;.An example of such a script could be:#!/bin/sh
# Original script by Freddie Cash <fjwcash@gmail.com>
# Modified by Michael W. Lucas <mwlucas@BlackHelicopters.org>
# and Viktor Petersson <vpetersson@wireload.net>
# The names of the HAST resources, as listed in /etc/hast.conf
resources="test"
# delay in mounting HAST resource after becoming master
# make your best guess
delay=3
# logging
log="local0.debug"
name="carp-hast"
# end of user configurable stuff
case "$1" in
master)
logger -p $log -t $name "Switching to primary provider for ${resources}."
sleep ${delay}
# Wait for any "hastd secondary" processes to stop
for disk in ${resources}; do
while $( pgrep -lf "hastd: ${disk} \(secondary\)" > /dev/null 2>&1 ); do
sleep 1
done
# Switch role for each disk
hastctl role primary ${disk}
if [ $? -ne 0 ]; then
logger -p $log -t $name "Unable to change role to primary for resource ${disk}."
exit 1
fi
done
# Wait for the /dev/hast/* devices to appear
for disk in ${resources}; do
for I in $( jot 60 ); do
[ -c "/dev/hast/${disk}" ] && break
sleep 0.5
done
if [ ! -c "/dev/hast/${disk}" ]; then
logger -p $log -t $name "GEOM provider /dev/hast/${disk} did not appear."
exit 1
fi
done
logger -p $log -t $name "Role for HAST resources ${resources} switched to primary."
logger -p $log -t $name "Mounting disks."
for disk in ${resources}; do
mkdir -p /hast/${disk}
fsck -p -y -t ufs /dev/hast/${disk}
mount /dev/hast/${disk} /hast/${disk}
done
;;
slave)
logger -p $log -t $name "Switching to secondary provider for ${resources}."
# Switch roles for the HAST resources
for disk in ${resources}; do
if ! mount | grep -q "^/dev/hast/${disk} on "
then
else
umount -f /hast/${disk}
fi
sleep $delay
hastctl role secondary ${disk} 2>&1
if [ $? -ne 0 ]; then
logger -p $log -t $name "Unable to switch role to secondary for resource ${disk}."
exit 1
fi
logger -p $log -t $name "Role switched to secondary for resource ${disk}."
done
;;
esacIn a nutshell, the script takes these actions when a
node becomes master /
primary:Promotes the HAST pools to
primary on a given node.Checks the file system under the
HAST pool.Mounts the pools at an appropriate place.When a node becomes backup /
secondary:Unmounts the HAST pools.Degrades the HAST pools to
secondary.Keep in mind that this is just an example script which
serves as a proof of concept. It does not handle all the
possible scenarios and can be extended or altered in any
way, for example, to start/stop required services.For this example, a standard UFS file system was used.
To reduce the time needed for recovery, a journal-enabled
UFS or ZFS file system can be used instead.More detailed information with additional examples can
be found in the
HAST Wiki
page.TroubleshootingGeneral Troubleshooting TipsHAST should generally work without
issues. However, as with any other software product, there
may be times when it does not work as supposed. The sources
of the problems may be different, but the rule of thumb is
to ensure that the time is synchronized between all nodes of
the cluster.When troubleshooting HAST problems,
the debugging level of &man.hastd.8; should be increased by
starting &man.hastd.8; with -d. This
argument may be specified multiple times to further increase
the debugging level. A lot of useful information may be
obtained this way. Consider also using
-F, which starts &man.hastd.8; in the
foreground.Recovering from the Split-brain ConditionSplit-brain is when the nodes of the
cluster are unable to communicate with each other, and both
are configured as primary. This is a dangerous condition
because it allows both nodes to make incompatible changes to
the data. This problem must be corrected manually by the
system administrator.The administrator must decide which node has more
important changes (or merge them manually) and let
HAST perform full synchronization of the
node which has the broken data. To do this, issue these
commands on the node which needs to be
resynchronized:&prompt.root; hastctl role init <resource>
&prompt.root; hastctl create <resource>
&prompt.root; hastctl role secondary <resource>
diff --git a/en_US.ISO8859-1/books/handbook/filesystems/chapter.xml b/en_US.ISO8859-1/books/handbook/filesystems/chapter.xml
index 8797a46e57..f47cdeee09 100644
--- a/en_US.ISO8859-1/books/handbook/filesystems/chapter.xml
+++ b/en_US.ISO8859-1/books/handbook/filesystems/chapter.xml
@@ -1,874 +1,874 @@
TomRhodesWritten by File Systems SupportSynopsisFile SystemsFile Systems SupportFile SystemsFile systems are an integral part of any operating system.
They allow users to upload and store files, provide access
to data, and make hard drives useful. Different operating
systems differ in their native file system. Traditionally, the
native &os; file system has been the Unix File System
UFS which has been modernized as
UFS2. Since &os; 7.0, the Z File
System ZFS is also available as a native file
system.In addition to its native file systems, &os; supports a
multitude of other file systems so that data from other
operating systems can be accessed locally, such as data stored
on locally attached USB storage devices,
flash drives, and hard disks. This includes support for the
&linux; Extended File System (EXT) and the
µsoft; New Technology File System
(NTFS).There are different levels of &os; support for the various
file systems. Some require a kernel module to be loaded and
others may require a toolset to be installed. Some non-native
file system support is full read-write while others are
read-only.After reading this chapter, you will know:The difference between native and supported file
systems.Which file systems are supported by &os;.How to enable, configure, access, and make use of
non-native file systems.Before reading this chapter, you should:Understand &unix; and &os; basics.Be familiar with the basics of kernel configuration and
compilation.Feel comfortable installing
software in &os;.Have some familiarity with disks, storage, and device names in
&os;.The Z File System (ZFS)The Z file system, originally developed by &sun;,
is designed to use a pooled storage method in that space is only
used as it is needed for data storage. It is also designed for
maximum data integrity, supporting data snapshots, multiple
copies, and data checksums. It uses a software data replication
model, known as RAID-Z.
RAID-Z provides redundancy similar to
hardware RAID, but is designed to prevent
data write corruption and to overcome some of the limitations
of hardware RAID.ZFS TuningSome of the features provided by ZFS
are RAM-intensive, so some tuning may be required to provide
maximum efficiency on systems with limited RAM.MemoryAt a bare minimum, the total system memory should be at
least one gigabyte. The amount of recommended RAM depends
upon the size of the pool and the ZFS features which are
used. A general rule of thumb is 1GB of RAM for every 1TB
of storage. If the deduplication feature is used, a general
rule of thumb is 5GB of RAM per TB of storage to be
deduplicated. While some users successfully use ZFS with
less RAM, it is possible that when the system is under heavy
load, it may panic due to memory exhaustion. Further tuning
may be required for systems with less than the recommended
RAM requirements.Kernel ConfigurationDue to the RAM limitations of the &i386; platform, users
using ZFS on the &i386; architecture should add the
following option to a custom kernel configuration file,
rebuild the kernel, and reboot:options KVA_PAGES=512This option expands the kernel address space, allowing
the vm.kvm_size tunable to be pushed
beyond the currently imposed limit of 1 GB, or the
limit of 2 GB for PAE. To find the
most suitable value for this option, divide the desired
address space in megabytes by four (4). In this example, it
is 512 for 2 GB.Loader TunablesThe kmem address space can
be increased on all &os; architectures. On a test system
with one gigabyte of physical memory, success was achieved
with the following options added to
/boot/loader.conf, and the system
restarted:vm.kmem_size="330M"
vm.kmem_size_max="330M"
vfs.zfs.arc_max="40M"
vfs.zfs.vdev.cache.size="5M"For a more detailed list of recommendations for
ZFS-related tuning, see .Using ZFSThere is a start up mechanism that allows &os; to
mount ZFS pools during system
initialization. To set it, issue the following
commands:&prompt.root; echo 'zfs_enable="YES"' >> /etc/rc.conf
&prompt.root; service zfs startThe examples in this section assume three
SCSI disks with the device names
da0,
da1,
and da2.
Users of IDE hardware should instead use
ad
device names.Single Disk PoolTo create a simple, non-redundant ZFS
pool using a single disk device, use
zpool:&prompt.root; zpool create example /dev/da0To view the new pool, review the output of
df:&prompt.root; df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235230 1628718 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032846 48737598 2% /usr
example 17547136 0 17547136 0% /exampleThis output shows that the example
pool has been created and mounted. It
is now accessible as a file system. Files may be created
on it and users can browse it, as seen in the following
example:&prompt.root; cd /example
&prompt.root; ls
&prompt.root; touch testfile
&prompt.root; ls -al
total 4
drwxr-xr-x 2 root wheel 3 Aug 29 23:15 .
drwxr-xr-x 21 root wheel 512 Aug 29 23:12 ..
-rw-r--r-- 1 root wheel 0 Aug 29 23:15 testfileHowever, this pool is not taking advantage of any
ZFS features. To create a dataset on
this pool with compression enabled:&prompt.root; zfs create example/compressed
&prompt.root; zfs set compression=gzip example/compressedThe example/compressed dataset is now
a ZFS compressed file system. Try
copying some large files to /example/compressed.Compression can be disabled with:&prompt.root; zfs set compression=off example/compressedTo unmount a file system, issue the following command
and then verify by using df:&prompt.root; zfs umount example/compressed
&prompt.root; df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235232 1628716 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032864 48737580 2% /usr
example 17547008 0 17547008 0% /exampleTo re-mount the file system to make it accessible
again, and verify with df:&prompt.root; zfs mount example/compressed
&prompt.root; df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235234 1628714 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032864 48737580 2% /usr
example 17547008 0 17547008 0% /example
example/compressed 17547008 0 17547008 0% /example/compressedThe pool and file system may also be observed by viewing
the output from mount:&prompt.root; mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1d on /usr (ufs, local, soft-updates)
example on /example (zfs, local)
example/data on /example/data (zfs, local)
example/compressed on /example/compressed (zfs, local)ZFS datasets, after creation, may be
used like any file systems. However, many other features
are available which can be set on a per-dataset basis. In
the following example, a new file system,
data is created. Important files will be
stored here, the file system is set to keep two copies of
each data block:&prompt.root; zfs create example/data
&prompt.root; zfs set copies=2 example/dataIt is now possible to see the data and space utilization
by issuing df:&prompt.root; df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235234 1628714 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032864 48737580 2% /usr
example 17547008 0 17547008 0% /example
example/compressed 17547008 0 17547008 0% /example/compressed
example/data 17547008 0 17547008 0% /example/dataNotice that each file system on the pool has the same
amount of available space. This is the reason for using
df in these examples, to show that the
file systems use only the amount of space they need and all
draw from the same pool. The ZFS file
system does away with concepts such as volumes and
partitions, and allows for several file systems to occupy
the same pool.To destroy the file systems and then destroy the pool as
they are no longer needed:&prompt.root; zfs destroy example/compressed
&prompt.root; zfs destroy example/data
&prompt.root; zpool destroy exampleZFS RAID-ZThere is no way to prevent a disk from failing. One
method of avoiding data loss due to a failed hard disk is to
implement RAID. ZFS
supports this feature in its pool design.To create a RAID-Z pool, issue the
following command and specify the disks to add to the
pool:&prompt.root; zpool create storage raidz da0 da1 da2&sun; recommends that the amount of devices used in
a RAID-Z configuration is between
three and nine. For environments requiring a single pool
consisting of 10 disks or more, consider breaking it up
into smaller RAID-Z groups. If only
two disks are available and redundancy is a requirement,
consider using a ZFS mirror. Refer to
&man.zpool.8; for more details.This command creates the storage
zpool. This may be verified using &man.mount.8; and
&man.df.1;. This command makes a new file system in the
pool called home:&prompt.root; zfs create storage/homeIt is now possible to enable compression and keep extra
copies of directories and files using the following
commands:&prompt.root; zfs set copies=2 storage/home
&prompt.root; zfs set compression=gzip storage/homeTo make this the new home directory for users, copy the
user data to this directory, and create the appropriate
symbolic links:&prompt.root; cp -rp /home/* /storage/home
&prompt.root; rm -rf /home /usr/home
&prompt.root; ln -s /storage/home /home
&prompt.root; ln -s /storage/home /usr/homeUsers should now have their data stored on the freshly
created /storage/home. Test by
adding a new user and logging in as that user.Try creating a snapshot which may be rolled back
later:&prompt.root; zfs snapshot storage/home@08-30-08Note that the snapshot option will only capture a real
file system, not a home directory or a file. The
@ character is a delimiter used between
the file system name or the volume name. When a user's
home directory gets trashed, restore it with:&prompt.root; zfs rollback storage/home@08-30-08To get a list of all available snapshots, run
ls in the file system's
.zfs/snapshot
directory. For example, to see the previously taken
snapshot:&prompt.root; ls /storage/home/.zfs/snapshotIt is possible to write a script to perform regular
snapshots on user data. However, over time, snapshots
may consume a great deal of disk space. The previous
snapshot may be removed using the following command:&prompt.root; zfs destroy storage/home@08-30-08After testing, /storage/home can be made the
real /home using
this command:&prompt.root; zfs set mountpoint=/home storage/homeRun df and
mount to confirm that the system now
treats the file system as the real
/home:&prompt.root; mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1d on /usr (ufs, local, soft-updates)
storage on /storage (zfs, local)
storage/home on /home (zfs, local)
&prompt.root; df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235240 1628708 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032826 48737618 2% /usr
storage 26320512 0 26320512 0% /storage
storage/home 26320512 0 26320512 0% /homeThis completes the RAID-Z
configuration. To get status updates about the file systems
created during the nightly &man.periodic.8; runs, issue the
following command:&prompt.root; echo 'daily_status_zfs_enable="YES"' >> /etc/periodic.confRecovering RAID-ZEvery software RAID has a method of
monitoring its state. The status of
RAID-Z devices may be viewed with the
following command:&prompt.root; zpool status -xIf all pools are healthy and everything is normal, the
following message will be returned:all pools are healthyIf there is an issue, perhaps a disk has gone offline,
the pool state will look similar to: pool: storage
state: DEGRADED
status: One or more devices has been taken offline by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
storage DEGRADED 0 0 0
raidz1 DEGRADED 0 0 0
da0 ONLINE 0 0 0
da1 OFFLINE 0 0 0
da2 ONLINE 0 0 0
errors: No known data errorsThis indicates that the device was previously taken
offline by the administrator using the following
command:&prompt.root; zpool offline storage da1It is now possible to replace
da1 after the system has been
powered down. When the system is back online, the following
command may issued to replace the disk:&prompt.root; zpool replace storage da1From here, the status may be checked again, this time
without the flag to get state
information:&prompt.root; zpool status storage
pool: storage
state: ONLINE
scrub: resilver completed with 0 errors on Sat Aug 30 19:44:11 2008
config:
NAME STATE READ WRITE CKSUM
storage ONLINE 0 0 0
raidz1 ONLINE 0 0 0
da0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
errors: No known data errorsAs shown from this example, everything appears to be
normal.Data VerificationZFS uses checksums to verify the
integrity of stored data. These are enabled automatically
upon creation of file systems and may be disabled using the
following command:&prompt.root; zfs set checksum=off storage/homeDoing so is not recommended as
checksums take very little storage space and are used to
check data integrity using checksum verification in a
process is known as scrubbing. To verify the
data integrity of the storage pool, issue
this command:&prompt.root; zpool scrub storageThis process may take considerable time depending on
the amount of data stored. It is also very
I/O intensive, so much so that only one
scrub may be run at any given time. After the scrub has
completed, the status is updated and may be viewed by
issuing a status request:&prompt.root; zpool status storage
pool: storage
state: ONLINE
scrub: scrub completed with 0 errors on Sat Jan 26 19:57:37 2013
config:
NAME STATE READ WRITE CKSUM
storage ONLINE 0 0 0
raidz1 ONLINE 0 0 0
da0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
errors: No known data errorsThe completion time is displayed and helps to ensure
data integrity over a long period of time.Refer to &man.zfs.8; and &man.zpool.8; for other
ZFS options.ZFS QuotasZFS supports different types of quotas: the refquota,
the general quota, the user quota, and the group quota.
This section explains the basics of each type and includes
some usage instructions.Quotas limit the amount of space that a dataset and its
descendants can consume, and enforce a limit on the amount
of space used by filesystems and snapshots for the
descendants. Quotas are useful to limit the amount of space
a particular user can use.Quotas cannot be set on volumes, as the
volsize property acts as an implicit
quota.The
refquota=size
limits the amount of space a dataset can consume by
enforcing a hard limit on the space used. However, this
hard limit does not include space used by descendants, such
as file systems or snapshots.To enforce a general quota of 10 GB for
storage/home/bob, use the
following:&prompt.root; zfs set quota=10G storage/home/bobUser quotas limit the amount of space that can be used
by the specified user. The general format is
userquota@user=size,
and the user's name must be in one of the following
formats:POSIX compatible name such as
joe.POSIX
numeric ID such as
789.SID name
such as
joe.bloggs@example.com.SID
numeric ID such as
S-1-123-456-789.For example, to enforce a quota of 50 GB for a user
named joe, use the
following:&prompt.root; zfs set userquota@joe=50GTo remove the quota or make sure that one is not set,
instead use:&prompt.root; zfs set userquota@joe=noneUser quota properties are not displayed by
zfs get all.
Non-root users can only see their own
quotas unless they have been granted the
userquota privilege. Users with this
privilege are able to view and set everyone's quota.The group quota limits the amount of space that a
specified group can consume. The general format is
groupquota@group=size.To set the quota for the group
firstgroup to 50 GB,
use:&prompt.root; zfs set groupquota@firstgroup=50GTo remove the quota for the group
firstgroup, or to make sure that
one is not set, instead use:&prompt.root; zfs set groupquota@firstgroup=noneAs with the user quota property,
non-root users can only see the quotas
associated with the groups that they belong to. However,
root or a user with the
groupquota privilege can view and set all
quotas for all groups.To display the amount of space consumed by each user on
the specified filesystem or snapshot, along with any
specified quotas, use zfs userspace.
For group information, use zfs
groupspace. For more information about
supported options or how to display only specific options,
refer to &man.zfs.1;.Users with sufficient privileges and
root can list the quota for
storage/home/bob using:&prompt.root; zfs get quota storage/home/bobZFS ReservationsZFS supports two types of space reservations. This
section explains the basics of each and includes some usage
instructions.The reservation property makes it
possible to reserve a minimum amount of space guaranteed
for a dataset and its descendants. This means that if a
10 GB reservation is set on
storage/home/bob, if disk
space gets low, at least 10 GB of space is reserved
for this dataset. The refreservation
property sets or indicates the minimum amount of space
guaranteed to a dataset excluding descendants, such as
snapshots. As an example, if a snapshot was taken of
storage/home/bob, enough disk space
would have to exist outside of the
refreservation amount for the operation
to succeed because descendants of the main data set are
not counted by the refreservation
amount and so do not encroach on the space set.Reservations of any sort are useful in many situations,
such as planning and testing the suitability of disk space
allocation in a new system, or ensuring that enough space is
available on file systems for system recovery procedures and
files.The general format of the reservation
property is
reservation=size,
so to set a reservation of 10 GB on
storage/home/bob, use:&prompt.root; zfs set reservation=10G storage/home/bobTo make sure that no reservation is set, or to remove a
reservation, use:&prompt.root; zfs set reservation=none storage/home/bobThe same principle can be applied to the
refreservation property for setting a
refreservation, with the general format
refreservation=size.To check if any reservations or refreservations exist on
storage/home/bob, execute one of the
following commands:&prompt.root; zfs get reservation storage/home/bob
&prompt.root; zfs get refreservation storage/home/bob&linux; FilesystemsThis section describes some of the &linux; filesystems
supported by &os;.ext2The &man.ext2fs.5; file system kernel implementation has
been available since &os; 2.2. In &os; 8.x and
earlier, the code is licensed under the
GPL. Since &os; 9.0, the code has
been rewritten and is now BSD
licensed.The &man.ext2fs.5; driver allows the &os; kernel to both
read and write to ext2 file systems.To access an ext2 file system, first
load the kernel loadable module:&prompt.root; kldload ext2fsThen, to mount an &man.ext2fs.5; volume located on
/dev/ad1s1:&prompt.root; mount -t ext2fs /dev/ad1s1 /mntXFSXFS was originally written by
SGI for the IRIX
operating system and was then ported to &linux; and
released under the GPL. See
this page
for more details. The &os; port was started by Russel
- Cattelan, &a.kan;, and &a.rodrigc;.
+ Cattelan, &a.kan.email;, and &a.rodrigc.email;.
To load XFS as a kernel-loadable
module:&prompt.root; kldload xfsThe &man.xfs.5; driver lets the &os; kernel access XFS
filesystems. However, only read-only access is supported and
writing to a volume is not possible.To mount a &man.xfs.5; volume located on
/dev/ad1s1:&prompt.root; mount -t xfs /dev/ad1s1 /mntThe sysutils/xfsprogs
port includes the mkfs.xfs which enables
the creation of XFS filesystems, plus
utilities for analyzing and repairing them.The -p flag to
mkfs.xfs can be used to create an
&man.xfs.5; filesystem which is populated with files and other
metadata. This can be used to quickly create a read-only
filesystem which can be tested on &os;.ReiserFSThe Reiser file system, ReiserFS, was ported to
- &os; by &a.dumbbell;, and has been released under the
+ &os; by &a.dumbbell.email;, and has been released under the
GPL .The ReiserFS driver permits the &os; kernel to access
ReiserFS file systems and read their contents, but not
write to them.First, the kernel-loadable module needs to be
loaded:&prompt.root; kldload reiserfsThen, to mount a ReiserFS volume located on
/dev/ad1s1:&prompt.root; mount -t reiserfs /dev/ad1s1 /mnt
diff --git a/en_US.ISO8859-1/books/handbook/jails/chapter.xml b/en_US.ISO8859-1/books/handbook/jails/chapter.xml
index 9f928a9264..06e09b74c9 100644
--- a/en_US.ISO8859-1/books/handbook/jails/chapter.xml
+++ b/en_US.ISO8859-1/books/handbook/jails/chapter.xml
@@ -1,1038 +1,1038 @@
MatteoRiondatoContributed by JailsjailsSynopsisThis chapter will provide an explanation of what &os; 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.Jails are a powerful tool, but they are not a security
panacea. It is particularly important to note that while it
is not possible for a jailed process to break out on its own,
there are several ways in which an unprivileged user outside
the jail can cooperate with a privileged user inside the jail
and thereby obtain elevated privileges in the host
environment.Most of these attacks can be mitigated by ensuring that
the jail root is not accessible to unprivileged users in the
host environment. Regardless, as a general rule, untrusted
users with privileged access to a jail should not be given
access to the host environment.After reading this chapter, you will know:What a jail is, and what purpose it may serve in &os;
installations.How to build, start, and stop a jail.The basics of jail administration, both from inside
and outside the jail.Other sources of useful information about jails are:The &man.jail.8; manual page. This is the full
reference of the jail utility — the
administrative tool which can be used in &os; to start,
stop, and control &os; jails.The mailing lists and their archives. The archives of
the &a.questions; and other mailing lists hosted by the
&a.mailman.lists; already contain a wealth of material for
jails. It should always be engaging to search the archives,
or post a new question to the &a.questions.name; mailing
list.Terms Related to JailsTo facilitate better understanding of parts of the &os;
system related to jails, their internals and the way they
interact with the rest of &os;, the following terms are used
further in this chapter:&man.chroot.8; (command)Utility, which uses &man.chroot.2; &os; system call to
change the root directory of a process and all its
descendants.&man.chroot.2; (environment)The environment of processes running in a
chroot. This includes resources such as
the part of the file system which is visible, user and
group IDs which are available, network interfaces and
other IPC mechanisms, etc.&man.jail.8; (command)The system administration utility which allows
launching of processes within a jail environment.host (system, process, user, etc.)The controlling system of a jail environment. The
host system has access to all the hardware resources
available, and can control processes both outside of and
inside a jail environment. One of the important
differences of the host system from a jail is that the
limitations which apply to superuser processes inside a
jail are not enforced for processes of the host
system.hosted (system, process, user, etc.)A process, user or other entity, whose access to
resources is restricted by a &os; jail.IntroductionSince system administration is a difficult and perplexing
task, many powerful tools were developed to make life easier for
the administrator. These tools mostly provide enhancements of
some sort to the way systems are installed, configured and
maintained. Part of the tasks which an administrator is
expected to do is to properly configure the security of a
system, so that it can continue serving its real purpose,
without allowing security violations.One of the tools which can be used to enhance the security
of a &os; system are jails. Jails were
- introduced in &os; 4.X by &a.phk;, but were greatly
+ introduced in &os; 4.X by &a.phk.email;, but were greatly
improved in &os; 5.X to make them a powerful and flexible
subsystem. Their development still goes on, enhancing their
usefulness, performance, reliability, and security.What is a JailBSD-like operating systems have had &man.chroot.2; since
the time of 4.2BSD. The &man.chroot.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 &man.chroot.8; utility is good for easy tasks which do not
require much flexibility or complex, 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 &os; kernel, it
was clear that &man.chroot.2; was not the ideal solution for
securing services. A new subsystem had to be
implemented.This is one of the main reasons why
jails were developed.Jails improve on the concept of the traditional
&man.chroot.2; environment in several ways. In a traditional
&man.chroot.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 &os; 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
.A jail is characterized by four elements:A directory subtree — the starting point from
which a jail is entered. Once inside the jail, a process
is not permitted to escape outside of this subtree.
Traditional security issues which plagued the original
&man.chroot.2; design will not affect &os; jails.A hostname — the hostname which will be used
within the jail. Jails are mainly used for hosting
network services, therefore having a descriptive hostname
for each jail can really help the system
administrator.An IP address — this will be
assigned to the jail and cannot be changed in any way
during the jail's life span. The IP address of a jail is
usually an alias address for an existing network
interface, but this is not strictly necessary.A command — the path name of an executable to
run inside the jail. The path is relative to the
root directory of the jail environment.Apart from these, jails can have their own set of users
and their own root user. Naturally, the
powers of the root user are limited
within the jail environment and, from the point of view of the
host system, the jail root user is not an
omnipotent user. In addition, the root
user of a jail is not allowed to perform critical operations
to the system outside of the associated &man.jail.8;
environment. More information about capabilities and
restrictions of the root user will be
discussed in
below.Creating and Controlling JailsSome administrators divide jails into the following two
types: complete jails, which resemble a real &os;
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 &man.jail.8; manual page is quite
clear about the procedure for building a jail:&prompt.root; setenv D /here/is/the/jail
&prompt.root; mkdir -p $D
&prompt.root; cd /usr/src
&prompt.root; make buildworld
&prompt.root; make installworld DESTDIR=$D
&prompt.root; make distribution DESTDIR=$D
&prompt.root; mount -t devfs devfs $D/devSelecting 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 &os;
base system.If you have already rebuilt your userland using
make world or
make buildworld, you can skip this step
and install your existing userland into the new jail.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.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/.Mounting the &man.devfs.8; file system inside a jail is
not required. On the other hand, any, or almost any
application requires access to at least one device,
depending on the purpose of the given application. It is
very important to control access to devices from inside a
jail, as improper settings could permit an attacker to do
nasty things in the jail. Control over &man.devfs.8; is
managed through rulesets which are described in the
&man.devfs.8; and &man.devfs.conf.5; manual pages.Once a jail is installed, it can be started by using the
&man.jail.8; utility. The &man.jail.8; utility takes four
mandatory arguments which are described in the
. Other arguments may be specified
too, e.g., to run the jailed process with the credentials of a
specific user. The
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 &os; system. For a
service jail, it depends on the service or
application that will run within the jail.Jails are often started at boot time and the &os;
rc mechanism provides an easy way to do
this.A list of the jails which are enabled to start at boot
time should be added to the &man.rc.conf.5; file:jail_enable="YES" # Set to NO to disable starting of any jails
jail_list="www" # Space separated list of names of jailsJail names in jail_list should
contain alphanumeric characters only.For each jail listed in jail_list, a
group of &man.rc.conf.5; settings, which describe the
particular jail, should be added:jail_www_rootdir="/usr/jail/www" # jail's root directory
jail_www_hostname="www.example.org" # jail's hostname
jail_www_ip="192.168.0.10" # jail's IP address
jail_www_devfs_enable="YES" # mount devfs in the jail
jail_www_devfs_ruleset="www_ruleset" # devfs ruleset to apply to jailThe default startup of jails configured in
&man.rc.conf.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.For a full list of available options, please see the
&man.rc.conf.5; manual page.&man.service.8; can be used to
start or stop a jail by hand, if an entry for it exists in
rc.conf:&prompt.root; service jail start www
&prompt.root; service jail stop wwwA clean way to shut down a &man.jail.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 &man.jexec.8; utility
from outside the jail:&prompt.root; sh /etc/rc.shutdownMore information about this can be found in the &man.jail.8;
manual page.Fine Tuning and AdministrationThere are several options which can be set for any jail, and
various ways of combining a host &os; 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.Some of the high-level applications for jail management,
which are available through the &os; Ports Collection, and
can be used to implement overall jail-based
solutions.System Tools for Jail Tuning in &os;Fine tuning of a jail's configuration is mostly done by
setting &man.sysctl.8; variables. A special subtree of sysctl
exists as a basis for organizing all the relevant options: the
security.jail.* hierarchy of &os; 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 &man.jail.8; and &man.sysctl.8; manual
pages.security.jail.set_hostname_allowed:
1security.jail.socket_unixiproute_only:
1security.jail.sysvipc_allowed:
0security.jail.enforce_statfs:
2security.jail.allow_raw_sockets:
0security.jail.chflags_allowed:
0security.jail.jailed: 0These 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 &man.jail.8;. The
root inside a jail may not load or unload
&man.devfs.8; rulesets, set firewall rules, or do many other
administrative tasks which require modifications of in-kernel
data, such as setting the securelevel of
the kernel.The base system of &os; contains a basic set of tools for
viewing information about the active jails, and attaching to a
jail to run administrative commands. The &man.jls.8; and
&man.jexec.8; commands are part of the base &os; system, and
can be used to perform the following simple tasks:Print a list of active jails and their corresponding
jail identifier (JID),
IP address, hostname and path.Attach to a running jail, from its host system, and
run a command inside the jail or perform administrative
tasks inside the jail itself. This is especially useful
when the root user wants to cleanly
shut down a jail. The &man.jexec.8; utility can also be
used to start a shell in a jail to do administration in
it; for example:&prompt.root; jexec 1 tcshHigh-Level Administrative Tools in the &os; Ports
CollectionAmong the many third-party utilities for jail
administration, one of the most complete and useful is
sysutils/jailutils. It is
a set of small applications that contribute to &man.jail.8;
management. Please refer to its web page for more
information.Application of JailsDanielGerzoContributed by Service JailsThis section is based upon an idea originally presented by
- &a.simon; at , and
an updated article written by Ken Tom
locals@gmail.com. This section illustrates how
to set up a &os; system that adds an additional layer of
security, using the &man.jail.8; feature. It is also assumed
that the given system is at least running RELENG_6_0 and the
information provided earlier in this chapter has been well
understood.DesignOne of the major problems with jails is the management
of their upgrade process. This tends to be a problem
because every jail has to be rebuilt from scratch whenever
it is updated. This is usually not a problem for a single
jail, since the update process is fairly simple, but can be
quite time consuming and tedious if a lot of jails are
created.This setup requires advanced experience with &os; and
usage of its features. If the presented steps below look
too complicated, it is advised to take a look at a simpler
system such as
sysutils/ezjail, which
provides an easier method of administering &os; jails and
is not as sophisticated as this setup.This idea has been presented to resolve such issues by
sharing as much as is possible between jails, in a safe way
— using read-only &man.mount.nullfs.8; mounts, so that
updating will be simpler, and putting single services into
individual jails will become more attractive. Additionally,
it provides a simple way to add or remove jails as well as a
way to upgrade them.Examples of services in this context are: an
HTTP server, a DNS
server, a SMTP server, and so
forth.The goals of the setup described in this section
are:Create a simple and easy to understand jail
structure. This implies not having
to run a full installworld on each and every
jail.Make it easy to add new jails or remove existing
ones.Make it easy to update or upgrade existing
jails.Make it possible to run a customized &os;
branch.Be paranoid about security, reducing as much as
possible the possibility of compromise.Save space and inodes, as much as possible.As it has been already mentioned, this design relies
heavily on having a single master template which is
read-only (known as nullfs)
mounted into each jail and one read-write device per jail.
A device can be a separate physical disc, a partition, or a
vnode backed &man.md.4; device. In this example, we will
use read-write nullfs
mounts.The file system layout is described in the following
list:Each jail will be mounted under the
/home/j
directory./home/j/mroot
is the template for each jail and the read-only
partition for all of the jails.A blank directory will be created for each jail
under the /home/j
directory.Each jail will have a
/s directory,
that will be linked to the read-write portion of the
system.Each jail shall have its own read-write system that
is based upon /home/j/skel.Each jailspace (read-write portion of each jail)
shall be created in /home/js.This assumes that the jails are based under the
/home partition.
This can, of course, be changed to anything else, but this
change will have to be reflected in each of the examples
below.Creating the TemplateThis section will describe the steps needed to create
the master template that will be the read-only portion for
the jails to use.It is always a good idea to update the &os; system to
the latest -RELEASE branch. Check the corresponding
Handbook Chapter
to accomplish this task. In the case the update is not
feasible, the buildworld will be required in order to be
able to proceed. Additionally, the
sysutils/cpdup package
will be required. We will use the &man.portsnap.8; utility
to download the &os; Ports Collection. The Handbook
Portsnap
Chapter is always good reading for
newcomers.First, create a directory structure for the
read-only file system which will contain the &os;
binaries for our jails, then change directory to the
&os; source tree and install the read-only file system
to the jail template:&prompt.root; mkdir /home/j /home/j/mroot
&prompt.root; cd /usr/src
&prompt.root; make installworld DESTDIR=/home/j/mrootNext, prepare a &os; Ports Collection for the jails
as well as a &os; source tree, which is required for
mergemaster:&prompt.root; cd /home/j/mroot
&prompt.root; mkdir usr/ports
&prompt.root; portsnap -p /home/j/mroot/usr/ports fetch extract
&prompt.root; cpdup /usr/src /home/j/mroot/usr/srcCreate a skeleton for the read-write portion of the
system:&prompt.root; mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles
&prompt.root; mv etc /home/j/skel
&prompt.root; mv usr/local /home/j/skel/usr-local
&prompt.root; mv tmp /home/j/skel
&prompt.root; mv var /home/j/skel
&prompt.root; mv root /home/j/skelUse mergemaster to
install missing configuration files. Then get rid of
the extra directories that
mergemaster creates:&prompt.root; mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i
&prompt.root; cd /home/j/skel
&prompt.root; rm -R bin boot lib libexec mnt proc rescue sbin sys usr devNow, symlink the read-write file system to the
read-only file system. Please make sure that the
symlinks are created in the correct
s/ locations.
Real directories or the creation of directories in the
wrong locations will cause the installation to
fail.&prompt.root; cd /home/j/mroot
&prompt.root; mkdir s
&prompt.root; ln -s s/etc etc
&prompt.root; ln -s s/home home
&prompt.root; ln -s s/root root
&prompt.root; ln -s ../s/usr-local usr/local
&prompt.root; ln -s ../s/usr-X11R6 usr/X11R6
&prompt.root; ln -s ../../s/distfiles usr/ports/distfiles
&prompt.root; ln -s s/tmp tmp
&prompt.root; ln -s s/var varAs a last step, create a generic
/home/j/skel/etc/make.conf with its
contents as shown below:WRKDIRPREFIX?= /s/portbuildHaving WRKDIRPREFIX set up this
way will make it possible to compile &os; ports inside
each jail. Remember that the ports directory is part of
the read-only system. The custom path for
WRKDIRPREFIX allows builds to be done
in the read-write portion of every jail.Creating JailsNow that we have a complete &os; jail template, we can
setup and configure the jails in
/etc/rc.conf. This example
demonstrates the creation of 3 jails: NS,
MAIL and WWW.Put the following lines into the
/etc/fstab file, so that the
read-only template for the jails and the read-write
space will be available in the respective jails:/home/j/mroot /home/j/ns nullfs ro 0 0
/home/j/mroot /home/j/mail nullfs ro 0 0
/home/j/mroot /home/j/www nullfs ro 0 0
/home/js/ns /home/j/ns/s nullfs rw 0 0
/home/js/mail /home/j/mail/s nullfs rw 0 0
/home/js/www /home/j/www/s nullfs rw 0 0Partitions marked with a 0 pass number are not
checked by &man.fsck.8; during boot, and partitions
marked with a 0 dump number are not backed up by
&man.dump.8;. We do not want
fsck to check
nullfs mounts or
dump to back up the
read-only nullfs mounts of the jails. This is why
they are marked with 0 0 in the
last two columns of each fstab
entry above.Configure the jails in
/etc/rc.conf:jail_enable="YES"
jail_set_hostname_allow="NO"
jail_list="ns mail www"
jail_ns_hostname="ns.example.org"
jail_ns_ip="192.168.3.17"
jail_ns_rootdir="/usr/home/j/ns"
jail_ns_devfs_enable="YES"
jail_mail_hostname="mail.example.org"
jail_mail_ip="192.168.3.18"
jail_mail_rootdir="/usr/home/j/mail"
jail_mail_devfs_enable="YES"
jail_www_hostname="www.example.org"
jail_www_ip="62.123.43.14"
jail_www_rootdir="/usr/home/j/www"
jail_www_devfs_enable="YES"The reason why the
jail_name_rootdir
variable is set to
/usr/home
instead of
/home is that
the physical path of the
/home directory
on a default &os; installation is
/usr/home. The
jail_name_rootdir
variable must not be set to a
path which includes a symbolic link, otherwise the
jails will refuse to start. Use the &man.realpath.1;
utility to determine a value which should be set to
this variable. Please see the &os;-SA-07:01.jail
Security Advisory for more information.Create the required mount points for the read-only
file system of each jail:&prompt.root; mkdir /home/j/ns /home/j/mail /home/j/wwwInstall the read-write template into each jail.
Note the use of
sysutils/cpdup,
which helps to ensure that a correct copy is done of
each directory:&prompt.root; mkdir /home/js
&prompt.root; cpdup /home/j/skel /home/js/ns
&prompt.root; cpdup /home/j/skel /home/js/mail
&prompt.root; cpdup /home/j/skel /home/js/wwwIn this phase, the jails are built and prepared to
run. First, mount the required file systems for each
jail, and then start them using the jail rc
script.&prompt.root; mount -a
&prompt.root; service jail startThe jails should be running now. To check if they have
started correctly, use the &man.jls.8; command. Its output
should be similar to the following:&prompt.root; jls
JID IP Address Hostname Path
3 192.168.3.17 ns.example.org /home/j/ns
2 192.168.3.18 mail.example.org /home/j/mail
1 62.123.43.14 www.example.org /home/j/wwwAt this point, it should be possible to log onto each
jail, add new users or configure daemons. The
JID column indicates the jail
identification number of each running jail. Use the
following command in order to perform administrative tasks
in the jail whose JID is 3:&prompt.root; jexec 3 tcshUpgradingIn time, there will be a need to upgrade the system to a
newer version of &os;, either because of a security issue,
or because new features have been implemented which are
useful for the existing jails. The design of this setup
provides an easy way to upgrade existing jails.
Additionally, it minimizes their downtime, as the jails will
be brought down only in the very last minute. Also, it
provides a way to roll back to the older versions should any
problems occur.The first step is to upgrade the host system in the
usual manner. Then create a new temporary read-only
template in /home/j/mroot2.&prompt.root; mkdir /home/j/mroot2
&prompt.root; cd /usr/src
&prompt.root; make installworld DESTDIR=/home/j/mroot2
&prompt.root; cd /home/j/mroot2
&prompt.root; cpdup /usr/src usr/src
&prompt.root; mkdir sThe installworld run
creates a few unnecessary directories, which should be
removed:&prompt.root; chflags -R 0 var
&prompt.root; rm -R etc var root usr/local tmpRecreate the read-write symlinks for the master file
system:&prompt.root; ln -s s/etc etc
&prompt.root; ln -s s/root root
&prompt.root; ln -s s/home home
&prompt.root; ln -s ../s/usr-local usr/local
&prompt.root; ln -s ../s/usr-X11R6 usr/X11R6
&prompt.root; ln -s s/tmp tmp
&prompt.root; ln -s s/var varThe right time to stop the jails is now:&prompt.root; service jail stopUnmount the original file systems:&prompt.root; umount /home/j/ns/s
&prompt.root; umount /home/j/ns
&prompt.root; umount /home/j/mail/s
&prompt.root; umount /home/j/mail
&prompt.root; umount /home/j/www/s
&prompt.root; umount /home/j/wwwThe read-write systems are attached to the
read-only system
(/s) and must
be unmounted first.Move the old read-only file system and replace it
with the new one. This will serve as a backup and
archive of the old read-only file system should
something go wrong. The naming convention used here
corresponds to when a new read-only file system has been
created. Move the original &os; Ports Collection over
to the new file system to save some space and
inodes:&prompt.root; cd /home/j
&prompt.root; mv mroot mroot.20060601
&prompt.root; mv mroot2 mroot
&prompt.root; mv mroot.20060601/usr/ports mroot/usrAt this point the new read-only template is ready,
so the only remaining task is to remount the file
systems and start the jails:&prompt.root; mount -a
&prompt.root; service jail startUse &man.jls.8; to check if the jails started correctly.
Do not forget to run mergemaster in each jail. The
configuration files will need to be updated as well as the
rc.d scripts.
diff --git a/en_US.ISO8859-1/htdocs/administration.xml b/en_US.ISO8859-1/htdocs/administration.xml
index e7d7c11794..fec8808939 100644
--- a/en_US.ISO8859-1/htdocs/administration.xml
+++ b/en_US.ISO8859-1/htdocs/administration.xml
@@ -1,495 +1,489 @@
]>
&title;$FreeBSD$
Introduction
This page lists teams, groups and individuals within the
FreeBSD project with designated project roles and areas of
responsibility, along with brief descriptions and contact
information.
The FreeBSD Core Team constitutes the project's "Board of Directors",
responsible for deciding the project's overall goals and direction as
well as managing specific areas of the FreeBSD project landscape. The
Core Team is elected by the active developers in the project.
The FreeBSD Documentation Engineering Team is responsible for
defining and following up documentation goals for the committers
in the Documentation project. The doceng team charter
describes the duties and responsibilities of the Documentation
Engineering Team in greater detail.
The primary responsibility of the FreeBSD Port Management Team is to
ensure that the FreeBSD Ports Developer community provides a ports
collection that is functional, stable, up-to-date and full-featured.
Its secondary responsibility is to coordinate among the committers
and developers who work on it. The portmgr team charter
describes the duties and responsibilities of the Port Management
Team in greater detail.
The Primary Release Engineering Team is responsible for setting and
publishing release schedules for official project releases of FreeBSD,
announcing code freezes and maintaining releng/* branches, among other
things. The release engineering team charter
describes the duties and responsibilities of the Primary Release
Engineering Team in greater detail.
The FreeBSD Donations Team is responsible for responding to donations
offers, establishing donation guidelines and procedures, and coordinating
donation offers with the FreeBSD developer community. A more detailed
description of the duties of the Donations Team is available on the FreeBSD Donations Liaison page.
The FreeBSD Security Team (headed by the Security Officer) is
responsible for keeping the community aware of bugs, exploits and
security risks affecting the FreeBSD src and ports trees, and to
promote and distribute information needed to safely run FreeBSD
systems. Furthermore, it is responsible for resolving software
bugs affecting the security of FreeBSD and issuing security
advisories. The FreeBSD
Security Officer Charter describes the duties and
responsibilities of the Security Officer in greater detail.
Vendor Relations is responsible for handling email
from hardware and software vendors. Email sent to Vendor
Relations is forwarded to the &os; Core Team in addition
to the &os; Foundation.
The FreeBSD Core Team Secretary is a non-voting member of the Core Team,
responsible for documenting the work done by core, keeping track of the
core agenda, direct contact with non-core members sending mail to core
and to be an the interface to the admin team for
committer/account approval. The Core Team Secretary is also responsible
for writing and sending out monthly status reports to the FreeBSD
Developer community, containing a summary of core's latest decisions and
actions.
The FreeBSD Port Management Team Secretary is a non-voting member of the
Port Management Team, responsible for documenting the work done by portmgr,
keeping track of voting procedures, and to be an interface to the other
teams, especially the admin and Core teams. The Port Management Team
Secretary is also responsible for writing and sending out monthly status
reports to the FreeBSD Developer community, containing a summary of
portmgr's latest decisions and actions.
The FreeBSD Security Team Secretary will make sure someone responds to
incoming emails towards the Security Team. He will acknowledge
receipt and keep track of the progress within the Security Team.
If needed the Secretary will contact members of the Security Team to
let them provide an update on ongoing items. Currently the Security
Team Secretary does not handle Security Officer Team items.
The Accounts Team is responsible for setting up accounts for new
committers in the project. Requests for new accounts will not be
acted upon without the proper approval from the appropriate entity.
The Bugmeisters and GNATS Administrators are responsible for ensuring
that the maintenance database is in working order, that the entries are
correctly categorised and that there are no invalid entries. They are
also responsible for the problem report group.
The Cluster Administrators consists of the people responsible for
administrating the machines that the project relies on for its
distributed work and communication to be synchronised. It
consists mainly of those people who have physical access to the servers.
Issues concerning the projects infrastructure or setting up new
machines should be directed to the cluster administrators. This
team is led by the lead cluster administrator whose duties and
responsbilities are described in the cluster administration charter
in greater detail.
The CVSup Mirror Site Coordinators coordinates all the CVSup
mirror site adminstrators to ensure that they are distributing current
versions of the software, that they have the capacity to update
themselves when major updates are in progress, and making it easy for
the general public to find their closest CVSup mirror.
The FTP/WWW Mirror Site Coordinators coordinate all the FTP/WWW
mirror site adminstrators to ensure that they are distributing current
versions of the software, that they have the capacity to update
themselves when major updates are in progress, and making it easy for
the general public to find their closest FTP/WWW mirror.
The Perforce Repository Administrators are responsible for
administrating the FreeBSD perforce source repository and setting up new
perforce accounts. All requests concerning new perforce accounts
for non-committers should be directed to the perforce
administrators.
The Postmaster Team is responsible for mail being correctly delivered
to the committers' email address, ensuring that the mailing lists work,
and should take measures against possible disruptions of project mail
services, such as having troll-, spam- and virus-filters.
The FreeBSD Webmaster Team is responsible for keeping the main FreeBSD web
sites up and running. This means web server configuration, CGI scripts,
fulltext and mailing list search. Anything web related, technical stuff
belongs to the scope of the Webmaster Team, excluding bugs in the
documentation.
The doceng@ team is a body to handle some of the meta-project
issues associated with the FreeBSD Documentation Project. The main
responsibilities of this team are:
To grant approval for new documentation committers. Documentation
includes articles and books, website pages, manual pages, release
notes and translations of the above. There are two kinds of
doc commit bits: translator commit bit, which is limited to
translations in a particular language and full commit bit, which
is only granted to aspirants, who have shown enough English
writing skills.
To maintain the doc project primer, which documents best
practices for the FreeBSD Documentation Project.
To manage the doc/ release process. This includes coordinating
the release documentation updates with the various translation
teams, coordinating with the release engineering team to tag the
doc/ tree during the release cycle, and documenting these
procedures.
To ensure that the generated documentation (PDF, HTML, etc.) on
the Web site and FTP site are up to date with respect to the
versions of the documents in the SVN tree. This includes making
sure the Web site build is functioning correctly, and also
involves working with the admin team to ensure that the primary
Web server has all of the requisite software installed
(including build scripts).
To act as MAINTAINER (when necessary) or to work in coordination
with existing MAINTAINERs, to ensure that the documentation
toolchains (DocBook, groff, etc.) are in good working order.
To maintain the sanctity of the FreeBSD doc/ tree.
Due to the visibility of these files and documents to the
outside world, doceng@ reserves the right to immediately backout
(or fix without waiting for response from the original
committer) changes that introduce broken links, cause the Web
site build to break, or otherwise degrade the accessibility of
the FreeBSD Web site and documentation.
It is specifically noted here that doceng@ is not a conflict
resolution body for the FreeBSD Documentation Project. Discussion and
consensus on the freebsd-doc mailing list is how the project has
conducted itself, and how it is expected to conduct itself in the
future.
Current Membership
-The current members of this team are &a.doceng;.
+The current members of this team are &a.doceng.members;.
New Doc Committers
New doc committers are approved by doceng@ with a vote through email
and a two week timeout. A committer is approved if at least one doceng@
member votes yes, and no doceng@ members vote no.
When a commit bit proposal is accepted, doceng@ sends out an
acceptance email to the mentor and the new committer with core@
and accounts@ CC'ed.
Idle Doc Committers
Doc Committers that have not made a commit in 12 months will be
contacted by a doceng@ member and without a response after a delay of
2 weeks, these committers will be automatically removed from the
access file. In case of no response, doceng@ will also contact core@
about the idle committers.
diff --git a/en_US.ISO8859-1/htdocs/platforms/arm.xml b/en_US.ISO8859-1/htdocs/platforms/arm.xml
index 2ad1f0af81..a865bba349 100644
--- a/en_US.ISO8859-1/htdocs/platforms/arm.xml
+++ b/en_US.ISO8859-1/htdocs/platforms/arm.xml
@@ -1,117 +1,117 @@
]>
&title;$FreeBSD$
Introduction
This page contains information about the FreeBSD port to the
ARM architecture and hardware. Discussion of the ARM port takes
place on the
freebsd-arm
mailing list.
ARM is officially a
Tier 2 architecture, as the FreeBSD project
does not provide official releases or pre-built packages for this
platform due to it primarily targeting the embedded arena. However,
FreeBSD/ARM is being actively developed and maintained, is well supported,
and provides an excellent framework for building ARM-based systems.
FreeBSD should work on the i80321 based Intel XScale®
devboards, which includes the IQ31244 and IQ80321 boards.
Support is still minimal, covering only the CPU, PCI-X bus,
em(4) Ethernet adapters, the UART and timer devices.
The i80219 XScale processor is supported, as is the EP80219
devboard.
The IXP425 is supported, as is the Avila GW2348-4 devboard.
The Atmel AT91RM9200 CPU/Microcontroller range is supported.
Support is provided for the Kwikbyte KB9202 devboard range, the
BWCT board and the Hot-e HL200 thin client device.
Minimal support for the StrongARM 1100 CPU is provided, but
only within the limits of what Simics emulate: CPU, UART and
clock. It is theoretically possible to boot on the Assabet board,
the one Simics emulates; no attempts, successful or unsuccessful,
have been reported.
Additionally, support for the Technologic Systems TS-7200 devboard
is in the works, as is support for the Atmel AT91SAM926x CPU and
the Marvell Orion ARM SoC, the Samsung S3C2XX0 range, and Cirrus
Logic EP93XX CPUs.
With FreeBSD/ARM, you can enjoy the silence from running your
(embedded) computer. There's even a song of that name, "Enjoy
The Silence", by Depeche Mode:
All I ever wanted
All I ever needed
Is here in my ARMs
Words are very unnecessary
They can only do harm
This page contains information about the FreeBSD port to Fujitsu's
SPARC64® and Oracle's UltraSPARC® architectures.
Discussion of this port takes
place on the
freebsd-sparc
mailing list.
UltraSPARC is a
Tier 2 architecture, and as such is not fully supported by the
FreeBSD project. Although fully functional, the port
is not as mature as the existing i386 or amd64 ports.
A summary of supported systems follows. SMP is supported on all supported
systems that contain more than 1 processor. For full details please see
the
hardware notes of the
release you are using.
Naturetech GENIALstation 777S
Sun Blade 100
Sun Blade 150
Sun Enterprise 150
Sun Enterprise 220R
Sun Enterprise 250
Sun Enterprise 420R
Sun Enterprise 450
Sun Fire B100s (support for the on-board NICs first appeared in
8.1-RELEASE)
Sun Fire V100
Sun Fire V120
Sun Netra™ T1 100/105
Sun Netra T1 AC200/DC200
Sun Netra t 1100
Sun Netra t 1120
Sun Netra t 1125
Sun Netra t 1400/1405
Sun Netra 120
Sun Netra X1
Sun SPARCEngine® Ultra AX1105
Sun SPARCEngine Ultra AXe
Sun SPARCEngine Ultra AXi
Sun SPARCEngine Ultra AXmp
Sun SPARCEngine CP1500
Sun Ultra™ 1
Sun Ultra 1E
Sun Ultra 2
Sun Ultra 5
Sun Ultra 10
Sun Ultra 30
Sun Ultra 60
Sun Ultra 80
Sun Ultra 450
The following systems are partially supported by FreeBSD. In
particular the fibre channel controllers in SBus-based systems are not
supported. However, it is possible to use these with a SCSI controller
supported by the esp(4) driver (Sun ESP SCSI, Sun FAS Fast-SCSI
and Sun FAS366 Fast-Wide SCSI controllers).
Sun Enterprise 3500
Sun Enterprise 4500
Starting with 7.2-RELEASE, sparc64 systems based on
Sun UltraSPARC III and beyond are also supported by FreeBSD, which includes
the following known working systems:
Sun Blade 1000
Sun Blade 1500
Sun Blade 2000
Sun Blade 2500
Sun Fire 280R
Sun Fire V210
Sun Fire V215 (support first appeared in 7.3-RELEASE and 8.1-RELEASE)
Sun Fire V240
Sun Fire V245 (support first appeared in 7.3-RELEASE and 8.1-RELEASE)
Sun Fire V250
Sun Fire V440 (support for the on-board NICs first appeared in
7.3-RELEASE and 8.0-RELEASE)
Sun Fire V480 (501-6780 and 501-6790 centerplanes only, for which support
first appeared in 7.3-RELEASE and 8.1-RELEASE,
other centerplanes might work beginning with 8.3-RELEASE and 9.0-RELEASE)
Sun Fire V880
Sun Fire V890 (support first appeared in 7.4-RELEASE and 8.1-RELEASE, non-mixed
Ultrasparc IV/IV+ CPU-configurations only)
Sun Netra 20/Netra T4
The following Sun UltraSPARC systems are not tested but
believed to be also supported by FreeBSD:
Sun Fire V125
Sun Fire V490 (support first appeared in 7.4-RELEASE and 8.1-RELEASE, non-mixed
Ultrasparc IV/IV+ CPU-configurations only)
Starting with 7.4-RELEASE and 8.1-RELEASE, sparc64 systems based on Fujitsu SPARC64 V
are also supported by FreeBSD, which includes the following
known working systems:
Fujitsu PRIMEPOWER® 250
The following Fujitsu SPARC64 systems are not tested but believed to be
also supported by FreeBSD:
Fujitsu PRIMEPOWER 450
Fujitsu PRIMEPOWER 650
Fujitsu PRIMEPOWER 850
If you have a system that is not listed here please try it, and let
us know about it.
FreeBSD/xbox is a port of FreeBSD which aims to run on Microsoft®
- Xbox® systems. This project was started by &a.rink;, who did most of the patching
- and coding. Ed Schouten helped with
+ Xbox® systems. This project was started by &a.rink.email;,
+ who did most of the patching
+ and coding. &a.ed.email; helped with
reviewing patches and he also provided details on certain Xbox
internals.
Status
&os;/xbox has been supported since FreeBSD 6-STABLE.
The framebuffer, Ethernet, sound and USB devices
(such as an USB keyboard for the console) are all supported.
In order to aid people in installing the FreeBSD/xbox port, a combined
install/livecd has been created.
It is available here.
Booting &os; kernels
In order to boot &os; you must have an up-to-date
version of the Linux/xbox BIOS, called Cromwell (failure will result in your
kernel crashing immediately after loading). A Cromwell with FreeBSD UFS
patches (this will make it able to load a kernel directly from an UFS file
system) is available in the ports tree at /usr/ports/sysutils/cromwell; it
can be flashed to the EEPROM using the /usr/ports/sysutils/raincoat port (as
long as your Xbox is below version 1.6).
Note: Several Xbox drives are known to reject certain types of media.
Should you experience random hangs, panics or corruption during installation,
try a different known-working DVD/CD-ROM.
Installing on the hard drive
You can do an installation using the Live CD's, but you will need to do
everything manually. It is suggested to prepare your disk using an FreeBSD/i386
installation and set up the /boot/xboxlinux.cfg configuration
file yourself, so Cromwell can determine which kernel to load.
Resources Of Interest To FreeBSD Contributors and Developers
Contributing to the FreeBSD Ports Collection
An introduction to how you can help contribute to the Ports
Collection, by either contributing new ports or helping to fix
problems in existing ports. Included is detailed information on
what the community will expect from you if you volunteer to maintain
one or more ports. Also includes a list of
further resources.
FreeBSD Porter's Handbook
The central reference book for FreeBSD ports submitters,
maintainers, and committers, mostly technically oriented. It
includes both mandatory requirements and recommendations of
what portmgr believes are the best approaches to common problems.
one or more ports. Also includes information about
keeping with changes as well.
FreeBSD Ports Build
Cluster
These machines continually build packages on all possible
combinations of OS release and CPU architecture (in our terminology,
build environments), and produce error logs of problems
that are encountered along the way.
FreeBSD Release Engineering for Third Party Packages
Describes the approach used by the FreeBSD release
engineering team to produce a high quality package set
suitable for official FreeBSD release media, with specific
emphasis on how to split up the packages for the release
media, and how to verify that a package set is
consistent.
Problem Report Handling Guidelines
While primarily aimed at FreeBSD committers, this should
also be read by users interested in how best to attract attention
to their PRs.
Resources Of General Interest
FreshPorts
A site maintained by Dan Langille that lets you browse
the state of the entire Ports Collection or any individual port
within it. Includes cross-references, links, charts and graphs,
and many other things. Of interest to users and developers
alike.
The FreeBSD Project is proud to have taken part in the Google Summer of Code
2005. By all accounts, the FreeBSD participation in this
program was an unqualified success. We received over 350
applications for student projects, amongst which 19 were selected
for funding. These student projects included improved installation
tools, filesystem enhancements, new utilities, and more. Many of
the students have continued working on their FreeBSD projects even
after the official close of the program. We are happy to see
continued development in our source code repository by these
talented young programmers and we look forward to working with more
students in the future.
The FreeBSD Project is proud to have taken part in the Google Summer of Code
again in 2006. By all accounts, the FreeBSD participation in this
program was an unqualified success. We received over 150
applications for student projects, amongst which 14 were selected
for funding. These student projects included security research,
improved installation tools, new utilities, and more. Many of the
students have continued working on their FreeBSD projects even after
the official close of the program.
We are happy to report than all 14 of our students this year
successfully completed the program. There were many other strong
applications which we unfortunately couldn't fund and many of these
students also spent the summer working on FreeBSD. We are happy to
see continued development in our source code repository by these
talented young programmers and we look forward to working with more
students in the future.
Information about the student projects is available from our Summer of Code
wiki and all of the code is checked into Perforce.
The summaries below were submitted by the individual students and
their mentors.
2006 Student Projects
Student:
Clement Lecigne
Summary:
IPv6 stack vulnerabilities
-
Mentor:
&a.gnn; <gnn@FreeBSD.org>
+
Mentor:
&a.gnn.email;
Summary:
The focus of this project was to review past vulnerabilities,
create vulnerability testing tools and to discover new vulnerabilities
in the FreeBSD IPv6 stack which is derived from the KAME project code.
During the summer Clement took two libraries, the popular libnet, and
his mentor's Packet Construction Set (PCS) and created tools to find
security problems in the IPv6 code. Several issues were found, bugs
filed, and patches created. At the moment Clement and George are
editing a 50 page paper that describes the project which will be
submitted for conference publication.
All of the code from the project, including the tools, is on line and
is described in the paper.
By all measures, this was a successful project. Both student and
mentor gained valuable insight into a previously externally maintained
set of code. In addition to the new tools development in this effort,
the FreeBSD Project now also has a new engineer to help work on the
code.
Student:
Chris Jones
Summary:
Jail Resource Limits
-
Mentor:
&a.kmacy; <kmacy@FreeBSD.org>
+
Mentor:
&a.kmacy.email;
Summary:
Chris added support for limiting CPU and memory use by jails. This
allows fairer sharing of systems' resources between divergent uses by
preventing one jail from monopolizing the available memory and CPU
time, if other users and jails have processes to run.
The code is currently available as patches against RELENG_6, and
Chris is in the process of applying it to -CURRENT. More details can
be found at JailResourceLimits.
Student:
Ivan Voras
Summary:
GEOM storage virtualization (gvirstor)
-
Mentor:
&a.pjd; <pjd@FreeBSD.org>
+
Mentor:
&a.pjd.email;
Summary:
The goal of this project was to create a virtual storage class for the
GEOM framework in FreeBSD that would allow creating "overcommitted"
storage devices, with a size larger than that of available physical
storage (e.g. hard drives). The project was completed successfully,
and the result is available on the project's home page. It's expected
the project will be included in FreeBSD CVS after it gets more testing
or after FreeBSD 6.2 is released, whichever comes first.
Working on the project was very pleasant, there was enough
documentation and the mentor was very helpful and responsive. Google's
team was apt and provided ample support to the participants of the
project. The project will help both OEMs of embedded devices (such as
NAS devices) and big users to make use of FreeBSD for large storage
projects.
Student:
Paolo Pisati
Summary:
Study analyze and improve the interrupt handling infrastructure
-
Mentor:
&a.jhb; <jhb@FreeBSD.org>
+
Mentor:
&a.jhb.email;
Summary:
This project consisted in the improvement of the interrupt handling
system in FreeBSD: while retaining backward compatibility with the
previous models (FAST and ITHREAD), a new method called 'Interrupt
filtering' was added. With interrupt filtering, the interrupt handler
is divided into 2 parts: the filter (that checks if the actual
interrupt belong to this device) and the ithread (that is scheduled in
case some blocking work has to be done). The main benefits of
interrupt filtering are:
feedback from filters (the system finally knows
if any handler has serviced an interrupt or not, and can react
consequently).
lower latency/overhead for shared interrupt line.
previous experiments with interrupt filtering showed an increase
in performance against the plain ithread model
Moreover, during the development of interrupt filtering, some MD
dependent code was converted into MI code, PPC was fixed to support
multiple FAST handlers per line and an interrupt stray storm detection
logic was added. While the framework is done, there are still machine
dependent bits to be written (the support for ppc, sparc64, arm and
itanium has to be written/reviewed) and a serious analysis of the
performance of this model against the previous one is a WIP.
Student:
Yuan Jue
Summary:
Porting Xen to FreeBSD.
-
Mentor:
&a.kmacy; <kmacy@FreeBSD.org>
+
Mentor:
&a.kmacy.email;
Summary:
Successfully got a domU kernel usable for installation. dom0 support
still in progress. Kip and Yuan Jue are continuing to work together
on this project after the official end of SoC. Yuan Jue has published
a more comprehensive FreeBSD/Xen howto here.
Student:
Adam David Alan Martin
Summary:
AutoFS - An Automounting Filesystem implementation for FreeBSD
-
Mentor:
&a.benno; <benno@FreeBSD.org>
+
Mentor:
&a.benno.email;
Summary:
Adam used PseudoFS as a starting point for an in-memory
representation of an Automounter Filesystem. This involved making a
few tweaks to PseudoFS to allow AutoFS to detect lookups. At this time,
the filesystem works and sends signals up to a userland program. Adam
plans to continue working on this, with Benno and Erez, to get AutoFS
working with Erez Zadok's AMD. The goal is to merge this work into
-CURRENT.
This summer was spent adding support for 4Front's OSSV4 API to
FreeBSD. A large number of audio ioctls were added, with a few
pending, and there is still work left to do with mixers/mixer
extensions (4Front's specs are still in flux) and MIDI (low priority
because, IIRC, MIDI still needs maintainership). Ryan plans to continue
work related to the mixer extensions as best he can while attending
university full-time. All of the code is committed to
FreeBSD-current.
Student:
Markus Boelter
Summary:
Bundled PXE Installer
-
Mentor:
&a.ps; <ps@FreeBSD.org>
+
Mentor:
&a.ps.email;
Summary:
For me, Google Summer of Code was a new and very exciting experience.
I got actively involved in doing Open Source Software and giving
something back to the community. Facing to some challenges within the
project forced me to look behind the scenery of FreeBSD. The result
was a better understanding of the overall system. Getting in touch
with a lot of developers directly also gave a very special spirit to
the Summer of Code.
I really enjoyed the time and will continue to work on the project
also after the deadline. For me, it was a great chance to get involved
in active development and not just doing some scripts and hacks at home.
Getting paid for the work was just a small part of the overall feeling.
Thanks people at FreeBSD and Google for the really, really great
time!
Student:
Shteryana Sotirova Shopova
Summary:
Integrated SNMP monitoring
-
Mentor:
&a.bz; <bz@FreeBSD.org>
+
Mentor:
&a.bz.email;
Summary:
After working on bsnmptools last year, Shteryana concentrated on
the server side this year.
An implementation for if_vlan(4) monitoring was dropped from the
original proposal in favor of extended support for the new
if_bridge(4) network bridge device monitoring module.
In addition to RFC 4188 single bridge support and extending the
kernel to get access to all the information a private MIB was
designed. This was needed to be able to monitor multiple bridges
supported by FreeBSD and adding an extended bridge management
interface and definitely was the greatest technical challenge
of the project.
The project was successfully completed - including code review - and
the kernel part has already been committed to CURRENT. User space part
will follow soon. For STABLE a patch is available too (see wiki).
Shteryana is going to continue her work on bsnmpd and is already
planning support for if_vlan(4) and jails monitoring modules.
We are happy that she will stay with the FreeBSD project and continue
to work on bsnmp and FreeBSD after SoC.
Nss-LDAP importing and nsswitch subsystem improvement
-
Mentor:
&a.ume; <ume@FreeBSD.org>
+
Mentor:
&a.ume.email;
Summary:
The project consisted of 5 parts:
Nsswitch modules and libc separation. The idea was to move the source
code for different nsswitch sources (such as "files", "dns", "nis") out of
the libc into the separate shared libraries. This task was successfully
finished (the patch is available).
Regression tests for nsswitch. A set of regression tests to test the
correctness of all nsswitch-related functions and the invariance of their
behavior between system upgrades. I think that task can be considered
successfully completed (the patch is available).
nss_ldap rewriting. Though, this task was not clearly mentioned in the
original proposal, during the SoC we found reasonable not to simply import
PADL's nss_ldap, but to rewrite it from scratch (licensing issues were among
the basic reasons for this). The resulting nss_ldap nsswitch module, though,
behaves mostly similar to the PADL's one, has different (I believe - more
flexible) architecture. Though it's basically finished, several useful
features from the PADL's nss_ldap still need to be implemented. But, despite
the lack of some features, I believe, that this task can be considered to be
successfully completed. (Missing features will be implemented ASAP -
hopefully during the September).
nss_ldap importing into the base. The task was to prepare a patch, that
will allow users to use nss_ldap from the base system. The task was
successfully completed (the patch is available), but required to import
OpenLDAP into the base in order for nss_ldap to work properly, and it had
led to a long discussion in the mailing list. This discussion, however, have
concluded with mostly positive opinions about nss_ldap and OpenLDAP
importing.
cached performance optimization. The caching daemon performance needs to
be as high as possible in order for cached to be as close (in terms of
speed) to "files" nsswitch source as possible. Cached's performance analysis
was made and nsswitch database precaching was introduced as the
optimization. This task was completed (the patch is available). However
there is an area for improvements - more precise and extensive performance
analysis should be made and more optimizations need to be introduces. This
will be done in the nearest future.
Though none of the code was committed yet into the main, official
FreeBSD tree, my experience from the previous year makes me think
that this situation is normal. I hope, that the code will be reviewed
and committed in the coming months.
The goal was to implement the basics of 2.6.16 support. This has
been implemented, and several programs from Fedora Core 4 work now
with osrelease="2".6.16. More complex applications do expose some bugs,
however. All of Roman's SoC work is in FreeBSD-current (the default
compatibility is still 2.4.2) and his current focus is to fix the
remaining bugs as time permits while attending university full-time. A
more detailed status of what is supported and what is not can be found
in the linux kernel
project wiki.
Student:
Spencer Whitman
Summary:
K Kernel Meta-Language
-
Mentor:
&a.phk; <phk@FreeBSD.org>
+
Mentor:
&a.phk.email;
Summary:
Spencer investigated implementing CPP macros in the first stage of the
prototype 'K' compiler. Spencer has expressed interest to continue
working with us on the 'K' project.
Student:
Dongmei Liu
Summary:
Porting the seref policy and setools to SEBSD
-
Mentor:
&a.csjp; <csjp@FreeBSD.org>
+
Mentor:
&a.csjp.email;
Summary:
Dongmei Liu spent the summer working on the basic footwork required to
port the SEREF policy to SEBSD. This work has been submitted and can
be viewed in the soc2006/dongmei_sebsd Perforce branch. This work was
originated from the sebsd branch:
//depot/projects/trustedbsd/sebsd. Additionally setools-2.3 was
ported from Linux and can be found in contrib/sebsd/setools
directory. It is hoped that this work will be merged into the main SEBSD
development branch.
-
Student:
Gábor Kövesdán
+
Student:
&a.gabor;
Summary:
Improving FreeBSD Ports Collection Infrastructure
-
Mentor:
&a.erwin; <erwin@FreeBSD.org>
+
Mentor:
&a.erwin.email;
Summary:
This project consists of the following tasks:
New handling for i386 binary ports
Cleanup: use ECHO_CMD and ECHO_MSG in bsd.port.mk properly
Add a basic infrastructure support for debugging
Installing ports with different destination (DESTDIR macro)
Cleanup: Move fetch shell scripts out of bsd.port.mk
Make ports respect CC and CFLAGS
Cross-compiling Ports
Plist generator tool
The first three items are completed and the next two items are being worked on.
The DESTDIR support was more complicated than presumed, so it took more
time and the student didn't have time to finish the other items. Gábor
will continue working on these and other ports related tasks and FreeBSD is
happy to have interested him to keep working on ports and ports infrastructure.
The following table lists the code freeze status for the major
branches of the src/ subtree of the FreeBSD Subversion
repository. Commits to any branch listed as "frozen" must first
be reviewed and approved by the relevant contact party. The
status of other subtrees such as ports/ and doc/,
is also provided below.
FreeBSD
Release Engineering
Describes the approach used by the FreeBSD release
engineering team to make production quality releases of the
FreeBSD Operating System. It describes the tools available
for those interested in producing customized FreeBSD releases
for corporate rollouts or commercial
productization.
FreeBSD
Release Engineering for Third Party Packages
Describes the approach used by the FreeBSD release
engineering team to produce a high quality package set
suitable for official FreeBSD release media. This document is
a work in progress, but eventually it will cover the process
used to build a clean package set on the FreeBSD.org "Ports
Cluster", how to configure any other set of machines as a
ports cluster, how to split up the packages for the release
media, and how to verify that a package set is
consistent.
The primary release engineering team is responsible for approving
MFC
requests during code freezes, setting release schedules, and all of
the other responsibilities laid out in our charter.
Primary RE Team
(re@FreeBSD.org) :
&a.re.members; form the primary release engineering
decision-making group.
The builders release engineering team is responsible
for building and packaging FreeBSD releases on the various supported
platforms.
The third party packages in the Ports Collection are managed by the
portmgr@ team. Among many other responsibilities, the port managers
keep the ports cluster running smoothly to produce binary
packages.
Where can I find the release directory or ISO images for older
FreeBSD releases?
The FreeBSD Project does not maintain a centralized historical
archive of old release ISO images, but there are still many
options. A large collection of the old releases (many
complete with the package sets) is at
ftp://ftp-archive.FreeBSD.org/pub/FreeBSD-Archive/old-releases/.
If you are unable to find an FTP mirror that still contains the
release you are looking for, then you can email CD-ROM vendors to
see if they have any old releases available. In September 2003,
we know of a case where FreeBSD 1.1 was used in a court of law to
invalidate a bogus software patent. Clearly, older releases can
be very important in some situations.
What versions of FreeBSD seem to be affected if possible.
Any plausible workaround.
Example code if possible.
After this information has been reported the Security Officer
or a Security Team delegate will get back to you.
Spam filters
Due to high volume of spam the main security contact mail
addresses are subject to spam filtering. If you cannot contact
the FreeBSD Security Officers or Security Team due to spam filters
(or suspect your mail has been filtered), please send mail to
security-officer-XXXX@FreeBSD.org with
XXXX replaced with 3432 instead of the normal
addresses. Note that this address will be changed periodically so
check back here for the latest address. Mails to this address
will go to the FreeBSD Security Officer Team.
The FreeBSD Security Officer Team and the FreeBSD Security Team
In order that the FreeBSD Project may respond to vulnerability
reports in a timely manner, emails sent to the <security-officer@FreeBSD.org>
mail alias are currently delivered to the following people:
As a general policy, the FreeBSD Security Officer favors full
disclosure of vulnerability information after a reasonable delay
to permit safe analysis and correction of a vulnerability, as well
as appropriate testing of the correction, and appropriate
coordination with other affected parties.
The Security Officer will notify one or more of the
FreeBSD Cluster Admins of
vulnerabilities that put the FreeBSD Project's resources under
immediate danger.
The Security Officer may bring additional FreeBSD developers or
outside developers into discussion of a submitted security
vulnerability if their expertise is required to fully understand
or correct the problem. Appropriate discretion will be exercised
to minimize unnecessary distribution of information about the
submitted vulnerability, and any experts brought in will act in
accordance of Security Officer policies. In the past, experts
have been brought in based on extensive experience with highly
complex components of the operating system, including FFS, the VM
system, and the network stack.
If a FreeBSD release process is underway, the FreeBSD Release
Engineer may also be notified that a vulnerability exists, and its
severity, so that informed decisions may be made regarding the
release cycle and any serious security bugs present in software
associated with an up-coming release. If requested, the Security
Officer will not share information regarding the nature of the
vulnerability with the Release Engineer, limiting information flow
to existence and severity.
The FreeBSD Security Officer has close working relationships with
a number of other organizations, including third-party vendors
that share code with FreeBSD (the OpenBSD, NetBSD and DragonFlyBSD
projects, Apple, and other vendors deriving software from FreeBSD,
as well as the Linux vendor security list), as well as
organizations that track vulnerabilities and security incidents,
such as CERT. Frequently vulnerabilities may extend beyond the
scope of the FreeBSD implementation, and (perhaps less frequently)
may have broad implications for the global networking community.
Under such circumstances, the Security Officer may wish to
disclose vulnerability information to these other organizations:
if you do not wish the Security Officer to do this, please
indicate so explicitly in any submissions.
Submitters should be careful to explicitly document any special
information handling requirements.
If the submitter of a vulnerability is interested in a
coordinated disclosure process with the submitter and/or other
vendors, this should be indicated explicitly in any submissions.
In the absence of explicit requests, the FreeBSD Security Officer
will select a disclosure schedule that reflects both a desire for
timely disclosure and appropriate testing of any solutions.
Submitters should be aware that if the vulnerability is being
actively discussed in public forums (such as bugtraq), and
actively exploited, the Security Officer may choose not to follow
a proposed disclosure timeline in order to provide maximum
protection for the user community.
Submissions may be protected using PGP. If desired, responses
will also be protected using PGP.
diff --git a/en_US.ISO8859-1/share/xml/mailing-lists.ent b/en_US.ISO8859-1/share/xml/mailing-lists.ent
index 702b344988..5f3bea757d 100644
--- a/en_US.ISO8859-1/share/xml/mailing-lists.ent
+++ b/en_US.ISO8859-1/share/xml/mailing-lists.ent
@@ -1,623 +1,622 @@
FreeBSD list server">
&a.mailman.listinfo;">
FreeBSD ACPI mailing list">
freebsd-acpi">
FreeBSD advocacy mailing list">
freebsd-advocacy">
FreeBSD AFS porting mailing list">
freebsd-afs">
FreeBSD Adaptec AIC7xxx discussions mailing list">
freebsd-aic7xxx">
Porting FreeBSD to AMD64 systems">
freebsd-amd64">
FreeBSD announcements mailing list">
freebsd-announce">
FreeBSD Apache mailing list">
freebsd-apache">
FreeBSD architecture and design mailing list">
freebsd-arch">
FreeBSD ARM porting mailing list">
freebsd-arm">
FreeBSD ATM networking mailing list">
freebsd-atm">
FreeBSD Bluetooth mailing list">
freebsd-bluetooth">
FreeBSD bugbusters mailing list">
freebsd-bugbusters">
FreeBSD problem reports mailing list">
freebsd-bugs">
FreeBSD chat mailing list">
freebsd-chat">
FreeBSD-specific Chromium issues">
freebsd-chromium">
FreeBSD clustering mailing list">
freebsd-cluster">
-
&os.current; mailing list">
freebsd-current">
CTM announcements">
ctm-announce">
CTM 4-STABLE src branch distribution mailing list">
ctm-src-4">
CTM 5-STABLE src branch distribution mailing list">
ctm-src-5">
CTM 6-STABLE src branch distribution mailing list">
ctm-src-6">
CTM 7-STABLE src branch distribution mailing list">
ctm-src-7">
CTM 8-STABLE src branch distribution mailing list">
ctm-src-8">
CTM 9-STABLE src branch distribution mailing list">
ctm-src-9">
CTM -CURRENT src branch distribution mailing list">
ctm-src-cur">
CTM user discussion mailing list">
ctm-users">
FreeBSD CVS commit message mailing list">
cvs-all">
FreeBSD CVS doc commit list">
cvs-doc">
FreeBSD CVS ports commit list">
cvs-ports">
FreeBSD CVS projects commit list">
cvs-projects">
FreeBSD CVS src commit list">
cvs-src">
FreeBSD CVSweb maintenance mailing list">
freebsd-cvsweb">
FreeBSD based Databases mailing list">
freebsd-database">
Using and improving &os; on the desktop">
freebsd-desktop">
FreeBSD documentation project mailing list">
freebsd-doc">
Writing device drivers for FreeBSD">
freebsd-drivers">
Using and working on DTrace in &os;.">
freebsd-dtrace">
FreeBSD users of Eclipse IDE, tools, rich client applications and ports">
freebsd-eclipse">
FreeBSD-embedded mailing list">
freebsd-embedded">
FreeBSD-emulation mailing list">
freebsd-emulation">
FreeBSD-eol mailing list">
freebsd-eol">
FreeBSD FireWire (IEEE 1394) discussion mailing list">
freebsd-firewire">
Fortran on FreeBSD mailing list">
freebsd-fortran">
FreeBSD file system project mailing list">
freebsd-fs">
FreeBSD gecko mailing list">
freebsd-gecko">
FreeBSD GEOM mailing list">
freebsd-geom">
FreeBSD GNOME and GNOME applications mailing list">
freebsd-gnome">
FreeBSD technical discussions mailing list">
freebsd-hackers">
FreeBSD hardware and equipment mailing list">
freebsd-hardware">
FreeBSD mirror sites mailing lists">
freebsd-hubs">
FreeBSD internationalization mailing list">
freebsd-i18n">
FreeBSD i386-specific issues mailing list">
freebsd-i386">
FreeBSD IA32 porting mailing list">
freebsd-ia32">
FreeBSD IA64 porting mailing list">
freebsd-ia64">
Infiniband on FreeBSD">
freebsd-infiniband">
FreeBSD IPFW code mailing list">
freebsd-ipfw">
FreeBSD ISDN mailing list">
freebsd-isdn">
FreeBSD Internet service provider's mailing list">
freebsd-isp">
FreeBSD jails mailing list">
freebsd-jail">
FreeBSD Java Language mailing list">
freebsd-java">
FreeBSD related employment mailing list">
freebsd-jobs">
FreeBSD KDE/Qt and KDE applications mailing list">
freebsd-kde">
FreeBSD LFS porting mailing list">
freebsd-lfs">
FreeBSD MIPS porting mailing list">
freebsd-mips">
FreeBSD mirror site administrators">
mirror-announce">
FreeBSD laptop computer mailing list">
freebsd-mobile">
Mono and C# applications on FreeBSD">
freebsd-mono">
FreeBSD port of the Mozilla browser mailing list">
freebsd-mozilla">
FreeBSD multimedia mailing list">
freebsd-multimedia">
FreeBSD networking mailing list">
freebsd-net">
FreeBSD new users mailing list">
freebsd-newbies">
FreeBSD new-bus mailing list">
freebsd-new-bus">
Discussions of high quality implementation of libm functions">
freebsd-numerics">
Office applications on FreeBSD">
freebsd-office">
Project Infrastructure Announcements">
freebsd-ops-announce">
FreeBSD performance mailing list">
freebsd-performance">
FreeBSD Perl mailing list">
freebsd-perl">
FreeBSD packet filter mailing list">
freebsd-pf">
Binary package management and package tools discussion">
freebsd-pkg">
FreeBSD non-Intel platforms porting mailing list">
freebsd-platforms">
FreeBSD ports mailing list">
freebsd-ports">
FreeBSD ports announce mailing list">
freebsd-ports-announce">
FreeBSD ports bugs mailing list">
freebsd-ports-bugs">
FreeBSD PowerPC porting mailing list">
freebsd-ppc">
Technical discussion of FreeBSD on HP ProLiant server platforms">
freebsd-proliant">
FreeBSD Python mailing list">
freebsd-python">
FreeBSD general questions mailing list">
freebsd-questions">
FreeBSD boot script system mailing list">
freebsd-rc">
FreeBSD realtime extensions mailing list">
freebsd-realtime">
FreeBSD Ruby mailing list">
freebsd-ruby">
FreeBSD SCSI subsystem mailing list">
freebsd-scsi">
FreeBSD security mailing list">
freebsd-security">
FreeBSD security notifications mailing list">
freebsd-security-notifications">
FreeBSD-small mailing list">
freebsd-small">
FreeBSD Development Snapshot Announcements">
freebsd-snapshots">
FreeBSD SPARC porting mailing list">
freebsd-sparc64">
&os.stable; mailing list">
freebsd-stable">
FreeBSD C99 and POSIX compliance mailing list">
freebsd-standards">
FreeBSD sun4v porting mailing list">
freebsd-sun4v">
SVN commit messages for the entire doc tree (except for user, projects and translations)">
svn-doc-all">
SVN commit messages for the doc tree for head/">
svn-doc-head">
SVN commit messages for the doc projects tree">
svn-doc-projects">
SVN commit messages for the doc admin / configuration tree">
svn-doc-svnadmin">
SVN commit messages for the entire ports tree">
svn-ports-all">
SVN commit messages for the ports tree for head/">
svn-ports-head">
SVN commit messages for the ports admin / configuration tree">
svn-ports-svnadmin">
SVN commit messages for the entire src tree (except for user and projects)">
svn-src-all">
SVN commit messages for the src tree for head/-current">
svn-src-head">
SVN commit messages for the src projects tree">
svn-src-projects">
SVN commit messages for releases in the src tree">
svn-src-release">
SVN commit messages for the release engineering / security commits to the src tree">
svn-src-releng">
SVN commit messages for all the -stable branches of the src tree">
svn-src-stable">
SVN commit messages for only the 6-stable src tree">
svn-src-stable-6">
SVN commit messages for only the 7-stable src tree">
svn-src-stable-7">
SVN commit messages for only the 8-stable src tree">
svn-src-stable-8">
SVN commit messages for only the 9-stable src tree">
svn-src-stable-9">
SVN commit messages for the old stable src trees">
svn-src-stable-other">
SVN commit messages for the admin / configuration tree">
svn-src-svnadmin">
SVN commit messages for the experimental user src tree">
svn-src-user">
SVN commit messages for the vendor work area tree">
svn-src-vendor">
Sysinstall development mailing list">
freebsd-sysinstall">
FreeBSD-specific Tcl/Tk discussions">
freebsd-tcltk">
FreeBSD test mailing list">
freebsd-test">
Testing on &os;">
freebsd-testing">
Porting TeX and its applications to &os;">
freebsd-tex">
FreeBSD threads mailing list">
freebsd-threads">
Porting FreeBSD to the Tilera family of CPUs">
freebsd-tilera">
FreeBSD tokenring mailing list">
freebsd-tokenring">
FreeBSD integrated toolchain mailing list">
freebsd-toolchain">
FreeBSD USB mailing list">
freebsd-usb">
FreeBSD user group coordination mailing list">
freebsd-user-groups">
FreeBSD vendors pre-release coordination mailing list">
freebsd-vendors">
Discussion of various virtualization techniques supported by FreeBSD">
freebsd-virtualization">
Discussion on the VuXML
infrastructure">
freebsd-vuxml">
FreeBSD Work-In-Progress Status">
freebsd-wip-status">
Discussions of 802.11 stack, tools, device driver development">
freebsd-wireless">
FreeBSD Webmaster mailing list">
freebsd-www">
FreeBSD X11 mailing list">
freebsd-x11">
FreeBSD port to Xen mailing list">
freebsd-xen">
XFCE for FreeBSD mailing list">
freebsd-xfce">
Zope for FreeBSD mailing list">
freebsd-zope">
bug-followup@FreeBSD.org">
majordomo@FreeBSD.org">
FreeBSD Alpha porting mailing list">
freebsd-alpha">
FreeBSD Quality Assurance mailing list">
freebsd-qa">
FreeBSD symmetric multiprocessing mailing list">
freebsd-smp">
diff --git a/en_US.ISO8859-1/share/xml/teams.ent b/en_US.ISO8859-1/share/xml/teams.ent
index 9459a02d6a..8b308e2f0f 100644
--- a/en_US.ISO8859-1/share/xml/teams.ent
+++ b/en_US.ISO8859-1/share/xml/teams.ent
@@ -1,52 +1,54 @@
admins@FreeBSD.org">
bugmeister@FreeBSD.org">
+core@FreeBSD.org">
+
core-secretary@FreeBSD.org">
cvsadm@FreeBSD.org">
cvsup-master@FreeBSD.org">
doceng@FreeBSD.org">
donations@FreeBSD.org">
faq@FreeBSD.org">
ftp-master@FreeBSD.org">
mirror-admin@FreeBSD.org">
ncvs@FreeBSD.org">
perforce-admin@FreeBSD.org">
pcvs@FreeBSD.org">
portmgr@FreeBSD.org">
portmgr-secretary@FreeBSD.org">
projcvs@FreeBSD.org">
re@FreeBSD.org">
security-officer@FreeBSD.org">
diff --git a/fr_FR.ISO8859-1/htdocs/releng/index.xml b/fr_FR.ISO8859-1/htdocs/releng/index.xml
index c93400c082..c939f4fedf 100644
--- a/fr_FR.ISO8859-1/htdocs/releng/index.xml
+++ b/fr_FR.ISO8859-1/htdocs/releng/index.xml
@@ -1,335 +1,335 @@
re@FreeBSD.org'>
security-officer@FreeBSD.org'>
portmgr@FreeBSD.org'>
]>
&title;$FreeBSD$
Cette page contient de la documentation sur le processus de sortie
des versions de FreeBSD.
NOTE : Les dates de sorties sont approximatives et peuvent être sujettes à modification.
30 Janvier 2006: Gel de RELENG_5 et RELENG_6
20 Mars 2006: FreeBSD 6.1
3 Avril 2006: FreeBSD 5.5
12 Juin 2006: Gel de RELENG_6
31 Juillet 2006: FreeBSD 6.2
23 Octobre 2006: Gel de RELENG_6
11 Décembre 2006: FreeBSD 6.3
Statut du gel du code source
Le tableau suivant recense la liste des statuts du gel du code source
pour les principales branches du répertoire src/ du dépôt CVS
FreeBSD. Toute demande de participation dans une branche marquée comme "gelée" doit d'abord
être examinée et approuvée par le contact de l'équipe correspondante. Le statut des
autres arborescences comme ports/, doc/ et www/ est également fourni ci-dessous.
Branche
Statut
Contact
Notes
HEAD
Ouvert
committers
Branche active de développement -CURRENT.
RELENG_6
Ouvert
committers
Branche de développement 6-STABLE.
RELENG_6_0
Gelé
&contact.so;
Branche supportée pour les correctifs de FreeBSD 6.0
Branche supportée pour les correctifs de FreeBSD 4.10.
RELENG_4_9
Gelé
&contact.so;
Branche pour les corrections liées à la sécurité de FreeBSD 4.9 (n'est pas supportée officiellement).
RELENG_4_8
Gelé
&contact.so;
Branche pour les corrections liées à la sécurité de FreeBSD 4.8 (n'est pas supportée officiellement).
RELENG_4_7
Gelé
&contact.so;
Branche pour les corrections liées à la sécurité de FreeBSD 4.7 (n'est pas supportée officiellement).
RELENG_4_6
Gelé
&contact.so;
Branche les corrections liées à la sécurité de FreeBSD 4.6 (n'est pas supportée officiellement).
RELENG_4_5
Gelé
&contact.so;
Branche pour les corrections liées à la sécurité de FreeBSD 4.5 (n'est pas supportée officiellement).
RELENG_4_4
Gelé
&contact.so;
Branche pour les corrections liées à la sécurité de FreeBSD 4.4 (n'est pas supportée officiellement).
RELENG_4_3
Gelé
&contact.so;
Branche pour les corrections liées à la sécurité de FreeBSD 4.3 (n'est pas supportée officiellement).
RELENG_3
Ouvert
committers
Branche de maintenance pour 3-STABLE (n'est pas supportée officiellement).
RELENG_2_2
Ouvert
committers
Branche de maintenance pour 2.2-STABLE (n'est pas supportée officiellement).
Arborescence
Statut
Contact
Notes
ports/
Ouvert
&contact.portmgr;
Collection des Ports FreeBSD.
doc/
Ouvert
freebsd-doc
Ensemble de documentation SGML/XML.
www/
Ouvert
freebsd-doc
Sources du site web FreeBSD.
Documentation à propos de la sortie de nouvelles versions
Processus de création
des versions de FreeBSD
Décrit l'approche utilisée par l'équipe chargée de la création des versions
de FreeBSD pour que ces nouvelles versions soient toujours de la même qualité.
Il décrit les outils disponibles pour les personnes intéressées par la création
d'une version personnalisée de FreeBSD dans le cadre d'une entreprise ou pour
une production commerciale.
Versions de FreeBSD /
Logiciels tiers (paquetages)
Décrit l'approche utilisée par l'équipe chargée de la création des
versions de FreeBSD pour proposer un ensemble de paquetages de grande qualité
adapté au cd-rom de la version officielle de FreeBSD. Ce document est en
cours d'élaboration et, à terme, couvrira le processus utilisé pour compiler
l'ensemble des paquetages sur le "Cluster de Ports" de FreeBSD.org, comment
configurer un groupe de machines pour en faire un "cluster de ports", comment
regrouper les paquetages pour le media utilisé et comment vérifier la cohérence
d'un ensemble de paquetages.
Equipe chargée de la sortie des nouvelles versions
L'équipe principale est chargée d'accepter ou non les requêtes MFC
pendant les périodes où le code source ne doit plus être modifié, d'établir
le calendrier des sorties et de toutes les autres responsabilités décrites dans notre charte.
Equipe principale (re@FreeBSD.org) :
&a.re.members; forment le groupe décisionnaire.
L'équipe de compilation des nouvelles versions est
responsable de la compilation du système et de la
génération des nouvelles versions pour les
plate-formes supportées.
Les logiciels tiers (paquetages) de la collection des ports sont gérés
par l'équipe portmgr@. Les responsables des ports sont notamment chargés
de vérifier que le cluster de ports peut générer les paquetages binaires sans problème.
Où puis-je trouver le répertoire de la version actuelle ou les images ISO
des versions plus anciennes de FreeBSD ?
Le projet FreeBSD ne maintient pas une archive centralisée des images ISO
de précédentes versions mais il existe cependant plusieurs possibilités :
une collection importante d'anciennes versions (dont certaines incluant
des collections complètes de paquetages) se trouve à
ftp://ftp-archive.FreeBSD.org/pub/FreeBSD-Archive/old-releases/.
Ensuite, explorez http://mirrorlist.FreeBSD.org.
Si vous ne trouvez pas un miroir FTP qui contient encore la version
que vous recherchez, vous pouvez envoyer un courrier électronique
aux distributeurs de cédéroms pour savoir s'ils disposent toujours
d'anciennes versions. En septembre 2003, nous avons entendu parler
d'un cas où FreeBSD 1.1 a été utilisé dans un tribunal pour invalider
un brevet logiciel bidon. Les vieilles versions peuvent être clairement
très importantes dans certaines situations.