diff options
Diffstat (limited to 'contrib/amd/doc/am-utils.texi')
-rw-r--r-- | contrib/amd/doc/am-utils.texi | 7816 |
1 files changed, 7816 insertions, 0 deletions
diff --git a/contrib/amd/doc/am-utils.texi b/contrib/amd/doc/am-utils.texi new file mode 100644 index 0000000..ca54503 --- /dev/null +++ b/contrib/amd/doc/am-utils.texi @@ -0,0 +1,7816 @@ +\input texinfo @c -*-texinfo-*- +@c +@c Copyright (c) 1997-1998 Erez Zadok +@c Copyright (c) 1989 Jan-Simon Pendry +@c Copyright (c) 1989 Imperial College of Science, Technology & Medicine +@c Copyright (c) 1989 The Regents of the University of California. +@c All rights reserved. +@c +@c This code is derived from software contributed to Berkeley by +@c Jan-Simon Pendry at Imperial College, London. +@c +@c Redistribution and use in source and binary forms, with or without +@c modification, are permitted provided that the following conditions +@c are met: +@c 1. Redistributions of source code must retain the above copyright +@c notice, this list of conditions and the following disclaimer. +@c 2. Redistributions in binary form must reproduce the above copyright +@c notice, this list of conditions and the following disclaimer in the +@c documentation and/or other materials provided with the distribution. +@c 3. All advertising materials mentioning features or use of this software +@c must display the following acknowledgment: +@c This product includes software developed by the University of +@c California, Berkeley and its contributors. +@c 4. Neither the name of the University nor the names of its contributors +@c may be used to endorse or promote products derived from this software +@c without specific prior written permission. +@c +@c THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +@c ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +@c IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +@c ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +@c FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +@c DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +@c OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +@c HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +@c LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +@c OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +@c +@c %W% (Berkeley) %G% +@c +@c $Id: am-utils.texi,v 6.0 1997/02/09 15:11:50 ezk beta $ +@c +@setfilename am-utils.info + +@include version.texi + +@c info directory entry +@direntry +* Am-utils: (am-utils). The Amd automounter suite of utilities +@end direntry + +@titlepage +@title Am-utils (4.4BSD Automounter Utilities) +@subtitle For version @value{VERSION}, @value{UPDATED} + +@author Erez Zadok +(Originally by Jan-Simon Pendry and Nick Williams) + +@page +Copyright @copyright{} 1997-1998 Erez Zadok +@* +Copyright @copyright{} 1989 Jan-Simon Pendry +@* +Copyright @copyright{} 1989 Imperial College of Science, Technology & Medicine +@* +Copyright @copyright{} 1989 The Regents of the University of California. +@sp +All Rights Reserved. +@vskip 1ex +Permission to copy this document, or any portion of it, as +necessary for use of this software is granted provided this +copyright notice and statement of permission are included. +@end titlepage +@page + +@c Define a new index for options. +@syncodeindex pg cp +@syncodeindex vr cp + +@ifinfo + +@c ################################################################ +@node Top, License, , (DIR) +Am-utils - The 4.4BSD Automounter Tool Suite +********************************************* + +Am-utils is the 4.4BSD Automounter Tool Suite, which includes the Amd +automounter, the Amq query and control program, the Hlfsd daemon, and +other tools. This Info file describes how to use and understand the +tools within Am-utils. +@end ifinfo + +@menu +* License:: Explains the terms and conditions for using + and distributing Am-utils. +* Distrib:: How to get the latest Am-utils distribution. +* Intro:: An introduction to Automounting concepts. +* History:: History of am-utils' development. +* Overview:: An overview of Amd. +* Supported Platforms:: Machines and Systems supported by Amd. +* Mount Maps:: Details of mount maps +* Amd Command Line Options:: All the Amd command line options explained. +* Filesystem Types:: The different mount types supported by Amd. +* Amd Configuration File:: The amd.conf file syntax and meaning. +* Run-time Administration:: How to start, stop and control Amd. +* FSinfo:: The FSinfo filesystem management tool. +* Hlfsd:: The Home-Link Filesystem server. +* Assorted Tools:: Other tools which come with am-utils. +* Examples:: Some examples showing how Amd might be used. +* Internals:: Implementation details. +* Acknowledgments & Trademarks:: Legal Notes + +Indexes +* Index:: An item for each concept. +@end menu + +@iftex +@unnumbered Preface + +This manual documents the use of the 4.4BSD automounter tool suite, +which includes @i{Amd}, @i{Amq}, @i{Hlfsd}, and other programs. This is +primarily a reference manual. While no tutorial exists, there are +examples available. @xref{Examples}. + +This manual comes in two forms: the published form and the Info form. +The Info form is for on-line perusal with the INFO program which is +distributed along with GNU texinfo package (a version of which is +available for GNU Emacs).@footnote{GNU packages can be found in +@url{ftp://ftp.gnu.org/pub/gnu/}.} Both forms contain substantially +the same text and are generated from a common source file, which is +distributed with the @i{Am-utils} source. +@end iftex + +@c ################################################################ +@node License, Distrib, Top, Top +@unnumbered License +@cindex License Information + +@i{Am-utils} is not in the public domain; it is copyrighted and there are +restrictions on its distribution. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +@enumerate + +@item +Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +@item +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. + +@item +All advertising materials mentioning features or use of this software +must display the following acknowledgment: + +@cartouche +``This product includes software developed by the University of +California, Berkeley and its contributors, as well as the Trustees of +Columbia University.'' +@end cartouche + +@item +Neither the name of the University nor the names of its contributors may +be used to endorse or promote products derived from this software +without specific prior written permission. + +@end enumerate + +THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. + +@c ################################################################ +@node Distrib, Intro, License, Top +@unnumbered Source Distribution +@cindex Source code distribution +@cindex Obtaining the source code + +The @i{Am-utils} home page is located in +@example +@url{http://www.cs.columbia.edu/~ezk/am-utils/} +@end example + +You can get the latest distribution version of @i{Am-utils} from +@example +@url{ftp://shekel.mcl.cs.columbia.edu/pub/am-utils/am-utils.tar.gz} +@end example + +Alpha and beta distributions are available in +@example +@url{ftp://shekel.mcl.cs.columbia.edu/pub/am-utils/}. +@end example + +Revision 5.2 was part of the 4.3BSD Reno distribution. + +Revision 5.3bsdnet, a late alpha version of 5.3, was part +of the BSD network version 2 distribution + +Revision 6.0 was made independently by @email{ezk@@cs.columbia.edu,Erez +Zadok} at the @uref{http://www.cs.columbia.edu/,Computer Science +Department} of @uref{http://www.columbia.edu/,Columbia University}, as +part of his @uref{http://www.cs.columbia.edu/~ezk/research/tp/thesis_proposal.html,PhD thesis work}. @xref{History} for more details. + +@unnumberedsec Bug Reports +@cindex Bug reports + +Before reporting a bug, see if it is a known one in the +@uref{http://www.cs.columbia.edu/~ezk/am-utils/BUGS.txt,bugs} file. +Send all bug reports to @email{amd-dev@@majordomo.cs.columbia.edu} +quoting the details of the release and your configuration. These can be +obtained by running the command @samp{amd -v}. It would greatly help if +you could provide a reproducible procedure for detecting the bug you are +reporting. + +Providing working patches is highly encouraged. Every patch +incorporated, however small, will get its author an honorable mention in +the @uref{http://www.cs.columbia.edu/~ezk/am-utils/AUTHORS.txt,authors +file}. + +@unnumberedsec Mailing List +@cindex Mailing list + +There are two mailing lists for people interested in keeping up-to-date +with developments. + +@c ############### + +@enumerate + +@item +The older list, @samp{amd-workers} is for general "how to" questions and +announcements. To subscribe, send a note to +@email{amd-workers-request@@majordomo.glue.umd.edu}.@footnote{Note that +the older address, @email{amd-workers-request@@acl.lanl.gov}, is +defunct.} To post a message to this list, send mail to +@email{amd-workers@@majordomo.glue.umd.edu}. + +@item +The developers only list, @samp{amd-dev} is for + +@itemize @minus +@item +announcements of alpha and beta releases of am-utils +@item +reporting of bugs and patches +@item +discussions of new features for am-utils +@item +implementation and porting issues +@end itemize + +To subscribe, send a note to @email{majordomo@@majordomo.cs.columbia.edu} +with the single body text line @samp{subscribe amd-dev}. To post a +message to this list, send mail to +@email{amd-dev@@majordomo.cs.columbia.edu}. To avoid as much spam as +possible, only subscribers to this list may post to it. + +Subscribers of @samp{amd-dev} are most suitable if they have the time +and resources to test new and buggy versions of amd, on as many +different platforms as possible. They should also be prepared to learn +and use the GNU Autoconf, Automake, and Libtool packages, and of course, +be very familiar with the complex code in the am-utils package. In +other words, subscribers on this list should be able to contribute +meaningfully to the development of amd. + +@end enumerate + +@c ################################################################ +@node Intro, History, Distrib, Top +@unnumbered Introduction +@cindex Introduction + +An @dfn{automounter} maintains a cache of mounted filesystems. +Filesystems are mounted on demand when they are first referenced, +and unmounted after a period of inactivity. + +@i{Amd} may be used as a replacement for Sun's automounter. The choice +of which filesystem to mount can be controlled dynamically with +@dfn{selectors}. Selectors allow decisions of the form ``hostname is +@var{this},'' or ``architecture is not @var{that}.'' Selectors may be +combined arbitrarily. @i{Amd} also supports a variety of filesystem +types, including NFS, UFS and the novel @dfn{program} filesystem. The +combination of selectors and multiple filesystem types allows identical +configuration files to be used on all machines thus reducing the +administrative overhead. + +@i{Amd} ensures that it will not hang if a remote server goes down. +Moreover, @i{Amd} can determine when a remote server has become +inaccessible and then mount replacement filesystems as and when they +become available. + +@i{Amd} contains no proprietary source code and has been ported to +numerous flavors of Unix. + +@c ################################################################ +@node History, Overview, Intro, Top +@unnumbered History +@cindex History + +The @i{Amd} package has been without an official maintainer since 1992. +Several people have stepped in to maintain it unofficially. Most +notable were the `upl' (Unofficial Patch Level) releases of @i{Amd}, +created by me (@email{ezk@@cs.columbia.edu,Erez Zadok}), and available from +@url{ftp://ftp.cs.columbia.edu/pub/amd/}. The last such unofficial +release was `upl102'. + +Through the process of patching and aging, it was becoming more and more +apparent that @i{Amd} was in much need of revitalizing. Maintaining +@i{Amd} had become a difficult task. I took it upon myself to cleanup +the code, so that it would be easier to port to new platforms, add new +features, keep up with the many new feature requests, and deal with the +never ending stream of bug reports. + +I have been working on such a release of @i{Amd} on and off since +January of 1996. The new suite of tools is currently named "am-utils" +(AutoMounter Utilities), in line with GNU naming conventions, befitting +the contents of the package. In October of 1996 I had received enough +offers to help me with this task that I decided to make a mailing list +for this group of people. Around the same time, @i{Amd} had become a +necessary part of my PhD thesis work, resulting in more work performed +on am-utils. + +Am-utils version 6.0 was numbered with a major new release number to +distinguish it from the last official release of @i{Amd} (5.x). Many +new features have been added such as a GNU @code{configure} system, NFS +Version 3, Autofs support, a run-time configuration file (`amd.conf'), +many new ports, more scripts and programs, as well as numerous bug +fixes. Another reason for the new major release number was to alert +users of am-utils that user-visible interfaces may have changed. In +order to make @i{Amd} work well for the next 10 years, and be easier to +maintain, it was necessary to remove old or unused features, change +various syntax files, etc. However, great care was taken to ensure the +maximum possible backwards compatibility. + +@c ################################################################ +@node Overview, Supported Platforms, History, Top +@chapter Overview + +@i{Amd} maintains a cache of mounted filesystems. Filesystems are +@dfn{demand-mounted} when they are first referenced, and unmounted after +a period of inactivity. @i{Amd} may be used as a replacement for Sun's +@b{automount}(8) program. It contains no proprietary source code and +has been ported to numerous flavors of Unix. @xref{Supported +Platforms}.@refill + +@i{Amd} was designed as the basis for experimenting with filesystem +layout and management. Although @i{Amd} has many direct applications it +is loaded with additional features which have little practical use. At +some point the infrequently used components may be removed to streamline +the production system. + +@c @i{Amd} supports the notion of @dfn{replicated} filesystems by evaluating +@c each member of a list of possible filesystem locations in parallel. +@c @i{Amd} checks that each cached mapping remains valid. Should a mapping be +@c lost -- such as happens when a fileserver goes down -- @i{Amd} automatically +@c selects a replacement should one be available. +@c +@menu +* Fundamentals:: +* Filesystems and Volumes:: +* Volume Naming:: +* Volume Binding:: +* Operational Principles:: +* Mounting a Volume:: +* Automatic Unmounting:: +* Keep-alives:: +* Non-blocking Operation:: +@end menu + +@node Fundamentals, Filesystems and Volumes, Overview, Overview +@comment node-name, next, previous, up +@section Fundamentals +@cindex Automounter fundamentals + +The fundamental concept behind @i{Amd} is the ability to separate the +name used to refer to a file from the name used to refer to its physical +storage location. This allows the same files to be accessed with the +same name regardless of where in the network the name is used. This is +very different from placing @file{/n/hostname} in front of the pathname +since that includes location dependent information which may change if +files are moved to another machine. + +By placing the required mappings in a centrally administered database, +filesystems can be re-organized without requiring changes to +configuration files, shell scripts and so on. + +@node Filesystems and Volumes, Volume Naming, Fundamentals, Overview +@comment node-name, next, previous, up +@section Filesystems and Volumes +@cindex Filesystem +@cindex Volume +@cindex Fileserver +@cindex sublink + +@i{Amd} views the world as a set of fileservers, each containing one or +more filesystems where each filesystem contains one or more +@dfn{volumes}. Here the term @dfn{volume} is used to refer to a +coherent set of files such as a user's home directory or a @TeX{} +distribution.@refill + +In order to access the contents of a volume, @i{Amd} must be told in +which filesystem the volume resides and which host owns the filesystem. +By default the host is assumed to be local and the volume is assumed to +be the entire filesystem. If a filesystem contains more than one +volume, then a @dfn{sublink} is used to refer to the sub-directory +within the filesystem where the volume can be found. + +@node Volume Naming, Volume Binding, Filesystems and Volumes, Overview +@comment node-name, next, previous, up +@section Volume Naming +@cindex Volume names +@cindex Network-wide naming +@cindex Replicated volumes +@cindex Duplicated volumes +@cindex Replacement volumes + +Volume names are defined to be unique across the entire network. A +volume name is the pathname to the volume's root as known by the users +of that volume. Since this name uniquely identifies the volume +contents, all volumes can be named and accessed from each host, subject +to administrative controls. + +Volumes may be replicated or duplicated. Replicated volumes contain +identical copies of the same data and reside at two or more locations in +the network. Each of the replicated volumes can be used +interchangeably. Duplicated volumes each have the same name but contain +different, though functionally identical, data. For example, +@samp{/vol/tex} might be the name of a @TeX{} distribution which varied +for each machine architecture.@refill + +@i{Amd} provides facilities to take advantage of both replicated and +duplicated volumes. Configuration options allow a single set of +configuration data to be shared across an entire network by taking +advantage of replicated and duplicated volumes. + +@i{Amd} can take advantage of replacement volumes by mounting them as +required should an active fileserver become unavailable. + +@node Volume Binding, Operational Principles, Volume Naming, Overview +@comment node-name, next, previous, up +@section Volume Binding +@cindex Volume binding +@cindex Unix namespace +@cindex Namespace +@cindex Binding names to filesystems + +Unix implements a namespace of hierarchically mounted filesystems. Two +forms of binding between names and files are provided. A @dfn{hard +link} completes the binding when the name is added to the filesystem. A +@dfn{soft link} delays the binding until the name is accessed. An +@dfn{automounter} adds a further form in which the binding of name to +filesystem is delayed until the name is accessed.@refill + +The target volume, in its general form, is a tuple (host, filesystem, +sublink) which can be used to name the physical location of any volume +in the network. + +When a target is referenced, @i{Amd} ignores the sublink element and +determines whether the required filesystem is already mounted. This is +done by computing the local mount point for the filesystem and checking +for an existing filesystem mounted at the same place. If such a +filesystem already exists then it is assumed to be functionally +identical to the target filesystem. By default there is a one-to-one +mapping between the pair (host, filesystem) and the local mount point so +this assumption is valid. + +@node Operational Principles, Mounting a Volume, Volume Binding, Overview +@comment node-name, next, previous, up +@section Operational Principles +@cindex Operational principles + +@i{Amd} operates by introducing new mount points into the namespace. +These are called @dfn{automount} points. The kernel sees these +automount points as NFS filesystems being served by @i{Amd}. Having +attached itself to the namespace, @i{Amd} is now able to control the +view the rest of the system has of those mount points. RPC calls are +received from the kernel one at a time. + +When a @dfn{lookup} call is received @i{Amd} checks whether the name is +already known. If it is not, the required volume is mounted. A +symbolic link pointing to the volume root is then returned. Once the +symbolic link is returned, the kernel will send all other requests +direct to the mounted filesystem. + +If a volume is not yet mounted, @i{Amd} consults a configuration +@dfn{mount-map} corresponding to the automount point. @i{Amd} then +makes a runtime decision on what and where to mount a filesystem based +on the information obtained from the map. + +@i{Amd} does not implement all the NFS requests; only those relevant +to name binding such as @dfn{lookup}, @dfn{readlink} and @dfn{readdir}. +Some other calls are also implemented but most simply return an error +code; for example @dfn{mkdir} always returns ``read-only filesystem''. + +@node Mounting a Volume, Automatic Unmounting, Operational Principles, Overview +@comment node-name, next, previous, up +@section Mounting a Volume +@cindex Mounting a volume +@cindex Location lists +@cindex Alternate locations +@cindex Mount retries +@cindex Background mounts + +Each automount point has a corresponding mount map. The mount map +contains a list of key--value pairs. The key is the name of the volume +to be mounted. The value is a list of locations describing where the +filesystem is stored in the network. In the source for the map the +value would look like + +@display +location1 location2 @dots{} locationN +@end display + +@i{Amd} examines each location in turn. Each location may contain +@dfn{selectors} which control whether @i{Amd} can use that location. +For example, the location may be restricted to use by certain hosts. +Those locations which cannot be used are ignored. + +@i{Amd} attempts to mount the filesystem described by each remaining +location until a mount succeeds or @i{Amd} can no longer proceed. The +latter can occur in three ways: + +@itemize @bullet +@item +If none of the locations could be used, or if all of the locations +caused an error, then the last error is returned. + +@item +If a location could be used but was being mounted in the background then +@i{Amd} marks that mount as being ``in progress'' and continues with +the next request; no reply is sent to the kernel. + +@item +Lastly, one or more of the mounts may have been @dfn{deferred}. A mount +is deferred if extra information is required before the mount can +proceed. When the information becomes available the mount will take +place, but in the mean time no reply is sent to the kernel. If the +mount is deferred, @i{Amd} continues to try any remaining locations. +@end itemize + +Once a volume has been mounted, @i{Amd} establishes a @dfn{volume +mapping} which is used to satisfy subsequent requests.@refill + +@node Automatic Unmounting, Keep-alives, Mounting a Volume, Overview +@comment node-name, next, previous, up +@section Automatic Unmounting + +To avoid an ever increasing number of filesystem mounts, @i{Amd} removes +volume mappings which have not been used recently. A time-to-live +interval is associated with each mapping and when that expires the +mapping is removed. When the last reference to a filesystem is removed, +that filesystem is unmounted. If the unmount fails, for example the +filesystem is still busy, the mapping is re-instated and its +time-to-live interval is extended. The global default for this grace +period is controlled by the @code{-w} command-line option (@pxref{-w +Option, -w}) or the @i{amd.conf} parameter @samp{dismount_interval} +(@pxref{dismount_interval Parameter}). It is also possible to set this +value on a per-mount basis (@pxref{opts Option, opts, opts}). + +Filesystems can be forcefully timed out using the @i{Amq} command. +@xref{Run-time Administration}. + +@node Keep-alives, Non-blocking Operation, Automatic Unmounting, Overview +@comment node-name, next, previous, up +@section Keep-alives +@cindex Keep-alives +@cindex Server crashes +@cindex NFS ping + +Use of some filesystem types requires the presence of a server on +another machine. If a machine crashes then it is of no concern to +processes on that machine that the filesystem is unavailable. However, +to processes on a remote host using that machine as a fileserver this +event is important. This situation is most widely recognized when an +NFS server crashes and the behavior observed on client machines is that +more and more processes hang. In order to provide the possibility of +recovery, @i{Amd} implements a @dfn{keep-alive} interval timer for some +filesystem types. Currently only NFS makes use of this service. + +The basis of the NFS keep-alive implementation is the observation that +most sites maintain replicated copies of common system data such as +manual pages, most or all programs, system source code and so on. If +one of those servers goes down it would be reasonable to mount one of +the others as a replacement. + +The first part of the process is to keep track of which fileservers are +up and which are down. @i{Amd} does this by sending RPC requests to the +servers' NFS @code{NullProc} and checking whether a reply is returned. +While the server state is uncertain the requests are re-transmitted at +three second intervals and if no reply is received after four attempts +the server is marked down. If a reply is received the fileserver is +marked up and stays in that state for 30 seconds at which time another +NFS ping is sent. + +Once a fileserver is marked down, requests continue to be sent every 30 +seconds in order to determine when the fileserver comes back up. During +this time any reference through @i{Amd} to the filesystems on that +server fail with the error ``Operation would block''. If a replacement +volume is available then it will be mounted, otherwise the error is +returned to the user. + +@c @i{Amd} keeps track of which servers are up and which are down. +@c It does this by sending RPC requests to the servers' NFS {\sc NullProc} and +@c checking whether a reply is returned. If no replies are received after a +@c short period, @i{Amd} marks the fileserver @dfn{down}. +@c RPC requests continue to be sent so that it will notice when a fileserver +@c comes back up. +@c ICMP echo packets \cite{rfc:icmp} are not used because it is the availability +@c of the NFS service that is important, not the existence of a base kernel. +@c Whenever a reference to a fileserver which is down is made via @i{Amd}, an alternate +@c filesystem is mounted if one is available. +@c +Although this action does not protect user files, which are unique on +the network, or processes which do not access files via @i{Amd} or +already have open files on the hung filesystem, it can prevent most new +processes from hanging. + +By default, fileserver state is not maintained for NFS/TCP mounts. The +remote fileserver is always assumed to be up. +@c +@c With a suitable combination of filesystem management and mount-maps, +@c machines can be protected against most server downtime. This can be +@c enhanced by allocating boot-servers dynamically which allows a diskless +@c workstation to be quickly restarted if necessary. Once the root filesystem +@c is mounted, @i{Amd} can be started and allowed to mount the remainder of +@c the filesystem from whichever fileservers are available. + +@node Non-blocking Operation, , Keep-alives, Overview +@comment node-name, next, previous, up +@section Non-blocking Operation +@cindex Non-blocking operation +@cindex Multiple-threaded server +@cindex RPC retries + +Since there is only one instance of @i{Amd} for each automount point, +and usually only one instance on each machine, it is important that it +is always available to service kernel calls. @i{Amd} goes to great +lengths to ensure that it does not block in a system call. As a last +resort @i{Amd} will fork before it attempts a system call that may block +indefinitely, such as mounting an NFS filesystem. Other tasks such as +obtaining filehandle information for an NFS filesystem, are done using a +purpose built non-blocking RPC library which is integrated with +@i{Amd}'s task scheduler. This library is also used to implement NFS +keep-alives (@pxref{Keep-alives}). + +Whenever a mount is deferred or backgrounded, @i{Amd} must wait for it +to complete before replying to the kernel. However, this would cause +@i{Amd} to block waiting for a reply to be constructed. Rather than do +this, @i{Amd} simply @dfn{drops} the call under the assumption that the +kernel RPC mechanism will automatically retry the request. + +@c ################################################################ +@node Supported Platforms, Mount Maps, Overview, Top +@comment node-name, next, previous, up +@chapter Supported Platforms +@cindex Supported Platforms +@cindex shared libraries +@cindex NFS V.3 support + +@i{Am-utils} has been ported to a wide variety of machines and operating +systems. @i{Am-utils}'s code works for little-endian and big-endian +machines, as well as 32 bit and 64 bit architectures. Furthermore, when +@i{Am-utils} ports to an Operating System on one architecture, it is generally +readily portable to the same Operating System on all platforms on which +it is available. + +The table below lists those platforms supported by the latest release. +The listing is based on the standard output from GNU's +@code{config.guess} script. Since significant changes have been made to +am-utils, not all systems listed here have been verified working for all +features. + +@multitable {Auto-Configured System Name} {Config} {Compile} {Amd} {NFS3} {Shlib} {Hlfsd} + +@item @b{Auto-Configured System Name} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab @b{Config} @tab @b{Compile} @tab @b{Amd} @tab @b{NFS3} @tab @b{Shlib} @tab @b{Hlfsd} + +@item @b{alpha-dec-osf2.1} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab @tab @tab + +@item @b{alpha-dec-osf4.0} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab yes @tab @tab + +@item @b{alphaev5-unknown-linux-gnu} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab yes @tab + +@item @b{hppa1.0-hp-hpux11.00} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab no @tab @tab + +@item @b{hppa1.1-hp-hpux10.10} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab no @tab + +@item @b{hppa1.1-hp-hpux10.20} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab no @tab + +@item @b{hppa1.1-hp-hpux9.01} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{hppa1.1-hp-hpux9.05} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{hppa1.1-hp-hpux9.07} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{i386-pc-bsdi2.1} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{i386-pc-bsdi3.0} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{i386-pc-bsdi3.1} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{i386-pc-solaris2.5.1} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab yes @tab yes @tab yes + +@item @b{i386-pc-solaris2.6} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab yes @tab yes @tab yes + +@item @b{i386-unknown-freebsd2.1.0} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{i386-unknown-freebsd2.2.1} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab yes @tab + +@item @b{i386-unknown-freebsd3.0} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab yes @tab yes @tab + +@item @b{i386-unknown-netbsd1.2.1} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab yes @tab yes @tab + +@item @b{i386-unknown-netbsd1.3} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab yes @tab yes @tab + +@item @b{i386-unknown-netbsd1.3.1} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab yes @tab yes @tab + +@item @b{i386-unknown-openbsd2.1} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab yes @tab yes @tab + +@item @b{i486-ncr-sysv4.3.03} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab @tab yes @tab @tab + +@item @b{i486-pc-linux-gnulibc1} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab yes @tab + +@item @b{i586-pc-linux-gnulinc1} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab yes @tab + +@item @b{i686-pc-linux-gnu} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab yes @tab + +@item @b{m68k-hp-hpux9.00} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{m68k-sun-sunos4.1.1} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{m68k-next-nextstep3} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{mips-dec-ultrix4.3} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{mips-sgi-irix5.2} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab @tab @tab @tab @tab @tab + +@item @b{mips-sgi-irix5.3} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab yes @tab @tab + +@item @b{mips-sgi-irix6.2} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab yes @tab @tab + +@item @b{mips-sgi-irix6.4} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab yes @tab yes @tab + +@item @b{powerpc-ibm-aix4.1.5.0} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{powerpc-ibm-aix4.2.1.0} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab yes @tab @tab + +@item @b{rs6000-ibm-aix3.2} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{rs6000-ibm-aix3.2.5} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{rs6000-ibm-aix4.1.4.0} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{rs6000-ibm-aix4.1.5.0} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{sparc-sun-solaris2.3} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab @tab + +@item @b{sparc-sun-solaris2.4} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab yes @tab + +@item @b{sparc-sun-solaris2.5} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab yes @tab yes @tab + +@item @b{sparc-sun-solaris2.5.1} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab yes @tab yes @tab yes + +@item @b{sparc-sun-solaris2.6} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab yes @tab yes @tab yes + +@item @b{sparc-sun-sunos4.1.1} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab yes @tab + +@item @b{sparc-sun-sunos4.1.3} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab yes @tab + +@item @b{sparc-sun-sunos4.1.3C} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab yes @tab + +@item @b{sparc-sun-sunos4.1.3_U1} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab yes @tab + +@item @b{sparc-sun-sunos4.1.4} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab yes @tab + +@item @b{sparc-unknown-linux-gnulibc1} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab n/a @tab yes @tab + +@item @b{sparc-unknown-netbsd1.2E} +@c {Config} {Compile} {Amd} {NFS V.3} {Shlib} {Hlfsd} +@tab yes @tab yes @tab yes @tab @tab @tab + +@end multitable + +See the @file{INSTALL} in the distribution for more specific details on +building and/or configuring for some systems. + +@c ################################################################ +@node Mount Maps, Amd Command Line Options, Supported Platforms, Top +@comment node-name, next, previous, up +@chapter Mount Maps +@cindex Mount maps +@cindex Automounter configuration maps +@cindex Mount information + +@i{Amd} has no built-in knowledge of machines or filesystems. +External @dfn{mount-maps} are used to provide the required information. +Specifically, @i{Amd} needs to know when and under what conditions it +should mount filesystems. + +The map entry corresponding to the requested name contains a list of +possible locations from which to resolve the request. Each location +specifies filesystem type, information required by that filesystem (for +example the block special device in the case of UFS), and some +information describing where to mount the filesystem (@pxref{fs Option}). A +location may also contain @dfn{selectors} (@pxref{Selectors}).@refill + +@menu +* Map Types:: +* Key Lookup:: +* Location Format:: +@end menu + +@node Map Types, Key Lookup, Mount Maps, Mount Maps +@comment node-name, next, previous, up +@section Map Types +@cindex Mount map types +@cindex Map types +@cindex Configuration map types +@cindex Types of mount map +@cindex Types of configuration map +@cindex Determining the map type + +A mount-map provides the run-time configuration information to @i{Amd}. +Maps can be implemented in many ways. Some of the forms supported by +@i{Amd} are regular files, ndbm databases, NIS maps, the @dfn{Hesiod} +name server, and even the password file. + +A mount-map @dfn{name} is a sequence of characters. When an automount +point is created a handle on the mount-map is obtained. For each map +type configured, @i{Amd} attempts to reference the map of the +appropriate type. If a map is found, @i{Amd} notes the type for future +use and deletes the reference, for example closing any open file +descriptors. The available maps are configured when @i{Amd} is built +and can be displayed by running the command @samp{amd -v}. + +When using an @i{Amd} configuration file (@pxref{Amd Configuration File}) +and the keyword @samp{map_type} (@pxref{map_type Parameter}), you may +force the map used to any type. + +By default, @i{Amd} caches data in a mode dependent on the type of map. +This is the same as specifying @samp{cache:=mapdefault} and selects a +suitable default cache mode depending on the map type. The individual +defaults are described below. The @var{cache} option can be specified +on automount points to alter the caching behavior (@pxref{Automount +Filesystem}).@refill + +The following map types have been implemented, though some are not +available on all machines. Run the command @samp{amd -v} to obtain a +list of map types configured on your machine. + +@menu +* File maps:: +* ndbm maps:: +* NIS maps:: +* NIS+ maps:: +* Hesiod maps:: +* Password maps:: +* Union maps:: +* LDAP maps:: +@end menu + +@node File maps, ndbm maps, Map Types, Map Types +@comment node-name, next, previous, up +@subsection File maps +@cindex File maps +@cindex Flat file maps +@cindex File map syntactic conventions + +When @i{Amd} searches a file for a map entry it does a simple scan of +the file and supports both comments and continuation lines. + +Continuation lines are indicated by a backslash character (@samp{\}) as +the last character of a line in the file. The backslash, newline character +@emph{and any leading white space on the following line} are discarded. A maximum +line length of 2047 characters is enforced after continuation lines are read +but before comments are stripped. Each line must end with +a newline character; that is newlines are terminators, not separators. +The following examples illustrate this: + +@example +key valA valB; \ + valC +@end example + +specifies @emph{three} locations, and is identical to + +@example +key valA valB; valC +@end example + +However, + +@example +key valA valB;\ + valC +@end example + +specifies only @emph{two} locations, and is identical to + +@example +key valA valB;valC +@end example + +After a complete line has been read from the file, including +continuations, @i{Amd} determines whether there is a comment on the +line. A comment begins with a hash (``@samp{#}'') character and +continues to the end of the line. There is no way to escape or change +the comment lead-in character. + +Note that continuation lines and comment support @dfn{only} apply to +file maps, or ndbm maps built with the @code{mk-amd-map} program. + +When caching is enabled, file maps have a default cache mode of +@code{all} (@pxref{Automount Filesystem}). + +@node ndbm maps, NIS maps, File maps, Map Types +@comment node-name, next, previous, up +@subsection ndbm maps +@cindex ndbm maps + +An ndbm map may be used as a fast access form of a file map. The program, +@code{mk-amd-map}, converts a normal map file into an ndbm database. +This program supports the same continuation and comment conventions that +are provided for file maps. Note that ndbm format files may @emph{not} +be sharable across machine architectures. The notion of speed generally +only applies to large maps; a small map, less than a single disk block, +is almost certainly better implemented as a file map. + +ndbm maps have a default cache mode of @samp{all} (@pxref{Automount Filesystem}). + +@node NIS maps, NIS+ maps, ndbm maps, Map Types +@comment node-name, next, previous, up +@subsection NIS maps +@cindex NIS (YP) maps + +When using NIS (formerly YP), an @i{Amd} map is implemented directly +by the underlying NIS map. Comments and continuation lines are +@emph{not} supported in the automounter and must be stripped when +constructing the NIS server's database. + +NIS maps have a default cache mode of @code{all} (@pxref{Automount +Filesystem}). + +The following rule illustrates what could be added to your NIS @file{Makefile}, +in this case causing the @file{amd.home} map to be rebuilt: +@example +$(YPTSDIR)/amd.home.time: $(ETCDIR)/amd.home + -@@sed -e "s/#.*$$//" -e "/^$$/d" $(ETCDIR)/amd.home | \ + awk '@{ \ + for (i = 1; i <= NF; i++) \ + if (i == NF) @{ \ + if (substr($$i, length($$i), 1) == "\\") \ + printf("%s", substr($$i, 1, length($$i) - 1)); \ + else \ + printf("%s\n", $$i); \ + @} \ + else \ + printf("%s ", $$i); \ + @}' | \ + $(MAKEDBM) - $(YPDBDIR)/amd.home; \ + touch $(YPTSDIR)/amd.home.time; \ + echo "updated amd.home"; \ + if [ ! $(NOPUSH) ]; then \ + $(YPPUSH) amd.home; \ + echo "pushed amd.home"; \ + else \ + : ; \ + fi +@end example + +Here @code{$(YPTSDIR)} contains the time stamp files, and @code{$(YPDBDIR)} contains +the dbm format NIS files. + +@node NIS+ maps, Hesiod maps, NIS maps, Map Types +@comment node-name, next, previous, up +@subsection NIS+ maps +@cindex NIS+ maps + +NIS+ maps do not support cache mode @samp{all} and, when caching is +enabled, have a default cache mode of @samp{inc}. + +XXX: FILL IN WITH AN EXAMPLE. + +@node Hesiod maps, Password maps, NIS+ maps, Map Types +@comment node-name, next, previous, up +@subsection Hesiod maps +@cindex Hesiod maps + +When the map name begins with the string @samp{hesiod.} lookups are made +using the @dfn{Hesiod} name server. The string following the dot is +used as a name qualifier and is prepended with the key being located. +The entire string is then resolved in the @code{automount} context, or +the @i{amd.conf} parameter @samp{hesiod_base} (@pxref{hesiod_base +Parameter}). For example, if the the key is @samp{jsp} and map name is +@samp{hesiod.homes} then @dfn{Hesiod} is asked to resolve +@samp{jsp.homes.automount}. + +Hesiod maps do not support cache mode @samp{all} and, when caching is +enabled, have a default cache mode of @samp{inc} (@pxref{Automount +Filesystem}). + +The following is an example of a @dfn{Hesiod} map entry: + +@example +jsp.homes.automount HS TXT "rfs:=/home/charm;rhost:=charm;sublink:=jsp" +njw.homes.automount HS TXT "rfs:=/home/dylan/dk2;rhost:=dylan;sublink:=njw" +@end example + +@node Password maps, Union maps, Hesiod maps, Map Types +@comment node-name, next, previous, up +@subsection Password maps +@cindex Password file maps +@cindex /etc/passwd maps +@cindex User maps, automatic generation +@cindex Automatic generation of user maps +@cindex Using the password file as a map + +The password map support is unlike the four previous map types. When +the map name is the string @file{/etc/passwd} @i{Amd} can lookup a user +name in the password file and re-arrange the home directory field to +produce a usable map entry. + +@i{Amd} assumes the home directory has the format +`@t{/}@i{anydir}@t{/}@i{dom1}@t{/../}@i{domN}@t{/}@i{login}'. +@c @footnote{This interpretation is not necessarily exactly what you want.} +It breaks this string into a map entry where @code{$@{rfs@}} has the +value `@t{/}@i{anydir}@t{/}@i{domN}', @code{$@{rhost@}} has the value +`@i{domN}@t{.}@i{...}@t{.}@i{dom1}', and @code{$@{sublink@}} has the +value @i{login}.@refill + +Thus if the password file entry was + +@example +/home/achilles/jsp +@end example + +the map entry used by @i{Amd} would be + +@example +rfs:=/home/achilles;rhost:=achilles;sublink:=jsp +@end example + +Similarly, if the password file entry was + +@example +/home/cc/sugar/mjh +@end example + +the map entry used by @i{Amd} would be + +@example +rfs:=/home/sugar;rhost:=sugar.cc;sublink:=jsp +@end example + +@node Union maps, LDAP maps , Password maps, Map Types +@comment node-name, next, previous, up +@subsection Union maps +@cindex Union file maps + +The union map support is provided specifically for use with the union +filesystem, @pxref{Union Filesystem}. + +It is identified by the string @samp{union:} which is followed by a +colon separated list of directories. The directories are read in order, +and the names of all entries are recorded in the map cache. Later +directories take precedence over earlier ones. The union filesystem +type then uses the map cache to determine the union of the names in all +the directories. + +@node LDAP maps, , Union maps, Map Types +@comment node-name, next, previous, up +@subsection LDAP maps +@cindex LDAP maps +@cindex Lightweight Directory Access Protocol + +LDAP (Lightweight Directory Access Protocol) maps do not support cache +mode @samp{all} and, when caching is enabled, have a default cache mode +of @samp{inc}. + +For example, an @i{Amd} map @samp{amd.home} that looks as follows: + +@example +/defaults opts:=rw,intr;type:=link + +zing -rhost:=shekel \ + host==shekel \ + host!=shekel;type:=nfs +@end example +@noindent +when converted to LDAP (@pxref{amd2ldif}), will result in the following +LDAP database: +@example +$ amd2ldif amd.home CUCS < amd.home +dn: cn=amdmap timestamp, CUCS +cn : amdmap timestamp +objectClass : amdmapTimestamp +amdmapTimestamp: 873071363 + +dn: cn=amdmap amd.home[/defaults], CUCS +cn : amdmap amd.home[/defaults] +objectClass : amdmap +amdmapName : amd.home +amdmapKey : /defaults +amdmapValue : opts:=rw,intr;type:=link + +dn: cn=amdmap amd.home[], CUCS +cn : amdmap amd.home[] +objectClass : amdmap +amdmapName : amd.home +amdmapKey : +amdmapValue : + +dn: cn=amdmap amd.home[zing], CUCS +cn : amdmap amd.home[zing] +objectClass : amdmap +amdmapName : amd.home +amdmapKey : zing +amdmapValue : -rhost:=shekel host==shekel host!=shekel;type:=nfs +@end example + +@c subsection Gdbm + +@node Key Lookup, Location Format, Map Types, Mount Maps +@comment node-name, next, previous, up +@section How keys are looked up +@cindex Key lookup +@cindex Map lookup +@cindex Looking up keys +@cindex How keys are looked up +@cindex Wildcards in maps + +The key is located in the map whose type was determined when the +automount point was first created. In general the key is a pathname +component. In some circumstances this may be modified by variable +expansion (@pxref{Variable Expansion}) and prefixing. If the automount +point has a prefix, specified by the @var{pref} option, then that is +prepended to the search key before the map is searched. + +If the map cache is a @samp{regexp} cache then the key is treated as an +egrep-style regular expression, otherwise a normal string comparison is +made. + +If the key cannot be found then a @dfn{wildcard} match is attempted. +@i{Amd} repeatedly strips the basename from the key, appends @samp{/*} and +attempts a lookup. Finally, @i{Amd} attempts to locate the special key @samp{*}. + +For example, the following sequence would be checked if @file{home/dylan/dk2} was +being located: + +@example + home/dylan/dk2 + home/dylan/* + home/* + * +@end example + +At any point when a wildcard is found, @i{Amd} proceeds as if an exact +match had been found and the value field is then used to resolve the +mount request, otherwise an error code is propagated back to the kernel. +(@pxref{Filesystem Types}).@refill + +@node Location Format, , Key Lookup, Mount Maps +@comment node-name, next, previous, up +@section Location Format +@cindex Location format +@cindex Map entry format +@cindex How locations are parsed + +The value field from the lookup provides the information required to +mount a filesystem. The information is parsed according to the syntax +shown below. + +@display +@i{location-list}: + @i{location-selection} + @i{location-list} @i{white-space} @t{||} @i{white-space} @i{location-selection} +@i{location-selection}: + @i{location} + @i{location-selection} @i{white-space} @i{location} +@i{location}: + @i{location-info} + @t{-}@i{location-info} + @t{-} +@i{location-info}: + @i{sel-or-opt} + @i{location-info}@t{;}@i{sel-or-opt} + @t{;} +@i{sel-or-opt}: + @i{selection} + @i{opt-ass} +@i{selection}: + selector@t{==}@i{value} + selector@t{!=}@i{value} +@i{opt-ass}: + option@t{:=}@i{value} +@i{white-space}: + space + tab +@end display + +Note that unquoted whitespace is not allowed in a location description. +White space is only allowed, and is mandatory, where shown with non-terminal +@i{white-space}. + +A @dfn{location-selection} is a list of possible volumes with which to +satisfy the request. @dfn{location-selection}s are separated by the +@samp{||} operator. The effect of this operator is to prevent use of +location-selections to its right if any of the location-selections on +its left were selected whether or not any of them were successfully +mounted (@pxref{Selectors}).@refill + +The location-selection, and singleton @dfn{location-list}, +@samp{type:=ufs;dev:=/dev/xd1g} would inform @i{Amd} to mount a UFS +filesystem from the block special device @file{/dev/xd1g}. + +The @dfn{sel-or-opt} component is either the name of an option required +by a specific filesystem, or it is the name of a built-in, predefined +selector such as the architecture type. The value may be quoted with +double quotes @samp{"}, for example +@samp{type:="ufs";dev:="/dev/xd1g"}. These quotes are stripped when the +value is parsed and there is no way to get a double quote into a value +field. Double quotes are used to get white space into a value field, +which is needed for the program filesystem (@pxref{Program Filesystem}).@refill + +@menu +* Map Defaults:: +* Variable Expansion:: +* Selectors:: +* Map Options:: +@end menu + +@node Map Defaults, Variable Expansion, Location Format, Location Format +@comment node-name, next, previous, up +@subsection Map Defaults +@cindex Map defaults +@cindex How to set default map parameters +@cindex Setting default map parameters + +A location beginning with a dash @samp{-} is used to specify default +values for subsequent locations. Any previously specified defaults in +the location-list are discarded. The default string can be empty in +which case no defaults apply. + +The location @samp{-fs:=/mnt;opts:=ro} would set the local mount point +to @file{/mnt} and cause mounts to be read-only by default. Defaults +specified this way are appended to, and so override, any global map +defaults given with @samp{/defaults}). + +@c +@c A @samp{/defaults} value @dfn{gdef} and a location list +@c \begin{quote} +@c $@samp{-}@dfn{def}_a $\verb*+ +$ @dfn{loc}_{a_1} $\verb*+ +$ @dfn{loc}_{a_2} $\verb*+ +$ @samp{-}@dfn{def}_b $\verb*+ +$ @dfn{loc}_{b_1} \ldots$ +@c \end{quote} +@c is equivalent to +@c \begin{quote} +@c $@samp{-}@dfn{gdef}@samp{;}@dfn{def}_a $\verb*+ +$ @dfn{loc}_{a_1} $\verb*+ +$ @dfn{loc}_{a_2} $\verb*+ +$ @samp{-}@dfn{gdef}@samp{;}@dfn{def}_b $\verb*+ +$ @dfn{loc}_{b_1} \ldots$ +@c \end{quote} +@c which is equivalent to +@c \begin{quote} +@c $@dfn{gdef}@samp{;}@dfn{def}_a@samp{;}@dfn{loc}_{a_1} $\verb*+ +$@dfn{gdef}@samp{;}@dfn{def}_a@samp{;}@dfn{loc}_{a_2} $\verb*+ +$@dfn{gdef}@samp{;}@dfn{def}_b@samp{;}@dfn{loc}_{b_1} \ldots$ +@c \end{quote} + +@node Variable Expansion, Selectors, Map Defaults, Location Format +@comment node-name, next, previous, up +@subsection Variable Expansion +@cindex Variable expansion +@cindex How variables are expanded +@cindex Pathname operators +@cindex Domain stripping +@cindex Domainname operators +@cindex Stripping the local domain name +@cindex Environment variables +@cindex How to access environment variables in maps + +To allow generic location specifications @i{Amd} does variable expansion +on each location and also on some of the option strings. Any option or +selector appearing in the form @code{$@dfn{var}} is replaced by the +current value of that option or selector. For example, if the value of +@code{$@{key@}} was @samp{bin}, @code{$@{autodir@}} was @samp{/a} and +@code{$@{fs@}} was `@t{$@{autodir@}}@t{/local/}@t{$@{key@}}' then +after expansion @code{$@{fs@}} would have the value @samp{/a/local/bin}. +Any environment variable can be accessed in a similar way.@refill + +Two pathname operators are available when expanding a variable. If the +variable name begins with @samp{/} then only the last component of the +pathname is substituted. For example, if @code{$@{path@}} was +@samp{/foo/bar} then @code{$@{/path@}} would be expanded to @samp{bar}. +Similarly, if the variable name ends with @samp{/} then all but the last +component of the pathname is substituted. In the previous example, +@code{$@{path/@}} would be expanded to @samp{/foo}.@refill + +Two domain name operators are also provided. If the variable name +begins with @samp{.} then only the domain part of the name is +substituted. For example, if @code{$@{rhost@}} was +@samp{swan.doc.ic.ac.uk} then @code{$@{.rhost@}} would be expanded to +@samp{doc.ic.ac.uk}. Similarly, if the variable name ends with @samp{.} +then only the host component is substituted. In the previous example, +@code{$@{rhost.@}} would be expanded to @samp{swan}.@refill + +Variable expansion is a two phase process. Before a location is parsed, +all references to selectors, @i{eg} @code{$@{path@}}, are expanded. The +location is then parsed, selections are evaluated and option assignments +recorded. If there were no selections or they all succeeded the +location is used and the values of the following options are expanded in +the order given: @var{sublink}, @var{rfs}, @var{fs}, @var{opts}, +@var{remopts}, @var{mount} and @var{unmount}. + +Note that expansion of option values is done after @dfn{all} assignments +have been completed and not in a purely left to right order as is done +by the shell. This generally has the desired effect but care must be +taken if one of the options references another, in which case the +ordering can become significant. + +There are two special cases concerning variable expansion: + +@enumerate +@item +before a map is consulted, any selectors in the name received +from the kernel are expanded. For example, if the request from the +kernel was for `@t{$@{arch@}}@t{.bin}' and the machine architecture +was @samp{vax}, the value given to @code{$@{key@}} would be +@samp{vax.bin}.@refill + +@item +the value of @code{$@{rhost@}} is expanded and normalized before the +other options are expanded. The normalization process strips any local +sub-domain components. For example, if @code{$@{domain@}} was +@samp{Berkeley.EDU} and @code{$@{rhost@}} was initially +@samp{snow.Berkeley.EDU}, after the normalization it would simply be +@samp{snow}. Hostname normalization is currently done in a +@emph{case-dependent} manner.@refill +@end enumerate + +@c====================================================================== +@node Selectors, Map Options, Variable Expansion, Location Format +@comment node-name, next, previous, up +@subsection Selectors +@cindex Selectors + +Selectors are used to control the use of a location. It is possible to +share a mount map between many machines in such a way that filesystem +location, architecture and operating system differences are hidden from +the users. A selector of the form @samp{arch==sun3;os==sunos4} would only +apply on Sun-3s running SunOS 4.x. + +Selectors can be negated by using @samp{!=} instead of @samp{==}. For +example to select a location on all non-Vax machines the selector +@samp{arch!=vax} would be used. + +Selectors are evaluated left to right. If a selector fails then that +location is ignored. Thus the selectors form a conjunction and the +locations form a disjunction. If all the locations are ignored or +otherwise fail then @i{Amd} uses the @dfn{error} filesystem +(@pxref{Error Filesystem}). This is equivalent to having a location +@samp{type:=error} at the end of each mount-map entry.@refill + +The default value of many of the selectors listed here can be overridden +by an @i{Amd} command line switch or in an @i{Amd} configuration file. +@xref{Amd Configuration File}. + +These are the selectors currently implemented. + +@menu +* arch Selector Variable:: +* autodir Selector Variable:: +* byte Selector Variable:: +* cluster Selector Variable:: +* domain Selector Variable:: +* host Selector Variable:: +* hostd Selector Variable:: +* karch Selector Variable:: +* os Selector Variable:: +* osver Selector Variable:: + +* key Selector Variable:: +* map Selector Variable:: +* netnumber Selector Variable:: +* network Selector Variable:: +* path Selector Variable:: +* wire Selector Variable:: + +* exists Selector Function:: +* false Selector Function:: +* netgrp Selector Function:: +* in_network Selector Function:: +* true Selector Function:: +@end menu + +@c ---------------------------------------------------------------- +@node arch Selector Variable, autodir Selector Variable, Selectors, Selectors +@comment node-name, next, previous, up +@subsubsection arch Selector Variable +@cindex arch Selector Variable +@cindex arch, mount selector +@cindex Mount selector; arch +@cindex Selector; arch + +The machine architecture which was automatically determined at compile +time. The architecture type can be displayed by running the command +@samp{amd -v}. @xref{Supported Platforms}.@refill + +@c ---------------------------------------------------------------- +@node autodir Selector Variable, byte Selector Variable, arch Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection autodir Selector Variable +@cindex autodir Selector Variable +@cindex autodir, mount selector +@cindex Mount selector; autodir +@cindex Selector; autodir + +The default directory under which to mount filesystems. This may be +changed by the @code{-a} command line option. @xref{fs Option}. + +@c ---------------------------------------------------------------- +@node byte Selector Variable, cluster Selector Variable, autodir Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection byte Selector Variable +@cindex byte Selector Variable +@cindex byte, mount selector +@cindex Mount selector; byte +@cindex Selector; byte + +The machine's byte ordering. This is either @samp{little}, indicating +little-endian, or @samp{big}, indicating big-endian. One possible use +is to share @samp{rwho} databases (@pxref{rwho servers}). Another is to +share ndbm databases, however this use can be considered a courageous +juggling act. + +@c ---------------------------------------------------------------- +@node cluster Selector Variable, domain Selector Variable, byte Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection cluster Selector Variable +@cindex cluster Selector Variable +@cindex cluster, mount selector +@cindex Mount selector; cluster +@cindex Selector; cluster + +This is provided as a hook for the name of the local cluster. This can +be used to decide which servers to use for copies of replicated +filesystems. @code{$@{cluster@}} defaults to the value of +@code{$@{domain@}} unless a different value is set with the @code{-C} +command line option. + +@c ---------------------------------------------------------------- +@node domain Selector Variable, host Selector Variable, cluster Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection domain Selector Variable +@cindex domain Selector Variable +@cindex domain, mount selector +@cindex Mount selector; domain +@cindex Selector; domain + +The local domain name as specified by the @code{-d} command line option. +@xref{host Selector Variable}. + +@c ---------------------------------------------------------------- +@node host Selector Variable, hostd Selector Variable, domain Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection host Selector Variable +@cindex host Selector Variable +@cindex host, mount selector +@cindex Mount selector; host +@cindex Selector; host + +The local hostname as determined by @b{gethostname}(2). If no domain +name was specified on the command line and the hostname contains a +period @samp{.} then the string before the period is used as the host +name, and the string after the period is assigned to @code{$@{domain@}}. +For example, if the hostname is @samp{styx.doc.ic.ac.uk} then +@code{host} would be @samp{styx} and @code{domain} would be +@samp{doc.ic.ac.uk}. @code{hostd} would be +@samp{styx.doc.ic.ac.uk}.@refill + +@c ---------------------------------------------------------------- +@node hostd Selector Variable, karch Selector Variable, host Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection hostd Selector Variable +@cindex hostd Selector Variable +@cindex hostd, mount selector +@cindex Mount selector; hostd +@cindex Selector; hostd + +This resolves to the @code{$@{host@}} and @code{$@{domain@}} +concatenated with a @samp{.} inserted between them if required. If +@code{$@{domain@}} is an empty string then @code{$@{host@}} and +@code{$@{hostd@}} will be identical. + +@c ---------------------------------------------------------------- +@node karch Selector Variable, os Selector Variable, hostd Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection karch Selector Variable +@cindex karch Selector Variable +@cindex karch, mount selector +@cindex Mount selector; karch +@cindex Selector; karch + +This is provided as a hook for the kernel architecture. This is used on +SunOS 4 and SunOS 5, for example, to distinguish between different +@samp{/usr/kvm} volumes. @code{$@{karch@}} defaults to the ``machine'' +value gotten from @b{uname}(2). If the @b{uname}(2) system call is not +available, the value of @code{$@{karch@}} defaults to that of +@code{$@{arch@}}. Finally, a different value can be set with the @code{-k} +command line option. + +@c ---------------------------------------------------------------- +@node os Selector Variable, osver Selector Variable, karch Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection os Selector Variable +@cindex os Selector Variable +@cindex os, mount selector +@cindex Mount selector; os +@cindex Selector; os + +The operating system. Like the machine architecture, this is +automatically determined at compile time. The operating system name can +be displayed by running the command @samp{amd -v}. @xref{Supported +Platforms}.@refill + +@c ---------------------------------------------------------------- +@node osver Selector Variable, key Selector Variable, os Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection osver Selector Variable +@cindex osver Selector Variable +@cindex osver, mount selector +@cindex Mount selector; osver +@cindex Selector; osver + +The operating system version. Like the machine architecture, this is +automatically determined at compile time. The operating system name can +be displayed by running the command @samp{amd -v}. @xref{Supported +Platforms}.@refill + +@c ---------------------------------------------------------------- +@ifhtml +<HR> +@end ifhtml +@sp 3 +The following selectors are also provided. Unlike the other selectors, +they vary for each lookup. Note that when the name from the kernel is +expanded prior to a map lookup, these selectors are all defined as empty +strings. + +@c ---------------------------------------------------------------- +@node key Selector Variable, map Selector Variable, osver Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection key Selector Variable +@cindex key Selector Variable +@cindex key, mount selector +@cindex Mount selector; key +@cindex Selector; key + +The name being resolved. For example, if @file{/home} is an automount +point, then accessing @file{/home/foo} would set @code{$@{key@}} to the +string @samp{foo}. The key is prefixed by the @var{pref} option set in +the parent mount point. The default prefix is an empty string. If the +prefix was @file{blah/} then @code{$@{key@}} would be set to +@file{blah/foo}.@refill + +@c ---------------------------------------------------------------- +@node map Selector Variable, netnumber Selector Variable, key Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection map Selector Variable +@cindex map Selector Variable +@cindex map, mount selector +@cindex Mount selector; map +@cindex Selector; map + +The name of the mount map being used. + +@c ---------------------------------------------------------------- +@node netnumber Selector Variable, network Selector Variable, map Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection netnumber Selector Variable +@cindex netnumber Selector Variable +@cindex netnumber, mount selector +@cindex Mount selector; netnumber +@cindex Selector; netnumber + +This selector is identical to the @samp{in_network} selector function, +see @ref{in_network Selector Function}. It will match either the name +or number of @i{any} network interface on which this host is connected +to. The names and numbers of all attached interfaces are available from +the output of @samp{amd -v}. + +@c ---------------------------------------------------------------- +@node network Selector Variable, path Selector Variable, netnumber Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection network Selector Variable +@cindex network Selector Variable +@cindex network, mount selector +@cindex Mount selector; network +@cindex Selector; network + +This selector is identical to the @samp{in_network} selector function, +see @ref{in_network Selector Function}. It will match either the name +or number of @i{any} network interface on which this host is connected +to. The names and numbers of all attached interfaces are available from +the output of @samp{amd -v}. + +@c ---------------------------------------------------------------- +@node path Selector Variable, wire Selector Variable, network Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection path Selector Variable +@cindex path Selector Variable +@cindex path, mount selector +@cindex Mount selector; path +@cindex Selector; path + +The full pathname of the name being resolved. For example +@file{/home/foo} in the example above. + +@c ---------------------------------------------------------------- +@node wire Selector Variable, exists Selector Function, path Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection wire Selector Variable +@cindex wire Selector Variable +@cindex wire, mount selector +@cindex Mount selector; wire +@cindex Selector; wire + +This selector is identical to the @samp{in_network} selector function, +see @ref{in_network Selector Function}. It will match either the name +or number of @i{any} network interface on which this host is connected +to. The names and numbers of all attached interfaces are available from +the output of @samp{amd -v}. + +@c ---------------------------------------------------------------- +@ifhtml +<HR> +@end ifhtml +@sp 2 +The following boolean functions are selectors which take an argument +@i{ARG}. They return a value of true or false, and thus do not need to +be compared with a value. Each of these may be negated by prepending +@samp{!} to their name. + +@c ---------------------------------------------------------------- +@node exists Selector Function, false Selector Function, wire Selector Variable, Selectors +@comment node-name, next, previous, up +@subsubsection exists Selector Function +@cindex exists Selector Function +@cindex exists, boolean mount selector +@cindex !exists, boolean mount selector +@cindex Mount selector; exists +@cindex Selector; exists + +If the file listed by @i{ARG} exists (via @b{lstat}(2)), this function +evaluates to true. Otherwise it evaluates to false. + +@c ---------------------------------------------------------------- +@node false Selector Function, netgrp Selector Function, exists Selector Function, Selectors +@comment node-name, next, previous, up +@subsubsection false Selector Function +@cindex false Selector Function +@cindex false, boolean mount selector +@cindex !false, boolean mount selector +@cindex Mount selector; false +@cindex Selector; false + +Always evaluates to false. @i{ARG} is ignored. + +@c ---------------------------------------------------------------- +@node netgrp Selector Function, in_network Selector Function, false Selector Function, Selectors +@comment node-name, next, previous, up +@subsubsection netgrp Selector Function +@cindex netgrp Selector Function +@cindex netgrp, boolean mount selector +@cindex !netgrp, boolean mount selector +@cindex Mount selector; netgrp +@cindex Selector; netgrp + +If the current host as determined by the value of @code{$@{host@}} is a +member of the netgroup @i{ARG}, this selector evaluates to true. +Otherwise it evaluates to false. + +For example, suppose you have a netgroup @samp{ppp-hosts}, and for +reasons of performance, these have a local @file{/home} partition, while +all other clients on the faster network can access a shared home +directory. A common map to use for both might look like the following: + +@example +home/* netgrp(ppp-hosts);type:=link;fs:=/local/$@{key@} \ + !netgrp(ppp-hosts);type:=nfs;rhost=serv1;rfs:=/remote/$@{key@} +@end example + +@c ---------------------------------------------------------------- +@node in_network Selector Function, true Selector Function, netgrp Selector Function, Selectors +@comment node-name, next, previous, up +@subsubsection in_network Selector Function +@cindex in_network Selector Function +@cindex in_network, boolean mount selector +@cindex !in_network, boolean mount selector +@cindex Mount selector; in_network +@cindex Selector; in_network + +If the current host has any network interface that is locally attached +to the network specified in @i{ARG} (either via name or number), this +selector evaluates to true. Otherwise it evaluates to false. + +For example, suppose you have two servers that have an exportable +@file{/opt} that smaller clients can NFS mount. The two servers are +say, @samp{serv1} on network @samp{foo-net.site.com} and @samp{serv2} on +network @samp{123.4.5.0}. You can write a map to be used by all clients +that will attempt to mount the closest one as follows: + +@example +opt in_network(foo-net.site.com);rhost:=serv1;rfs:=/opt \ + in_network(123.4.5.0);rhost:=serv2;rfs:=/opt \ + rhost:=fallback-server +@end example + +@c ---------------------------------------------------------------- +@node true Selector Function, , in_network Selector Function, Selectors +@comment node-name, next, previous, up +@subsubsection true Selector Function +@cindex true Selector Function +@cindex true, boolean mount selector +@cindex !true, boolean mount selector +@cindex Mount selector; true +@cindex Selector; true + +Always evaluates to true. @i{ARG} is ignored. + +@c ================================================================ +@node Map Options, , Selectors, Location Format +@comment node-name, next, previous, up +@subsection Map Options +@cindex Map options +@cindex Setting map options + +Options are parsed concurrently with selectors. The difference is that +when an option is seen the string following the @samp{:=} is +recorded for later use. As a minimum the @var{type} option must be +specified. Each filesystem type has other options which must also be +specified. @xref{Filesystem Types}, for details on the filesystem +specific options.@refill + +Superfluous option specifications are ignored and are not reported +as errors. + +The following options apply to more than one filesystem type. + +@menu +* addopts Option:: +* delay Option:: +* fs Option:: +* opts Option:: +* remopts Option:: +* sublink Option:: +* type Option:: +@end menu + +@node addopts Option, delay Option, Map Options, Map Options +@comment node-name, next, previous, up +@subsubsection addopts Option +@cindex Setting additional options on a mount location +@cindex Overriding or adding options to a mount +@cindex addopts, mount option +@cindex Mount option; addopts + +This option adds additional options to default options normally +specified in the @samp{/defaults} entry or the defaults of the key entry +being processed (@xref{opts Option}). Normally when you specify +@samp{opts} in both the @samp{/defaults} and the map entry, the latter +overrides the former completely. But with @samp{addopts} it will +append the options and override any conflicting ones. + +Options which start with @samp{no} will override those with the same +name that do not start with @samp{no} and vice verse. Special handling +is given to inverted options such as @samp{soft} and @samp{hard}, +@samp{bg} and @samp{fg}, @samp{ro} and @samp{rw}, etc. + +For example, if the default options specified were +@example +opts:=rw,nosuid,intr,rsize=1024,wsize=1024,quota,posix +@end example + +and the ones specified in a map entry were + +@example +addopts:=grpid,suid,ro,rsize=2048,quota,nointr +@end example + +then the actual options used would be + +@example +wsize=1024,posix,grpid,suid,ro,rsize=2048,quota,nointr +@end example + +@node delay Option, fs Option, addopts Option, Map Options +@comment node-name, next, previous, up +@subsubsection delay Option +@cindex Setting a delay on a mount location +@cindex Delaying mounts from specific locations +@cindex Primary server +@cindex Secondary server +@cindex delay, mount option +@cindex Mount option; delay + +The delay, in seconds, before an attempt will be made to mount from the +current location. Auxiliary data, such as network address, file handles +and so on are computed regardless of this value. + +A delay can be used to implement the notion of primary and secondary +file servers. The secondary servers would have a delay of a few +seconds, thus giving the primary servers a chance to respond first. + +@node fs Option, opts Option, delay Option, Map Options +@comment node-name, next, previous, up +@subsubsection fs Option +@cindex Setting the local mount point +@cindex Overriding the default mount point +@cindex fs, mount option +@cindex Mount option; fs + +The local mount point. The semantics of this option vary between +filesystems. + +For NFS and UFS filesystems the value of @code{$@{fs@}} is used as the +local mount point. For other filesystem types it has other meanings +which are described in the section describing the respective filesystem +type. It is important that this string uniquely identifies the +filesystem being mounted. To satisfy this requirement, it should +contain the name of the host on which the filesystem is resident and the +pathname of the filesystem on the local or remote host. + +The reason for requiring the hostname is clear if replicated filesystems +are considered. If a fileserver goes down and a replacement filesystem +is mounted then the @dfn{local} mount point @dfn{must} be different from +that of the filesystem which is hung. Some encoding of the filesystem +name is required if more than one filesystem is to be mounted from any +given host. + +If the hostname is first in the path then all mounts from a particular +host will be gathered below a single directory. If that server goes +down then the hung mount points are less likely to be accidentally +referenced, for example when @b{getcwd}(3) traverses the namespace to +find the pathname of the current directory. + +The @samp{fs} option defaults to +@code{$@{autodir@}/$@{rhost@}$@{rfs@}}. In addition, +@samp{rhost} defaults to the local host name (@code{$@{host@}}) and +@samp{rfs} defaults to the value of @code{$@{path@}}, which is the full +path of the requested file; @samp{/home/foo} in the example above +(@pxref{Selectors}). @code{$@{autodir@}} defaults to @samp{/a} but may +be changed with the @code{-a} command line option. Sun's automounter +defaults to @samp{/tmp_mnt}. Note that there is no @samp{/} between +the @code{$@{rhost@}} and @code{$@{rfs@}} since @code{$@{rfs@}} begins +with a @samp{/}.@refill + +@node opts Option, remopts Option, fs Option, Map Options +@comment node-name, next, previous, up +@subsubsection opts Option +@cindex Setting system mount options +@cindex Passing parameters to the mount system call +@cindex mount system call +@cindex mount system call flags +@cindex The mount system call +@cindex opts, mount option +@cindex Mount option; opts + +The options to pass to the mount system call. A leading @samp{-} is +silently ignored. The mount options supported generally correspond to +those used by @b{mount}(8) and are listed below. Some additional +pseudo-options are interpreted by @i{Amd} and are also listed. + +Unless specifically overridden, each of the system default mount options +applies. Any options not recognized are ignored. If no options list is +supplied the string @samp{rw,defaults} is used and all the system +default mount options apply. Options which are not applicable for a +particular operating system are silently ignored. For example, only 4.4BSD +is known to implement the @code{compress} and @code{spongy} options. + +@table @code + +@item acdirmax=@var{n} +@cindex Mount flags; acdirmax +Set the maximum directory attribute cache timeout to @var{n}. + +@item acdirmin=@var{n} +@cindex Mount flags; acdirmin +Set the minimum directory attribute cache timeout to @var{n}. + +@item acregmax=@var{n} +@cindex Mount flags; acregmax +Set the maximum file attribute cache timeout to @var{n}. + +@item acregmin=@var{n} +@cindex Mount flags; acregmin +Set the minimum file attribute cache timeout to @var{n}. + +@item actimeo=@var{n} +@cindex Mount flags; actimeo +Set the overall attribute cache timeout to @var{n}. + +@item auto +@cindex Mount flags; auto +@itemx ignore +@cindex Mount flags; ignore +Ignore this mount by @b{df}(1). + +@item cache +@cindex Mount flags; cache +Allow data to be cached from a remote server for this mount. + +@item compress +@cindex Mount flags; compress +Use NFS compression protocol. + +@item defperm +@cindex Mount flags; defperm +Ignore the permission mode bits, and default file permissions to 0555, +UID 0, and GID 0. Useful for CD-ROMs formatted as ISO-9660. + +@item dev +@cindex Mount flags; dev +Allow local special devices on this filesystem. + +@item dumbtimr +@cindex Mount flags; dumbtimr +(XXX: a dumb timer?) + +@item fsid +@cindex Mount flags; fsid +Set ID of filesystem. + +@item grpid +@cindex Mount flags; grpid +Use BSD directory group-id semantics. + +@item int +@cindex Mount flags; int +@itemx intr +@cindex Mount flags; intr +Allow keyboard interrupts on hard mounts. + +@item multi +@cindex Mount flags; multi +Perform multi-component lookup on files. + +@item maxgroups +@cindex Mount flags; maxgroups +Set the maximum number of groups to allow for this mount. + +@item nfsv3 +@cindex Mount flags; nfsv3 +Use NFS Version 3 for this mount. + +@item noac +@cindex Mount flags; noac +Turn off the attribute cache. + +@item noauto +@cindex Mount flags; noauto +(XXX: No automatic what?) + +@item nocache +@cindex Mount flags; nocache +Do not allow data to be cached from a remote server for this +mount. + +@item noconn +@cindex Mount flags; noconn +Don't make a connection on datagram transports. + +@item nocto +@cindex Mount flags; nocto +No close-to-open consistency. + +@item nodefperm +@cindex Mount flags; nodefperm +Do not ignore the permission mode bits. Useful for CD-ROMS formatted as +ISO-9660. + +@item nodev +@cindex Mount flags; nodev +@itemx nodevs +@cindex Mount flags; nodevs +Don't allow local special devices on this filesystem. + +@item noint +@cindex Mount flags; noint +Do not allow keyboard interrupts for this mount + +@item nosub +@cindex Mount flags; nosub +Disallow mounts beneath this mount. + +@item nosuid +@cindex Mount flags; nosuid +Don't allow set-uid or set-gid executables on this filesystem. + +@item noversion +@cindex Mount flags; noversion +Strip the extension @samp{;#} from the version string of files recorded +on an ISO-9660 CD-ROM. + +@item overlay +@cindex Mount flags; overlay +Overlay this mount on top of an existing mount, if any. + +@item pgthresh=@var{n} +@cindex Mount flags; pgthresh +Set the paging threshold to @var{n} kilobytes. + +@item port=@var{n} +@cindex Mount flags; port +Set the NFS port to @var{n}. + +@item posix +@cindex Mount flags; posix +Turn on POSIX static pathconf for mounts. + +@item proto=@var{s} +@cindex Mount flags; proto +Use transport protocol @var{s} for NFS (can be @code{"tcp"} or @code{"udp"}). + +@item quota +@cindex Mount flags; quota +Enable quota checking on this mount. + +@item rdonly +@cindex Mount flags; rdonly +@itemx ro +@cindex Mount flags; ro +Mount this filesystem readonly. + +@item resvport +@cindex Mount flags; resvport +Use a reserved port (smaller than 1024) for remote NFS mounts. Most +systems assume that, but some allow for mounts to occur on non-reserved +ports. This causes problems when such a system tries to NFS mount one +that requires reserved ports. It is recommended that this option always +be on. + +@item retrans=@i{n} +@cindex Mount flags; retrans +The number of NFS retransmits made before a user error is generated by a +@samp{soft} mounted filesystem, and before a @samp{hard} mounted +filesystem reports @samp{NFS server @dfn{yoyo} not responding still +trying}. + +@item retry +@cindex Mount flags; retry +Set the NFS retry counter. + +@item rrip +@cindex Mount flags; rrip +Uses the Rock Ridge Interchange Protocol (RRIP) extensions to ISO-9660. + +@item rsize=@var{n} +@cindex Mount flags; rsize +The NFS read packet size. You may need to set this if you are using +NFS/UDP through a gateway or a slow link. + +@item rw +@cindex Mount flags; rw +Allow reads and writes on this filesystem. + +@item soft +@cindex Mount flags; soft +Give up after @dfn{retrans} retransmissions. + +@item spongy +@cindex Mount flags; spongy +Like @samp{soft} for status requests, and @samp{hard} for data transfers. + +@item suid +@cindex Mount flags; suid +Allow set-uid programs on this mount. + +@item symttl +@cindex Mount flags; symttl +Turn of the symbolic link cache time-to-live. + +@item sync +@cindex Mount flags; sync +Perform synchronous filesystem operations on this mount. + +@item tcp +@cindex Mount flags; tcp +Use TCP/IP instead of UDP/IP, ignored if the NFS implementation does not +support TCP/IP mounts. + +@item timeo=@var{n} +@cindex Mount flags; timeo +The NFS timeout, in tenth-seconds, before a request is retransmitted. + +@item vers=@var{n} +@cindex Mount flags; vers + Use NFS protocol version number @var{n} (can be 2 or 3). + +@item wsize=@var{n} +@cindex Mount flags; wsize +The NFS write packet size. You may need to set this if you are using +NFS/UDP through a gateway or a slow link. + +@end table + +The following options are implemented by @i{Amd}, rather than being +passed to the kernel. + +@table @code + +@item nounmount +@cindex Mount flags; nounmount +Configures the mount so that its time-to-live will +never expire. This is also the default for some filesystem types. +@c +@c Implementation broken: + +@item ping=@var{n} +@cindex Mount flags; ping +The interval, in seconds, between keep-alive pings. When four +consecutive pings have failed the mount point is marked as hung. This +interval defaults to 30 seconds. If the ping interval is less than zero, +no pings are sent and the host is assumed to be always +up. By default, pings are not sent for an NFS/TCP mount. + +@item retry=@var{n} +@cindex Mount flags; retry=@var{n} +The number of times to retry the mount system call. + +@item utimeout=@var{n} +@cindex Mount flags; utimeout=@var{n} +The interval, in seconds, by which the mount's +time-to-live is extended after an unmount attempt +has failed. In fact the interval is extended before the unmount is +attempted to avoid thrashing. The default value is 120 seconds (two +minutes) or as set by the @code{-w} command line option. + +@end table + +@node remopts Option, sublink Option, opts Option, Map Options +@comment node-name, next, previous, up +@subsubsection remopts Option +@cindex Setting system mount options for non-local networks +@cindex remopts, mount option +@cindex Mount option; remopts + +This option has the same use as @code{$@{opts@}} but applies only when +the remote host is on a non-local network. For example, when using NFS +across a gateway it is often necessary to use smaller values for the +data read and write sizes. This can simply be done by specifying the +small values in @var{remopts}. When a non-local host is accessed, the +smaller sizes will automatically be used. + +@i{Amd} determines whether a host is local by examining the network +interface configuration at startup. Any interface changes made after +@i{Amd} has been started will not be noticed. The likely effect will +be that a host may incorrectly be declared non-local. + +Unless otherwise set, the value of @code{$@{remopts@}} is the same as +the value of @code{$@{opts@}}. + +@node sublink Option, type Option, remopts Option, Map Options +@comment node-name, next, previous, up +@subsubsection sublink Option +@cindex Setting the sublink option +@cindex sublink, mount option +@cindex Mount option; sublink + +The subdirectory within the mounted filesystem to which the reference +should point. This can be used to prevent duplicate mounts in cases +where multiple directories in the same mounted filesystem are used. + +@node type Option, , sublink Option, Map Options +@comment node-name, next, previous, up +@subsubsection type Option +@cindex Setting the filesystem type option +@cindex type, mount option +@cindex Mount option; type + +The filesystem type to be used. @xref{Filesystem Types}, for a full +description of each type.@refill + +@c ################################################################ +@node Amd Command Line Options, Filesystem Types, Mount Maps, Top +@comment node-name, next, previous, up +@chapter @i{Amd} Command Line Options +@cindex Command line options, Amd +@cindex Amd command line options +@cindex Overriding defaults on the command line + +Many of @i{Amd}'s parameters can be set from the command line. The +command line is also used to specify automount points and maps. + +The general format of a command line is + +@example +amd [@i{options}] [@{ @i{directory} @i{map-name} [-@i{map-options}] @} ...] +@end example + +For each directory and map-name given or specified in the +@file{amd.conf} file, @i{Amd} establishes an automount point. The +@dfn{map-options} may be any sequence of options or +selectors---@pxref{Location Format}. The @dfn{map-options} apply only +to @i{Amd}'s mount point. + +@samp{type:=toplvl;cache:=mapdefault;fs:=$@{map@}} is the default value for the +map options. Default options for a map are read from a special entry in +the map whose key is the string @samp{/defaults}. When default options +are given they are prepended to any options specified in the mount-map +locations as explained in @ref{Map Defaults}. + +The @dfn{options} are any combination of those listed below. + +Once the command line has been parsed, the automount points are mounted. +The mount points are created if they do not already exist, in which case they +will be removed when @i{Amd} exits. +Finally, @i{Amd} disassociates itself from its controlling terminal and +forks into the background. + +Note: Even if @i{Amd} has been built with @samp{-DDEBUG} (via +@code{configure --enable-debug}), it will still background itself and +disassociate itself from the controlling terminal. To use a debugger it +is necessary to specify @samp{-D nodaemon} on the command line. +However, even with all of this, mounts and unmounts are performed in the +background, and @i{Amd} will always fork before doing them. Therefore, +debugging what happens closely during un/mounts is more challenging. + +@emph{All} of @i{Amd}'s command options (save @code{-F} and @code{-T}) +can be specified in the @file{amd.conf} file. @xref{Amd Configuration +File}. If @i{Amd} is invoked without any command line options, it will +default to using the configuration file @file{/etc/amd.conf}, if one +exists. + +@menu +* -a Option:: Automount directory. +* -c Option:: Cache timeout interval. +* -d Option:: Domain name. +* -k Option:: Kernel architecture. +* -l Option:: Log file. +* -n Option:: Hostname normalization. +* -o Option:: Operating system version. +* -p Option:: Output process id. +* -r Option:: Restart existing mounts. +* -t Option:: Kernel RPC timeout. +* -v Option:: Version information. +* -w Option:: Wait interval after failed unmount. +* -x Option:: Log options. +* -y Option:: NIS domain. +* -C-Option:: Cluster name. +* -D-Option:: Debug flags. +* -F Option:: Amd configuration file. +* -H Option:: Show brief help. +* -O-Option:: Operating system name. +* -S Option:: Lock executable pages in memory. +* -T-Option:: Set tag for configuration file. +@end menu + +@c ---------------------------------------------------------------- +@node -a Option, -c Option, Amd Command Line Options, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-a} @var{directory} +@cindex Automount directory +@cindex Setting the default mount directory + +Specifies the default mount directory. This option changes the variable +@code{$@{autodir@}} which otherwise defaults to @file{/a}. For example, +some sites prefer @file{/amd} or @file{/n}. + +@example +amd -a /amd ... +@end example + +@c ---------------------------------------------------------------- +@node -c Option, -d Option, -a Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-c} @var{cache-interval} +@cindex Cache interval +@cindex Interval before a filesystem times out +@cindex Setting the interval before a filesystem times out +@cindex Changing the interval before a filesystem times out + +Selects the period, in seconds, for which a name is cached by @i{Amd}. +If no reference is made to the volume in this period, @i{Amd} discards +the volume name to filesystem mapping. + +Once the last reference to a filesystem has been removed, @i{Amd} +attempts to unmount the filesystem. If the unmount fails the interval +is extended by a further period as specified by the @samp{-w} command +line option or by the @samp{utimeout} mount option. + +The default @dfn{cache-interval} is 300 seconds (five minutes). + +@c ---------------------------------------------------------------- +@node -d Option, -k Option, -c Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-d} @var{domain} +@cindex Domain name +@cindex Setting the local domain name +@cindex Overriding the local domain name + +Specifies the host's domain. This sets the internal variable +@code{$@{domain@}} and affects the @code{$@{hostd@}} variable. + +If this option is not specified and the hostname already contains the +local domain then that is used, otherwise the default value of +@code{$@{domain@}} is @samp{unknown.domain}. + +For example, if the local domain was @samp{doc.ic.ac.uk}, @i{Amd} could +be started as follows: + +@example +amd -d doc.ic.ac.uk ... +@end example + +@c ---------------------------------------------------------------- +@node -k Option, -l Option, -d Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-k} @var{kernel-architecture} +@cindex Setting the Kernel architecture + +Specifies the kernel architecture of the system. This is usually the +output of @samp{uname -m} (the ``machine'' value gotten from +@b{uname}(2)). If the @b{uname}(2) system call is not available, the +value of @code{$@{karch@}} defaults to that of @code{$@{arch@}}. + +The only effect of this option is to set the variable @code{$@{karch@}}. + +This option would be used as follows: + +@example +amd -k `arch -k` ... +@end example + +@c ---------------------------------------------------------------- +@node -l Option, -n Option, -k Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-l} @var{log-option} +@cindex Log filename +@cindex Setting the log file +@cindex Using syslog to log errors +@cindex syslog + +Selects the form of logging to be made. Several special @dfn{log-options} +are recognized. + +@enumerate +@item +If @dfn{log-option} is the string @samp{syslog}, @i{Amd} will use the +@b{syslog}(3) mechanism. If your system supports syslog facilities, then +the default facility used is @samp{LOG_DAEMON}. + +@item +@cindex syslog facility; specifying an alternate +When using syslog, if you wish to change the facility, append its name +to the log option name, delimited by a single colon. For example, if +@dfn{log-options} is the string @samp{syslog:local7} then @b{Amd} will +log messages via @b{syslog}(3) using the @samp{LOG_LOCAL7} facility. If +the facility name specified is not recognized, @i{Amd} will default to +@samp{LOG_DAEMON}. Note: while you can use any syslog facility +available on your system, it is generally a bad idea to use those +reserved for other services such as @samp{kern}, @samp{lpr}, +@samp{cron}, etc. + +@item +If @dfn{log-option} is the string @samp{/dev/stderr}, @i{Amd} will use +standard error, which is also the default target for log messages. To +implement this, @i{Amd} simulates the effect of the @samp{/dev/fd} +driver. +@end enumerate + +Any other string is taken as a filename to use for logging. Log +messages are appended to the file if it already exists, otherwise a new +file is created. The file is opened once and then held open, rather +than being re-opened for each message. + +Normally, when long-running daemons hold an open file descriptor on a +log file, it is impossible to ``rotate'' the log file and compress older +logs on a daily basis. The daemon needs to be told to discard (via +@b{close}(2)) its file handle, and re-open the log file. This is done +using @code{amq -l} @i{log-option}. @xref{Amq -l option}. + +If the @samp{syslog} option is specified but the system does not support +syslog or if the named file cannot be opened or created, @i{Amd} will +use standard error. Error messages generated before @i{Amd} has +finished parsing the command line are printed on standard error. + +Since @i{Amd} tends to generate a lot of logging information (especially +if debugging was turned on), and due to it being an important program +running on the system, it is usually best to log to a separate disk +file. In that case @i{Amd} would be started as follows: + +@example +amd -l /var/log/amd ... +@end example + +@c ---------------------------------------------------------------- +@node -n Option, -o Option, -l Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-n} +@cindex Hostname normalization +@cindex Aliased hostnames +@cindex Resolving aliased hostnames +@cindex Normalizing hostnames + +Normalizes the remote hostname before using it. Normalization is done +by replacing the value of @code{$@{rhost@}} with the (generally fully +qualified) primary name returned by a hostname lookup. + +This option should be used if several names are used to refer to a +single host in a mount map. + +@c ---------------------------------------------------------------- +@node -o Option, -p Option, -n Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-o} @var{op-sys-ver} +@cindex Operating System version +@cindex Setting the Operating System version + +Override the compiled-in version number of the operating system, with +@var{op-sys-ver}. Useful when the built-in version is not desired for +backward compatibility reasons. For example, if the built-in version is +@samp{2.5.1}, you can override it to @samp{5.5.1}, and use older maps +that were written with the latter in mind. + +@c ---------------------------------------------------------------- +@node -p Option, -r Option, -o Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-p} +@cindex Process id +@cindex Displaying the process id +@cindex process id of Amd daemon +@cindex pid file, creating with -p option +@cindex Creating a pid file + +Causes @i{Amd}'s process id to be printed on standard output. +This can be redirected to a suitable file for use with kill: + +@example +amd -p > /var/run/amd.pid ... +@end example + +This option only has an affect if @i{Amd} is running in daemon mode. +If @i{Amd} is started with the @code{-D nodaemon} debug flag, this +option is ignored. + +@c ---------------------------------------------------------------- +@node -r Option, -t Option, -p Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-r} +@cindex Restarting existing mounts +@cindex Picking up existing mounts + +Tells @i{Amd} to restart existing mounts (@pxref{Inheritance Filesystem}). +@c @dfn{This option will be made the default in the next release.} + +@c ---------------------------------------------------------------- +@node -t Option, -v Option, -r Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-t} @var{timeout.retransmit} +@cindex Setting Amd's RPC parameters + +Specifies the RPC @dfn{timeout} and @dfn{retransmit} intervals used by +the kernel to communicate to @i{Amd}. These are used to set the +@samp{timeo} and @samp{retrans} mount options. + +@i{Amd} relies on the kernel RPC retransmit mechanism to trigger mount +retries. The value of this parameter changes the retry interval. Too +long an interval gives poor interactive response, too short an interval +causes excessive retries. + +@c ---------------------------------------------------------------- +@node -v Option, -w Option, -t Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-v} +@cindex Version information +@cindex Discovering version information +@cindex How to discover your version of Amd + +Print version information on standard error and then exit. The output +is of the form: + +@example +Copyright (c) 1997-1998 Erez Zadok +Copyright (c) 1990 Jan-Simon Pendry +Copyright (c) 1990 Imperial College of Science, Technology & Medicine +Copyright (c) 1990 The Regents of the University of California. +am-utils version 6.0a15 (build 61). +Built by ezk@@cs.columbia.edu on date Wed Oct 22 15:21:03 EDT 1997. +cpu=sparc (big-endian), arch=sun4, karch=sun4u. +full_os=solaris2.5.1, os=sos5, osver=5.5.1, vendor=sun. +Map support for: root, passwd, union, nisplus, nis, ndbm, file, error. +AMFS: nfs, link, nfsx, nfsl, host, linkx, program, union, inherit, + ufs, lofs, hsfs, pcfs, auto, direct, toplvl, error. +FS: autofs, cachefs, cdfs, lofs, nfs, nfs3, pcfs, tfs, tmpfs, ufs. +Network 1: wire="mcl-lab-net.cs.columbia.edu" (netnumber=128.59.13). +Network 2: wire="14-net.cs.columbia.edu" (netnumber=128.59.14). +Network 3: wire="old-net.cs.columbia.edu" (netnumber=128.59.16). +@end example + +The information includes the version number, number of times @i{Amd} was +compiled on the local system, release date and name of the release. +Following come the cpu type, byte ordering, and the architecture and +kernel architecture as @code{$@{arch@}} and @code{$@{karch@}}, +respectively. The next line lists the full name of the system, the +variables @code{$@{os@}} and @code{$@{osver@}}, and the vendor's +name. @xref{Supported Platforms}. + +Then come a list of map types supported, filesystems internally +supported by @i{Amd} (AMFS), and generic filesystems available (FS). +Finally all known networks (if any) of this host are listed by name +and number. They are available via the variables +@code{$@{wire@}} or @code{$@{network@}}, and +@code{$@{netnumber@}} (@pxref{Selectors}) or the @samp{in_network} +selector function (@pxref{in_network Selector Function}). + +@c ---------------------------------------------------------------- +@node -w Option, -x Option, -v Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-w} @var{wait-timeout} +@cindex Setting the interval between unmount attempts +@cindex unmount attempt backoff interval + +Selects the interval in seconds between unmount attempts after the +initial time-to-live has expired. + +This defaults to 120 seconds (two minutes). + +@c ---------------------------------------------------------------- +@node -x Option, -y Option, -w Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-x} @var{opts} +@cindex Log message selection +@cindex Selecting specific log messages +@cindex How to select log messages +@cindex syslog priorities + +Specifies the type and verbosity of log messages. @dfn{opts} is +a comma separated list selected from the following options: + +@table @code +@item fatal +Fatal errors +@item error +Non-fatal errors +@item user +Non-fatal user errors +@item warn +Recoverable errors +@item warning +Alias for @code{warn} +@item info +Information messages +@item map +Mount map usage +@item stats +Additional statistics +@item all +All of the above +@end table + +Initially a set of default logging flags is enabled. This is as if +@samp{-x all,nomap,nostats} had been selected. The command line is +parsed and logging is controlled by the @code{-x} option. The very first +set of logging flags is saved and can not be subsequently disabled using +@i{Amq}. This default set of options is useful for general production +use.@refill + +The @samp{info} messages include details of what is mounted and +unmounted and when filesystems have timed out. If you want to have the +default set of messages without the @samp{info} messages then you simply +need @samp{-x noinfo}. The messages given by @samp{user} relate to +errors in the mount maps, so these are useful when new maps are +installed. The following table lists the syslog priorities used for each +of the message types.@refill + +@table @code +@item fatal +@samp{LOG_CRIT} +@item error +@samp{LOG_ERR} +@item user +@samp{LOG_WARNING} +@item warning +@samp{LOG_WARNING} +@item info +@samp{LOG_INFO} +@item debug +@samp{LOG_DEBUG} +@item map +@samp{LOG_DEBUG} +@item stats +@samp{LOG_INFO} +@end table + + +The options can be prefixed by the string @samp{no} to indicate +that this option should be turned off. For example, to obtain all +but @samp{info} messages the option @samp{-x all,noinfo} would be used. + +If @i{Amd} was built with debugging enabled the @code{debug} option is +automatically enabled regardless of the command line options. + +@c ---------------------------------------------------------------- +@node -y Option, -C-Option, -x Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-y} @var{NIS-domain} +@cindex NIS (YP) domain name +@cindex Overriding the NIS (YP) domain name +@cindex Setting the NIS (YP) domain name +@cindex YP domain name + +Selects an alternate NIS domain. This is useful for debugging and +cross-domain shared mounting. If this flag is specified, @i{Amd} +immediately attempts to bind to a server for this domain. +@c @i{Amd} refers to NIS maps when it starts, unless the @code{-m} option +@c is specified, and whenever required in a mount map. + +@c ---------------------------------------------------------------- +@node -C-Option, -D-Option, -y Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-C} @var{cluster-name} +@cindex Cluster names +@cindex Setting the cluster name + +Specifies the name of the cluster of which the local machine is a member. +The only effect is to set the variable @code{$@{cluster@}}. +The @dfn{cluster-name} is will usually obtained by running another command which uses +a database to map the local hostname into a cluster name. +@code{$@{cluster@}} can then be used as a selector to restrict mounting of +replicated data. +If this option is not given, @code{$@{cluster@}} has the same value as @code{$@{domain@}}. +This would be used as follows: + +@example +amd -C `clustername` ... +@end example + +@c ---------------------------------------------------------------- +@node -D-Option, -F Option, -C-Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-D} @var{opts} +@cindex Debug options +@cindex Setting debug flags + +Controls the verbosity and coverage of the debugging trace; @dfn{opts} +is a comma separated list of debugging options. The @code{-D} option is +only available if @i{Amd} was compiled with @samp{-DDEBUG}, or +configured with @code{configure --enable-debug}. The memory debugging +facilities (@samp{mem}) are only available if @i{Amd} was compiled with +@samp{-DDEBUG_MEM} (in addition to @samp{-DDEBUG}), or configured with +@code{configure --enable-debug=mem}. + +The most common options to use are @samp{-D trace} and @samp{-D test} +(which turns on all the useful debug options). As usual, every option +can be prefixed with @samp{no} to turn it off. + +@table @code +@item all +all options +@item amq +register for amq +@item daemon +enter daemon mode +@item fork +fork server +@item full +program trace +@item info +@cindex debugging hesiod resolver service +@cindex Hesiod: turning on RES_DEBUG +info service specific debugging (hesiod, nis, etc.) In the case of +hesiod maps, turns on the hesiod RES_DEBUG internal debugging option. +@item mem +trace memory allocations +@item mtab +use local @file{./mtab} file +@item str +debug string munging +@item test +full debug but no daemon +@item trace +protocol trace +@end table + +You may also refer to the program source for a more detailed explanation +of the available options. + +@c ---------------------------------------------------------------- +@node -F Option, -H Option, -D-Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-F} @var{conf-file} +@cindex Amd configuration file; specifying name +@cindex Amd configuration file +@cindex amd.conf file + +Specify an @i{Amd} configuration file @var{conf-file} to use. For a +description of the format and syntax, @pxref{Amd Configuration File}. +This configuration file is used to specify any options in lieu of typing +many of them on the command line. The @file{amd.conf} file includes +directives for every command line option @i{Amd} has, and many more that +are only available via the configuration file facility. The +configuration file specified by this option is processed after all other +options had been processed, regardless of the actual location of this +option on the command line. + +@c ---------------------------------------------------------------- +@node -H Option, -O-Option, -F Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-H} +@cindex Displaying brief help +@cindex Help; showing from Amd + +Print a brief help and usage string. + +@c ---------------------------------------------------------------- +@node -O-Option, -S Option, -H Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-O} @var{op-sys-name} +@cindex Operating System name +@cindex Setting the Operating System name + +Override the compiled-in name of the operating system, with +@var{op-sys-name}. Useful when the built-in name is not desired for +backward compatibility reasons. For example, if the build in name is +@samp{sunos5}, you can override it to the old name @samp{sos5}, and use +older maps which were written with the latter in mind. + +@c ---------------------------------------------------------------- +@node -S Option, -T-Option, -O-Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-S} +@cindex plock; using +@cindex locking executable pages in memory + +Do @emph{not} lock the running executable pages of @i{Amd} into memory. +To improve @i{Amd}'s performance, systems that support the @b{plock}(3) +call lock the @i{Amd} process into memory. This way there is less +chance the operating system will schedule, page out, and swap the +@i{Amd} process as needed. This tends to improve @i{Amd}'s performance, +at the cost of reserving the memory used by the @i{Amd} process (making +it unavailable for other processes). If this behavior is not desired, +use the @code{-S} option. + +@c ---------------------------------------------------------------- +@node -T-Option, , -S Option, Amd Command Line Options +@comment node-name, next, previous, up +@section @code{-T} @var{tag} +@cindex Tags for Amd configuration file +@cindex Configuration file; tags + +Specify a tag to use with @file{amd.conf}. All map entries tagged with +@var{tag} will be processed. Map entries that are not tagged are always +processed. Map entries that are tagged with a tag other than @var{tag} +will not be processed. + +@c ################################################################ +@node Filesystem Types, Amd Configuration File, Amd Command Line Options, Top +@comment node-name, next, previous, up +@chapter Filesystem Types +@cindex Filesystem types +@cindex Mount types +@cindex Types of filesystem + +To mount a volume, @i{Amd} must be told the type of filesystem to be +used. Each filesystem type typically requires additional information +such as the fileserver name for NFS. + +From the point of view of @i{Amd}, a @dfn{filesystem} is anything that +can resolve an incoming name lookup. An important feature is support +for multiple filesystem types. Some of these filesystems are +implemented in the local kernel and some on remote fileservers, whilst +the others are implemented internally by @i{Amd}.@refill + +The two common filesystem types are UFS and NFS. Four other user +accessible filesystems (@samp{link}, @samp{program}, @samp{auto} and +@samp{direct}) are also implemented internally by @i{Amd} and these are +described below. There are two additional filesystem types internal to +@i{Amd} which are not directly accessible to the user (@samp{inherit} +and @samp{error}). Their use is described since they may still have an +effect visible to the user.@refill + +@menu +* Network Filesystem:: A single NFS filesystem. +* Network Host Filesystem:: NFS mount a host's entire export tree. +* Network Filesystem Group:: An atomic group of NFS filesystems. +* Unix Filesystem:: Native disk filesystem. +* Caching Filesystem:: Caching from remote server filesystem. +* CD-ROM Filesystem:: ISO9660 CD ROM. +* Loopback Filesystem:: Local loopback-mount filesystem. +* Memory/RAM Filesystem:: A memory or RAM-based filesystem. +* Null Filesystem:: 4.4BSD's loopback-mount filesystem. +* Floppy Filesystem:: MS-DOS Floppy filesystem. +* Translucent Filesystem:: The directory merging filesystem. +* Shared Memory+Swap Filesystem:: Sun's tmpfs filesystem. +* User ID Mapping Filesystem:: 4.4BSD's umapfs filesystem. +* Program Filesystem:: Generic Program mounts. +* Symbolic Link Filesystem:: Local link. +* Symbolic Link Filesystem II:: Local link referencing existing filesystem. +* NFS-Link Filesystem:: Link if path exists, NFS otherwise. +* Automount Filesystem:: +* Direct Automount Filesystem:: +* Union Filesystem:: +* Error Filesystem:: +* Top-level Filesystem:: +* Autofs Filesystem:: Sun's kernel-based automounter filesystem. +* Root Filesystem:: +* Inheritance Filesystem:: +@end menu + +@c ---------------------------------------------------------------- +@node Network Filesystem, Network Host Filesystem, Filesystem Types, Filesystem Types +@comment node-name, next, previous, up +@section Network Filesystem (@samp{nfs}) +@cindex NFS +@cindex Mounting an NFS filesystem +@cindex How to mount and NFS filesystem +@cindex nfs, filesystem type +@cindex Filesystem type; nfs + +The @dfn{nfs} (@samp{type:=nfs}) filesystem type provides access to Sun's NFS. + +@noindent +The following options must be specified: + +@table @code +@cindex rhost, mount option +@cindex Mount option; rhost +@item rhost +the remote fileserver. This must be an entry in the hosts database. IP +addresses are not accepted. The default value is taken +from the local host name (@code{$@{host@}}) if no other value is +specified. + +@cindex rfs, mount option +@cindex Mount option; rfs +@item rfs +the remote filesystem. +If no value is specified for this option, an internal default of +@code{$@{path@}} is used. +@end table + +NFS mounts require a two stage process. First, the @dfn{file handle} of +the remote file system must be obtained from the server. Then a mount +system call must be done on the local system. @i{Amd} keeps a cache +of file handles for remote file systems. The cache entries have a +lifetime of a few minutes. + +If a required file handle is not in the cache, @i{Amd} sends a request +to the remote server to obtain it. @i{Amd} @dfn{does not} wait for +a response; it notes that one of the locations needs retrying, but +continues with any remaining locations. When the file handle becomes +available, and assuming none of the other locations was successfully +mounted, @i{Amd} will retry the mount. This mechanism allows several +NFS filesystems to be mounted in parallel. +@c @footnote{The mechanism +@c is general, however NFS is the only filesystem +@c for which the required hooks have been written.} +The first one which responds with a valid file handle will be used. + +@noindent +An NFS entry might be: + +@example +jsp host!=charm;type:=nfs;rhost:=charm;rfs:=/home/charm;sublink:=jsp +@end example + +The mount system call and any unmount attempts are always done +in a new task to avoid the possibility of blocking @i{Amd}. + +@c ---------------------------------------------------------------- +@node Network Host Filesystem, Network Filesystem Group, Network Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Network Host Filesystem (@samp{host}) +@cindex Network host filesystem +@cindex Mounting entire export trees +@cindex How to mount all NFS exported filesystems +@cindex host, filesystem type +@cindex Filesystem type; host + +@c NOTE: the current implementation of the @dfn{host} filesystem type +@c sometimes fails to maintain a consistent view of the remote mount tree. +@c This happens when the mount times out and only some of the remote mounts +@c are successfully unmounted. To prevent this from occurring, use the +@c @samp{nounmount} mount option. + +The @dfn{host} (@samp{type:=host}) filesystem allows access to the entire export tree of an +NFS server. The implementation is layered above the @samp{nfs} +implementation so keep-alives work in the same way. The only option +which needs to be specified is @samp{rhost} which is the name of the +fileserver to mount. + +The @samp{host} filesystem type works by querying the mount daemon on +the given fileserver to obtain its export list. @i{Amd} then obtains +filehandles for each of the exported filesystems. Any errors at this +stage cause that particular filesystem to be ignored. Finally each +filesystem is mounted. Again, errors are logged but ignored. One +common reason for mounts to fail is that the mount point does not exist. +Although @i{Amd} attempts to automatically create the mount point, it +may be on a remote filesystem to which @i{Amd} does not have write +permission. + +When an attempt to unmount a @samp{host} filesystem mount fails, @i{Amd} +remounts any filesystems which had successfully been unmounted. To do +this @i{Amd} queries the mount daemon again and obtains a fresh copy of +the export list. @i{Amd} then tries to mount any exported filesystems +which are not currently mounted. + +Sun's automounter provides a special @samp{-hosts} map. To achieve the +same effect with @i{Amd} requires two steps. First a mount map must +be created as follows: + +@example +* type:=host;rhost:=$@{key@};fs:=$@{autodir@}/$@{rhost@}/root +@end example + +@noindent +and then start @i{Amd} with the following command + +@example +amd /net net.map +@end example + +@noindent +where @samp{net.map} is the name of map described above. Note that the +value of @code{$@{fs@}} is overridden in the map. This is done to avoid +a clash between the mount tree and any other filesystem already mounted +from the same fileserver. + +If different mount options are needed for different hosts then +additional entries can be added to the map, for example + +@example +host2 opts:=ro,nosuid,soft +@end example + +@noindent +would soft mount @samp{host2} read-only. + +@c ---------------------------------------------------------------- +@node Network Filesystem Group, Unix Filesystem, Network Host Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Network Filesystem Group (@samp{nfsx}) +@cindex Network filesystem group +@cindex Atomic NFS mounts +@cindex Mounting an atomic group of NFS filesystems +@cindex How to mount an atomic group of NFS filesystems +@cindex nfsx, filesystem type +@cindex Filesystem type; nfsx + +The @dfn{nfsx} (@samp{type:=nfsx}) filesystem allows a group of filesystems to be mounted +from a single NFS server. The implementation is layered above the +@samp{nfs} implementation so keep-alives work in the same way. + +The options are the same as for the @samp{nfs} filesystem with one +difference. + +@noindent +The following options must be specified: + +@table @code +@item rhost +the remote fileserver. This must be an entry in the hosts database. IP +addresses are not accepted. The default value is taken from the local +host name (@code{$@{host@}}) if no other value is specified. + +@item rfs +as a list of filesystems to mount. The list is in the form of a comma +separated strings. +@end table + +@noindent +For example: + +@example +pub type:=nfsx;rhost:=gould;\ + rfs:=/public,/,graphics,usenet;fs:=$@{autodir@}/$@{rhost@}/root +@end example + +The first string defines the root of the tree, and is applied as a +prefix to the remaining members of the list which define the individual +filesystems. The first string is @emph{not} used as a filesystem name. +A parallel operation is used to determine the local mount points to +ensure a consistent layout of a tree of mounts. + +Here, the @emph{three} filesystems, @samp{/public}, +@samp{/public/graphics} and @samp{/public/usenet}, would be mounted.@refill + +A local mount point, @code{$@{fs@}}, @emph{must} be specified. The +default local mount point will not work correctly in the general case. +A suggestion is to use @samp{fs:=$@{autodir@}/$@{rhost@}/root}.@refill + +@c ---------------------------------------------------------------- +@node Unix Filesystem, Caching Filesystem, Network Filesystem Group, Filesystem Types +@comment node-name, next, previous, up +@section Unix Filesystem (@samp{ufs}, @samp{xfs}, or @samp{efs}) +@cindex Unix filesystem +@cindex UFS +@cindex XFS +@cindex EFS +@cindex Mounting a UFS filesystem +@cindex Mounting a local disk +@cindex How to mount a UFS filesystems +@cindex How to mount a local disk +@cindex Disk filesystems +@cindex ufs, filesystem type +@cindex Filesystem type; ufs +@cindex xfs, filesystem type +@cindex Filesystem type; xfs +@cindex efs, filesystem type +@cindex Filesystem type; efs + +The @dfn{ufs} (@samp{type:=ufs}) filesystem type provides access to the system's standard +disk filesystem---usually a derivative of the Berkeley Fast Filesystem. + +@noindent +The following option must be specified: + +@table @code +@cindex dev, mount option +@cindex Mount option; dev +@item dev +the block special device to be mounted. +@end table + +A UFS entry might be: + +@example +jsp host==charm;type:=ufs;dev:=/dev/sd0d;sublink:=jsp +@end example + +UFS is the default Unix disk-based file system, which Am-utils picks up +during the autoconfiguration phase. Some systems have more than one +type, such as IRIX, that comes with EFS (Extent File System) and XFS +(Extended File System). In those cases, you may explicitly set the file +system type, by using entries such: + +@example +ez1 type:=efs;dev:=/dev/xd0a +ez2 type:=xfs;dev:=/dev/sd3c +@end example + +@c ---------------------------------------------------------------- +@node Caching Filesystem, CD-ROM Filesystem, Unix Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Caching Filesystem (@samp{cachefs}) +@cindex Caching Filesystem +@cindex cachefs, filesystem type +@cindex Filesystem type; cachefs + +The @dfn{cachefs} (@samp{type:=cachefs}) filesystem caches files from +one location onto another, presumably providing faster access. It is +particularly useful to cache from a larger and remote (slower) NFS +partition to a smaller and local (faster) UFS directory. + +@noindent +The following options must be specified: + +@table @code +@cindex cachedir, mount option +@cindex Mount option; cachedir +@item cachedir +the directory where the cache is stored. +@item rfs +the path name to the ``back file system'' to be cached from. +@item fs +the ``front file system'' mount point to the cached files, where @i{Amd} +will set a symbolic link pointing to. +@end table + +A CacheFS entry for, say, the @file{/import} @i{Amd} mount point, might +be: + +@example +copt type:=cachefs;cachedir:=/cache;rfs:=/import/opt;fs:=/n/import/copt +@end example + +Access to the pathname @file{/import/copt} will follow a symbolic link +to @file{/n/import/copt}. The latter is the mount point for a caching +file system, that caches from @file{/import/opt} to @file{/cache}. + +@b{Caveats}: +@enumerate +@item This file system is currently only implemented for Solaris 2.x! +@item Before being used for the first time, the cache directory @i{must} be +initialized with @samp{cfsadmin -c @var{cachedir}}. See the manual page for +@b{cfsadmin}(1M) for more information. +@item The ``back file system'' mounted must be a complete file system, not +a subdirectory thereof; otherwise you will get an error ``Invalid Argument''. +@item If @i{Amd} aborts abnormally, the state of the cache may be +inconsistent, requiring running the command @file{fsck -F cachefs +@var{cachedir}}. Otherwise you will get the error ``No Space Left on Device''. +@end enumerate + +@c ---------------------------------------------------------------- +@node CD-ROM Filesystem, Loopback Filesystem, Caching Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section CD-ROM Filesystem (@samp{cdfs}) +@cindex CD-ROM Filesystem +@cindex cdfs, filesystem type +@cindex Filesystem type; cdfs + +The @dfn{cdfs} (@samp{type:=cdfs}) filesystem mounts a CD-ROM with an +ISO9660 format filesystem on it. + +@noindent +The following option must be specified: + +@table @code +@cindex dev, mount option +@cindex Mount option; dev +@item dev +the block special device to be mounted. +@end table + +A cdfs entry might be: + +@example +cdfs os==sunos4;type:=cdfs;dev:=/dev/sr0 \ + os==sunos5;type:=cdfs;dev:=/dev/dsk/c0t6d0s2 +@end example + +@c ---------------------------------------------------------------- +@node Loopback Filesystem, Memory/RAM Filesystem, CD-ROM Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Loopback Filesystem (@samp{lofs}) +@cindex Loopback Filesystem +@cindex lofs, filesystem type +@cindex Filesystem type; lofs + +The @dfn{lofs} (@samp{type:=lofs}) filesystem is also called the +loopback filesystem. It mounts a local directory on another, thus +providing mount-time binding to another location (unlike symbolic +links). + +The loopback filesystem is particularly useful within the context of a +chroot-ed directory (via @b{chroot}(2)), to provide access to +directories otherwise inaccessible. + +@noindent +The following option must be specified: + +@table @code +@cindex rfs, mount option +@cindex Mount option; rfs +@item rfs +the pathname to be mounted on top of @code{$@{fs@}}. +@end table + +Usually, the FTP server runs in a chroot-ed environment, for security +reasons. In this example, lofs is used to provide a subdirectory within +a user's home directory, also available for public ftp. + +@example +lofs type:=lofs;rfs:=/home/ezk/myftpdir;fs:=/usr/ftp/pub/ezk +@end example + +@c ---------------------------------------------------------------- +@node Memory/RAM Filesystem, Null Filesystem, Loopback Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Memory/RAM Filesystem (@samp{mfs}) +@cindex Memory/RAM Filesystem +@cindex mfs, filesystem type +@cindex Filesystem type; mfs + +The @dfn{mfs} (@samp{type:=mfs}) filesystem is available in 4.4BSD, +Linux, and other systems. It creates a filesystem in a portion of the +system's memory, thus providing very fast file (volatile) access. + +XXX: THIS FILESYSTEM IS NOT IMPLEMENTED YET! + +@c ---------------------------------------------------------------- +@node Null Filesystem, Floppy Filesystem, Memory/RAM Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Null Filesystem (@samp{nullfs}) +@cindex Null Filesystem +@cindex nullfs, filesystem type +@cindex Filesystem type; nullfs + +The @dfn{nullfs} (@samp{type:=nullfs}) filesystem is available from 4.4BSD, +and is very similar to the loopback filesystem, @dfn{lofs}. + +XXX: THIS FILESYSTEM IS NOT IMPLEMENTED YET! + +@c ---------------------------------------------------------------- +@node Floppy Filesystem, Translucent Filesystem, Null Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Floppy Filesystem (@samp{pcfs}) +@cindex Floppy Filesystem +@cindex pcfs, filesystem type +@cindex Filesystem type; pcfs + +The @dfn{pcfs} (@samp{type:=pcfs}) filesystem mounts a floppy previously +formatted for the MS-DOS format. + +@noindent +The following option must be specified: + +@table @code +@cindex dev, mount option +@cindex Mount option; dev +@item dev +the block special device to be mounted. +@end table + +A pcfs entry might be: + +@example +pcfs os==sunos4;type:=pcfs;dev:=/dev/fd0 \ + os==sunos5;type:=pcfs;dev:=/dev/diskette +@end example + +@c ---------------------------------------------------------------- +@node Translucent Filesystem, Shared Memory+Swap Filesystem, Floppy Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Translucent Filesystem (@samp{tfs}) +@cindex Translucent Filesystem +@cindex tfs, filesystem type +@cindex Filesystem type; tfs + +The @dfn{tfs} (@samp{type:=tfs}) filesystem is an older version of the +4.4BSD @dfn{unionfs}. + +XXX: THIS FILESYSTEM IS NOT IMPLEMENTED YET! + +@c ---------------------------------------------------------------- +@node Shared Memory+Swap Filesystem, User ID Mapping Filesystem, Translucent Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Shared Memory+Swap Filesystem (@samp{tmpfs}) +@cindex Shared Memory and Swap Filesystem +@cindex tmpfs, filesystem type +@cindex Filesystem type; tmpfs + +The @dfn{tmpfs} (@samp{type:=tmpfs}) filesystem shares memory between a +the swap device and the rest of the system. It is generally used to +provide a fast access @file{/tmp} directory, one that uses memory that +is otherwise unused. This filesystem is available in SunOS 4.x and 5.x. + +XXX: THIS FILESYSTEM IS NOT IMPLEMENTED YET! + +@c ---------------------------------------------------------------- +@node User ID Mapping Filesystem, Program Filesystem, Shared Memory+Swap Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section User ID Mapping Filesystem (@samp{umapfs}) +@cindex User ID Mapping Filesystem +@cindex umapfs, filesystem type +@cindex Filesystem type; umapfs + +The @dfn{umapfs} (@samp{type:=umapfs}) filesystem maps User IDs of file +ownership, and is available from 4.4BSD. + +XXX: THIS FILESYSTEM IS NOT IMPLEMENTED YET! + +@c ---------------------------------------------------------------- +@node Program Filesystem, Symbolic Link Filesystem, User ID Mapping Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Program Filesystem (@samp{program}) +@cindex Program filesystem +@cindex Mount a filesystem under program control +@cindex program, filesystem type +@cindex Filesystem type; program + +The @dfn{program} (@samp{type:=program}) filesystem type allows a program to be run whenever a +mount or unmount is required. This allows easy addition of support for +other filesystem types, such as MIT's Remote Virtual Disk (RVD) +which has a programmatic interface via the commands +@samp{rvdmount} and @samp{rvdunmount}. + +@noindent +The following options must be specified: + +@table @code +@cindex mount, mount option +@cindex Mount option; mount +@item mount +the program which will perform the mount. + +@cindex unmount, mount option +@cindex Mount option; unmount +@item unmount +the program which will perform the unmount. +@end table + +The exit code from these two programs is interpreted as a Unix error +code. As usual, exit code zero indicates success. To execute the +program @i{Amd} splits the string on whitespace to create an array of +substrings. Single quotes @samp{'} can be used to quote whitespace +if that is required in an argument. There is no way to escape or change +the quote character. + +To run the program @samp{rvdmount} with a host name and filesystem as +arguments would be specified by @samp{mount:="/etc/rvdmount rvdmount +fserver $@{path@}"}. + +The first element in the array is taken as the pathname of the program +to execute. The other members of the array form the argument vector to +be passed to the program, @dfn{including argument zero}. This means +that the split string must have at least two elements. The program is +directly executed by @i{Amd}, not via a shell. This means that scripts +must begin with a @code{#!} interpreter specification. + +If a filesystem type is to be heavily used, it may be worthwhile adding +a new filesystem type into @i{Amd}, but for most uses the program +filesystem should suffice. + +When the program is run, standard input and standard error are inherited +from the current values used by @i{Amd}. Standard output is a +duplicate of standard error. The value specified with the @code{-l} +command line option has no effect on standard error. + +@c ---------------------------------------------------------------- +@node Symbolic Link Filesystem, Symbolic Link Filesystem II, Program Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Symbolic Link Filesystem (@samp{link}) +@cindex Symbolic link filesystem +@cindex Referencing part of the local name space +@cindex Mounting part of the local name space +@cindex How to reference part of the local name space +@cindex link, filesystem type +@cindex symlink, link filesystem type +@cindex Filesystem type; link + +Each filesystem type creates a symbolic link to point from the volume +name to the physical mount point. The @samp{link} filesystem does the +same without any other side effects. This allows any part of the +machines name space to be accessed via @i{Amd}. + +One common use for the symlink filesystem is @file{/homes} which can be +made to contain an entry for each user which points to their +(auto-mounted) home directory. Although this may seem rather expensive, +it provides a great deal of administrative flexibility. + +@noindent +The following option must be defined: + +@table @code +@item fs +The value of @var{fs} option specifies the destination of the link, as +modified by the @var{sublink} option. If @var{sublink} is non-null, it +is appended to @code{$@{fs@}}@code{/} and the resulting string is used +as the target. +@end table + +The @samp{link} filesystem can be thought of as identical to the +@samp{ufs} filesystem but without actually mounting anything. + +An example entry might be: + +@example +jsp host==charm;type:=link;fs:=/home/charm;sublink:=jsp +@end example +which would return a symbolic link pointing to @file{/home/charm/jsp}. + +@c ---------------------------------------------------------------- +@node Symbolic Link Filesystem II, NFS-Link Filesystem, Symbolic Link Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Symbolic Link Filesystem II (@samp{linkx}) +@cindex Symbolic link filesystem II +@cindex Referencing an existing part of the local name space +@cindex Mounting an existing part of the local name space +@cindex How to reference an existing part of the local name space +@cindex linkx, filesystem type +@cindex symlink, linkx filesystem type +@cindex Filesystem type; linkx + +The @dfn{linkx} (@samp{type:=linkx}) filesystem type is identical to @samp{link} with the +exception that the target of the link must exist. Existence is checked +with the @b{lstat}(2) system call. + +The @samp{linkx} filesystem type is particularly useful for wildcard map +entries. In this case, a list of possible targets can be given and +@i{Amd} will choose the first one which exists on the local machine. + +@c ---------------------------------------------------------------- +@node NFS-Link Filesystem, Automount Filesystem, Symbolic Link Filesystem II, Filesystem Types +@comment node-name, next, previous, up +@section NFS-Link Filesystem (@samp{nfsl}) +@cindex NFS-Link filesystem II +@cindex Referencing an existing part of the name space if target exists +@cindex Mounting a remote part of the name space if target is missing +@cindex Symlink if target exists, NFS otherwise +@cindex nfsl, filesystem type +@cindex symlink, nfsl filesystem type +@cindex Filesystem type; nfsl + +The @dfn{nfsl} (@samp{type:=nfsl}) filesystem type is a combination of two others: +@samp{link} and @samp{nfs}. If the local host name is equal to the +value of @code{$@{rhost@}}, or if the target pathname listed in +@code{$@{fs@}} exists, @samp{nfsl} will behave exactly as +@samp{type:=link}, and refer to the target as a symbolic link. If the +local host name is not equal to the value of @code{$@{rhost@}}, or if +the target of the link does not exist, @i{Amd} will treat it as +@samp{type:=nfs}, and will mount a remote pathname for it. + +The @samp{nfsl} filesystem type is particularly useful as a shorthand +for the more cumbersome and yet one of the most popular @i{Amd} +entries. For example, you can simplify all map entries that look like: + +@example +zing -fs:=/n/shekel/u/zing \ + host!=shekel;type:=nfs;rhost:=shekel;rfs:=$@{fs@} \ + host==shekel;type:=link +@end example + +or + +@example +zing -fs:=/n/shekel/u/zing \ + exists($@{fs@});type:=link \ + !exists($@{fs@});type:=nfs;rhost:=shekel;rfs:=$@{fs@} +@end example + +into a shorter form + +@example +zing type:=nfsl;fs:=/n/shekel/u/zing;rhost:=shekel;rfs:=$@{fs@} +@end example + +Not just does it make the maps smaller and simpler, but it avoids +possible mistakes that often happen when forgetting to set up the two +entries (one for @samp{type:=nfs} and the other for @samp{type:=link}) +necessary to perform transparent mounts of existing or remote mounts. + +@c ---------------------------------------------------------------- +@node Automount Filesystem, Direct Automount Filesystem, NFS-Link Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Automount Filesystem (@samp{auto}) +@cindex Automount filesystem +@cindex Map cache types +@cindex Setting map cache parameters +@cindex How to set map cache parameters +@cindex How to start an indirect automount point +@cindex auto, filesystem type +@cindex Filesystem type; auto +@cindex SIGHUP signal +@cindex Map cache synchronizing +@cindex Synchronizing the map cache +@cindex Map cache options +@cindex Regular expressions in maps + +The @dfn{auto} (@samp{type:=auto}) filesystem type creates a new automount point below an +existing automount point. Top-level automount points appear as system +mount points. An automount mount point can also appear as a +sub-directory of an existing automount point. This allows some +additional structure to be added, for example to mimic the mount tree of +another machine. + +The following options may be specified: + +@table @code +@cindex cache, mount option +@cindex Mount option; cache +@item cache +specifies whether the data in this mount-map should be +cached. The default value is @samp{none}, in which case +no caching is done in order to conserve memory. +However, better performance and reliability can be obtained by caching +some or all of a mount-map. + +If the cache option specifies @samp{all}, +the entire map is enumerated when the mount point is created. + +If the cache option specifies @samp{inc}, caching is done incrementally +as and when data is required. +Some map types do not support cache mode @samp{all}, in which case @samp{inc} +is used whenever @samp{all} is requested. + +Caching can be entirely disabled by using cache mode @samp{none}. + +If the cache option specifies @samp{regexp} then the entire map will be +enumerated and each key will be treated as an egrep-style regular +expression. The order in which a cached map is searched does not +correspond to the ordering in the source map so the regular expressions +should be mutually exclusive to avoid confusion. + +Each mount map type has a default cache type, usually @samp{inc}, which +can be selected by specifying @samp{mapdefault}. + +The cache mode for a mount map can only be selected on the command line. +Starting @i{Amd} with the command: + +@example +amd /homes hesiod.homes -cache:=inc +@end example + +will cause @samp{/homes} to be automounted using the @dfn{Hesiod} name +server with local incremental caching of all successfully resolved names. + +All cached data is forgotten whenever @i{Amd} receives a @samp{SIGHUP} +signal and, if cache @samp{all} mode was selected, the cache will be +reloaded. This can be used to inform @i{Amd} that a map has been +updated. In addition, whenever a cache lookup fails and @i{Amd} needs +to examine a map, the map's modify time is examined. If the cache is +out of date with respect to the map then it is flushed as if a +@samp{SIGHUP} had been received. + +An additional option (@samp{sync}) may be specified to force @i{Amd} to +check the map's modify time whenever a cached entry is being used. For +example, an incremental, synchronized cache would be created by the +following command: + +@example +amd /homes hesiod.homes -cache:=inc,sync +@end example + +@item fs +specifies the name of the mount map to use for the new mount point. + +Arguably this should have been specified with the @code{$@{rfs@}} option but +we are now stuck with it due to historical accident. + +@c %If the string @samp{.} is used then the same map is used; +@c %in addition the lookup prefix is set to the name of the mount point followed +@c %by a slash @samp{/}. +@c %This is the same as specifying @samp{fs:=\$@{map@};pref:=\$@{key@}/}. +@c + +@item pref +alters the name that is looked up in the mount map. If +@code{$@{pref@}}, the @dfn{prefix}, is non-null then it is prepended to +the name requested by the kernel @dfn{before} the map is searched. +@end table + +The server @samp{dylan.doc.ic.ac.uk} has two user disks: +@samp{/dev/dsk/2s0} and @samp{/dev/dsk/5s0}. These are accessed as +@samp{/home/dylan/dk2} and @samp{/home/dylan/dk5} respectively. Since +@samp{/home} is already an automount point, this naming is achieved with +the following map entries:@refill + +@example +dylan type:=auto;fs:=$@{map@};pref:=$@{key@}/ +dylan/dk2 type:=ufs;dev:=/dev/dsk/2s0 +dylan/dk5 type:=ufs;dev:=/dev/dsk/5s0 +@end example + +@c ---------------------------------------------------------------- +@node Direct Automount Filesystem, Union Filesystem, Automount Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Direct Automount Filesystem (@samp{direct}) +@cindex Direct automount filesystem +@cindex How to start a direct automount point +@cindex direct, filesystem type +@cindex Filesystem type; direct + +The @dfn{direct} (@samp{type:=direct}) filesystem is almost identical to the automount +filesystem. Instead of appearing to be a directory of mount points, it +appears as a symbolic link to a mounted filesystem. The mount is done +at the time the link is accessed. @xref{Automount Filesystem} for a +list of required options. + +Direct automount points are created by specifying the @samp{direct} +filesystem type on the command line: + +@example +amd ... /usr/man auto.direct -type:=direct +@end example + +where @samp{auto.direct} would contain an entry such as: + +@example +usr/man -type:=nfs;rfs:=/usr/man \ + rhost:=man-server1 rhost:=man-server2 +@end example + +In this example, @samp{man-server1} and @samp{man-server2} are file +servers which export copies of the manual pages. Note that the key +which is looked up is the name of the automount point without the +leading @samp{/}. + +@c ---------------------------------------------------------------- +@node Union Filesystem, Error Filesystem, Direct Automount Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Union Filesystem (@samp{union}) +@cindex Union filesystem +@cindex union, filesystem type +@cindex Filesystem type; union + +The @dfn{union} (@samp{type:=union}) filesystem type allows the contents of several +directories to be merged and made visible in a single directory. This +can be used to overcome one of the major limitations of the Unix mount +mechanism which only allows complete directories to be mounted. + +For example, supposing @file{/tmp} and @file{/var/tmp} were to be merged +into a new directory called @file{/mtmp}, with files in @file{/var/tmp} +taking precedence. The following command could be used to achieve this +effect: + +@example +amd ... /mtmp union:/tmp:/var/tmp -type:=union +@end example + +Currently, the unioned directories must @emph{not} be automounted. That +would cause a deadlock. This seriously limits the current usefulness of +this filesystem type and the problem will be addressed in a future +release of @i{Amd}. + +Files created in the union directory are actually created in the last +named directory. This is done by creating a wildcard entry which points +to the correct directory. The wildcard entry is visible if the union +directory is listed, so allowing you to see which directory has +priority. + +The files visible in the union directory are computed at the time +@i{Amd} is started, and are not kept up-to-date with respect to the +underlying directories. Similarly, if a link is removed, for example +with the @samp{rm} command, it will be lost forever. + +@c ---------------------------------------------------------------- +@node Error Filesystem, Top-level Filesystem, Union Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Error Filesystem (@samp{error}) +@cindex Error filesystem +@cindex error, filesystem type +@cindex Filesystem type; error + +The @dfn{error} (@samp{type:=error}) filesystem type is used internally as a catch-all in the +case where none of the other filesystems was selected, or some other +error occurred. Lookups and mounts always fail with ``No such file or +directory''. All other operations trivially succeed. + +The error filesystem is not directly accessible. + +@c ---------------------------------------------------------------- +@node Top-level Filesystem, Autofs Filesystem, Error Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Top-level Filesystem (@samp{toplvl}) +@cindex Top level filesystem +@cindex toplvl, filesystem type +@cindex Filesystem type; toplvl + +The @dfn{toplvl} (@samp{type:=toplvl}) filesystems is derived from the @samp{auto} filesystem +and is used to mount the top-level automount nodes. Requests of this +type are automatically generated from the command line arguments and can +also be passed in by using the @code{-M} option of the @dfn{Amq} command. +That option is insecure, and is unavailable unless am-utils was +configured with @samp{--with-amq-mount}. + +@c ---------------------------------------------------------------- +@node Root Filesystem, Inheritance Filesystem, Autofs Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Root Filesystem (@samp{root}) +@cindex Root filesystem +@cindex root, filesystem type +@cindex Filesystem type; root + +The @dfn{root} (@samp{type:=root}) filesystem type acts as an internal +placeholder onto which @i{Amd} can pin @samp{toplvl} mounts. Only one +node of this type need ever exist and one is created automatically +during startup. The effect of having more than one root node is +undefined. + +The root filesystem is not directly accessible. + +@c ---------------------------------------------------------------- +@node Autofs Filesystem, Root Filesystem, Top-level Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Autofs Filesystem (@samp{autofs}) +@cindex Autofs filesystem +@cindex autofs, filesystem type +@cindex Filesystem type; autofs + +The @dfn{autofs} (@samp{type:=autofs}) filesystem uses Sun's kernel-based automounter +supporting filesystem for @i{Amd}'s mount points. Hence it is another +type of top level filesystem. + +The autofs filesystem is not directly accessible from @i{Amd} maps, but +only from the @file{amd.conf} file (@pxref{mount_type Parameter}). + +Note that Autofs support is still very early. See the distribution file +@file{README.autofs} for detail of what works and what does not. + +@c ---------------------------------------------------------------- +@node Inheritance Filesystem, , Root Filesystem, Filesystem Types +@comment node-name, next, previous, up +@section Inheritance Filesystem (@samp{inherit}) +@cindex Inheritance filesystem +@cindex Nodes generated on a restart +@cindex inherit, filesystem type +@cindex Filesystem type; inherit + +The @dfn{inheritance} (@samp{type:=inherit}) filesystem is not directly +accessible. Instead, internal mount nodes of this type are +automatically generated when @i{Amd} is started with the @code{-r} option. +At this time the system mount table is scanned to locate any filesystems +which are already mounted. If any reference to these filesystems is +made through @i{Amd} then instead of attempting to mount it, @i{Amd} +simulates the mount and @dfn{inherits} the filesystem. This allows a +new version of @i{Amd} to be installed on a live system simply by +killing the old daemon with @samp{SIGTERM} and starting the new one.@refill + +This filesystem type is not generally visible externally, but it is +possible that the output from @samp{amq -m} may list @samp{inherit} as +the filesystem type. This happens when an inherit operation cannot +be completed for some reason, usually because a fileserver is down. + +@c ################################################################ +@node Amd Configuration File, Run-time Administration, Filesystem Types, Top +@comment node-name, next, previous, up +@chapter Amd Configuration File +@cindex Amd Configuration File +@cindex amd.conf + +The @samp{amd.conf} file is the configuration file for @i{Amd}, as part +of the am-utils suite. This file contains runtime configuration +information for the @i{Amd} automounter program. + +@menu +* File Format:: +* The Global Section:: +* Regular Map Sections:: +* Common Parameters:: +* Global Parameters:: +* Regular Map Parameters:: +* amd.conf Examples:: +@end menu + +@c ================================================================ +@node File Format, The Global Section, Amd Configuration File, Amd Configuration File +@comment node-name, next, previous, up +@section File Format +@cindex amd.conf file format + +The @samp{amd.conf} file consists of sections and parameters. A section +begins with the name of the section in square brackets @samp{[]} and +continues until the next section begins or the end of the file is reached. +Sections contain parameters of the form @samp{name = value}. + +The file is line-based --- that is, each newline-terminated line +represents either a comment, a section name or a parameter. No +line-continuation syntax is available. + +Section names, parameter names and their values are case sensitive. + +Only the first equals sign in a parameter is significant. Whitespace +before or after the first equals sign is discarded. Leading, trailing +and internal whitespace in section and parameter names is irrelevant. +Leading and trailing whitespace in a parameter value is discarded. +Internal whitespace within a parameter value is not allowed, unless the +whole parameter value is quoted with double quotes as in @samp{name = +"some value"}. + +Any line beginning with a pound sign @samp{#} is ignored, as are lines +containing only whitespace. + +The values following the equals sign in parameters are all either a +string (no quotes needed if string does not include spaces) or a +boolean, which may be given as @samp{yes}/@samp{no}. Case is significant in all +values. Some items such as cache timeouts are numeric. + +@c ================================================================ +@node The Global Section, Regular Map Sections, File Format, Amd Configuration File +@comment node-name, next, previous, up +@section The Global Section +@cindex amd.conf global section + +The global section must be specified as @samp{[global]}. Parameters in +this section either apply to @i{Amd} as a whole, or to all other regular map +sections which follow. There should be only one global section defined +in one configuration file. + +It is highly recommended that this section be specified first in the +configuration file. If it is not, then regular map sections which +precede it will not use global values defined later. + +@c ================================================================ +@node Regular Map Sections, Common Parameters, The Global Section, Amd Configuration File +@comment node-name, next, previous, up +@section Regular Map Sections +@cindex amd.conf regular map sections + +Parameters in regular (non-global) sections apply to a single map entry. +For example, if the map section @samp{[/homes]} is defined, then all +parameters following it will be applied to the @file{/homes} +@i{Amd}-managed mount point. + +@c ================================================================ +@node Common Parameters, Global Parameters, Regular Map Sections, Amd Configuration File +@comment node-name, next, previous, up +@section Common Parameters +@cindex amd.conf common parameters + +These parameters can be specified either in the global or a map-specific +section. Entries specified in a map-specific section override the default +value or one defined in the global section. If such a common parameter is +specified only in the global section, it is applicable to all regular map +sections that follow. + +@menu +* browsable_dirs Parameter:: +* map_options Parameter:: +* map_type Parameter:: +* mount_type Parameter:: +* search_path Parameter:: +@end menu + +@c ---------------------------------------------------------------- +@node browsable_dirs Parameter, map_options Parameter, Common Parameters, Common Parameters +@comment node-name, next, previous, up +@subsection @t{browsable_dirs} Parameter +@cindex browsable_dirs Parameter + +(type=string, default=@samp{no}). If @samp{yes}, then @i{Amd}'s top-level +mount points will be browsable to @b{readdir}(3) calls. This means you +could run for example @b{ls}(1) and see what keys are available to mount +in that directory. Not all entries are made visible to @b{readdir}(3): +the @samp{/defaults} entry, wildcard entries, and those with a @file{/} +in them are not included. If you specify @samp{full} to this option, +all but the @samp{/defaults} entry will be visible. Note that if you run +a command which will attempt to @b{stat}(2) the entries, such as often +done by @samp{ls -l} or @samp{ls -F}, @i{Amd} will attempt to mount +@i{every} entry in that map. This is often called a ``mount storm''. + +@c ---------------------------------------------------------------- +@node map_options Parameter, map_type Parameter, browsable_dirs Parameter, Common Parameters +@comment node-name, next, previous, up +@subsection @t{map_options} Parameter +@cindex map_options Parameter + +(type=string, default no options). This option is the same as +specifying map options on the command line to @i{Amd}, such as +@samp{cache:=all}. + +@c ---------------------------------------------------------------- +@node map_type Parameter, mount_type Parameter, map_options Parameter, Common Parameters +@comment node-name, next, previous, up +@subsection @t{map_type} Parameter +@cindex map_type Parameter + +(type=string, default search all map types). If specified, @i{Amd} will +initialize the map only for the type given. This is useful to avoid the +default map search type used by @i{Amd} which takes longer and can have +undesired side-effects such as initializing NIS even if not used. +Possible values are + +@table @samp +@item file +plain files +@item hesiod +Hesiod name service from MIT +@item ldap +Lightweight Directory Access Protocol +@item ndbm +(New) dbm style hash files +@item nis +Network Information Services (version 2) +@item nisplus +Network Information Services Plus (version 3) +@item passwd +local password files +@item union +union maps +@end table + +@c ---------------------------------------------------------------- +@node mount_type Parameter, search_path Parameter, map_type Parameter, Common Parameters +@comment node-name, next, previous, up +@subsection @t{mount_type} Parameter +@cindex mount_type Parameter + +(type=string, default=@samp{nfs}). All @i{Amd} mount types default to NFS. +That is, @i{Amd} is an NFS server on the map mount points, for the local +host it is running on. If @samp{autofs} is specified, @i{Amd} will be +an autofs server for those mount points. + +@c ---------------------------------------------------------------- +@node search_path Parameter, , mount_type Parameter, Common Parameters +@comment node-name, next, previous, up +@subsection @t{search_path} Parameter +@cindex search_path Parameter + +(type=string, default no search path). This provides a +(colon-delimited) search path for file maps. Using a search path, +sites can allow for local map customizations and overrides, and can +distributed maps in several locations as needed. + +@c ================================================================ +@node Global Parameters, Regular Map Parameters, Common Parameters, Amd Configuration File +@comment node-name, next, previous, up +@section Global Parameters +@cindex amd.conf global parameters + +The following parameters are applicable to the @samp{[global]} section only. + +@menu +* arch Parameter:: +* auto_dir Parameter:: +* cache_duration Parameter:: +* cluster Parameter:: +* debug_options Parameter:: +* dismount_interval Parameter:: +* fully_qualified_hosts Parameter:: +* hesiod_base Parameter:: +* karch Parameter:: +* ldap_base Parameter:: +* ldap_cache_maxmem Parameter:: +* ldap_cache_seconds Parameter:: +* ldap_hostports Parameter:: +* local_domain Parameter:: +* log_file Parameter:: +* log_options Parameter:: +* nfs_retransmit_counter Parameter:: +* nfs_retry_interval Parameter:: +* nis_domain Parameter:: +* normalize_hostnames Parameter:: +* os Parameter:: +* osver Parameter:: +* pid_file Parameter:: +* plock Parameter:: +* portmap_program Parameter:: +* print_pid Parameter:: +* print_version Parameter:: +* restart_mounts Parameter:: +* selectors_on_default Parameter:: +* show_statfs_entries Parameter:: +* unmount_on_exit Parameter:: +@end menu + +@c ---------------------------------------------------------------- +@node arch Parameter, auto_dir Parameter, Global Parameters, Global Parameters +@comment node-name, next, previous, up +@subsection @t{arch} Parameter +@cindex arch Parameter + +(type=string, default to compiled in value). Allows you to override the +value of the @i{arch} @i{Amd} variable. + +@c ---------------------------------------------------------------- +@node auto_dir Parameter, cache_duration Parameter, arch Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{auto_dir} Parameter +@cindex auto_dir Parameter + +(type=string, default=@samp{/a}). Same as the @code{-a} option to @i{Amd}. +This sets the private directory where @i{Amd} will create +sub-directories for its real mount points. + +@c ---------------------------------------------------------------- +@node cache_duration Parameter, cluster Parameter, auto_dir Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{cache_duration} Parameter +@cindex cache_duration Parameter + +(type=numeric, default=300). Same as the @code{-c} option to +@i{Amd}. Sets the duration in seconds that looked up map entries remain +in the cache. + +@c ---------------------------------------------------------------- +@node cluster Parameter, debug_options Parameter, cache_duration Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{cluster} Parameter +@cindex cluster Parameter + +(type=string, default no cluster). Same as the @code{-C} option to +@i{Amd}. Specifies the alternate HP-UX cluster to use. + +@c ---------------------------------------------------------------- +@node debug_options Parameter, dismount_interval Parameter, cluster Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{debug_options} Parameter +@cindex debug_options Parameter + +(type=string, default no debug options). Same as the @code{-D} +option to @i{Amd}. Specify any debugging options for @i{Amd}. Works +only if am-utils was configured for debugging using the +@code{--enable-debug} option. The @samp{mem} option alone can be turned +on via @code{--enable-debug=mem}. Otherwise debugging options are +ignored. Options are comma delimited, and can be preceded by the string +@samp{no} to negate their meaning. You can get the list of supported +debugging options by running @code{amd -v}. Possible values are: + +@table @samp +@item all +all options +@item amq +register for amq +@item daemon +enter daemon mode +@item fork +fork server +@item full +program trace +@item mem +trace memory allocations +@item mtab +use local @file{./mtab} file +@item str +debug string munging +@item test +full debug but no daemon +@item trace +protocol trace +@end table + +@c ---------------------------------------------------------------- +@node dismount_interval Parameter, fully_qualified_hosts Parameter, debug_options Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{dismount_interval} Parameter +@cindex dismount_interval Parameter + +(type=numeric, default=120). Same as the @code{-w} option to +@i{Amd}. Specify in seconds, the time between attempts to dismount file +systems that have exceeded their cached times. + +@c ---------------------------------------------------------------- +@node fully_qualified_hosts Parameter, hesiod_base Parameter, dismount_interval Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{fully_qualified_hosts} Parameter +@cindex fully_qualified_hosts Parameter + +(type=string, default=@samp{no}). If @samp{yes}, @i{Amd} will perform RPC +authentication using fully-qualified host names. This is necessary for +some systems, and especially when performing cross-domain mounting. For +this function to work, the @i{Amd} variable @samp{$@{hostd@}} is used, +requiring that @samp{$@{domain@}} not be null. + +@c ---------------------------------------------------------------- +@node hesiod_base Parameter, karch Parameter, fully_qualified_hosts Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{hesiod_base} Parameter +@cindex hesiod_base Parameter + +(type=string, default=@samp{automount}). Specify the base name for +hesiod maps. + +@c ---------------------------------------------------------------- +@node karch Parameter, ldap_base Parameter, hesiod_base Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{karch} Parameter +@cindex karch Parameter + +(type=string, default to karch of the system). Same as the @code{-k} +option to @i{Amd}. Allows you to override the kernel-architecture of +your system. Useful for example on Sun (Sparc) machines, where you can +build one @i{Amd} binary, and run it on multiple machines, yet you want +each one to get the correct @i{karch} variable set (for example, sun4c, +sun4m, sun4u, etc.) Note that if not specified, @i{Amd} will use +@b{uname}(2) to figure out the kernel architecture of the machine. + +@c ---------------------------------------------------------------- +@node ldap_base Parameter, ldap_cache_maxmem Parameter, karch Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{ldap_base} Parameter +@cindex ldap_base Parameter + +(type=string, default not set). Specify the base name for +LDAP. + +@c ---------------------------------------------------------------- +@node ldap_cache_maxmem Parameter, ldap_cache_seconds Parameter, ldap_base Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{ldap_cache_maxmem} Parameter +@cindex ldap_cache_maxmem Parameter + +(type=numeric, default=131072). Specify the maximum memory @i{Amd} +should use to cache LDAP entries. + +@c ---------------------------------------------------------------- +@node ldap_cache_seconds Parameter, ldap_hostports Parameter, ldap_cache_maxmem Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{ldap_cache_seconds} Parameter +@cindex ldap_cache_seconds Parameter + +(type=numeric, default=0). Specify the number of seconds to keep +entries in the cache. + +@c ---------------------------------------------------------------- +@node ldap_hostports Parameter, local_domain Parameter, ldap_cache_seconds Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{ldap_hostports} Parameter +@cindex ldap_hostports Parameter + +(type=string, default not set). Specify +LDAP-specific values such as country and organization. + +@c ---------------------------------------------------------------- +@node local_domain Parameter, log_file Parameter, ldap_hostports Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{local_domain} Parameter +@cindex local_domain Parameter + +(type=string, default no sub-domain). Same as the @code{-d} option +to @i{Amd}. Specify the local domain name. If this option is not given +the domain name is determined from the hostname, by removing the first +component of the fully-qualified host name. + +@c ---------------------------------------------------------------- +@node log_file Parameter, log_options Parameter, local_domain Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{log_file} Parameter +@cindex log_file Parameter + +(type=string, default=@samp{stderr}). Same as the @code{-l} option to +@i{Amd}. Specify a file name to log @i{Amd} events to. +If the string @samp{/dev/stderr} is specified, +@i{Amd} will send its events to the standard error file descriptor. + +If the string @samp{syslog} is given, @i{Amd} will record its events +with the system logger @b{syslogd}(8). If your system supports syslog +facilities, then the default facility used is @samp{LOG_DAEMON}. + +When using syslog, if you wish to change the facility, append its name +to the option name, delimited by a single colon. For example, if it is +the string @samp{syslog:local7} then @i{Amd} will log messages via +@b{syslog}(3) using the @samp{LOG_LOCAL7} facility. If the facility +name specified is not recognized, @i{Amd} will default to @samp{LOG_DAEMON}. +Note: while you can use any syslog facility available on your system, it +is generally a bad idea to use those reserved for other services such as +@samp{kern}, @samp{lpr}, @samp{cron}, etc. + +@c ---------------------------------------------------------------- +@node log_options Parameter, nfs_retransmit_counter Parameter, log_file Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{log_options} Parameter +@cindex log_options Parameter + +(type=string, default no logging options). Same as the @code{-x} +option to @i{Amd}. Specify any logging options for @i{Amd}. Options +are comma delimited, and can be preceded by the string @samp{no} to +negate their meaning. The @samp{debug} logging option is only available +if am-utils was configured with @code{--enable-debug}. You can get the +list of supported debugging options by running @code{amd -v}. Possible +values are: + +@table @samp +@item all +all messages +@item debug +debug messages +@item error +non-fatal system errors +@item fatal +fatal errors +@item info +information +@item map +map errors +@item stats +additional statistical information +@item user +non-fatal user errors +@item warn +warnings +@item warning +warnings +@end table + +@c ---------------------------------------------------------------- +@node nfs_retransmit_counter Parameter, nfs_retry_interval Parameter, log_options Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{nfs_retransmit_counter} Parameter +@cindex nfs_retransmit_counter Parameter + +(type=numeric, default=110). Same as the @i{counter} part of the +@code{-t} @i{interval.counter} option to @i{Amd}. Specifies the +retransmit counter's value in @emph{tenths} of seconds. + +@c ---------------------------------------------------------------- +@node nfs_retry_interval Parameter, nis_domain Parameter, nfs_retransmit_counter Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{nfs_retry_interval} Parameter +@cindex nfs_retry_interval Parameter + +(type=numeric, default=8). Same as the @i{interval} part of the +@code{-t} @i{interval.counter} option to @i{Amd}. Specifies the +interval in @emph{tenths} of seconds, between NFS/RPC/UDP retries. + +@c ---------------------------------------------------------------- +@node nis_domain Parameter, normalize_hostnames Parameter, nfs_retry_interval Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{nis_domain} Parameter +@cindex nis_domain Parameter + +(type=string, default to local NIS domain name). Same as the +@code{-y} option to @i{Amd}. Specify an alternative NIS domain from +which to fetch the NIS maps. The default is the system domain name. +This option is ignored if NIS support is not available. + +@c ---------------------------------------------------------------- +@node normalize_hostnames Parameter, os Parameter, nis_domain Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{normalize_hostnames} Parameter +@cindex normalize_hostnames Parameter + +(type=boolean, default=@samp{no}). Same as the @code{-n} option to @i{Amd}. +If @samp{yes}, then the name referred to by @code{$@{rhost@}} is normalized +relative to the host database before being used. The effect is to +translate aliases into ``official'' names. + +@c ---------------------------------------------------------------- +@node os Parameter, osver Parameter, normalize_hostnames Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{os} Parameter +@cindex os Parameter + +(type=string, default to compiled in value). Same as the @code{-O} +option to @i{Amd}. Allows you to override the compiled-in name of the +operating system. Useful when the built-in name is not desired for +backward compatibility reasons. For example, if the built-in name is +@samp{sunos5}, you can override it to @samp{sos5}, and use older maps +which were written with the latter in mind. + +@c ---------------------------------------------------------------- +@node osver Parameter, pid_file Parameter, os Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{osver} Parameter +@cindex osver Parameter + +(type=string, default to compiled in value). Same as the @code{-o} +option to @i{Amd}. Allows you to override the compiled-in version +number of the operating system. Useful when the built-in version is not +desired for backward compatibility reasons. For example, if the build +in version is @samp{2.5.1}, you can override it to @samp{5.5.1}, and use +older maps that were written with the latter in mind. + +@c ---------------------------------------------------------------- +@node pid_file Parameter, plock Parameter, osver Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{pid_file} Parameter +@cindex pid_file Parameter + +(type=string, default=@samp{/dev/stdout}). Specify a file to store the process +ID of the running daemon into. If not specified, @i{Amd} will print its +process id onto the standard output. Useful for killing @i{Amd} after +it had run. Note that the PID of a running @i{Amd} can also be +retrieved via @i{Amq} (@pxref{Amq -p option}). + +This file is used only if the @samp{print_pid} option is on +(@pxref{print_pid Parameter}). + +@c ---------------------------------------------------------------- +@node plock Parameter, portmap_program Parameter, pid_file Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{plock} Parameter +@cindex plock Parameter + +(type=boolean, default=@samp{yes}). Same as the @code{-S} option to @i{Amd}. +If @samp{yes}, lock the running executable pages of @i{Amd} into memory. +To improve @i{Amd}'s performance, systems that support the @b{plock}(3) +call can lock the @i{Amd} process into memory. This way there is less +chance the operating system will schedule, page out, and swap the +@i{Amd} process as needed. This improves @i{Amd}'s performance, at the +cost of reserving the memory used by the @i{Amd} process (making it +unavailable for other processes). + +@c ---------------------------------------------------------------- +@node portmap_program Parameter, print_pid Parameter, plock Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{portmap_program} Parameter +@cindex portmap_program Parameter + +(type=numeric, default=300019). Specify an alternate Port-mapper RPC +program number, other than the official number. This is useful when +running multiple @i{Amd} processes. For example, you can run another +@i{Amd} in ``test'' mode, without affecting the primary @i{Amd} process +in any way. For safety reasons, the alternate program numbers that can +be specified must be in the range 300019-300029, inclusive. @i{Amq} has +an option @code{-P} which can be used to specify an alternate program +number of an @i{Amd} to contact. In this way, amq can fully control any +number of @i{Amd} processes running on the same host. + +@c ---------------------------------------------------------------- +@node print_pid Parameter, print_version Parameter, portmap_program Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{print_pid} Parameter +@cindex print_pid Parameter + +(type=boolean, default=@samp{no}). Same as the @code{-p} option to @i{Amd}. +If @samp{yes}, @i{Amd} will print its process ID upon starting. + +@c ---------------------------------------------------------------- +@node print_version Parameter, restart_mounts Parameter, print_pid Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{print_version} Parameter +@cindex print_version Parameter + +(type=boolean, default=@samp{no}). Same as the @code{-v} option to @i{Amd}, +but the version prints and @i{Amd} continues to run. If @samp{yes}, @i{Amd} +will print its version information string, which includes some +configuration and compilation values. + +@c ---------------------------------------------------------------- +@node restart_mounts Parameter, selectors_on_default Parameter, print_version Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{restart_mounts} Parameter +@cindex restart_mounts Parameter + +(type=boolean, default=@samp{no}). Same as the @code{-r} option to @i{Amd}. +If @samp{yes} @i{Amd} will scan the mount table to determine which file +systems are currently mounted. Whenever one of these would have been +auto-mounted, @i{Amd} inherits it. + +@c ---------------------------------------------------------------- +@node selectors_on_default Parameter, show_statfs_entries Parameter, restart_mounts Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{selectors_on_default} Parameter +@cindex selectors_on_default Parameter + +(type=boolean, default=@samp{no}). If @samp{yes}, then the @samp{/defaults} entry of +maps will be looked for and any selectors processed before setting defaults +for all other keys in that map. Useful when you want to set different +options for a complete map based on some parameters. For example, you +may want to better the NFS performance over slow slip-based networks as +follows: + +@example +/defaults \ + wire==slip-net;opts:=intr,rsize=1024,wsize=1024 \ + wire!=slip-net;opts:=intr,rsize=8192,wsize=8192 +@end example + +@c ---------------------------------------------------------------- +@node show_statfs_entries Parameter, unmount_on_exit Parameter , selectors_on_default Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{show_statfs_entries} Parameter +@cindex show_statfs_entries Parameter + +(type=boolean), default=@samp{no}). If @samp{yes}, then all maps which are +browsable will also show the number of entries (keys) they have when +@b{df}(1) runs. (This is accomplished by returning non-zero values to +the @b{statfs}(2) system call). + +@c ---------------------------------------------------------------- +@node unmount_on_exit Parameter, , show_statfs_entries Parameter, Global Parameters +@comment node-name, next, previous, up +@subsection @t{unmount_on_exit} Parameter +@cindex unmount_on_exit Parameter + +(type=boolean), default=@samp{no}). If @samp{yes}, then @i{Amd} will attempt +to unmount all file systems which it knows about. Normally it leaves +all (esp. NFS) mounted file systems intact. Note that @i{Amd} does not +know about file systems mounted before it starts up, unless the +@samp{restart_mounts} option is used (@pxref{restart_mounts Parameter}). + +@c ================================================================ +@node Regular Map Parameters, amd.conf Examples, Global Parameters, Amd Configuration File +@comment node-name, next, previous, up +@section Regular Map Parameters +@cindex amd.conf regular map parameters + +The following parameters are applicable only to regular map sections. + +@menu +* map_name Parameter:: +* tag Parameter:: +@end menu + +@c ---------------------------------------------------------------- +@node map_name Parameter, tag Parameter, Regular Map Parameters, Regular Map Parameters +@comment node-name, next, previous, up +@subsection map_name Parameter +@cindex map_name Parameter + +(type=string, must be specified). Name of the map where the keys are +located. + +@c ---------------------------------------------------------------- +@node tag Parameter, , map_name Parameter, Regular Map Parameters +@comment node-name, next, previous, up +@subsection tag Parameter +@cindex tag Parameter + +(type=string, default no tag). Each map entry in the configuration file +can be tagged. If no tag is specified, that map section will always be +processed by @i{Amd}. If it is specified, then @i{Amd} will process the map +if the @code{-T} option was given to @i{Amd}, and the value given to that +command-line option matches that in the map section. + +@c ================================================================ +@node amd.conf Examples, , Regular Map Parameters, Amd Configuration File +@comment node-name, next, previous, up +@section amd.conf Examples +@cindex amd.conf examples + +The following is the actual @code{amd.conf} file I use at the +Computer Science Department of Columbia University. + +@example +# GLOBAL OPTIONS SECTION +[ global ] +normalize_hostnames = no +print_pid = no +#pid_file = /var/run/amd.pid +restart_mounts = yes +#unmount_on_exit = yes +auto_dir = /n +log_file = /var/log/amd +log_options = all +#debug_options = all +plock = no +selectors_on_default = yes +# config.guess picks up "sunos5" and I don't want to edit my maps yet +os = sos5 +# if you print_version after setting up "os", it will show it. +print_version = no +map_type = file +search_path = /etc/amdmaps:/usr/lib/amd:/usr/local/AMD/lib +browsable_dirs = yes +fully_qualified_hosts = no + +# DEFINE AN AMD MOUNT POINT +[ /u ] +map_name = amd.u + +[ /proj ] +map_name = amd.proj + +[ /src ] +map_name = amd.src + +[ /misc ] +map_name = amd.misc + +[ /import ] +map_name = amd.import + +[ /tftpboot/.amd ] +tag = tftpboot +map_name = amd.tftpboot +@end example + +@c ################################################################ +@node Run-time Administration, FSinfo, Amd Configuration File, Top +@comment node-name, next, previous, up +@chapter Run-time Administration +@cindex Run-time administration +@cindex Amq command + +@menu +* Starting Amd:: +* Stopping Amd:: +* Restarting Amd:: +* Controlling Amd:: +@end menu + +@node Starting Amd, Stopping Amd, Run-time Administration, Run-time Administration +@comment node-name, next, previous, up +@section Starting @i{Amd} +@cindex Starting Amd +@cindex Additions to /etc/rc.local +@cindex /etc/rc.local additions +@cindex ctl-amd + +@i{Amd} is best started from @samp{/etc/rc.local} on BSD systems, or +from the appropriate start-level script in @samp{/etc/init.d} on System V +systems. + +@example +if [ -f /usr/local/sbin/ctl-amd ]; then + /usr/local/sbin/ctl-amd start; (echo -n ' amd') > /dev/console +fi +@end example + +@noindent +The shell script, @samp{ctl-amd} is used to start, stop, or restart +@i{Amd}. It is a relatively generic script. All options you want to +set should not be made in this script, but rather updated in the +@file{amd.conf} file. @xref{Amd Configuration File}. + +If you do not wish to use an @i{Amd} configuration file, you may start +@i{Amd} manually. For example, getting the map entries via NIS: + +@example +amd -r -l /var/log/amd `ypcat -k auto.master` +@end example + +@node Stopping Amd, Restarting Amd, Starting Amd, Run-time Administration +@comment node-name, next, previous, up +@section Stopping @i{Amd} +@cindex Stopping Amd +@cindex SIGTERM signal +@cindex SIGINT signal + +@i{Amd} stops in response to two signals. + +@table @samp +@item SIGTERM +causes the top-level automount points to be unmounted and then @i{Amd} +to exit. Any automounted filesystems are left mounted. They can be +recovered by restarting @i{Amd} with the @code{-r} command line option.@refill + +@item SIGINT +causes @i{Amd} to attempt to unmount any filesystems which it has +automounted, in addition to the actions of @samp{SIGTERM}. This signal +is primarily used for debugging.@refill +@end table + +Actions taken for other signals are undefined. + +The easiest and safest way to stop @i{Amd}, without having to find its +process ID by hand, is to use the @file{ctl-amd} script, as with: + +@example +ctl-amd stop +@end example + +@node Restarting Amd, Controlling Amd, Stopping Amd, Run-time Administration +@comment node-name, next, previous, up +@section Restarting @i{Amd} +@cindex Restarting Amd +@cindex Killing and starting Amd + +Before @i{Amd} can be started, it is vital to ensure that no other +@i{Amd} processes are managing any of the mount points, and that the +previous process(es) have terminated cleanly. When a terminating signal +is set to @i{Amd}, the automounter does @emph{not} terminate right then. +Rather, it starts by unmounting all of its managed mount mounts in the +background, and then terminates. It usually takes a few seconds for +this process to happen, but it can take an arbitrarily longer time. If +two or more @i{Amd} processes attempt to manage the same mount point, it +usually will result in a system lockup. + +The easiest and safest way to restart @i{Amd}, without having to find +its process ID by hand, sending it the @samp{SIGTERM} signal, waiting for @i{Amd} +to die cleanly, and verifying so, is to use the @file{ctl-amd} script, +as with: + +@example +ctl-amd restart +@end example + +The script will locate the process ID of @i{Amd}, kill it, and wait for +it to die cleanly before starting a new instance of the automounter. +@file{ctl-amd} will wait for a total of 30 seconds for @i{Amd} to die, +and will check once every 5 seconds if it had. + +@node Controlling Amd, , Restarting Amd, Run-time Administration +@comment node-name, next, previous, up +@section Controlling @i{Amd} +@cindex Controlling Amd +@cindex Discovering what is going on at run-time +@cindex Listing currently mounted filesystems + +It is sometimes desirable or necessary to exercise external control +over some of @i{Amd}'s internal state. To support this requirement, +@i{Amd} implements an RPC interface which is used by the @dfn{Amq} program. +A variety of information is available. + +@i{Amq} generally applies an operation, specified by a single letter option, +to a list of mount points. The default operation is to obtain statistics +about each mount point. This is similar to the output shown above +but includes information about the number and type of accesses to each +mount point. + +@menu +* Amq default:: Default command behavior. +* Amq -f option:: Flushing the map cache. +* Amq -h option:: Controlling a non-local host. +* Amq -l option:: Controlling the log file. +* Amq -m option:: Obtaining mount statistics. +* Amq -M-option:: Mounting a volume. +* Amq -p option:: Getting Amd's process ID. +* Amq -P-option:: Contacting alternate Amd processes. +* Amq -s option:: Obtaining global statistics. +* Amq -T option:: Use TCP transport. +* Amq -U-option:: Use UDP transport. +* Amq -u option:: Forcing volumes to time out. +* Amq -v option:: Version information. +* Other Amq options:: Three other special options. +@end menu + +@c ---------------------------------------------------------------- +@node Amq default, Amq -f option, Controlling Amd, Controlling Amd +@comment node-name, next, previous, up +@subsection @i{Amq} default information + +With no arguments, @dfn{Amq} obtains a brief list of all existing +mounts created by @i{Amd}. This is different from the list displayed by +@b{df}(1) since the latter only includes system mount points. + +@noindent +The output from this option includes the following information: + +@itemize @bullet +@item +the automount point, +@item +the filesystem type, +@item +the mount map or mount information, +@item +the internal, or system mount point. +@end itemize + +@noindent +For example: + +@example +/ root "root" sky:(pid75) +/homes toplvl /usr/local/etc/amd.homes /homes +/home toplvl /usr/local/etc/amd.home /home +/homes/jsp nfs charm:/home/charm /a/charm/home/charm/jsp +/homes/phjk nfs toytown:/home/toytown /a/toytown/home/toytown/ai/phjk +@end example + +@noindent +If an argument is given then statistics for that volume name will +be output. For example: + +@example +What Uid Getattr Lookup RdDir RdLnk Statfs Mounted@@ +/homes 0 1196 512 22 0 30 90/09/14 12:32:55 +/homes/jsp 0 0 0 0 1180 0 90/10/13 12:56:58 +@end example + +@table @code +@item What +the volume name. + +@item Uid +ignored. + +@item Getattr +the count of NFS @dfn{getattr} requests on this node. This should only be +non-zero for directory nodes. + +@item Lookup +the count of NFS @dfn{lookup} requests on this node. This should only be +non-zero for directory nodes. + +@item RdDir +the count of NFS @dfn{readdir} requests on this node. This should only +be non-zero for directory nodes. + +@item RdLnk +the count of NFS @dfn{readlink} requests on this node. This should be +zero for directory nodes. + +@item Statfs +the count of NFS @dfn{statfs} requests on this node. This should only +be non-zero for top-level automount points. + +@item Mounted@@ +the date and time the volume name was first referenced. +@end table + +@c ---------------------------------------------------------------- +@node Amq -f option, Amq -h option, Amq default, Controlling Amd +@comment node-name, next, previous, up +@subsection @i{Amq} @code{-f} option +@cindex Flushing the map cache +@cindex Map cache, flushing + +The @code{-f} option causes @i{Amd} to flush the internal mount map cache. +This is useful for example in Hesiod maps since @i{Amd} will not +automatically notice when they have been updated. The map cache can +also be synchronized with the map source by using the @samp{sync} option +(@pxref{Automount Filesystem}).@refill + +@c ---------------------------------------------------------------- +@node Amq -l option, Amq -m option, Amq -h option, Controlling Amd +@comment node-name, next, previous, up +@subsection @i{Amq} @code{-l} option +@cindex Resetting the Amd log file +@cindex Setting the Amd log file via Amq +@cindex Log file, resetting + +Tell @i{Amd} to use @i{log_file} as the log file name. For security +reasons, this @emph{must} be the same log file which @i{Amd} used when +started. This option is therefore only useful to refresh @i{Amd}'s open +file handle on the log file, so that it can be rotated and compressed +via daily cron jobs. + +@c ---------------------------------------------------------------- +@node Amq -h option, Amq -l option, Amq -f option, Controlling Amd +@comment node-name, next, previous, up +@subsection @i{Amq} @code{-h} option +@cindex Querying an alternate host + +By default the local host is used. In an HP-UX cluster the root server +is used since that is the only place in the cluster where @i{Amd} will +be running. To query @i{Amd} on another host the @code{-h} option should +be used. + +@c ---------------------------------------------------------------- +@node Amq -m option, Amq -M-option, Amq -l option, Controlling Amd +@comment node-name, next, previous, up +@subsection @i{Amq} @code{-m} option + +The @code{-m} option displays similar information about mounted +filesystems, rather than automount points. The output includes the +following information: + +@itemize @bullet +@item +the mount information, +@item +the mount point, +@item +the filesystem type, +@item +the number of references to this filesystem, +@item +the server hostname, +@item +the state of the file server, +@item +any error which has occurred. +@end itemize + +For example: + +@example +"root" truth:(pid602) root 1 localhost is up +hesiod.home /home toplvl 1 localhost is up +hesiod.vol /vol toplvl 1 localhost is up +hesiod.homes /homes toplvl 1 localhost is up +amy:/home/amy /a/amy/home/amy nfs 5 amy is up +swan:/home/swan /a/swan/home/swan nfs 0 swan is up (Permission denied) +ex:/home/ex /a/ex/home/ex nfs 0 ex is down +@end example + +When the reference count is zero the filesystem is not mounted but +the mount point and server information is still being maintained +by @i{Amd}. + +@c ---------------------------------------------------------------- +@node Amq -M-option, Amq -p option, Amq -m option, Controlling Amd +@comment node-name, next, previous, up +@subsection @i{Amq} @code{-M} option + +The @code{-M} option passes a new map entry to @i{Amd} and waits for it to +be evaluated, possibly causing a mount. For example, the following +command would cause @samp{/home/toytown} on host @samp{toytown} to be +mounted locally on @samp{/mnt/toytown}. + +@example +amq -M '/mnt/toytown type:=nfs;rfs:=/home/toytown;rhost:=toytown;fs:=$@{key@}' +@end example + +@i{Amd} applies some simple security checks before allowing this +operation. The check tests whether the incoming request is from a +privileged UDP port on the local machine. ``Permission denied'' is +returned if the check fails. + +This option is very insecure as it is vulnerable to attacks such as IP +Spoofing. In other words, it is relatively easy for an attacker who +really wants to, to make your @i{Amd} process mount any filesystem from +the Internet! Therefore, the @emph{complete} code which supports the +@code{-M} option in @i{Amd} and @i{Amq} is turned off by default. To turn +it on, you have to reconfigure am-utils with @code{configure +--enable-amq-mount}. Think twice before doing so, and use this option +only if you absolutely need to. + +A future release of @i{Amd} will include code to allow the @b{mount}(8) +command to mount automount points: + +@example +mount -t amd /vol hesiod.vol +@end example + +This will then allow @i{Amd} to be controlled from the standard system +filesystem mount list. + +@c ---------------------------------------------------------------- +@node Amq -p option, Amq -P-option, Amq -M-option, Controlling Amd +@comment node-name, next, previous, up +@subsection @i{Amq} @code{-p} option +@cindex Process ID; Amd +@cindex Amd's process ID +@cindex Amd's PID +@cindex PID; Amd + +Return the process ID of the remote or locally running @i{Amd}. Useful +when you need to send a signal to the local @i{Amd} process, and would +rather not have to search through the process table. This option is +used in the @file{ctl-amd} script. + +@c ---------------------------------------------------------------- +@node Amq -P-option, Amq -s option, Amq -p option, Controlling Amd +@comment node-name, next, previous, up +@subsection @i{Amq} @code{-P} option +@cindex Multiple Amd processes +@cindex Running multiple Amd +@cindex Debugging a new Amd configuration +@cindex RPC Program numbers; Amd + +Contact an alternate running @i{Amd} that had registered itself on a +different RPC @var{program_number} and apply all other operations to +that instance of the automounter. This is useful when you run multiple +copies of @i{Amd}, and need to manage each one separately. If not +specified, @i{Amq} will use the default program number for @i{Amd}, 300019. +For security reasons, the only alternate program numbers @i{Amd} can use +range from 300019 to 300029, inclusive. + +For example, to kill an alternate running @i{Amd}: + +@example +kill `amq -p -P 300020` +@end example + +@c ---------------------------------------------------------------- +@node Amq -s option, Amq -T option, Amq -P-option, Controlling Amd +@comment node-name, next, previous, up +@subsection @i{Amq} @code{-s} option +@cindex Global statistics +@cindex Statistics + +The @code{-s} option displays global statistics. If any other options are specified +or any filesystems named then this option is ignored. For example: + +@example +requests stale mount mount unmount +deferred fhandles ok failed failed +1054 1 487 290 7017 +@end example + +@table @samp +@item Deferred requests +are those for which an immediate reply could not be constructed. For +example, this would happen if a background mount was required. + +@item Stale filehandles +counts the number of times the kernel passes a stale filehandle to @i{Amd}. +Large numbers indicate problems. + +@item Mount ok +counts the number of automounts which were successful. + +@item Mount failed +counts the number of automounts which failed. + +@item Unmount failed +counts the number of times a filesystem could not be unmounted. Very +large numbers here indicate that the time between unmount attempts +should be increased. +@end table + +@c ---------------------------------------------------------------- +@node Amq -T option, Amq -U-option, Amq -s option, Controlling Amd +@comment node-name, next, previous, up +@subsection @i{Amq} @code{-T} option +@cindex Forcing Amq to use a TCP transport +@cindex TCP; using with Amq + +The @code{-T} option causes the @i{Amq} to contact @i{Amd} using the TCP +transport only (connection oriented). Normally, @i{Amq} will use TCP +first, and if that failed, will try UDP. + +@c ---------------------------------------------------------------- +@node Amq -U-option, Amq -u option, Amq -T option, Controlling Amd +@comment node-name, next, previous, up +@subsection @i{Amq} @code{-U} option +@cindex Forcing Amq to use a UDP transport +@cindex UDP; using with Amq + +The @code{-U} option causes the @i{Amq} to contact @i{Amd} using the UDP +transport only (connectionless). Normally, @i{Amq} will use TCP first, +and if that failed, will try UDP. + +@c ---------------------------------------------------------------- +@node Amq -u option, Amq -v option, Amq -U-option, Controlling Amd +@comment node-name, next, previous, up +@subsection @i{Amq} @code{-u} option +@cindex Forcing filesystem to time out +@cindex Unmounting a filesystem + +The @code{-u} option causes the time-to-live interval of the named mount +points to be expired, thus causing an unmount attempt. This is the only +safe way to unmount an automounted filesystem. It is not possible to +unmount a filesystem which has been mounted with the @samp{nounmount} +flag. + +@c The @code{-H} option informs @i{Amd} that the specified mount point has hung - +@c as if its keepalive timer had expired. + +@c ---------------------------------------------------------------- +@node Amq -v option, Other Amq options, Amq -u option, Controlling Amd +@comment node-name, next, previous, up +@subsection @i{Amq} @code{-v} option +@cindex Version information at run-time + +The @code{-v} option displays the version of @i{Amd} in a similar way to +@i{Amd}'s @code{-v} option. + +@c ---------------------------------------------------------------- +@node Other Amq options, , Amq -v option, Controlling Amd +@comment node-name, next, previous, up +@subsection Other @i{Amq} options +@cindex Logging options via Amq +@cindex Debugging options via Amq + +Two other operations are implemented. These modify the state of @i{Amd} +as a whole, rather than any particular filesystem. The @code{-x} and +@code{-D} options have exactly the same effect as @i{Amd}'s corresponding +command line options. + +When @i{Amd} receives a @code{-x} flag it limits the log options being +modified to those which were not enabled at startup. This prevents a +user turning @emph{off} any logging option which was specified at +startup, though any which have been turned on since then can still be +turned off. The @code{-D} option has a similar behavior. + +@c ################################################################ +@node FSinfo, Hlfsd, Run-time Administration, Top +@comment node-name, next, previous, up +@chapter FSinfo +@cindex FSinfo +@cindex Filesystem info package + +XXX: this chapter should be reviewed by someone knowledgeable with +fsinfo. + +@menu +* FSinfo Overview:: Introduction to FSinfo. +* Using FSinfo:: Basic concepts. +* FSinfo Grammar:: Language syntax, semantics and examples. +* FSinfo host definitions:: Defining a new host. +* FSinfo host attributes:: Definable host attributes. +* FSinfo filesystems:: Defining locally attached filesystems. +* FSinfo static mounts:: Defining additional static mounts. +* FSinfo automount definitions:: +* FSinfo Command Line Options:: +* FSinfo errors:: +@end menu + +@node FSinfo Overview, Using FSinfo, FSinfo, FSinfo +@comment node-name, next, previous, up +@section @i{FSinfo} overview +@cindex FSinfo overview + +@i{FSinfo} is a filesystem management tool. It has been designed to +work with @i{Amd} to help system administrators keep track of the ever +increasing filesystem namespace under their control. + +The purpose of @i{FSinfo} is to generate all the important standard +filesystem data files from a single set of input data. Starting with a +single data source guarantees that all the generated files are +self-consistent. One of the possible output data formats is a set of +@i{Amd} maps which can be used amongst the set of hosts described in the +input data. + +@i{FSinfo} implements a declarative language. This language is +specifically designed for describing filesystem namespace and physical +layouts. The basic declaration defines a mounted filesystem including +its device name, mount point, and all the volumes and access +permissions. @i{FSinfo} reads this information and builds an internal +map of the entire network of hosts. Using this map, many different data +formats can be produced including @file{/etc/fstab}, +@file{/etc/exports}, @i{Amd} mount maps and +@file{/etc/bootparams}.@refill + +@node Using FSinfo, FSinfo Grammar, FSinfo Overview, FSinfo +@comment node-name, next, previous, up +@section Using @i{FSinfo} +@cindex Using FSinfo + +The basic strategy when using @i{FSinfo} is to gather all the +information about all disks on all machines into one set of +declarations. For each machine being managed, the following data is +required: + +@itemize @bullet +@item +Hostname +@item +List of all filesystems and, optionally, their mount points. +@item +Names of volumes stored on each filesystem. +@item +NFS export information for each volume. +@item +The list of static filesystem mounts. +@end itemize + +The following information can also be entered into the same +configuration files so that all data can be kept in one place. + +@itemize @bullet +@item +List of network interfaces +@item +IP address of each interface +@item +Hardware address of each interface +@item +Dumpset to which each filesystem belongs +@item +and more @dots{} +@end itemize + +To generate @i{Amd} mount maps, the automount tree must also be defined +(@pxref{FSinfo automount definitions}). This will have been designed at +the time the volume names were allocated. Some volume names will not be +automounted, so @i{FSinfo} needs an explicit list of which volumes +should be automounted.@refill + +Hostnames are required at several places in the @i{FSinfo} language. It +is important to stick to either fully qualified names or unqualified +names. Using a mixture of the two will inevitably result in confusion. + +Sometimes volumes need to be referenced which are not defined in the set +of hosts being managed with @i{FSinfo}. The required action is to add a +dummy set of definitions for the host and volume names required. Since +the files generated for those particular hosts will not be used on them, +the exact values used is not critical. + +@node FSinfo Grammar, FSinfo host definitions, Using FSinfo, FSinfo +@comment node-name, next, previous, up +@section @i{FSinfo} grammar +@cindex FSinfo grammar +@cindex Grammar, FSinfo + +@i{FSinfo} has a relatively simple grammar. Distinct syntactic +constructs exist for each of the different types of data, though they +share a common flavor. Several conventions are used in the grammar +fragments below. + +The notation, @i{list(}@t{xxx}@i{)}, indicates a list of zero or more +@t{xxx}'s. The notation, @i{opt(}@t{xxx}@i{)}, indicates zero or one +@t{xxx}. Items in double quotes, @i{eg} @t{"host"}, represent input +tokens. Items in angle brackets, @i{eg} @var{<hostname>}, represent +strings in the input. Strings need not be in double quotes, except to +differentiate them from reserved words. Quoted strings may include the +usual set of C ``@t{\}'' escape sequences with one exception: a +backslash-newline-whitespace sequence is squashed into a single space +character. To defeat this feature, put a further backslash at the start +of the second line. + +At the outermost level of the grammar, the input consists of a +sequence of host and automount declarations. These declarations are +all parsed before they are analyzed. This means they can appear in +any order and cyclic host references are possible. + +@example +fsinfo : @i{list(}fsinfo_attr@i{)} ; + +fsinfo_attr : host | automount ; +@end example + +@menu +* FSinfo host definitions:: +* FSinfo automount definitions:: +@end menu + +@node FSinfo host definitions, FSinfo host attributes, FSinfo Grammar, FSinfo +@comment node-name, next, previous, up +@section @i{FSinfo} host definitions +@cindex FSinfo host definitions +@cindex Defining a host, FSinfo + +A host declaration consists of three parts: a set of machine attribute +data, a list of filesystems physically attached to the machine, and a +list of additional statically mounted filesystems. + +@example +host : "host" host_data @i{list(}filesystem@i{@i{)}} @i{list(}mount@i{@i{)}} ; +@end example + +Each host must be declared in this way exactly once. Such things as the +hardware address, the architecture and operating system types and the +cluster name are all specified within the @dfn{host data}. + +All the disks the machine has should then be described in the @dfn{list +of filesystems}. When describing disks, you can specify what +@dfn{volname} the disk/partition should have and all such entries are +built up into a dictionary which can then be used for building the +automounter maps. + +The @dfn{list of mounts} specifies all the filesystems that should be +statically mounted on the machine. + +@menu +* FSinfo host attributes:: +* FSinfo filesystems:: +* FSinfo static mounts:: +@end menu + +@node FSinfo host attributes, FSinfo filesystems, FSinfo host definitions , FSinfo host definitions +@comment node-name, next, previous, up +@section @i{FSinfo} host attributes +@cindex FSinfo host attributes +@cindex Defining host attributes, FSinfo + +The host data, @dfn{host_data}, always includes the @dfn{hostname}. In +addition, several other host attributes can be given. + +@example +host_data : @var{<hostname>} + | "@{" @i{list(}host_attrs@i{)} "@}" @var{<hostname>} + ; + +host_attrs : host_attr "=" @var{<string>} + | netif + ; + +host_attr : "config" + | "arch" + | "os" + | "cluster" + ; +@end example + +The @dfn{hostname} is, typically, the fully qualified hostname of the +machine. + +Examples: + +@example +host dylan.doc.ic.ac.uk + +host @{ + os = hpux + arch = hp300 +@} dougal.doc.ic.ac.uk +@end example + +The options that can be given as host attributes are shown below. + +@menu +* netif Option: FSinfo host netif: +* config Option: FSinfo host config: +* arch Option: FSinfo host arch: +* os Option: FSinfo host os: +* cluster Option: FSinfo host cluster: +@end menu + +@node FSinfo host netif, FSinfo host config, , FSinfo host attributes +@comment node-name, next, previous, up +@subsection netif Option + +This defines the set of network interfaces configured on the machine. +The interface attributes collected by @i{FSinfo} are the IP address, +subnet mask and hardware address. Multiple interfaces may be defined +for hosts with several interfaces by an entry for each interface. The +values given are sanity checked, but are currently unused for anything +else. + +@example +netif : "netif" @var{<string>} "@{" @i{list(}netif_attrs@i{)} "@}" ; + +netif_attrs : netif_attr "=" @var{<string>} ; + +netif_attr : "inaddr" | "netmask" | "hwaddr" ; +@end example + +Examples: + +@example +netif ie0 @{ + inaddr = 129.31.81.37 + netmask = 0xfffffe00 + hwaddr = "08:00:20:01:a6:a5" +@} + +netif ec0 @{ @} +@end example + +@node FSinfo host config, FSinfo host arch, FSinfo host netif, FSinfo host attributes +@comment node-name, next, previous, up +@subsection config Option +@cindex FSinfo config host attribute +@cindex config, FSinfo host attribute + +This option allows you to specify configuration variables for the +startup scripts (@file{rc} scripts). A simple string should immediately +follow the keyword. + +Example: + +@example +config "NFS_SERVER=true" +config "ZEPHYR=true" +@end example + +This option is currently unsupported. + +@node FSinfo host arch, FSinfo host os, FSinfo host config, FSinfo host attributes +@comment node-name, next, previous, up +@subsection arch Option +@cindex FSinfo arch host attribute +@cindex arch, FSinfo host attribute + +This defines the architecture of the machine. For example: + +@example +arch = hp300 +@end example + +This is intended to be of use when building architecture specific +mountmaps, however, the option is currently unsupported. + +@node FSinfo host os, FSinfo host cluster, FSinfo host arch, FSinfo host attributes +@comment node-name, next, previous, up +@subsection os Option +@cindex FSinfo os host attribute +@cindex os, FSinfo host attribute + +This defines the operating system type of the host. For example: + +@example +os = hpux +@end example + +This information is used when creating the @file{fstab} files, for +example in choosing which format to use for the @file{fstab} entries +within the file. + +@node FSinfo host cluster, , FSinfo host os, FSinfo host attributes +@comment node-name, next, previous, up +@subsection cluster Option +@cindex FSinfo cluster host attribute +@cindex cluster, FSinfo host attribute + +This is used for specifying in which cluster the machine belongs. For +example: + +@example +cluster = "theory" +@end example + +The cluster is intended to be used when generating the automount maps, +although it is currently unsupported. + +@node FSinfo filesystems, FSinfo static mounts, FSinfo host attributes, FSinfo host definitions +@comment node-name, next, previous, up +@section @i{FSinfo} filesystems +@cindex FSinfo filesystems + +The list of physically attached filesystems follows the machine +attributes. These should define all the filesystems available from this +machine, whether exported or not. In addition to the device name, +filesystems have several attributes, such as filesystem type, mount +options, and @samp{fsck} pass number which are needed to generate +@file{fstab} entries. + +@example +filesystem : "fs" @var{<device>} "@{" @i{list(}fs_data@i{)} "@}" ; + +fs_data : fs_data_attr "=" @var{<string>} + | mount + ; + +fs_data_attr + : "fstype" | "opts" | "passno" + | "freq" | "dumpset" | "log" + ; +@end example + +Here, @var{<device>} is the device name of the disk (for example, +@file{/dev/dsk/2s0}). The device name is used for building the mount +maps and for the @file{fstab} file. The attributes that can be +specified are shown in the following section. + +The @i{FSinfo} configuration file for @code{dylan.doc.ic.ac.uk} is listed below. + +@example +host dylan.doc.ic.ac.uk + +fs /dev/dsk/0s0 @{ + fstype = swap +@} + +fs /dev/dsk/0s0 @{ + fstype = hfs + opts = rw,noquota,grpid + passno = 0; + freq = 1; + mount / @{ @} +@} + +fs /dev/dsk/1s0 @{ + fstype = hfs + opts = defaults + passno = 1; + freq = 1; + mount /usr @{ + local @{ + exportfs "dougal eden dylan zebedee brian" + volname /nfs/hp300/local + @} + @} +@} + +fs /dev/dsk/2s0 @{ + fstype = hfs + opts = defaults + passno = 1; + freq = 1; + mount default @{ + exportfs "toytown_clients hangers_on" + volname /home/dylan/dk2 + @} +@} + +fs /dev/dsk/3s0 @{ + fstype = hfs + opts = defaults + passno = 1; + freq = 1; + mount default @{ + exportfs "toytown_clients hangers_on" + volname /home/dylan/dk3 + @} +@} + +fs /dev/dsk/5s0 @{ + fstype = hfs + opts = defaults + passno = 1; + freq = 1; + mount default @{ + exportfs "toytown_clients hangers_on" + volname /home/dylan/dk5 + @} +@} +@end example + +@menu +* fstype Option: FSinfo filesystems fstype: +* opts Option: FSinfo filesystems opts: +* passno Option: FSinfo filesystems passno: +* freq Option: FSinfo filesystems freq: +* mount Option: FSinfo filesystems mount: +* dumpset Option: FSinfo filesystems dumpset: +* log Option: FSinfo filesystems log: +@end menu + +@node FSinfo filesystems fstype, FSinfo filesystems opts, , FSinfo filesystems +@comment node-name, next, previous, up +@subsection fstype Option +@cindex FSinfo fstype filesystems option +@cindex fstype, FSinfo filesystems option +@cindex export, FSinfo special fstype + +This specifies the type of filesystem being declared and will be placed +into the @file{fstab} file as is. The value of this option will be +handed to @code{mount} as the filesystem type---it should have such +values as @code{4.2}, @code{nfs} or @code{swap}. The value is not +examined for correctness. + +There is one special case. If the filesystem type is specified as +@samp{export} then the filesystem information will not be added to the +host's @file{fstab} information, but it will still be visible on the +network. This is useful for defining hosts which contain referenced +volumes but which are not under full control of @i{FSinfo}. + +Example: + +@example +fstype = swap +@end example + +@node FSinfo filesystems opts, FSinfo filesystems passno, FSinfo filesystems fstype, FSinfo filesystems +@comment node-name, next, previous, up +@subsection opts Option +@cindex FSinfo opts filesystems option +@cindex opts, FSinfo filesystems option + +This defines any options that should be given to @b{mount}(8) in the +@file{fstab} file. For example: + +@example +opts = rw,nosuid,grpid +@end example + +@node FSinfo filesystems passno, FSinfo filesystems freq, FSinfo filesystems opts, FSinfo filesystems +@comment node-name, next, previous, up +@subsection passno Option +@cindex FSinfo passno filesystems option +@cindex passno, FSinfo filesystems option + +This defines the @b{fsck}(8) pass number in which to check the +filesystem. This value will be placed into the @file{fstab} file. + +Example: + +@example +passno = 1 +@end example + +@node FSinfo filesystems freq, FSinfo filesystems mount, FSinfo filesystems passno, FSinfo filesystems +@comment node-name, next, previous, up +@subsection freq Option +@cindex FSinfo freq filesystems option +@cindex freq, FSinfo filesystems option + +This defines the interval (in days) between dumps. The value is placed +as is into the @file{fstab} file. + +Example: + +@example +freq = 3 +@end example + +@node FSinfo filesystems mount, FSinfo filesystems dumpset, FSinfo filesystems freq, FSinfo filesystems +@comment node-name, next, previous, up +@subsection mount Option +@cindex FSinfo mount filesystems option +@cindex mount, FSinfo filesystems option +@cindex exportfs, FSinfo mount option +@cindex volname, FSinfo mount option +@cindex sel, FSinfo mount option + +This defines the mountpoint at which to place the filesystem. If the +mountpoint of the filesystem is specified as @code{default}, then the +filesystem will be mounted in the automounter's tree under its volume +name and the mount will automatically be inherited by the automounter. + +Following the mountpoint, namespace information for the filesystem may +be described. The options that can be given here are @code{exportfs}, +@code{volname} and @code{sel}. + +The format is: + +@example +mount : "mount" vol_tree ; + +vol_tree : @i{list(}vol_tree_attr@i{)} ; + +vol_tree_attr + : @var{<string>} "@{" @i{list(}vol_tree_info@i{)} vol_tree "@}" ; + +vol_tree_info + : "exportfs" @var{<export-data>} + | "volname" @var{<volname>} + | "sel" @var{<selector-list>} + ; +@end example + +Example: + +@example +mount default @{ + exportfs "dylan dougal florence zebedee" + volname /vol/andrew +@} +@end example + +In the above example, the filesystem currently being declared will have +an entry placed into the @file{exports} file allowing the filesystem to +be exported to the machines @code{dylan}, @code{dougal}, @code{florence} +and @code{zebedee}. The volume name by which the filesystem will be +referred to remotely, is @file{/vol/andrew}. By declaring the +mountpoint to be @code{default}, the filesystem will be mounted on the +local machine in the automounter tree, where @i{Amd} will automatically +inherit the mount as @file{/vol/andrew}.@refill + +@table @samp +@item exportfs +a string defining which machines the filesystem may be exported to. +This is copied, as is, into the @file{exports} file---no sanity checking +is performed on this string.@refill + +@item volname +a string which declares the remote name by which to reference the +filesystem. The string is entered into a dictionary and allows you to +refer to this filesystem in other places by this volume name.@refill + +@item sel +a string which is placed into the automounter maps as a selector for the +filesystem.@refill + +@end table + +@node FSinfo filesystems dumpset, FSinfo filesystems log, FSinfo filesystems mount, FSinfo filesystems +@comment node-name, next, previous, up +@subsection dumpset Option +@cindex FSinfo dumpset filesystems option +@cindex dumpset, FSinfo filesystems option + +This provides support for Imperial College's local file backup tools and +is not documented further here. + +@node FSinfo filesystems log, , FSinfo filesystems dumpset, FSinfo filesystems +@comment node-name, next, previous, up +@subsection log Option +@cindex FSinfo log filesystems option +@cindex log, FSinfo filesystems option + +Specifies the log device for the current filesystem. This is ignored if +not required by the particular filesystem type. + +@node FSinfo static mounts, FSinfo automount definitions , FSinfo filesystems, FSinfo host definitions +@comment node-name, next, previous, up +@section @i{FSinfo} static mounts +@cindex FSinfo static mounts +@cindex Statically mounts filesystems, FSinfo + +Each host may also have a number of statically mounted filesystems. For +example, the host may be a diskless workstation in which case it will +have no @code{fs} declarations. In this case the @code{mount} +declaration is used to determine from where its filesystems will be +mounted. In addition to being added to the @file{fstab} file, this +information can also be used to generate a suitable @file{bootparams} +file.@refill + +@example +mount : "mount" @var{<volname>} @i{list(}localinfo@i{)} ; + +localinfo : localinfo_attr @var{<string>} ; + +localinfo_attr + : "as" + | "from" + | "fstype" + | "opts" + ; +@end example + +The filesystem specified to be mounted will be searched for in the +dictionary of volume names built when scanning the list of hosts' +definitions. + +The attributes have the following semantics: +@table @samp +@item from @var{machine} +mount the filesystem from the machine with the hostname of +@dfn{machine}.@refill + +@item as @var{mountpoint} +mount the filesystem locally as the name given, in case this is +different from the advertised volume name of the filesystem. + +@item opts @var{options} +native @b{mount}(8) options. + +@item fstype @var{type} +type of filesystem to be mounted. +@end table + +An example: + +@example +mount /export/exec/hp300/local as /usr/local +@end example + +If the mountpoint specified is either @file{/} or @file{swap}, the +machine will be considered to be booting off the net and this will be +noted for use in generating a @file{bootparams} file for the host which +owns the filesystems. + +@node FSinfo automount definitions, FSinfo Command Line Options, FSinfo static mounts, FSinfo +@comment node-name, next, previous, up +@section Defining an @i{Amd} Mount Map in @i{FSinfo} +@cindex FSinfo automount definitions +@cindex Defining an Amd mount map, FSinfo + +The maps used by @i{Amd} can be constructed from @i{FSinfo} by defining +all the automount trees. @i{FSinfo} takes all the definitions found and +builds one map for each top level tree. + +The automount tree is usually defined last. A single automount +configuration will usually apply to an entire management domain. One +@code{automount} declaration is needed for each @i{Amd} automount point. +@i{FSinfo} determines whether the automount point is @dfn{direct} +(@pxref{Direct Automount Filesystem}) or @dfn{indirect} +(@pxref{Top-level Filesystem}). Direct automount points are +distinguished by the fact that there is no underlying +@dfn{automount_tree}.@refill + +@example +automount : "automount" @i{opt(}auto_opts@i{)} automount_tree ; + +auto_opts : "opts" @var{<mount-options>} ; + +automount_tree + : @i{list(}automount_attr@i{)} + ; + +automount_attr + : @var{<string>} "=" @var{<volname>} + | @var{<string>} "->" @var{<symlink>} + | @var{<string>} "@{" automount_tree "@}" + ; +@end example + +If @var{<mount-options>} is given, then it is the string to be placed in +the maps for @i{Amd} for the @code{opts} option. + +A @dfn{map} is typically a tree of filesystems, for example @file{home} +normally contains a tree of filesystems representing other machines in +the network. + +A map can either be given as a name representing an already defined +volume name, or it can be a tree. A tree is represented by placing +braces after the name. For example, to define a tree @file{/vol}, the +following map would be defined: + +@example +automount /vol @{ @} +@end example + +Within a tree, the only items that can appear are more maps. +For example: + +@example +automount /vol @{ + andrew @{ @} + X11 @{ @} +@} +@end example + +In this case, @i{FSinfo} will look for volumes named @file{/vol/andrew} +and @file{/vol/X11} and a map entry will be generated for each. If the +volumes are defined more than once, then @i{FSinfo} will generate +a series of alternate entries for them in the maps.@refill + +Instead of a tree, either a link (@var{name} @code{->} +@var{destination}) or a reference can be specified (@var{name} @code{=} +@var{destination}). A link creates a symbolic link to the string +specified, without further processing the entry. A reference will +examine the destination filesystem and optimize the reference. For +example, to create an entry for @code{njw} in the @file{/homes} map, +either of the two forms can be used:@refill + +@example +automount /homes @{ + njw -> /home/dylan/njw +@} +@end example + +or + +@example +automount /homes @{ + njw = /home/dylan/njw +@} +@end example + +In the first example, when @file{/homes/njw} is referenced from @i{Amd}, +a link will be created leading to @file{/home/dylan/njw} and the +automounter will be referenced a second time to resolve this filename. +The map entry would be: + +@example +njw type:=link;fs:=/home/dylan/njw +@end example + +In the second example, the destination directory is analyzed and found +to be in the filesystem @file{/home/dylan} which has previously been +defined in the maps. Hence the map entry will look like: + +@example +njw rhost:=dylan;rfs:=/home/dylan;sublink:=njw +@end example + +Creating only one symbolic link, and one access to @i{Amd}. + +@node FSinfo Command Line Options, FSinfo errors, FSinfo automount definitions, FSinfo +@comment node-name, next, previous, up +@section @i{FSinfo} Command Line Options +@cindex FSinfo command line options +@cindex Command line options, FSinfo + +@i{FSinfo} is started from the command line by using the command: + +@example +fsinfo [@i{options}] @i{files} ... +@end example + +The input to @i{FSinfo} is a single set of definitions of machines and +automount maps. If multiple files are given on the command-line, then +the files are concatenated together to form the input source. The files +are passed individually through the C pre-processor before being parsed. + +Several options define a prefix for the name of an output file. If the +prefix is not specified no output of that type is produced. The suffix +used will correspond either to the hostname to which a file belongs, or +to the type of output if only one file is produced. Dumpsets and the +@file{bootparams} file are in the latter class. To put the output into +a subdirectory simply put a @file{/} at the end of the prefix, making +sure that the directory has already been made before running +@i{Fsinfo}. + +@menu +* -a FSinfo Option:: Amd automount directory: +* -b FSinfo Option:: Prefix for bootparams files. +* -d FSinfo Option:: Prefix for dumpset data files. +* -e FSinfo Option:: Prefix for exports files. +* -f FSinfo Option:: Prefix for fstab files. +* -h FSinfo Option:: Local hostname. +* -m FSinfo Option:: Prefix for automount maps. +* -q FSinfo Option:: Ultra quiet mode. +* -v FSinfo Option:: Verbose mode. +* -I FSinfo Option:: Define new #include directory. +* -D-FSinfo Option:: Define macro. +* -U FSinfo Option:: Undefine macro. +@end menu + +@node -a FSinfo Option, -b FSinfo Option, FSinfo Command Line Options, FSinfo Command Line Options +@comment node-name, next, previous, up +@subsection @code{-a} @var{autodir} + +Specifies the directory name in which to place the automounter's +mountpoints. This defaults to @file{/a}. Some sites have the autodir set +to be @file{/amd}, and this would be achieved by: + +@example +fsinfo -a /amd ... +@end example + +@node -b FSinfo Option, -d FSinfo Option, -a FSinfo Option, FSinfo Command Line Options +@comment node-name, next, previous, up +@subsection @code{-b} @var{bootparams} +@cindex bootparams, FSinfo prefix + +This specifies the prefix for the @file{bootparams} filename. If it is +not given, then the file will not be generated. The @file{bootparams} +file will be constructed for the destination machine and will be placed +into a file named @file{bootparams} and prefixed by this string. The +file generated contains a list of entries describing each diskless +client that can boot from the destination machine. + +As an example, to create a @file{bootparams} file in the directory +@file{generic}, the following would be used: + +@example +fsinfo -b generic/ ... +@end example + +@node -d FSinfo Option, -e FSinfo Option, -b FSinfo Option, FSinfo Command Line Options +@comment node-name, next, previous, up +@subsection @code{-d} @var{dumpsets} +@cindex dumpset, FSinfo prefix + +This specifies the prefix for the @file{dumpsets} file. If it is not +specified, then the file will not be generated. The file will be for +the destination machine and will be placed into a filename +@file{dumpsets}, prefixed by this string. The @file{dumpsets} file is +for use by Imperial College's local backup system. + +For example, to create a @file{dumpsets} file in the directory @file{generic}, +then you would use the following: + +@example +fsinfo -d generic/ ... +@end example + +@node -e FSinfo Option, -f FSinfo Option, -d FSinfo Option, FSinfo Command Line Options +@comment node-name, next, previous, up +@subsection @code{-e} @var{exportfs} +@cindex exports, FSinfo prefix + +Defines the prefix for the @file{exports} files. If it is not given, +then the file will not be generated. For each machine defined in the +configuration files as having disks, an @file{exports} file is +constructed and given a filename determined by the name of the machine, +prefixed with this string. If a machine is defined as diskless, then no +@file{exports} file will be created for it. The files contain entries +for directories on the machine that may be exported to clients. + +Example: To create the @file{exports} files for each diskfull machine +and place them into the directory @file{exports}: + +@example +fsinfo -e exports/ ... +@end example + +@node -f FSinfo Option, -h FSinfo Option, -e FSinfo Option, FSinfo Command Line Options +@comment node-name, next, previous, up +@subsection @code{-f} @var{fstab} +@cindex fstab, FSinfo prefix + +This defines the prefix for the @file{fstab} files. The files will only +be created if this prefix is defined. For each machine defined in the +configuration files, a @file{fstab} file is created with the filename +determined by prefixing this string with the name of the machine. These +files contain entries for filesystems and partitions to mount at boot +time. + +Example, to create the files in the directory @file{fstabs}: + +@example +fsinfo -f fstabs/ ... +@end example + +@node -h FSinfo Option, -m FSinfo Option, -f FSinfo Option, FSinfo Command Line Options +@comment node-name, next, previous, up +@subsection @code{-h} @var{hostname} +@cindex hostname, FSinfo command line option + +Defines the hostname of the destination machine to process for. If this +is not specified, it defaults to the local machine name, as returned by +@b{gethostname}(2). + +Example: + +@example +fsinfo -h dylan.doc.ic.ac.uk ... +@end example + +@node -m FSinfo Option, -q FSinfo Option, -h FSinfo Option, FSinfo Command Line Options +@comment node-name, next, previous, up +@subsection @code{-m} @var{mount-maps} +@cindex maps, FSinfo command line option + +Defines the prefix for the automounter files. The maps will only be +produced if this prefix is defined. The mount maps suitable for the +network defined by the configuration files will be placed into files +with names calculated by prefixing this string to the name of each map. + +For example, to create the automounter maps and place them in the +directory @file{automaps}: + +@example +fsinfo -m automaps/ ... +@end example + +@node -q FSinfo Option, -v FSinfo Option, -m FSinfo Option, FSinfo Command Line Options +@comment node-name, next, previous, up +@subsection @code{-q} +@cindex quiet, FSinfo command line option + +Selects quiet mode. @i{FSinfo} suppress the ``running commentary'' and +only outputs any error messages which are generated. + +@node -v FSinfo Option, -D-FSinfo Option, -q FSinfo Option, FSinfo Command Line Options +@comment node-name, next, previous, up +@subsection @code{-v} +@cindex verbose, FSinfo command line option + +Selects verbose mode. When this is activated, the program will display +more messages, and display all the information discovered when +performing the semantic analysis phase. Each verbose message is output +to @file{stdout} on a line starting with a @samp{#} character. + +@node -D-FSinfo Option, -I FSinfo Option, -v FSinfo Option, FSinfo Command Line Options +@comment node-name, next, previous, up +@subsection @code{-D} @var{name[=defn]} + +Defines a symbol @dfn{name} for the preprocessor when reading the +configuration files. Equivalent to @code{#define} directive. + +@node -I FSinfo Option, -U FSinfo Option, -D-FSinfo Option, FSinfo Command Line Options +@comment node-name, next, previous, up +@subsection @code{-I} @var{directory} + +This option is passed into the preprocessor for the configuration files. +It specifies directories in which to find include files + +@node -U FSinfo Option, , -I FSinfo Option, FSinfo Command Line Options +@comment node-name, next, previous, up +@subsection @code{-U} @var{name} + +Removes any initial definition of the symbol @dfn{name}. Inverse of the +@code{-D} option. + +@node FSinfo errors, , FSinfo Command Line Options, FSinfo +@comment node-name, next, previous, up +@section Errors produced by @i{FSinfo} +@cindex FSinfo error messages + +The following table documents the errors and warnings which @i{FSinfo} may produce. + +@table @t + +@item " expected +Occurs if an unescaped newline is found in a quoted string. + +@item ambiguous mount: @var{volume} is a replicated filesystem +If several filesystems are declared as having the same volume name, they +will be considered replicated filesystems. To mount a replicated +filesystem statically, a specific host will need to be named, to say +which particular copy to try and mount, else this error will +result. + +@item can't open @var{filename} for writing +Occurs if any errors are encountered when opening an output file. + +@item cannot determine localname since volname @var{volume} is not uniquely defined +If a volume is replicated and an attempt is made to mount the filesystem +statically without specifying a local mountpoint, @i{FSinfo} cannot +calculate a mountpoint, as the desired pathname would be +ambiguous. + +@item @var{device} has duplicate exportfs data +Produced if the @samp{exportfs} option is used multiple times within the +same branch of a filesystem definition. For example, if you attempt to +set the @samp{exportfs} data at different levels of the mountpoint +directory tree. + +@item dump frequency for @var{host}:@var{device} is non-zero +Occurs if @var{device} has its @samp{fstype} declared to be @samp{swap} +or @samp{export} and the @samp{dump} option is set to a value greater +than zero. Swap devices should not be dumped. + +@item duplicate host @var{hostname}! +If a host has more than one definition. + +@item end of file within comment +A comment was unterminated before the end of one of the configuration +files. + +@item @var{filename}: cannot open for reading +If a file specified on the command line as containing configuration data +could not be opened. + +@item @var{filesystem} has a volname but no exportfs data +Occurs when a volume name is declared for a file system, but the string +specifying what machines the filesystem can be exported to is +missing. + +@item fs field "@var{field-name}" already set +Occurs when multiple definitions are given for one of the attributes of a +host's filesystem. + +@item host field "@var{field-name}" already set +If duplicate definitions are given for any of the fields with a host +definition. + +@item @var{host}:@var{device} has more than one mount point +Occurs if the mount option for a host's filesystem specifies multiple +trees at which to place the mountpoint. + +@item @var{host}:@var{device} has no mount point +Occurs if the @samp{mount} option is not specified for a host's +filesystem. + +@item @var{host}:@var{device} needs field "@var{field-name}" +Occurs when a filesystem is missing a required field. @var{field-name} could +be one of @samp{fstype}, @samp{opts}, @samp{passno} or +@samp{mount}. + +@item @var{host}:mount field specified for swap partition +Occurs if a mountpoint is given for a filesystem whose type is declared +to be @samp{swap}. + +@item malformed IP dotted quad: @var{address} +If the Internet address of an interface is incorrectly specified. An +Internet address definition is handled to @b{inet_addr}(3N) to see if it +can cope. If not, then this message will be displayed. + +@item malformed netmask: @var{netmask} +If the netmask cannot be decoded as though it were a hexadecimal number, +then this message will be displayed. It will typically be caused by +incorrect characters in the @var{netmask} value. + +@item mount field "@var{field-name}" already set +Occurs when a static mount has multiple definitions of the same field. + +@item mount tree field "@var{field-name}" already set +Occurs when the @var{field-name} is defined more than once during the +definition of a filesystems mountpoint. + +@item netif field @var{field-name} already set +Occurs if you attempt to define an attribute of an interface more than +once. + +@item network booting requires both root and swap areas +Occurs if a machine has mount declarations for either the root partition +or the swap area, but not both. You cannot define a machine to only +partially boot via the network. + +@item no disk mounts on @var{hostname} +If there are no static mounts, nor local disk mounts specified for a +machine, this message will be displayed. + +@item no volname given for @var{host}:@var{device} +Occurs when a filesystem is defined to be mounted on @file{default}, but +no volume name is given for the file system, then the mountpoint cannot +be determined. + +@item not allowed '/' in a directory name +Occurs when a pathname with multiple directory elements is specified as +the name for an automounter tree. A tree should only have one name at +each level. + +@item pass number for @var{host}:@var{device} is non-zero +Occurs if @var{device} has its @samp{fstype} declared to be @samp{swap} +or @samp{export} and the @b{fsck}(8) pass number is set. Swap devices should not be +fsck'd. @xref{FSinfo filesystems fstype}. + +@item sub-directory @var{directory} of @var{directory-tree} starts with '/' +Within the filesystem specification for a host, if an element +@var{directory} of the mountpoint begins with a @samp{/} and it is not +the start of the tree. + +@item sub-directory of @var{directory-tree} is named "default" +@samp{default} is a keyword used to specify if a mountpoint should be +automatically calculated by @i{FSinfo}. If you attempt to specify a +directory name as this, it will use the filename of @file{default} but +will produce this warning. + +@item unknown \ sequence +Occurs if an unknown escape sequence is found inside a string. Within a +string, you can give the standard C escape sequences for strings, such +as newlines and tab characters. + +@item unknown directory attribute +If an unknown keyword is found while reading the definition of a host's +filesystem mount option. + +@item unknown filesystem attribute +Occurs if an unrecognized keyword is used when defining a host's +filesystems. + +@item unknown host attribute +Occurs if an unrecognized keyword is used when defining a host. + +@item unknown mount attribute +Occurs if an unrecognized keyword is found while parsing the list of +static mounts. + +@item unknown volname @var{volume} automounted @i{[} on @i{name} @i{]} +Occurs if @var{volume} is used in a definition of an automount map but the volume +name has not been declared during the host filesystem definitions. + +@item volname @var{volume} is unknown +Occurs if an attempt is made to mount or reference a volume name which +has not been declared during the host filesystem definitions. + +@item volname @var{volume} not exported from @var{machine} +Occurs if you attempt to mount the volume @var{volume} from a machine +which has not declared itself to have such a filesystem +available. + +@end table + +@c ################################################################ +@node Hlfsd, Assorted Tools, FSinfo, Top +@comment node-name, next, previous, up +@chapter Hlfsd +@pindex Hlfsd +@cindex Home-Link Filesystem + +@i{Hlfsd} is a daemon which implements a filesystem containing a +symbolic link to subdirectory within a user's home directory, depending +on the user which accessed that link. It was primarily designed to +redirect incoming mail to users' home directories, so that it can be read +from anywhere. It was designed and implemented by +@email{ezk@@cs.columbia.edu,Erez Zadok} and +@email{dupuy@@cs.columbia.edu,Alexander Dupuy}, at the +@uref{http://www.cs.columbia.edu/,Computer Science Department} of +@uref{http://www.columbia.edu/,Columbia University}. A +@uref{http://www.cs.columbia.edu/~ezk/research/hlfsd/hlfsd.html,paper} +on @i{Hlfsd} was presented at the Usenix LISA VII conference in 1993. + +@i{Hlfsd} operates by mounting itself as an NFS server for the directory +containing @i{linkname}, which defaults to @file{/hlfs/home}. Lookups +within that directory are handled by @i{Hlfsd}, which uses the +password map to determine how to resolve the lookup. The directory will +be created if it doesn't already exist. The symbolic link will be to +the accessing user's home directory, with @i{subdir} appended to it. If +not specified, @i{subdir} defaults to @file{.hlfsdir}. This directory +will also be created if it does not already exist. + +A @samp{SIGTERM} sent to @i{Hlfsd} will cause it to shutdown. A @samp{SIGHUP} will +flush the internal caches, and reload the password map. It will also +close and reopen the log file, to enable the original log file to be +removed or rotated. A @samp{SIGUSR1} will cause it to dump its internal table +of user IDs and home directories to the file @file{/tmp/hlfsddump}. + +@menu +* Introduction to Hlfsd:: +* Background to Mail Delivery:: +* Using Hlfsd:: +@end menu + +@c ================================================================ +@node Introduction to Hlfsd, Background to Mail Delivery, Hlfsd, Hlfsd +@comment node-name, next, previous, up +@section Introduction to Hlfsd +@cindex Introduction to Hlfsd +@cindex Hlfsd; introduction + +Electronic mail has become one of the major applications for many +computer networks, and use of this service is expected to increase over +time, as networks proliferate and become faster. Providing a convenient +environment for users to read, compose, and send electronic mail has +become a requirement for systems administrators (SAs). + +Widely used methods for handling mail usually require users to be logged +into a designated ``home'' machine, where their mailbox files reside. +Only on that one machine can they read newly arrived mail. Since users +have to be logged into that system to read their mail, they often find +it convenient to run all of their other processes on that system as +well, including memory and CPU-intensive jobs. For example, in our +department, we have allocated and configured several multi-processor +servers to handle such demanding CPU/memory applications, but these were +underutilized, in large part due to the inconvenience of not being able +to read mail on those machines. (No home directories were located on +these designated CPU-servers, since we did not want NFS service for +users' home directories to have to compete with CPU-intensive jobs. At the +same time, we discouraged users from running demanding applications on +their home machines.) + +Many different solutions have been proposed to allow users to read their +mail on any host. However, all of these solutions fail in one or more +of several ways: + +@itemize @bullet + +@item +they introduce new single points of failure + +@item +they require using different mail transfer agents (MTAs) or user agents +(UAs) + +@item +they do not solve the problem for all cases, i.e. the solution is only +partially successful for a particular environment. + +@end itemize + +We have designed a simple filesystem, called the @dfn{Home-Link File +System}, to provide the ability to deliver mail to users' home +directories, without modification to mail-related applications. We have +endeavored to make it as stable as possible. Of great importance to us +was to make sure the HLFS daemon, @file{hlfsd} , would not hang under +any circumstances, and would take the next-best action when faced with +problems. Compared to alternative methods, @i{Hlfsd} is a stable, more +general solution, and easier to install/use. In fact, in some ways, we +have even managed to improve the reliability and security of mail +service. + +Our server implements a small filesystem containing a symbolic link +to a subdirectory of the invoking user's home directory, and named symbolic +links to users' mailbox files. + +The @i{Hlfsd} server finds out the @var{uid} of the process that is +accessing its mount point, and resolves the pathname component @samp{home} as a +symbolic link to a subdirectory within the home directory given by the +@var{uid}'s entry in the password file. If the @var{gid} of the process +that attempts to access a mailbox file is a special one (called +HLFS_GID), then the server maps the name of the @emph{next} pathname +component directly to the user's mailbox. This is necessary so that +access to a mailbox file by users other than the owner can succeed. The +server has safety features in case of failures such as hung filesystems +or home directory filesystems that are inaccessible or full. + +On most of our machines, mail gets delivered to the directory +@file{/var/spool/mail}. Many programs, including UAs, depend on that +path. @i{Hlfsd} creates a directory @file{/mail}, and mounts itself on +top of that directory. @i{Hlfsd} implements the path name component +called @samp{home}, pointing to a subdirectory of the user's home directory. +We have made @file{/var/spool/mail} a symbolic link to +@file{/mail/home}, so that accessing @file{/var/spool/mail} actually +causes access to a subdirectory within a user's home directory. + +The following table shows an example of how resolving the pathname +@file{/var/mail/@i{NAME}} to @file{/users/ezk/.mailspool/@i{NAME}} proceeds. + +@multitable {Resolving Component} {Pathname left to resolve} {Value if symbolic link} + +@item @b{Resolving Component} +@tab @b{Pathname left to resolve} +@tab @b{Value if symbolic link} + +@item @t{/} +@tab @t{var/mail/}@i{NAME} + +@item @t{var/} +@tab @t{mail/}@i{NAME} + +@item @t{mail}@@ +@tab @t{/mail/home/}@i{NAME} +@tab @t{mail}@@ -> @t{/mail/home} + +@item @t{/} +@tab @t{mail/home/}@i{NAME} + +@item @t{mail/} +@tab @t{home/}@i{NAME} + +@item @t{home}@@ +@tab @i{NAME} +@tab @t{home}@@ -> @t{/users/ezk/.mailspool} + +@item @t{/} +@tab @t{users/ezk/.mailspool/}@i{NAME} + +@item @t{users/} +@tab @t{ezk/.mailspool/}@i{NAME} + +@item @t{ezk/} +@tab @t{.mailspool/}@i{NAME} + +@item @t{.mailspool/} +@tab @i{NAME} + +@item @i{NAME} + +@end multitable + +@c ================================================================ +@node Background to Mail Delivery, Using Hlfsd, Introduction to Hlfsd, Hlfsd +@comment node-name, next, previous, up +@section Background to Mail Delivery +@cindex Background to Mail Delivery +@cindex Hlfsd; background + +This section provides an in-depth discussion of why available methods +for delivering mail to home directories are not as good as the one used +by @i{Hlfsd}. + +@menu +* Single-Host Mail Spool Directory:: +* Centralized Mail Spool Directory:: +* Distributed Mail Spool Service:: +* Why Deliver Into the Home Directory?:: +@end menu + +@c ---------------------------------------------------------------- +@node Single-Host Mail Spool Directory, Centralized Mail Spool Directory, Background to Mail Delivery, Background to Mail Delivery +@comment node-name, next, previous, up +@subsection Single-Host Mail Spool Directory +@cindex Single-Host Mail Spool Directory + +The most common method for mail delivery is for mail to be appended to a +mailbox file in a standard spool directory on the designated ``mail +home'' machine of the user. The greatest advantage of this method is +that it is the default method most vendors provide with their systems, +thus very little (if any) configuration is required on the SA's part. +All they need to set up are mail aliases directing mail to the host on +which the user's mailbox file is assigned. (Otherwise, mail is +delivered locally, and users find mailboxes on many machines.) + +As users become more sophisticated, and aided by windowing systems, they +find themselves logging in on multiple hosts at once, performing several +tasks concurrently. They ask to be able to read their mail on any host +on the network, not just the one designated as their ``mail home''. + +@c ---------------------------------------------------------------- +@node Centralized Mail Spool Directory, Distributed Mail Spool Service, Single-Host Mail Spool Directory, Background to Mail Delivery +@comment node-name, next, previous, up +@subsection Centralized Mail Spool Directory +@cindex Centralized Mail Spool Directory + +A popular method for providing mail readability from any host is to have +all mail delivered to a mail spool directory on a designated +``mail-server'' which is exported via NFS to all of the hosts on the +network. Configuring such a system is relatively easy. On most +systems, the bulk of the work is a one-time addition to one or two +configuration files in @file{/etc}. The file-server's spool directory +is then hard-mounted across every machine on the local network. In +small environments with only a handful of hosts this can be an +acceptable solution. In our department, with a couple of hundred active +hosts and thousands of mail messages processed daily, this was deemed +completely unacceptable, as it introduced several types of problems: + +@table @b + +@item Scalability and Performance + +As more and more machines get added to the network, more mail traffic +has to go over NFS to and from the mail-server. Users like to run +mail-watchers, and read their mail often. The stress on the shared +infrastructure increases with every user and host added; loads on the +mail server would most certainly be high since all mail delivery goes +through that one machine.@footnote{ Delivery via NFS-mounted filesystems +may require usage of @samp{rpc.lockd} and @samp{rpc.statd} to provide +distributed file-locking, both of which are widely regarded as unstable +and unreliable. Furthermore, this will degrade performance, as local +processes as well as remote @samp{nfsd} processes are kept busy.} This +leads to lower reliability and performance. To reduce the number of +concurrent connections between clients and the server host, some SAs +have resorted to automounting the mail-spool directory. But this +solution only makes things worse: since users often run mail watchers, +and many popular applications such as @samp{trn}, @samp{emacs}, +@samp{csh} or @samp{ksh} check periodically for new mail, the +automounted directory would be effectively permanently mounted. If it +gets unmounted automatically by the automounter program, it is most +likely to get mounted shortly afterwards, consuming more I/O resources +by the constant cycle of mount and umount calls. + +@item Reliability + +The mail-server host and its network connectivity must be very reliable. +Worse, since the spool directory has to be hard-mounted,@footnote{No SA +in their right minds would soft-mount read/write partitions --- the +chances for data loss are too great.} many processes which access the +spool directory (various shells, @samp{login}, @samp{emacs}, etc.) +would be hung as long as connectivity to the mail-server is severed. To +improve reliability, SAs may choose to backup the mail-server's spool +partition several times a day. This may make things worse since reading +or delivering mail while backups are in progress may cause backups to be +inconsistent; more backups consume more backup-media resources, and +increase the load on the mail-server host. + +@end table + +@c ---------------------------------------------------------------- +@node Distributed Mail Spool Service, Why Deliver Into the Home Directory?, Centralized Mail Spool Directory, Background to Mail Delivery +@comment node-name, next, previous, up +@subsection Distributed Mail Spool Service +@cindex Distributed Mail Spool Service + +Despite the existence of a few systems that support delivery to users' +home directories, mail delivery to home directories hasn't caught on. +We believe the main reason is that there are too many programs that +``know'' where mailbox files reside. Besides the obvious (the delivery +program @file{/bin/mail} and mail readers like @file{/usr/ucb/Mail}, +@samp{mush}, @samp{mm}, etc.), other programs that know mailbox location +are login, from, almost every shell, @samp{xbiff}, @samp{xmailbox}, and +even some programs not directly related to mail, such as @samp{emacs} +and @samp{trn}. Although some of these programs can be configured to +look in different directories with the use of environment variables and +other resources, many of them cannot. The overall porting work is +significant. + +Other methods that have yet to catch on require the use of a special +mail-reading server, such as IMAP or POP. The main disadvantage of +these systems is that UAs need to be modified to use these services --- +a long and involved task. That is why they are not popular at this +time. + +Several other ideas have been proposed and even used in various +environments. None of them is robust. They are mostly very +specialized, inflexible, and do not extend to the general case. Some of +the ideas are plain bad, potentially leading to lost or corrupt mail: + +@table @b + +@item automounters + +Using an automounter such as @i{Amd} to provide a set of symbolic links +from the normal spool directory to user home directories is not +sufficient. UAs rename, unlink, and recreate the mailbox as a regular +file, therefore it must be a real file, not a symbolic link. +Furthermore, it must reside in a real directory which is writable by the +UAs and MTAs. This method may also require populating +@file{/var/spool/mail} with symbolic links and making sure they are +updated. Making @i{Amd} manage that directory directly fails, since +many various lock files need to be managed as well. Also, @i{Amd} does +not provide all of the NFS operations which are required to write mail +such as write, create, remove, and unlink. + +@item @code{$MAIL} + +Setting this variable to an automounted directory pointing to the user's +mail spool host only solves the problem for those programs which know +and use @code{$MAIL}. Many programs don't, therefore this solution is partial +and of limited flexibility. Also, it requires the SAs or the users to +set it themselves --- an added level of inconvenience and possible +failures. + +@item @t{/bin/mail} + +Using a different mail delivery agent could be the solution. One such +example is @samp{hdmail}. However, @samp{hdmail} still requires +modifying all UAs, the MTA's configuration, installing new daemons, and +changing login scripts. This makes the system less upgradable or +compatible with others, and adds one more complicated system for SAs to +deal with. It is not a complete solution because it still requires each +user have their @code{$MAIL} variable setup correctly, and that every program +use this variable. + +@end table + +@c ---------------------------------------------------------------- +@node Why Deliver Into the Home Directory?, , Distributed Mail Spool Service, Background to Mail Delivery +@comment node-name, next, previous, up +@subsection Why Deliver Into the Home Directory? +@cindex Why Deliver Into the Home Directory? +@cindex Hlfsd; Why Deliver Into the Home Directory? + +There are several major reasons why SAs might want to deliver mail +directly into the users' home directories: + +@table @b + +@item Location + +Many mail readers need to move mail from the spool directory to the +user's home directory. It speeds up this operation if the two are on +the same filesystem. If for some reason the user's home directory is +inaccessible, it isn't that useful to be able to read mail, since there +is no place to move it to. In some cases, trying to move mail to a +non-existent or hung filesystem may result in mail loss. + +@item Distribution + +Having all mail spool directories spread among the many more filesystems +minimizes the chances that complete environments will grind to a halt +when a single server is down. It does increase the chance that there +will be someone who is not able to read their mail when a machine is +down, but that is usually preferred to having no one be able to read +their mail because a centralized mail server is down. The problem of +losing some mail due to the (presumably) higher chances that a user's +machine is down is minimized in HLFS. + +@item Security + +Delivering mail to users' home directories has another advantage --- +enhanced security and privacy. Since a shared system mail spool +directory has to be world-readable and searchable, any user can see +whether other users have mail, when they last received new mail, or when +they last read their mail. Programs such as @samp{finger} display this +information, which some consider an infringement of privacy. While it +is possible to disable this feature of @samp{finger} so that remote +users cannot see a mailbox file's status, this doesn't prevent local +users from getting the information. Furthermore, there are more +programs which make use of this information. In shared environments, +disabling such programs has to be done on a system-wide basis, but with +mail delivered to users' home directories, users less concerned with +privacy who do want to let others know when they last received or read +mail can easily do so using file protection bits. + +@c Lastly, on systems that do not export their NFS filesystem with +@c @t{anon=0}, superusers are less likely to snoop around others' mail, as +@c they become ``nobodies'' across NFS. + +@end table + +In summary, delivering mail to home directories provides users the +functionality sought, and also avoids most of the problems just +discussed. + +@c ================================================================ +@node Using Hlfsd, , Background to Mail Delivery, Hlfsd +@comment node-name, next, previous, up +@section Using Hlfsd +@cindex Using Hlfsd +@cindex Hlfsd; using + +@menu +* Controlling Hlfsd:: +* Hlfsd Options:: +* Hlfsd Files:: +@end menu + +@c ---------------------------------------------------------------- +@node Controlling Hlfsd, Hlfsd Options, Using Hlfsd, Using Hlfsd +@comment node-name, next, previous, up +@subsection Controlling Hlfsd +@cindex Controlling Hlfsd +@cindex Hlfsd; controlling +@pindex ctl-hlfsd + +Much the same way @i{Amd} is controlled by @file{ctl-amd}, so does +@i{Hlfsd} get controlled by the @file{ctl-hlfsd} script: + +@table @t + +@item ctl-hlfsd start +Start a new @i{Hlfsd}. + +@item ctl-hlfsd stop +Stop a running @i{Hlfsd}. + +@item ctl-hlfsd restart +Stop a running @i{Hlfsd}, wait for 10 seconds, and then start a new +one. It is hoped that within 10 seconds, the previously running +@i{Hlfsd} terminate properly; otherwise, starting a second one could +cause system lockup. + +@end table + +For example, on our systems, we start @i{Hlfsd} within @file{ctl-hlfsd} +as follows on Solaris 2 systems: + +@example +hlfsd -a /var/alt_mail -x all -l /var/log/hlfsd /mail/home .mailspool +@end example + +The directory @file{/var/alt_mail} is a directory in the root partition +where alternate mail will be delivered into, when it cannot be delivered +into the user's home directory. + +Normal mail gets delivered into @file{/var/mail}, but on our systems, +that is a symbolic link to @file{/mail/home}. @file{/mail} is managed +by @i{Hlfsd}, which creates a dynamic symlink named @samp{home}, +pointing to the subdirectory @file{.mailspool} @emph{within} the +accessing user's home directory. This results in mail which normally +should go to @file{/var/mail/@code{$USER}}, to go to +@file{@code{$HOME}/.mailspool/@code{$USER}}. + +@i{Hlfsd} does not create the @file{/var/mail} symlink. This needs to +be created (manually) once on each host, by the system administrators, +as follows: + +@example +mv /var/mail /var/alt_mail +ln -s /mail/home /var/mail +@end example + +@c ---------------------------------------------------------------- +@node Hlfsd Options, Hlfsd Files, Controlling Hlfsd, Using Hlfsd +@comment node-name, next, previous, up +@subsection Hlfsd Options +@cindex Hlfsd Options +@cindex Hlfsd; Options + +@table @t + +@item -a @var{alt_dir} +Alternate directory. The name of the directory to which the symbolic +link returned by @i{Hlfsd} will point, if it cannot access the home +directory of the user. This defaults to @file{/var/hlfs}. This +directory will be created if it doesn't exist. It is expected that +either users will read these files, or the system administrators will +run a script to resend this ``lost mail'' to its owner. + +@item -c @var{cache-interval} +Caching interval. @i{Hlfsd} will cache the validity of home directories +for this interval, in seconds. Entries which have been verified within +the last @var{cache-interval} seconds will not be verified again, since +the operation could be expensive, and the entries are most likely still +valid. After the interval has expired, @i{Hlfsd} will re-verify the +validity of the user's home directory, and reset the cache time-counter. +The default value for @var{cache-interval} is 300 seconds (5 minutes). + +@item -f +Force fast startup. This option tells @i{Hlfsd} to skip startup-time +consistency checks such as existence of mount directory, alternate spool +directory, symlink to be hidden under the mount directory, their +permissions and validity. + +@item -g @var{group} +Set the special group HLFS_GID to @var{group}. Programs such as +@file{/usr/ucb/from} or @file{/usr/sbin/in.comsat}, which access the +mailboxes of other users, must be setgid @samp{HLFS_GID} to work properly. The +default group is @samp{hlfs}. If no group is provided, and there is no +group @samp{hlfs}, this feature is disabled. + +@item -h +Help. Print a brief help message, and exit. + +@item -i @var{reload-interval} +Map-reloading interval. Each @var{reload-interval} seconds, @i{Hlfsd} +will reload the password map. @i{Hlfsd} needs the password map for the +UIDs and home directory pathnames. @i{Hlfsd} schedules a @samp{SIGALRM} to +reload the password maps. A @samp{SIGHUP} sent to @i{Hlfsd} will force it to +reload the maps immediately. The default value for +@var{reload-interval} is 900 seconds (15 minutes.) + +@item -l @var{logfile} +Specify a log file to which @i{Hlfsd} will record events. If +@var{logfile} is the string @samp{syslog} then the log messages will be +sent to the system log daemon by @b{syslog}(3), using the @samp{LOG_DAEMON} +facility. This is also the default. + +@item -n +No verify. @i{Hlfsd} will not verify the validity of the symbolic link +it will be returning, or that the user's home directory contains +sufficient disk-space for spooling. This can speed up @i{Hlfsd} at the +cost of possibly returning symbolic links to home directories which are +not currently accessible or are full. By default, @i{Hlfsd} validates +the symbolic-link in the background. The @code{-n} option overrides the +meaning of the @code{-c} option, since no caching is necessary. + +@item -o @var{mount-options} +Mount options which @i{Hlfsd} will use to mount itself on top of +@var{dirname}. By default, @var{mount-options} is set to @samp{ro}. If +the system supports symbolic-link caching, default options are set +to @samp{ro,nocache}. + +@item -p +Print PID. Outputs the process-id of @i{Hlfsd} to standard output where +it can be saved into a file. + +@item -v +Version. Displays version information to standard error. + +@item -x @var{log-options} +Specify run-time logging options. The options are a comma separated +list chosen from: @samp{fatal}, @samp{error}, @samp{user}, @samp{warn}, @samp{info}, @samp{map}, @samp{stats}, @samp{all}. + +@item -C +Force @i{Hlfsd} to run on systems that cannot turn off the NFS +attribute-cache. Use of this option on those systems is discouraged, as +it may result in loss or misdelivery of mail. The option is ignored on +systems that can turn off the attribute-cache. + +@item -D @var{log-options} +Select from a variety of debugging options. Prefixing an option with +the string @samp{no} reverses the effect of that option. Options are +cumulative. The most useful option is @samp{all}. Since this option is +only used for debugging other options are not documented here. A fuller +description is available in the program source. A @samp{SIGUSR1} sent +to @i{Hlfsd} will cause it to dump its internal password map to the file +@file{/usr/tmp/hlfsd.dump.XXXXXX}, where @samp{XXXXXX} will be replaced +by a random string generated by @b{mktemp}(3) or (the more secure) +@b{mkstemp}(3). + +@item -P @var{password-file} +Read the user-name, user-id, and home directory information from the +file @var{password-file}. Normally, @i{Hlfsd} will use @b{getpwent}(3) +to read the password database. This option allows you to override the +default database, and is useful if you want to map users' mail files to +a directory other than their home directory. Only the username, uid, +and home-directory fields of the file @var{password-file} are read and +checked. All other fields are ignored. The file @var{password-file} +must otherwise be compliant with Unix Version 7 colon-delimited format +@b{passwd}(4). + +@end table + +@c ---------------------------------------------------------------- +@node Hlfsd Files, , Hlfsd Options, Using Hlfsd +@comment node-name, next, previous, up +@subsection Hlfsd Files +@cindex Hlfsd Files +@cindex Hlfsd; Files + +The following files are used by @i{Hlfsd}: + +@table @file + +@item /hlfs +directory under which @i{Hlfsd} mounts itself and manages the symbolic +link @file{home}. + +@item .hlfsdir +default sub-directory in the user's home directory, to which the +@file{home} symbolic link returned by @i{Hlfsd} points. + +@item /var/hlfs +directory to which @file{home} symbolic link returned by @i{Hlfsd} +points if it is unable to verify the that user's home directory is +accessible. + +@end table + +For discussion on other files used by @i{Hlfsd}, see @ref{lostaltmail} and +@ref{lostaltmail.conf-sample}. + +@c ################################################################ +@node Assorted Tools, Examples, Hlfsd, Top +@comment node-name, next, previous, up +@chapter Assorted Tools +@cindex Assorted Tools + +The following are additional utilities and scripts included with +am-utils, and get installed. + +@menu +* am-eject:: +* amd.conf-sample:: +* amd2ldif:: +* amd2sun:: +* ctl-amd:: +* ctl-hlfsd:: +* expn:: +* fix-amd-map:: +* fixmount:: +* fixrmtab:: +* lostaltmail:: +* lostaltmail.conf-sample:: +* mk-amd-map:: +* pawd:: +* wait4amd:: +* wait4amd2die:: +* wire-test:: +@end menu + +@c ---------------------------------------------------------------- +@node am-eject, amd.conf-sample, Assorted Tools, Assorted Tools +@comment node-name, next, previous, up +@section am-eject +@pindex am-eject + +A shell script unmounts a floppy or CD-ROM that is automounted, and +then attempts to eject the removable device. + +@c ---------------------------------------------------------------- +@node amd.conf-sample, amd2ldif, am-eject, Assorted Tools +@comment node-name, next, previous, up +@section amd.conf-sample +@pindex amd.conf-sample + +A sample @i{Amd} configuration file. @xref{Amd Configuration File}. + +@c ---------------------------------------------------------------- +@node amd2ldif, amd2sun, amd.conf-sample, Assorted Tools +@comment node-name, next, previous, up +@section amd2ldif +@pindex amd2ldif + +A script to convert @i{Amd} maps to LDAP input files. Use it as follows: + +@example +amd2ldif @i{mapname} @i{base} < @i{amd.mapfile} > @i{mapfile.ldif} +@end example + +@c ---------------------------------------------------------------- +@node amd2sun, ctl-amd, amd2ldif, Assorted Tools +@comment node-name, next, previous, up +@section amd2sun +@pindex amd2sun + +A script to convert @i{Amd} maps to Sun Automounter maps. Use it as +follows + +@example +amd2sun < @i{amd.mapfile} > @i{auto_mapfile} +@end example + +@c ---------------------------------------------------------------- +@node ctl-amd, ctl-hlfsd, amd2sun, Assorted Tools +@comment node-name, next, previous, up +@section ctl-amd +@pindex ctl-amd + +A script to start, stop, or restart @i{Amd}. Use it as follows: + +@table @t +@item ctl-amd start +Start a new @i{Amd} process. +@item ctl-amd stop +Stop the running @i{Amd}. +@item ctl-amd restart +Stop the running @i{Amd} (if any), safely wait for it to terminate, and +then start a new process --- only if the previous one died cleanly. +@end table + +@xref{Run-time Administration} for more details. + +@c ---------------------------------------------------------------- +@node ctl-hlfsd, expn, ctl-amd, Assorted Tools +@comment node-name, next, previous, up +@section ctl-hlfsd +@pindex ctl-hlfsd + +A script for controlling @i{Hlfsd}, much the same way @file{ctl-amd} +controls @i{Amd}. Use it as follows: + +@table @t +@item ctl-hlfsd start +Start a new @i{Hlfsd} process. +@item ctl-hlfsd stop +Stop the running @i{Hlfsd}. +@item ctl-hlfsd restart +Stop the running @i{Hlfsd} (if any), wait for 10 seconds for it to +terminate, and then start a new process --- only if the previous one +died cleanly. +@end table + +@xref{Hlfsd} for more details. + +@c ---------------------------------------------------------------- +@node expn, fix-amd-map, ctl-hlfsd, Assorted Tools +@comment node-name, next, previous, up +@section expn +@pindex expn + +A script to expand email addresses into their full name. It is +generally useful when using with the @file{lostaltmail} script, but is a +useful tools otherwise. + +@example +$ expn -v ezk@@cs.columbia.edu +ezk@@cs.columbia.edu -> + ezk@@shekel.mcl.cs.columbia.edu +ezk@@shekel.mcl.cs.columbia.edu -> + Erez Zadok <"| /usr/local/mh/lib/slocal -user ezk || exit 75> + Erez Zadok <\ezk> + Erez Zadok </u/zing/ezk/.mailspool/backup> +@end example + +@c ---------------------------------------------------------------- +@node fix-amd-map, fixmount, expn, Assorted Tools +@comment node-name, next, previous, up +@section fix-amd-map +@pindex fix-amd-map + +Am-utils changed some of the syntax and default values of some +variables. For example, the default value for @samp{$@{os@}} for +Solaris 2.x (aka SunOS 5.x) systems used to be @samp{sos5}, it is now +more automatically generated from @file{config.guess} and its value is +@samp{sunos5}. + +This script converts older @i{Amd} maps to new ones. Use it as follows: + +@example +fix-amd-map < @i{old.map} > @i{new.map} +@end example + +@c ---------------------------------------------------------------- +@node fixmount, fixrmtab, fix-amd-map, Assorted Tools +@comment node-name, next, previous, up +@section fixmount +@pindex fixmount + +@samp{fixmount} is a variant of @b{showmount}(8) that can delete bogus +mount entries in remote @b{mountd}(8) daemons. This is useful to +cleanup otherwise ever-accumulating ``junk''. Use it for example: + +@example +fixmount -r @i{host} +@end example + +See the online manual page for @samp{fixmount} for more details of its +usage. + +@c ---------------------------------------------------------------- +@node fixrmtab, lostaltmail, fixmount, Assorted Tools +@comment node-name, next, previous, up +@section fixrmtab +@pindex fixrmtab + +A script to invalidate @file{/etc/rmtab} entries for hosts named. Also +restart mountd for changes to take effect. Use it for example: + +@example +fixrmtab @i{host1} @i{host2} @i{...} +@end example + +@c ---------------------------------------------------------------- +@node lostaltmail, lostaltmail.conf-sample, fixrmtab, Assorted Tools +@comment node-name, next, previous, up +@section lostaltmail +@pindex lostaltmail + +A script used with @i{Hlfsd} to resend any ``lost'' mail. @i{Hlfsd} +redirects mail which cannot be written into the user's home directory to +an alternate directory. This is useful to continue delivering mail, +even if the user's file system was unavailable, full, or over quota. +But, the mail which gets delivered to the alternate directory needs to +be resent to its respective users. This is what the @samp{lostaltmail} +script does. + +Use it as follows: + +@example +lostaltmail +@end example + +This script needs a configuration file @samp{lostaltmail.conf} set up +with the right parameters to properly work. @xref{Hlfsd} for more +details. + +@c ---------------------------------------------------------------- +@node lostaltmail.conf-sample, mk-amd-map, lostaltmail, Assorted Tools +@comment node-name, next, previous, up +@section lostaltmail.conf-sample +@pindex lostaltmail.conf-sample +@cindex lostaltmail; configuration file + +This is a text file with configuration parameters needed for the +@samp{lostaltmail} script. The script includes comments explaining each +of the configuration variables. See it for more information. Also +@pxref{Hlfsd} for general information. + +@c ---------------------------------------------------------------- +@node mk-amd-map, pawd, lostaltmail.conf-sample, Assorted Tools +@comment node-name, next, previous, up +@section mk-amd-map +@pindex mk-amd-map + +This program converts a normal @i{Amd} map file into an ndbm database +with the same prefix as the named file. Use it as follows: + +@example +mk-amd-map @i{mapname} +@end example + +@c ---------------------------------------------------------------- +@node pawd, wait4amd, mk-amd-map, Assorted Tools +@comment node-name, next, previous, up +@section pawd +@pindex pawd + +@i{Pawd} is used to print the current working directory, adjusted to +reflect proper paths that can be reused to go through the automounter +for the shortest possible path. In particular, the path printed back +does not include any of @i{Amd}'s local mount points. Using them is +unsafe, because @i{Amd} may unmount managed file systems from the mount +points, and thus including them in paths may not always find the files +within. + +Without any arguments, @i{Pawd} will print the automounter adjusted +current working directory. With any number of arguments, it will print +the adjusted path of each one of the arguments. + +@c ---------------------------------------------------------------- +@node wait4amd, wait4amd2die, pawd, Assorted Tools +@comment node-name, next, previous, up +@section wait4amd +@pindex wait4amd + +A script to wait for @i{Amd} to start on a particular host before +performing an arbitrary command. The command is executed repeatedly, +with 1 second intervals in between. You may interrupt the script using +@samp{^C} (or whatever keyboard sequence your terminal's @samp{intr} function +is bound to). + +Examples: + +@table @t +@item wait4amd saturn amq -p -h saturn +When @i{Amd} is up on host @samp{saturn}, get the process ID of that +running @i{Amd}. +@item wait4amd pluto rlogin pluto +Remote login to host @samp{pluto} when @i{Amd} is up on that host. It +is generally necessary to wait for @i{Amd} to properly start and +initialize on a remote host before logging in to it, because otherwise +user home directories may not be accessible across the network. +@item wait4amd pluto +A short-hand version of the previous command, since the most useful +reason for this script is to login to a remote host. I use it very +often when testing out new versions of @i{Amd}, and need to reboot hung +hosts. +@end table + +@c ---------------------------------------------------------------- +@node wait4amd2die, wire-test, wait4amd, Assorted Tools +@comment node-name, next, previous, up +@section wait4amd2die +@pindex wait4amd2die + +This script is used internally by @samp{ctl-amd} when used to restart +@i{Amd}. It waits for @i{Amd} to terminate. If it detected that +@i{Amd} terminated cleanly, this script will return an exist status of +zero. Otherwise, it will return a non-zero exit status. + +The script tests for @i{Amd}'s existence once every 5 seconds, six +times, for a total of 30 seconds. It will return a zero exist status as +soon as it detects that @i{Amd} dies. + +@c ---------------------------------------------------------------- +@node wire-test, , wait4amd2die, Assorted Tools +@comment node-name, next, previous, up +@section wire-test +@pindex wire-test + +A simple program to test if some of the most basic networking functions +in am-util's library @file{libamu} work. It also tests the combination +of NFS protocol and version number that are supported from the current +host, to a remote one. + +For example, in this test a machine which only supports NFS Version 2 is +contacting a remote host that can support the same version, but using +both UDP and TCP. If no host name is specified, @samp{wire-test} will +try @file{localhost}. + +@example +$ wire-test moisil +Network name is "mcl-lab-net.cs.columbia.edu" +Network number is "128.59.13" +Network name is "old-net.cs.columbia.edu" +Network number is "128.59.16" +My IP address is 0x7f000001. +NFS Version and protocol tests to host "moisil"... + testing vers=2, proto="udp" -> found version 2. + testing vers=3, proto="udp" -> failed! + testing vers=2, proto="tcp" -> found version 2. + testing vers=3, proto="tcp" -> failed! +@end example + +@c ################################################################ +@node Examples, Internals, Assorted Tools, Top +@comment node-name, next, previous, up +@chapter Examples + +@menu +* User Filesystems:: +* Home Directories:: +* Architecture Sharing:: +* Wildcard Names:: +* rwho servers:: +* /vol:: +* /defaults with selectors:: +* /tftpboot in a chroot-ed environment:: + +@end menu + +@node User Filesystems, Home Directories, Examples, Examples +@comment node-name, next, previous, up +@section User Filesystems +@cindex User filesystems +@cindex Mounting user filesystems + +With more than one fileserver, the directories most frequently +cross-mounted are those containing user home directories. A common +convention used at Imperial College is to mount the user disks under +@t{/home/}@i{machine}. + +Typically, the @samp{/etc/fstab} file contained a long list of entries +such as: + +@example +@i{machine}:/home/@i{machine} /home/@i{machine} nfs ... +@end example + +for each fileserver on the network. + +There are numerous problems with this system. The mount list can become +quite large and some of the machines may be down when a system is +booted. When a new fileserver is installed, @samp{/etc/fstab} must be +updated on every machine, the mount directory created and the filesystem +mounted. + +In many environments most people use the same few workstations, but +it is convenient to go to a colleague's machine and access your own +files. When a server goes down, it can cause a process on a client +machine to hang. By minimizing the mounted filesystems to only include +those actively being used, there is less chance that a filesystem will +be mounted when a server goes down. + +The following is a short extract from a map taken from a research fileserver +at Imperial College. + +Note the entry for @samp{localhost} which is used for users such as +the operator (@samp{opr}) who have a home directory on most machine as +@samp{/home/localhost/opr}. + +@example +/defaults opts:=rw,intr,grpid,nosuid +charm host!=$@{key@};type:=nfs;rhost:=$@{key@};rfs:=/home/$@{key@} \ + host==$@{key@};type:=ufs;dev:=/dev/xd0g +# +... + +# +localhost type:=link;fs:=$@{host@} +... +# +# dylan has two user disks so have a +# top directory in which to mount them. +# +dylan type:=auto;fs:=$@{map@};pref:=$@{key@}/ +# +dylan/dk2 host!=dylan;type:=nfs;rhost:=dylan;rfs:=/home/$@{key@} \ + host==dylan;type:=ufs;dev:=/dev/dsk/2s0 +# +dylan/dk5 host!=dylan;type:=nfs;rhost:=dylan;rfs:=/home/$@{key@} \ + host==dylan;type:=ufs;dev:=/dev/dsk/5s0 +... +# +toytown host!=$@{key@};type:=nfs;rhost:=$@{key@};rfs:=/home/$@{key@} \ + host==$@{key@};type:=ufs;dev:=/dev/xy1g +... +# +zebedee host!=$@{key@};type:=nfs;rhost:=$@{key@};rfs:=/home/$@{key@} \ + host==$@{key@};type:=ufs;dev:=/dev/dsk/1s0 +# +# Just for access... +# +gould type:=auto;fs:=$@{map@};pref:=$@{key@}/ +gould/staff host!=gould;type:=nfs;rhost:=gould;rfs:=/home/$@{key@} +# +gummo host!=$@{key@};type:=nfs;rhost:=$@{key@};rfs:=/home/$@{key@} +... +@end example + +This map is shared by most of the machines listed so on those +systems any of the user disks is accessible via a consistent name. +@i{Amd} is started with the following command + +@example +amd /home amd.home +@end example + +Note that when mounting a remote filesystem, the @dfn{automounted} +mount point is referenced, so that the filesystem will be mounted if +it is not yet (at the time the remote @samp{mountd} obtains the file handle). + +@node Home Directories, Architecture Sharing, User Filesystems, Examples +@comment node-name, next, previous, up +@section Home Directories +@cindex Home directories +@cindex Example of mounting home directories +@cindex Mount home directories + +One convention for home directories is to locate them in @samp{/homes} +so user @samp{jsp}'s home directory is @samp{/homes/jsp}. With more +than a single fileserver it is convenient to spread user files across +several machines. All that is required is a mount-map which converts +login names to an automounted directory. + +Such a map might be started by the command: + +@example +amd /homes amd.homes +@end example + +where the map @samp{amd.homes} contained the entries: + +@example +/defaults type:=link # All the entries are of type:=link +jsp fs:=/home/charm/jsp +njw fs:=/home/dylan/dk5/njw +... +phjk fs:=/home/toytown/ai/phjk +sjv fs:=/home/ganymede/sjv +@end example + +Whenever a login name is accessed in @samp{/homes} a symbolic link +appears pointing to the real location of that user's home directory. In +this example, @samp{/homes/jsp} would appear to be a symbolic link +pointing to @samp{/home/charm/jsp}. Of course, @samp{/home} would also +be an automount point. + +This system causes an extra level of symbolic links to be used. +Although that turns out to be relatively inexpensive, an alternative is +to directly mount the required filesystems in the @samp{/homes} +map. The required map is simple, but long, and its creation is best automated. +The entry for @samp{jsp} could be: + +@example +jsp -sublink:=$@{key@};rfs:=/home/charm \ + host==charm;type:=ufs;dev:=/dev/xd0g \ + host!=charm;type:=nfs;rhost:=charm +@end example + +This map can become quite big if it contains a large number of entries. +By combining two other features of @i{Amd} it can be greatly simplified. + +First the UFS partitions should be mounted under the control of +@samp{/etc/fstab}, taking care that they are mounted in the same place +that @i{Amd} would have automounted them. In most cases this would be +something like @samp{/a/@dfn{host}/home/@dfn{host}} and +@samp{/etc/fstab} on host @samp{charm} would have a line:@refill + +@example +/dev/xy0g /a/charm/home/charm 4.2 rw,nosuid,grpid 1 5 +@end example + +The map can then be changed to: + +@example +/defaults type:=nfs;sublink:=$@{key@};opts:=rw,intr,nosuid,grpid +jsp rhost:=charm;rfs:=/home/charm +njw rhost:=dylan;rfs:=/home/dylan/dk5 +... +phjk rhost:=toytown;rfs:=/home/toytown;sublink:=ai/$@{key@} +sjv rhost:=ganymede;rfs:=/home/ganymede +@end example + +This map operates as usual on a remote machine (@i{ie} @code{$@{host@}} +not equal to @code{$@{rhost@}}). On the machine where the filesystem is +stored (@i{ie} @code{$@{host@}} equal to @code{$@{rhost@}}), @i{Amd} +will construct a local filesystem mount point which corresponds to the +name of the locally mounted UFS partition. If @i{Amd} is started with +the @code{-r} option then instead of attempting an NFS mount, @i{Amd} will +simply inherit the UFS mount (@pxref{Inheritance Filesystem}). If +@code{-r} is not used then a loopback NFS mount will be made. This type of +mount is known to cause a deadlock on many systems. + +@node Architecture Sharing, Wildcard Names, Home Directories, Examples +@comment node-name, next, previous, up +@section Architecture Sharing +@cindex Architecture sharing +@cindex Sharing a fileserver between architectures +@cindex Architecture dependent volumes + +@c %At the moment some of the research machines have sets of software +@c %mounted in @samp{/vol}. This contains subdirectories for \TeX, +@c %system sources, local sources, prolog libraries and so on. +Often a filesystem will be shared by machines of different architectures. +Separate trees can be maintained for the executable images for each +architecture, but it may be more convenient to have a shared tree, +with distinct subdirectories. + +A shared tree might have the following structure on the fileserver (called +@samp{fserver} in the example): + +@example +local/tex +local/tex/fonts +local/tex/lib +local/tex/bin +local/tex/bin/sun3 +local/tex/bin/sun4 +local/tex/bin/hp9000 +... +@end example + +In this example, the subdirectories of @samp{local/tex/bin} should be +hidden when accessed via the automount point (conventionally @samp{/vol}). +A mount-map for @samp{/vol} to achieve this would look like: + +@example +/defaults sublink:=$@{/key@};rhost:=fserver;type:=link +tex type:=auto;fs:=$@{map@};pref:=$@{key@}/ +tex/fonts host!=fserver;type:=nfs;rfs:=/vol/tex \ + host==fserver;fs:=/usr/local/tex +tex/lib host!=fserver;type:=nfs;rfs:=/vol/tex \ + host==fserver;fs:=/usr/local/tex +tex/bin -sublink:=$@{/key@}/$@{arch@} \ + host!=fserver;type:=nfs;rfs:=/vol/tex \ + host:=fserver;fs:=/usr/local/tex +@end example + +When @samp{/vol/tex/bin} is referenced, the current machine architecture +is automatically appended to the path by the @code{$@{sublink@}} +variable. This means that users can have @samp{/vol/tex/bin} in their +@samp{PATH} without concern for architecture dependencies. + +@node Wildcard Names, rwho servers, Architecture Sharing, Examples +@comment node-name, next, previous, up +@section Wildcard Names & Replicated Servers + +By using the wildcard facility, @i{Amd} can @dfn{overlay} an existing +directory with additional entries. +The system files are usually mounted under @samp{/usr}. If instead, +@i{Amd} is mounted on @samp{/usr}, additional +names can be overlayed to augment or replace names in the ``master'' @samp{/usr}. +A map to do this would have the form: + +@example +local type:=auto;fs:=local-map +share type:=auto;fs:=share-map +* -type:=nfs;rfs:=/export/exec/$@{arch@};sublink:="$@{key@}" \ + rhost:=fserv1 rhost:=fserv2 rhost:=fserv3 +@end example + +Note that the assignment to @code{$@{sublink@}} is surrounded by double +quotes to prevent the incoming key from causing the map to be +misinterpreted. This map has the effect of directing any access to +@samp{/usr/local} or @samp{/usr/share} to another automount point. + +In this example, it is assumed that the @samp{/usr} files are replicated +on three fileservers: @samp{fserv1}, @samp{fserv2} and @samp{fserv3}. +For any references other than to @samp{local} and @samp{share} one of +the servers is used and a symbolic link to +@t{$@{autodir@}/$@{rhost@}/export/exec/$@{arch@}/@i{whatever}} is +returned once an appropriate filesystem has been mounted.@refill + +@node rwho servers, /vol, Wildcard Names, Examples +@comment node-name, next, previous, up +@section @samp{rwho} servers +@cindex rwho servers +@cindex Architecture specific mounts +@cindex Example of architecture specific mounts + +The @samp{/usr/spool/rwho} directory is a good candidate for automounting. +For efficiency reasons it is best to capture the rwho data on a small +number of machines and then mount that information onto a large number +of clients. The data written into the rwho files is byte order dependent +so only servers with the correct byte ordering can be used by a client: + +@example +/defaults type:=nfs +usr/spool/rwho -byte==little;rfs:=/usr/spool/rwho \ + rhost:=vaxA rhost:=vaxB \ + || -rfs:=/usr/spool/rwho \ + rhost:=sun4 rhost:=hp300 +@end example + +@node /vol, /defaults with selectors, rwho servers, Examples +@comment node-name, next, previous, up +@section @samp{/vol} +@cindex /vol +@cindex Catch-all mount point +@cindex Generic volume name + +@samp{/vol} is used as a catch-all for volumes which do not have other +conventional names. + +Below is part of the @samp{/vol} map for the domain @samp{doc.ic.ac.uk}. +The @samp{r+d} tree is used for new or experimental software that needs +to be available everywhere without installing it on all the fileservers. +Users wishing to try out the new software then simply include +@samp{/vol/r+d/@{bin,ucb@}} in their path.@refill + +The main tree resides on one host @samp{gould.doc.ic.ac.uk}, which has +different @samp{bin}, @samp{etc}, @samp{lib} and @samp{ucb} +sub-directories for each machine architecture. For example, +@samp{/vol/r+d/bin} for a Sun-4 would be stored in the sub-directory +@samp{bin/sun4} of the filesystem @samp{/usr/r+d}. When it was accessed +a symbolic link pointing to @samp{/a/gould/usr/r+d/bin/sun4} would be +returned.@refill + +@example +/defaults type:=nfs;opts:=rw,grpid,nosuid,intr,soft +wp -opts:=rw,grpid,nosuid;rhost:=charm \ + host==charm;type:=link;fs:=/usr/local/wp \ + host!=charm;type:=nfs;rfs:=/vol/wp +... +# +src -opts:=rw,grpid,nosuid;rhost:=charm \ + host==charm;type:=link;fs:=/usr/src \ + host!=charm;type:=nfs;rfs:=/vol/src +# +r+d type:=auto;fs:=$@{map@};pref:=r+d/ +# per architecture bin,etc,lib&ucb... +r+d/bin rhost:=gould.doc.ic.ac.uk;rfs:=/usr/r+d;sublink:=$@{/key@}/$@{arch@} +r+d/etc rhost:=gould.doc.ic.ac.uk;rfs:=/usr/r+d;sublink:=$@{/key@}/$@{arch@} +r+d/include rhost:=gould.doc.ic.ac.uk;rfs:=/usr/r+d;sublink:=$@{/key@} +r+d/lib rhost:=gould.doc.ic.ac.uk;rfs:=/usr/r+d;sublink:=$@{/key@}/$@{arch@} +r+d/man rhost:=gould.doc.ic.ac.uk;rfs:=/usr/r+d;sublink:=$@{/key@} +r+d/src rhost:=gould.doc.ic.ac.uk;rfs:=/usr/r+d;sublink:=$@{/key@} +r+d/ucb rhost:=gould.doc.ic.ac.uk;rfs:=/usr/r+d;sublink:=$@{/key@}/$@{arch@} +# hades pictures +pictures -opts:=rw,grpid,nosuid;rhost:=thpfs \ + host==thpfs;type:=link;fs:=/nbsd/pictures \ + host!=thpfs;type:=nfs;rfs:=/nbsd;sublink:=pictures +# hades tools +hades -opts:=rw,grpid,nosuid;rhost:=thpfs \ + host==thpfs;type:=link;fs:=/nbsd/hades \ + host!=thpfs;type:=nfs;rfs:=/nbsd;sublink:=hades +# bsd tools for hp. +bsd -opts:=rw,grpid,nosuid;arch==hp9000;rhost:=thpfs \ + host==thpfs;type:=link;fs:=/nbsd/bsd \ + host!=thpfs;type:=nfs;rfs:=/nbsd;sublink:=bsd +@end example + +@node /defaults with selectors, /tftpboot in a chroot-ed environment, /vol, Examples +@comment node-name, next, previous, up +@section @samp{/defaults} with selectors +@cindex /defaults with selectors +@cindex selectors on default + +It is sometimes useful to have different defaults for a given map. To +achieve this, the @samp{/defaults} entry must be able to process normal +selectors. This feature is turned on by setting +@samp{selectors_on_default = yes} in the @file{amd.conf} file. +@xref{selectors_on_default Parameter}. + +In this example, I set different default NFS mount options for hosts +which are running over a slower network link. By setting a smaller size +for the NFS read and write buffer sizes, you can greatly improve remote +file service performance. + +@example +/defaults \ + wire==slip-net;opts:=rw,intr,rsize=1024,wsize=1024,timeo=20,retrans=10 \ + wire!=slip-net;opts:=rw,intr +@end example + +@node /tftpboot in a chroot-ed environment, , /defaults with selectors, Examples +@comment node-name, next, previous, up +@section @samp{/tftpboot} in a chroot-ed environment +@cindex /tftpboot in a chroot-ed environment +@cindex chroot: /tftpboot example + +In this complex example, we attempt to run an @i{Amd} process +@emph{inside} a chroot-ed environment. @samp{tftpd} (Trivial FTP) is +used to trivially retrieve files used to boot X-Terminals, Network +Printers, Network routers, diskless workstations, and other such +devices. For security reasons, @samp{tftpd} (and also @samp{ftpd}) +processes are run using the @b{chroot}(2) system call. This provides an +environment for these processes, where access to any files outside the +directory where the chroot-ed process runs is denied. + +For example, if you start @samp{tftpd} on your system with + +@example +chroot /tftpboot /usr/sbin/tftpd +@end example + +@noindent +then the @samp{tftpd} process will not be able to access any files +outside @file{/tftpboot}. This ensures that no one can retrieve files +such as @file{/etc/passwd} and run password crackers on it. + +Since the TFTP service works by broadcast, it is necessary to have at +least one TFTP server running on each subnet. If you have lots of files +that you need to make available for @samp{tftp}, and many subnets, it +could take significant amounts of disk space on each host serving them. + +A solution we implemented at Columbia University was to have every host +run @samp{tftpd}, but have those servers retrieve the boot files from +two replicated servers. Those replicated servers have special +partitions dedicated to the many network boot files. + +We start @i{Amd} as follows: + +@example +amd /tftpboot/.amd amd.tftpboot +@end example + +That is, @i{Amd} is serving the directory @file{/tftpboot/.amd}. The +@samp{tftp} server runs inside @file{/tftpboot} and is chroot-ed in that +directory too. The @file{amd.tftpboot} map looks like: + +@example +# +# Amd /tftpboot directory -> host map +# + +/defaults opts:=nosuid,ro,intr,soft;fs:=/tftpboot/import;type:=nfs + +tp host==lol;rfs:=/n/lol/import/tftpboot;type:=lofs \ + host==ober;rfs:=/n/ober/misc/win/tftpboot;type:=lofs \ + rhost:=ober;rfs:=/n/ober/misc/win/tftpboot \ + rhost:=lol;rfs:=/n/lol/import/tftpboot +@end example + +To help understand this example, I list a few of the file entries that +are created inside @file{/tftpboot}: + +@example +$ ls -la /tftpboot +dr-xr-xr-x 2 root 512 Aug 30 23:11 .amd +drwxrwsr-x 12 root 512 Aug 30 08:00 import +lrwxrwxrwx 1 root 33 Feb 27 1997 adminpr.cfg -> ./.amd/tp/hplj/adminpr.cfg +lrwxrwxrwx 1 root 22 Dec 5 1996 tekxp -> ./.amd/tp/xterms/tekxp +lrwxrwxrwx 1 root 1 Dec 5 1996 tftpboot -> . +@end example + +Here is an explanation of each of the entries listed above: + +@table @code + +@item .amd +This is the @i{Amd} mount point. Note that you do not need to run a +separate @i{Amd} process for the TFTP service. The @b{chroot}(2) system +call only protects against file access, but the same process can still +serve files and directories inside and outside the chroot-ed +environment, because @i{Amd} itself was not run in chroot-ed mode. + +@item import +This is the mount point where @i{Amd} will mount the directories +containing the boot files. The map is designed so that remote +directories will be NFS mounted (even if they are already mounted +elsewhere), and local directories are loopback mounted (since they are +not accessible outside the chroot-ed @file{/tftpboot} directory). + +@item adminpr.cfg +@itemx tekxp +Two manually created symbolic links to directories @emph{inside} the +@i{Amd}-managed directory. The crossing of the component @file{tp} will +cause @i{Amd} to automount one of the remote replicas. Once crossed, +access to files inside proceeds as usual. The @samp{adminpr.cfg} is a +configuration file for an HP Laser-Jet 4si printer, and the @samp{tekxp} +is a directory for Tektronix X-Terminal boot files. + +@item tftpboot +This innocent looking symlink is important. Usually, when devices boot +via the TFTP service, they perform the @samp{get file} command to +retrieve @var{file}. However, some devices assume that @samp{tftpd} +does not run in a chroot-ed environment, but rather ``unprotected'', and +thus use a full pathname for files to retrieve, as in @samp{get +/tftpboot/file}. This symlink effectively strips out the leading +@file{/tftpboot/}. + +@end table + +@c ################################################################ +@node Internals, Acknowledgments & Trademarks, Examples, Top +@comment node-name, next, previous, up +@chapter Internals + +Note that there are more error and logging messages possible than are +listed here. Most of them are self-explanatory. Refer to the program +sources for more details on the rest. + +@menu +* Log Messages:: +@end menu + +@node Log Messages, , Internals, Internals +@comment node-name, next, previous, up +@section Log Messages + +In the following sections a brief explanation is given of some of the +log messages made by @i{Amd}. Where the message is in @samp{typewriter} +font, it corresponds exactly to the message produced by @i{Amd}. Words +in @dfn{italic} are replaced by an appropriate string. Variables, +@code{$@{@i{var}@}}, indicate that the value of the appropriate variable is +output. + +Log messages are either sent directly to a file, +or logged via the @b{syslog}(3) mechanism. @xref{log_file Parameter} +In either case, entries in the file are of the form: +@example +@i{date-string} @i{hostname} @t{amd[}@i{pid}@t{]} @i{message} +@end example + +@menu +* Fatal errors:: +* Info messages:: +@end menu + +@node Fatal errors, Info messages, Log Messages, Log Messages +@comment node-name, next, previous, up +@subsection Fatal errors + +@i{Amd} attempts to deal with unusual events. Whenever it is not +possible to deal with such an error, @i{Amd} will log an appropriate +message and, if it cannot possibly continue, will either exit or abort. +These messages are selected by @samp{-x fatal} on the command line. +When @b{syslog}(3) is being used, they are logged with level +@samp{LOG_FATAL}. Even if @i{Amd} continues to operate it is likely to +remain in a precarious state and should be restarted at the earliest +opportunity. + +@table @t + +@item Attempting to inherit not-a-filesystem +The prototype mount point created during a filesystem restart did not +contain a reference to the restarted filesystem. This error ``should +never happen''. + +@item Can't bind to domain "@i{NIS-domain}" +A specific NIS domain was requested on the command line, but no server +for that domain is available on the local net. + +@item Can't determine IP address of this host (@i{hostname}) +When @i{Amd} starts it determines its own IP address. If this lookup +fails then @i{Amd} cannot continue. The hostname it looks up is that +obtained returned by @b{gethostname}(2) system call. + +@item Can't find root file handle for @i{automount point} +@i{Amd} creates its own file handles for the automount points. When it +mounts itself as a server, it must pass these file handles to the local +kernel. If the filehandle is not obtainable the mount point is ignored. +This error ``should never happen''. + +@item Must be root to mount filesystems (euid = @i{euid}) +To prevent embarrassment, @i{Amd} makes sure it has appropriate system +privileges. This amounts to having an euid of 0. The check is made +after argument processing complete to give non-root users a chance to +access the @code{-v} option. + +@item No work to do - quitting +No automount points were given on the command line and so there is no +work to do. + +@item Out of memory +While attempting to malloc some memory, the memory space available to +@i{Amd} was exhausted. This is an unrecoverable error. + +@item Out of memory in realloc +While attempting to realloc some memory, the memory space available to +@i{Amd} was exhausted. This is an unrecoverable error. + +@item cannot create rpc/udp service +Either the NFS or AMQ endpoint could not be created. + +@item gethostname: @i{description} +The @b{gethostname}(2) system call failed during startup. + +@item host name is not set +The @b{gethostname}(2) system call returned a zero length host name. +This can happen if @i{Amd} is started in single user mode just after +booting the system. + +@item ifs_match called! +An internal error occurred while restarting a pre-mounted filesystem. +This error ``should never happen''. + +@item mount_afs: @i{description} +An error occurred while @i{Amd} was mounting itself. + +@item run_rpc failed +Somehow the main NFS server loop failed. This error ``should never +happen''. + +@item unable to free rpc arguments in amqprog_1 +The incoming arguments to the AMQ server could not be free'ed. + +@item unable to free rpc arguments in nfs_program_1 +The incoming arguments to the NFS server could not be free'ed. + +@item unable to register (AMQ_PROGRAM, AMQ_VERSION, udp) +The AMQ server could not be registered with the local portmapper or the +internal RPC dispatcher. + +@item unable to register (NFS_PROGRAM, NFS_VERSION, 0) +The NFS server could not be registered with the internal RPC dispatcher. + +@end table + +XXX: This section needs to be updated + +@node Info messages, , Fatal errors, Log Messages +@comment node-name, next, previous, up +@subsection Info messages + +@i{Amd} generates information messages to record state changes. These +messages are selected by @samp{-x info} on the command line. When +@b{syslog}(3) is being used, they are logged with level @samp{LOG_INFO}. + +The messages listed below can be generated and are in a format suitable +for simple statistical analysis. @dfn{mount-info} is the string +that is displayed by @dfn{Amq} in its mount information column and +placed in the system mount table. + +@table @t + +@item "@t{$@{@i{path}@}}" forcibly timed out +An automount point has been timed out by the @i{Amq} command. + +@item "@t{$@{@i{path}@}}" has timed out +No access to the automount point has been made within the timeout +period. + +@item Filehandle denied for "$@{@i{rhost}@}:$@{@i{rfs}@}" +The mount daemon refused to return a file handle for the requested filesystem. + +@item Filehandle error for "$@{@i{rhost}@}:$@{@i{rfs}@}": @i{description} +The mount daemon gave some other error for the requested filesystem. + +@item Finishing with status @i{exit-status} +@i{Amd} is about to exit with the given exit status. + +@item Re-synchronizing cache for map @t{$@{@i{map}@}} +The named map has been modified and the internal cache is being re-synchronized. + +@item file server @t{$@{@i{rhost}@}} is down - timeout of "@t{$@{@i{path}@}}" ignored +An automount point has timed out, but the corresponding file server is +known to be down. This message is only produced once for each mount +point for which the server is down. + +@item file server @t{$@{@i{rhost}@}} type nfs is down +An NFS file server that was previously up is now down. + +@item file server @t{$@{@i{rhost}@}} type nfs is up +An NFS file server that was previously down is now up. + +@item file server @t{$@{@i{rhost}@}} type nfs starts down +A new NFS file server has been referenced and is known to be down. + +@item file server @t{$@{@i{rhost}@}} type nfs starts up +A new NFS file server has been referenced and is known to be up. + +@item mount of "@t{$@{@i{path}@}}" on @t{$@{@i{fs}@}} timed out +Attempts to mount a filesystem for the given automount point have failed +to complete within 30 seconds. + +@item @i{mount-info} mounted fstype @t{$@{@i{type}@}} on @t{$@{@i{fs}@}} +A new file system has been mounted. + +@item @i{mount-info} restarted fstype @t{$@{@i{type}@}} on @t{$@{@i{fs}@}} +@i{Amd} is using a pre-mounted filesystem to satisfy a mount request. + +@item @i{mount-info} unmounted fstype @t{$@{@i{type}@}} from @t{$@{@i{fs}@}} +A file system has been unmounted. + +@item @i{mount-info} unmounted fstype @t{$@{@i{type}@}} from @t{$@{@i{fs}@}} link @t{$@{@i{fs}@}}/@t{$@{@i{sublink}@}} +A file system of which only a sub-directory was in use has been unmounted. + +@item restarting @i{mount-info} on @t{$@{@i{fs}@}} +A pre-mounted file system has been noted. + +@end table + +XXX: This section needs to be updated + +@c ################################################################ +@node Acknowledgments & Trademarks, Index, Internals, Top +@comment node-name, next, previous, up +@unnumbered Acknowledgments & Trademarks + +Many thanks to the @email{amd-dev@@majordomo.cs.columbia.edu,Amd +Developers} mailing list through the months developing am-utils. These +members have contributed to the discussions, ideas, code and +documentation, and subjected their systems to alpha quality code. +Special thanks go to those +@uref{http://www.cs.columbia.edu/~ezk/am-utils/AUTHORS.txt,authors} who +have submitted patches. + +Thanks to the Formal Methods Group at Imperial College for suffering +patiently while @i{Amd} was being developed on their machines. + +Thanks to the many people who have helped with the development of +@i{Amd}, especially Piete Brooks at the Cambridge University Computing +Lab for many hours of testing, experimentation and discussion. + +Thanks to the @email{amd-workers@@majordomo.glue.umd.edu,Amd Workers} +mailing list members for many suggestions and bug reports to @i{Amd}. + +@itemize @bullet +@item +@b{DEC}, @b{VAX} and @b{Ultrix} are registered trademarks of Digital +Equipment Corporation. +@item +@b{AIX} and @b{IBM} are registered trademarks of International Business +Machines Corporation. +@item +@b{Sun}, @b{NFS} and @b{SunOS} are registered trademarks of Sun +Microsystems, Inc. +@item +@b{UNIX} is a registered trademark in the USA and other countries, +exclusively licensed through X/Open Company, Ltd. +@item +All other registered trademarks are owned by their respective owners. +@end itemize + +@c ################################################################ +@node Index, , Acknowledgments & Trademarks, Top +@comment node-name, next, previous, up +@unnumbered Index + +@printindex cp + +@contents +@bye + +@c ==================================================================== +@c ISPELL LOCAL WORDS: +@c LocalWords: setfilename amdref overfullrule settitle titlepage titlefont nz +@c LocalWords: authorfont vskip ifinfo iftex cindex unnumberedsec dfn xref vol +@c LocalWords: locationN pxref jpo nott concentrix Sjoerd sjoerd cwi Eitan vuw +@c LocalWords: Mizrotsky eitan shumuji dgux fpx scp hcx metcalf masala hlh OTS +@c LocalWords: Presnell srp cgl Trost trost ogi pyrOSx OSx tubsibr riscix iX +@c LocalWords: Piete pb Lindblad cjl ai umax utek xinu Mitchum D'Souza dsouza +@c LocalWords: mrc apu alliant aviion AViiON fps macII multimax tahoe vax emph +@c LocalWords: mapdefault valA valB valC YPTSDIR ETCDIR substr MAKEDBM YPDBDIR +@c LocalWords: NOPUSH njw dylan dk dylan njw anydir domN achilles mjh pref sel +@c LocalWords: gdef loc loc loc ldots autodir remopts rwho rwho styx styx yoyo +@c LocalWords: noindent gould rvdmount rvdunmount fserver mtmp unioned logfile +@c LocalWords: dmn esac phjk toytown toytown toytown toytown phjk RdDir RdLnk +@c LocalWords: volname attrs netif dougal inaddr hwaddr ec mountmaps passno xy +@c LocalWords: freq dumpset hfs brian florence localinfo fstabs automaps defn +@c LocalWords: localname fsck'd opr gummo sjv ganymede sjv fserv fserv fserv +@c LocalWords: vaxA vaxB wp thpfs nbsd asis ifs amqprog free'ed printindex gov +@c LocalWords: LocalWords syncodeindex Distrib bsdnet lanl AutoMounter acis ic +@c LocalWords: ac uk aix bsd Mullender nl il DG lcs hpux irix ucsf NeXT cse cl +@c LocalWords: mt FX hp ibm mips utils def def Domainname eg hostd getwd tmp +@c LocalWords: subsubsection rw grpid intr noconn nocto nodevs nosuid retrans +@c LocalWords: rsize tcp timeo nounmount utimeout DDEBUG nodaemon fd hostnames +@c LocalWords: pid Amd's pendry vangogh nfsx backoff stats nomap nostats CRIT +@c LocalWords: noinfo clustername RVD dsk dsk amq hostports osver statfs str +@c LocalWords: ou counter's amdmaps proj src tftpboot sh mv cd sbin ypcat inet +@c LocalWords: Getattr getattr localhost fhandles netmask fstype noquota addr +@c LocalWords: exportfs Dumpsets dumpsets pindex ldif fixmount fixrmtab euid +@c LocalWords: lostaltmail realloc netnumber itemx primnetnum primnetname ARG +@c LocalWords: subsnetname subsnetnum netgrp netgroup multitable Shlib dec osf +@c LocalWords: hppa pc bsdi freebsd netbsd openbsd ncr sysv rs acdirmax fsid +@c LocalWords: acdirmin acregmax acregmin actimeo dumbtimr nfsv noac noauto sd +@c LocalWords: nocache nodev noint nosub pgthresh posix rdonly suid symttl mfs +@c LocalWords: AMFS umapfs myftpdir unionfs es mapname mapfile mapfile slocal +@c LocalWords: mailspool saturn saturn notknown lol ober dr xr xr drwxrwsr cfg +@c LocalWords: lrwxrwxrwx adminpr hplj adminpr cfg tekxp xterms tekxp Dupuy tp +@c LocalWords: linkname hlfsddump dirname rmtab pluto rlogin direntry pg vr dn +@c LocalWords: maxmem hlfsdir xmailbox showmount cn amdmap amdmapName resvport +@c LocalWords: objectClass amdmapKey amdmapValue ln powerpc amdmapTimestamp ez +@c LocalWords: moisil FSinfo Libtool Unmounting sublink fileservers NullProc +@c LocalWords: gethostname mount's unmounts linkx remounts unmounting UAs SA's +@c LocalWords: mountpoint mountpoints unescaped UIDs util's overlayed uref EFS +@c LocalWords: serv maxgroups nfsl cachedir copt cfsadmin efs addopts fg +@c LocalWords: nointr |