Copyright © 1994-2004 Daniel Quinlan
Copyright © 2001-2004 Paul 'Rusty' Russell
Copyright © 2003-2004 Christopher Yeoh
This standard consists of a set of requirements and guidelines for fileand directory placement under UNIX-like operating systems. Theguidelines are intended to support interoperability of applications,system administration tools, development tools, and scripts as well asgreater uniformity of documentation for these systems.
All trademarks and copyrights are owned by their owners, unlessspecifically noted otherwise. Use of a term in this document should notbe regarded as affecting the validity of any trademark or servicemark.
Permission is granted to make and distribute verbatim copies ofthis standard provided the copyright and this permission notice arepreserved on all copies.
Permission is granted to copy and distribute modified versions of thisstandard under the conditions for verbatim copying, provided also thatthe title page is labeled as modified including a reference to theoriginal standard, provided that information on retrieving the originalstandard is included, and provided that the entire resulting derivedwork is distributed under the terms of a permission notice identical tothis one.
Permission is granted to copy and distribute translations of thisstandard into another language, under the above conditions for modifiedversions, except that this permission notice may be stated in atranslation approved by the copyright holder.
This standard enables:
Software to predict the location of installed files anddirectories, and
Users to predict the location of installed files anddirectories.
We do this by:
Specifying guiding principles for each area of the filesystem,
Specifying the minimum files and directories required,
Enumerating exceptions to the principles, and
Enumerating specific cases where there has been historical conflict.
The FHS document is used by:
Independent software suppliers to create applications which are FHScompliant, and work with distributions which are FHS complaint,
OS creators to provide systems which are FHS compliant, and
Users to understand and maintain the FHS compliance of a system.
The FHS document has a limited scope:
Local placement of local files is a local issue, so FHS does notattempt to usurp system administrators.
FHS addresses issues where file placements need to be coordinatedbetween multiple parties such as local sites, distributions,applications, documentation, etc.
We recommend that you read a typeset version of this document ratherthan the plain text version. In the typeset version, the names of filesand directories are displayed in a constant-width font.
Components of filenames that vary are represented by a descriptionof the contents enclosed in "<" and">" characters,
Optional components of filenames are enclosed in"[" and "]" characters and maybe combined with the "<" and">" convention. For example, if a filename isallowed to occur either with or without an extension, it might berepresented by
Variable substrings of directory names and filenames are indicatedby "*".
The sections of the text marked asRationale are explanatory and arenon-normative.
This standard assumes that the operating system underlying anFHS-compliant file system supports the same basic security featuresfound in most UNIX filesystems.
It is possible to define two independent distinctions amongfiles: shareable vs. unshareable and variable vs. static. In general,files that differ in either of these respects should be located indifferent directories. This makes it easy to store files withdifferent usage characteristics on different filesystems.
"Shareable" files are those that can be stored on one hostand used on others. "Unshareable" files are those that are notshareable. For example, the files in user home directories areshareable whereas device lock files are not.
"Static" files include binaries, libraries, documentationfiles and other files that do not change without system administratorintervention. "Variable" files are files that are not static.
Rationale | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Shareable files can be stored on one host and used on severalothers. Typically, however, not all files in the filesystemhierarchy are shareable and so each system has local storagecontaining at least its unshareable files. It is convenient if allthe files a system requires that are stored on a foreign host can bemade available by mounting one or a few directories from the foreignhost. Static and variable files should be segregated because staticfiles, unlike variable files, can be stored on read-only media anddo not need to be backed up on the same schedule as variablefiles. Historical UNIX-like filesystem hierarchies contained bothstatic and variable files under both /usr and/etc. In order to realize the advantagesmentioned above, the /var hierarchy wascreated and all variable files were transferred from/usr to /var.Consequently /usr can now be mounted read-only(if it is a separate filesystem). Variable files have beentransferred from /etc to/var over a longer period as technology haspermitted. Here is an example of a FHS-compliant system.(Other FHS-compliant layouts are possible.)
|
The contents of the root filesystem must be adequate to boot,restore, recover, and/or repair the system.
To boot a system, enough must be present on the root partitionto mount other filesystems. This includes utilities, configuration,boot loader information, and other essential start-up data./usr, /opt, and/var are designed such that they may be locatedon other partitions or filesystems.
To enable recovery and/or repair of a system, those utilitiesneeded by an experienced maintainer to diagnose and reconstruct adamaged system must be present on the root filesystem.
To restore a system, those utilities needed to restore fromsystem backups (on floppy, tape, etc.) must be present on the rootfilesystem.
Rationale | |
---|---|
The primary concern used to balance these considerations, whichfavor placing many things on the root filesystem, is the goal ofkeeping root as small as reasonably possible. For several reasons, itis desirable to keep the root filesystem small:
|
Applications must never create or require special files orsubdirectories in the root directory. Other locations in the FHShierarchy provide more than enough flexibility for any package.
Rationale | |
---|---|
There are several reasons why creating a new subdirectory ofthe root filesystem is prohibited:
Distributions should not create new directories in the roothierarchy without extremely careful consideration of the consequencesincluding for application portability. |
The following directories, or symbolic links to directories, arerequired in /.
Directory | Description |
---|---|
bin | Essential command binaries |
boot | Static files of the boot loader |
dev | Device files |
etc | Host-specific system configuration |
lib | Essential shared libraries and kernel modules |
media | Mount point for removeable media |
mnt | Mount point for mounting a filesystem temporarily |
opt | Add-on application software packages |
sbin | Essential system binaries |
srv | Data for services provided by this system |
tmp | Temporary files |
usr | Secondary hierarchy |
var | Variable data |
Each directory listed above is specified in detail in separatesubsections below. /usr and/var each have a complete section in thisdocument due to the complexity of those directories.
The following directories, or symbolic links to directories,must be in /, if the corresponding subsystem isinstalled:
Directory | Description |
---|---|
home | User home directories (optional) |
lib |
Alternate format essential shared libraries (optional) |
root | Home directory for the root user (optional) |
Each directory listed above is specified in detail in separatesubsections below.
/bin contains commands that may be used byboth the system administrator and by users, but which are requiredwhen no other filesystems are mounted (e.g. in single user mode). Itmay also contain commands which are used indirectly by scripts.[1]
There must be no subdirectories in/bin.
The following commands, or symbolic links to commands, arerequired in /bin.
Command | Description |
---|---|
cat | Utility to concatenate files to standard output |
chgrp | Utility to change file group ownership |
chmod | Utility to change file access permissions |
chown | Utility to change file owner and group |
cp | Utility to copy files and directories |
date | Utility to print or set the system data and time |
dd | Utility to convert and copy a file |
df | Utility to report filesystem disk space usage |
dmesg | Utility to print or control the kernel message buffer |
echo | Utility to display a line of text |
false | Utility to do nothing, unsuccessfully |
hostname | Utility to show or set the system's host name |
kill | Utility to send signals to processes |
ln | Utility to make links between files |
login | Utility to begin a session on the system |
ls | Utility to list directory contents |
mkdir | Utility to make directories |
mknod | Utility to make block or character special files |
more | Utility to page through text |
mount | Utility to mount a filesystem |
mv | Utility to move/rename files |
ps | Utility to report process status |
pwd | Utility to print name of current working directory |
rm | Utility to remove files or directories |
rmdir | Utility to remove empty directories |
sed | The `sed' stream editor |
sh | The Bourne command shell |
stty | Utility to change and print terminal line settings |
su | Utility to change user ID |
sync | Utility to flush filesystem buffers |
true | Utility to do nothing, successfully |
umount | Utility to unmount file systems |
uname | Utility to print system information |
If /bin/sh is not a true Bourne shell, itmust be a hard or symbolic link to the real shell command.
The [ and testcommands must be placed together in either /binor /usr/bin.
Rationale | |
---|---|
For example bash behaves differently when called assh or bash. The use of asymbolic link also allows users to easily see that/bin/sh is not a true Bourne shell. The requirement for the [ andtest commands to be included as binaries (even ifimplemented internally by the shell) is shared with the POSIX.2standard. |
The following programs, or symbolic links to programs, must bein /bin if the corresponding subsystem isinstalled:
Command | Description |
---|---|
csh | The C shell (optional) |
ed | The `ed' editor (optional) |
tar | The tar archiving utility (optional) |
cpio | The cpio archiving utility (optional) |
gzip | The GNU compression utility (optional) |
gunzip | The GNU uncompression utility (optional) |
zcat | The GNU uncompression utility (optional) |
netstat | The network statistics utility (optional) |
ping | The ICMP network test utility (optional) |
If the gunzip and zcatprograms exist, they must be symbolic or hard links togzip. /bin/csh may be a symbolic link to/bin/tcsh or/usr/bin/tcsh.
Rationale | |
---|---|
The tar, gzip and cpio commands have been added to make restoration of asystem possible (provided that / is intact). Conversely, if no restoration from the root partition is everexpected, then these binaries might be omitted (e.g., a ROM chip root,mounting /usr through NFS). If restoration of asystem is planned through the network, then ftpor tftp (along with everything necessary to getan ftp connection) must be available on the root partition. |
This directory contains everything required for the boot processexcept configuration files not needed at boot time and the mapinstaller. Thus /boot stores data that is used before the kernelbegins executing user-mode programs. This may include saved masterboot sectors and sector map files.[2]
The operating system kernel must be located in either/ or /boot.[3]
The /dev directory is the location ofspecial or device files.
If it is possible that devices in /dev willneed to be manually created, /dev must contain acommand named MAKEDEV, which can create devicesas needed. It may also contain a MAKEDEV.localfor any local devices.
If required, MAKEDEV must have provisionsfor creating any device that may be found on the system, not justthose that a particular implementation installs.
The /etc hierarchy contains configurationfiles. A "configuration file" is a local file used to control theoperation of a program; it must be static and cannot be an executablebinary.[4]
No binaries may be located under /etc.[5]
The following directories, or symbolic links to directories arerequired in /etc:
Directory | Description |
---|---|
opt | Configuration for /opt |
X11 | Configuration for the X Window system (optional) |
sgml | Configuration for SGML (optional) |
xml | Configuration for XML (optional) |
The following directories, or symbolic links to directories mustbe in /etc, if the corresponding subsystem isinstalled:
Directory | Description |
---|---|
opt | Configuration for /opt |
The following files, or symbolic links to files, must be in/etc if the corresponding subsystem isinstalled:[6]
File | Description |
---|---|
csh.login | Systemwide initialization file for C shell logins (optional) |
exports | NFS filesystem access control list (optional) |
fstab | Static information about filesystems (optional) |
ftpusers | FTP daemon user access control list (optional) |
gateways | File which lists gateways for routed (optional) |
gettydefs | Speed and terminal settings used by getty (optional) |
group | User group file (optional) |
host.conf | Resolver configuration file (optional) |
hosts | Static information about host names (optional) |
hosts.allow | Host access file for TCP wrappers (optional) |
hosts.deny | Host access file for TCP wrappers (optional) |
hosts.equiv | List of trusted hosts for rlogin, rsh, rcp (optional) |
hosts.lpd | List of trusted hosts for lpd (optional) |
inetd.conf | Configuration file for inetd (optional) |
inittab | Configuration file for init (optional) |
issue | Pre-login message and identification file (optional) |
ld.so.conf | List of extra directories to search for shared libraries (optional) |
motd | Post-login message of the day file (optional) |
mtab | Dynamic information about filesystems (optional) |
mtools.conf | Configuration file for mtools (optional) |
networks | Static information about network names (optional) |
passwd | The password file (optional) |
printcap | The lpd printer capability database (optional) |
profile | Systemwide initialization file for sh shell logins (optional) |
protocols | IP protocol listing (optional) |
resolv.conf | Resolver configuration file (optional) |
rpc | RPC protocol listing (optional) |
securetty | TTY access control for root login (optional) |
services | Port names for network services (optional) |
shells | Pathnames of valid login shells (optional) |
syslog.conf | Configuration file for syslogd (optional) |
mtab does not fit the static nature of/etc: it is excepted for historical reasons.[7]
Host-specific configuration files for add-on applicationsoftware packages must be installed within the directory/etc/opt/
No structure is imposed on the internal arrangement of/etc/opt/
If a configuration file must reside in a different location inorder for the package or system to function properly, it may be placedin a location other than/etc/opt/
Rationale | |
---|---|
Refer to the rationale for /opt. |
/etc/X11 is the location for all X11host-specific configuration. This directory is necessary to allowlocal control if /usr is mounted readonly.
The following files, or symbolic links to files, must be in/etc/X11 if the corresponding subsystem isinstalled:
File | Description |
---|---|
Xconfig | The configuration file for early versions of XFree86 (optional) |
XF86Config | The configuration file for XFree86 versions 3 and 4 (optional) |
Xmodmap | Global X11 keyboard modification file (optional) |
Subdirectories of /etc/X11 may includethose for xdm and for any other programs (somewindow managers, for example) that need them.[8]We recommend that window managers with only one configuration filewhich is a default .*wmrc file must name itsystem.*wmrc (unless there is a widely-acceptedalternative name) and not use a subdirectory. Any window managersubdirectories must be identically named to the actual window managerbinary.
Generic configuration files defining high-level parameters ofthe SGML systems are installed here. Files with names*.conf indicate generic configuration files.File with names *.cat are the DTD-specificcentralized catalogs, containing references to all other catalogsneeded to use the given DTD. The super catalog filecatalog references all the centralizedcatalogs.
Generic configuration files defining high-level parameters ofthe XML systems are installed here. Files with names*.conf indicate generic configuration files.The super catalog filecatalog references all the centralizedcatalogs.
/home is a fairly standard concept, but itis clearly a site-specific filesystem.[9]The setup will differ from host to host. Therefore, no program shouldrely on this location.[10]
User specific configuration files for applications are stored in theuser's home directory in a file that starts with the '.' character (a"dot file"). If an application needs to create more than one dot filethen they should be placed in a subdirectory with a name starting witha '.' character, (a "dot directory"). In this case the configurationfiles should not start with the '.' character.[11]
The /lib directory contains those sharedlibrary images needed to boot the system and run the commands in theroot filesystem, ie. by binaries in /bin and/sbin.[12]
At least one of each of the following filename patterns arerequired (they may be files, or symbolic links):
File | Description |
---|---|
libc.so.* | The dynamically-linked C library (optional) |
ld* | The execution time linker/loader (optional) |
If a C preprocessor is installed, /lib/cppmust be a reference to it, for historical reasons.[13]
The following directories, or symbolic links to directories,must be in /lib, if the corresponding subsystemis installed:
Directory | Description |
---|---|
modules | Loadable kernel modules (optional) |
There may be one or more variants of the/lib directory on systems which support more thanone binary format requiring separate libraries.[14]
If one or more of these directories exist, the requirements fortheir contents are the same as the normal /libdirectory, except that /lib
This directory contains subdirectories which are used as mountpoints for removeable media such as floppy disks, cdroms and zipdisks.
Rationale | |
---|---|
Historically there have been a number of other different placesused to mount removeable media such as /cdrom,/mnt or /mnt/cdrom. Placingthe mount points for all removeable media directly in the rootdirectory would potentially result in a large number of extradirectories in /. Although the use ofsubdirectories in /mnt as a mount point hasrecently been common, it conflicts with a much older tradition ofusing /mnt directly as a temporary mount point. |
The following directories, or symbolic links to directories,must be in /media, if the corresponding subsystemis installed:
Directory | Description |
---|---|
floppy | Floppy drive (optional) |
cdrom | CD-ROM drive (optional) |
cdrecorder | CD writer (optional) |
zip | Zip drive (optional) |
On systems where more than one device exists for mounting acertain type of media, mount directories can be created by appending adigit to the name of those available above starting with '0', but theunqualified name must also exist.[16]
This directory is provided so that the system administrator maytemporarily mount a filesystem as needed. The content of thisdirectory is a local issue and should not affect the manner in whichany program is run.
This directory must not be used by installation programs: asuitable temporary directory not in use by the system must be usedinstead.
/opt is reserved for the installation ofadd-on application software packages.
A package to be installed in /opt mustlocate its static files in a separate/opt/
Directory | Description |
---|---|
Static package objects | |
LANANA registered provider name |
The directories /opt/bin,/opt/doc, /opt/include,/opt/info, /opt/lib, and/opt/man are reserved for local systemadministrator use. Packages may provide "front-end" files intended tobe placed in (by linking or copying) these reserved directories by thelocal system administrator, but must function normally in the absenceof these reserved directories.
Programs to be invoked by users must be located in the directory/opt/
Package files that are variable (change in normal operation)must be installed in /var/opt. See the sectionon /var/opt for more information.
Host-specific configuration files must be installed in/etc/opt. See the section on/etc for more information.
No other package files may exist outside the/opt, /var/opt, and/etc/opt hierarchies except for those packagefiles that must reside in specific locations within the filesystemtree in order to function properly. For example, device lock filesmust be placed in /var/lock and devices must belocated in /dev.
Distributions may install software in /opt,but must not modify or delete software installed by the local systemadministrator without the assent of the local systemadministrator.
Rationale | |
---|---|
The use of /opt for add-on software is awell-established practice in the UNIX community. The System VApplication Binary Interface [AT&T 1990], based on the System VInterface Definition (Third Edition), provides for an/opt structure very similar to the one definedhere. The Intel Binary Compatibility Standard v. 2 (iBCS2) alsoprovides a similar structure for /opt. Generally, all data required to support a package on a systemmust be present within /opt/ The minor restrictions on distributions using/opt are necessary because conflicts are possiblebetween distribution-installed and locally-installed software,especially in the case of fixed pathnames found in some binarysoftware. The structure of the directories below/opt/ |
The root account's home directory may be determined by developeror local preference, but this is the recommended defaultlocation.[17]
Utilities used for system administration (and other root-onlycommands) are stored in /sbin,/usr/sbin, and/usr/local/sbin. /sbincontains binaries essential for booting, restoring, recovering, and/orrepairing the system in addition to the binaries in/bin.[18] Programs executed after/usr is known to be mounted (when there are noproblems) are generally placed into /usr/sbin.Locally-installed system administration programs should be placed into/usr/local/sbin.[19]
The following commands, or symbolic links to commands, arerequired in /sbin.
Command | Description |
---|---|
shutdown | Command to bring the system down. |
The following files, or symbolic links to files, must be in/sbin if the corresponding subsystem isinstalled:
Command | Description |
---|---|
fastboot | Reboot the system without checking the disks (optional) |
fasthalt | Stop the system without checking the disks (optional) |
fdisk | Partition table manipulator (optional) |
fsck | File system check and repair utility (optional) |
fsck.* | File system check and repair utility for a specific filesystem (optional) |
getty | The getty program (optional) |
halt | Command to stop the system (optional) |
ifconfig | Configure a network interface (optional) |
init | Initial process (optional) |
mkfs | Command to build a filesystem (optional) |
mkfs.* | Command to build a specific filesystem (optional) |
mkswap | Command to set up a swap area (optional) |
reboot | Command to reboot the system (optional) |
route | IP routing table utility (optional) |
swapon | Enable paging and swapping (optional) |
swapoff | Disable paging and swapping (optional) |
update | Daemon to periodically flush filesystem buffers (optional) |
/srv contains site-specific data which isserved by this system.
Rationale | |
---|---|
This main purpose of specifying this is so that users may find thelocation of the data files for particular service, and so thatservices which require a single tree for readonly data, writable dataand scripts (such as cgi scripts) can be reasonably placed. Data thatis only of interest to a specific user should go in that users' homedirectory. The methodology used to name subdirectories of/srv is unspecified as there is currently noconsensus on how this should be done. One method for structuring dataunder /srv is by protocol,eg. ftp, rsync,www, and cvs. On largesystems it can be useful to structure /srv byadministrative context, such as /srv/physics/www,/srv/compsci/cvs, etc. This setup will differfrom host to host. Therefore, no program should rely on a specificsubdirectory structure of /srv existing or datanecessarily being stored in /srv. However/srv should always exist on FHS compliant systemsand should be used as the default location for such data. Distributions must take care not to remove locally placed files inthese directories without administrator permission.[20] |
The /tmp directory must be made availablefor programs that require temporary files.
Programs must not assume that any files or directories in/tmp are preserved between invocations of theprogram.
Rationale | |
---|---|
IEEE standard P1003.2 (POSIX, part 2) makes requirements thatare similar to the above section. Although data stored in /tmp may be deletedin a site-specific manner, it is recommended that files anddirectories located in /tmp be deleted wheneverthe system is booted. FHS added this recommendation on the basis of historicalprecedent and common practice, but did not make it a requirementbecause system administration is not within the scope of thisstandard. |
/usr is the second major section of thefilesystem. /usr is shareable, read-only data.That means that /usr should be shareable betweenvarious FHS-compliant hosts and must not be written to. Anyinformation that is host-specific or varies with time is storedelsewhere.
Large software packages must not use a direct subdirectory underthe /usr hierarchy.
The following directories, or symbolic links to directories, arerequired in /usr.
Directory | Description |
---|---|
bin | Most user commands |
include | Header files included by C programs |
lib | Libraries |
local | Local hierarchy (empty after main installation) |
sbin | Non-vital system binaries |
share | Architecture-independent data |
Directory | Description |
---|---|
X11R6 | XWindow System, version 11 release 6 (optional) |
games | Games and educational binaries (optional) |
lib |
Alternate Format Libraries (optional) |
src | Source code (optional) |
An exception is made for the X Window System because ofconsiderable precedent and widely-accepted practice.
The following symbolic links to directories may be present. Thispossibility is based on the need to preserve compatibility with oldersystems until all implementations can be assumed to use the/var hierarchy.
/usr/spool -> /var/spool /usr/tmp -> /var/tmp /usr/spool/locks -> /var/lock |
Once a system no longer requires any one of the above symbolic links,the link may be removed, if desired.
This hierarchy is reserved for the X Window System, version 11release 6, and related files.
To simplify matters and make XFree86 more compatible with the XWindow System on other systems, the following symbolic links must bepresent if /usr/X11R6 exists:
/usr/bin/X11 -> /usr/X11R6/bin /usr/lib/X11 -> /usr/X11R6/lib/X11 /usr/include/X11 -> /usr/X11R6/include/X11 |
In general, software must not be installed or managed via the abovesymbolic links. They are intended for utilization by users only. Thedifficulty is related to the release version of the X Window System —in transitional periods, it is impossible to know what release of X11 isin use.
Host-specific data in /usr/X11R6/lib/X11 should be interpretedas a demonstration file. Applications requiring information about thecurrent host must reference a configuration file in /etc/X11,which may be linked to a file in /usr/X11R6/lib.[21]
This is the primary directory of executable commands on thesystem.
The following directories, or symbolic links to directories,must be in /usr/bin, if the correspondingsubsystem is installed:
Directory | Description |
---|---|
mh | Commands for the MH mail handling system (optional) |
/usr/bin/X11 must be a symlink to/usr/X11R6/bin if the latter exists.
The following files, or symbolic links to files, must be in/usr/bin, if the corresponding subsystem isinstalled:
Command | Description |
---|---|
perl | The Practical Extraction and Report Language (optional) |
python | The Python interpreted language (optional) |
tclsh | Simple shell containing Tcl interpreter (optional) |
wish | Simple Tcl/Tk windowing shell (optional) |
expect | Program for interactive dialog (optional) |
Rationale | |
---|---|
Because shell script interpreters (invoked with#! |
This is where all of the system's general-use include files for the Cprogramming language should be placed.
The following directories, or symbolic links to directories,must be in /usr/include, if the correspondingsubsystem is installed:
Directory | Description |
---|---|
bsd | BSD compatibility include files (optional) |
The symbolic link /usr/include/X11 mustlink to /usr/X11R6/include/X11 if the latterexists.
/usr/lib includes object files, libraries,and internal binaries that are not intended to be executed directly byusers or shell scripts.[22]
Applications may use a single subdirectory under/usr/lib. If an application uses a subdirectory,all architecture-dependent data exclusively used by the applicationmust be placed within that subdirectory. [23]
For historical reasons, /usr/lib/sendmailmust be a symbolic link to /usr/sbin/sendmail ifthe latter exists.[24]
If /lib/X11 exists,/usr/lib/X11 must be a symbolic link to/lib/X11, or to whatever/lib/X11 is a symbolic link to.[25]
/usr/lib
The /usr/local hierarchy is for use by thesystem administrator when installing software locally. It needs to besafe from being overwritten when the system software is updated. Itmay be used for programs and data that are shareable amongst a groupof hosts, but not found in /usr.
Locally installed software must be placed within/usr/local rather than /usrunless it is being installed to replace or upgrade software in/usr.[27]
The following directories, or symbolic links to directories,must be in /usr/local
Directory | Description |
---|---|
bin | Local binaries |
etc | Host-specific system configuration for local binaries |
games | Local game binaries |
include | Local C header files |
lib | Local libraries |
man | Local online manuals |
sbin | Local system binaries |
share | Local architecture-independent hierarchy |
src | Local source code |
No other directories, except those listed below, may be in/usr/local after first installing a FHS-compliantsystem.
If directories /lib
/usr/local/etc may be a symbolic link to/etc/local.
Rationale | |
---|---|
The consistency of /usr/local/etc isbeneficial to installers, and is already used in other systems. Asall of /usr/local needs to be backed up toreproduce a system, it introduces no additional maintenance overhead,but a symlink to /etc/local is suitable ifsystems want alltheir configuration under one hierarchy. Note that /usr/etc is still not allowed: programsin /usr should place configuration files in/etc. |
The requirements for the contents of this directory are the sameas /usr/share. The only additional constraint isthat /usr/local/share/man and/usr/local/man directories must be synonomous(usually this means that one of them must be a symbolic link).[28]
This directory contains any non-essential binaries usedexclusively by the system administrator. System administrationprograms that are required for system repair, system recovery,mounting /usr, or other essential functions mustbe placed in /sbin instead.[29]
The /usr/share hierarchy is for allread-only architecture independent data files.[30]
This hierarchy is intended to be shareable among allarchitecture platforms of a given OS; thus, for example, a site withi386, Alpha, and PPC platforms might maintain a single/usr/share directory that is centrally-mounted.Note, however, that /usr/share is generally notintended to be shared by different OSes or by different releases ofthe same OS.
Any program or package which contains or requires data thatdoesn't need to be modified should store that data in/usr/share (or/usr/local/share, if installed locally). It isrecommended that a subdirectory be used in/usr/share for this purpose.
Game data stored in /usr/share/games mustbe purely static data. Any modifiable files, such as score files,game play logs, and so forth, should be placed in/var/games.
The following directories, or symbolic links to directories,must be in /usr/share
Directory | Description |
---|---|
man | Online manuals |
misc | Miscellaneous architecture-independent data |
The following directories, or symbolic links to directories, must be in /usr/share, if the correspondingsubsystem is installed:
Directory | Description |
---|---|
dict | Word lists (optional) |
doc | Miscellaneous documentation (optional) |
games | Static data files for /usr/games (optional) |
info | GNU Info system s primary directory (optional) |
locale | Locale information (optional) |
nls | Message catalogs for Native language support (optional) |
sgml | SGML data (optional) |
terminfo | Directories for terminfo database (optional) |
tmac | troff macros not distributed with groff (optional) |
xml | XML data (optional) |
zoneinfo | Timezone information and configuration (optional) |
It is recommended that application-specific,architecture-independent directories be placed here. Such directoriesinclude groff, perl,ghostscript, texmf, andkbd (Linux) or syscons(BSD). They may, however, be placed in /usr/libfor backwards compatibility, at the distributor's discretion.Similarly, a /usr/lib/games hierarchy may be usedin addition to the /usr/share/games hierarchy ifthe distributor wishes to place some game data there.
This directory is the home for word lists on the system;Traditionally this directory contains only the Englishwords file, which is used bylook(1) and various spelling programs.words may use either American or Britishspelling.
Rationale | |
---|---|
The reason that only word lists are located here is that theyare the only files common to all spell checkers. |
The following files, or symbolic links to files, must be in/usr/share/dict, if the corresponding subsystemis installed:
File | Description |
---|---|
words | List of English words (optional) |
Sites that require both American and British spelling may linkwords to/usr/share/dict/american-english or/usr/share/dict/british-english.
Word lists for other languages may be added using the Englishname for that language, e.g.,/usr/share/dict/french,/usr/share/dict/danish, etc. These should, ifpossible, use an ISO 8859 character set which is appropriate for thelanguage in question; if possible the Latin1 (ISO 8859-1) characterset should be used (this is often not possible).
Other word lists must be included here, if present.
This section details the organization for manual pagesthroughout the system, including /usr/share/man.Also refer to the section on/var/cache/man.
The primary
Manual pages are stored in
A description of each section follows:
man1: User programsManual pages that describe publicly accessible commands are contained inthis chapter. Most program documentation that a user will need to useis located here.
man2: System callsThis section describes all of the system calls (requests for thekernel to perform operations).
man3: Library functions and subroutinesSection 3 describes program library routines that are not direct callsto kernel services. This and chapter 2 are only really of interest toprogrammers.
man4: Special filesSection 4 describes the special files, related driver functions, andnetworking support available in the system. Typically, this includesthe device files found in /dev and the kernel interface tonetworking protocol support.
man5: File formatsThe formats for many data files are documented in thesection 5. This includes various include files, program output files,and system files.
man6: GamesThis chapter documents games, demos, and generally trivial programs.Different people have various notions about how essential this is.
man7: MiscellaneousManual pages that are difficult to classify are designated as beingsection 7. The troff and other text processing macro packages are foundhere.
man8: System administrationPrograms used by system administrators for system operation andmaintenance are documented here. Some of these programs are alsooccasionally useful for normal users.
The following directories, or symbolic links to directories,must be in/usr/share/
Directory | Description |
---|---|
man1 | User programs (optional) |
man2 | System calls (optional) |
man3 | Library calls (optional) |
man4 | Special files (optional) |
man5 | File formats (optional) |
man6 | Games (optional) |
man7 | Miscellaneous (optional) |
man8 | System administration (optional) |
The component describes themanual section.
Provisions must be made in the structure of/usr/share/man to support manual pages which arewritten in different (or multiple) languages. These provisions musttake into account the storage and reference of these manual pages.Relevant factors include language (including geographical-baseddifferences), and character code set.
This naming of language subdirectories of/usr/share/man is based on Appendix E of thePOSIX 1003.1 standard which describes the locale identification string— the most well-accepted method to describe a culturalenvironment. The
The
The
The
A parameter specifying a
Systems which use a unique language and code set for all manualpages may omit the
Countries for which there is a well-accepted standard charactercode set may omit the
Various examples:
Language | Territory | Character Set | Directory |
---|---|---|---|
English | — | ASCII | /usr/share/man/en |
English | United Kingdom | ISO 8859-15 | /usr/share/man/en_GB |
English | United States | ASCII | /usr/share/man/en_US |
French | Canada | ISO 8859-1 | /usr/share/man/fr_CA |
French | France | ISO 8859-1 | /usr/share/man/fr_FR |
German | Germany | ISO 646 | /usr/share/man/de_DE.646 |
German | Germany | ISO 6937 | /usr/share/man/de_DE.6937 |
German | Germany | ISO 8859-1 | /usr/share/man/de_DE.88591 |
German | Switzerland | ISO 646 | /usr/share/man/de_CH.646 |
Japanese | Japan | JIS | /usr/share/man/ja_JP.jis |
Japanese | Japan | SJIS | /usr/share/man/ja_JP.sjis |
Japanese | Japan | UJIS (or EUC-J) | /usr/share/man/ja_JP.ujis |
Similarly, provision must be made for manual pages which arearchitecture-dependent, such as documentation on device-drivers orlow-level system administration commands. These must be placed underan
Manual pages for commands and data under/usr/local are stored in/usr/local/man. Manual pages for X11R6 arestored in /usr/X11R6/man. It follows that allmanual page hierarchies in the system must have the same structure as/usr/share/man.
The cat page sections (cat)containing formatted manual page entries are also found withinsubdirectories of
The numbered sections "1" through "8" are traditionally defined.In general, the file name for manual pages located within a particularsection end with ..
In addition, some large sets of application-specific manualpages have an additional suffix appended to the manual page filename.For example, the MH mail handling system manual pages must havemh appended to all MH manuals. All X WindowSystem manual pages must have an x appended tothe filename.
The practice of placing various language manual pages inappropriate subdirectories of /usr/share/man alsoapplies to the other manual page hierarchies, such as/usr/local/man and/usr/X11R6/man. (This portion of the standardalso applies later in the section on the optional/var/cache/man structure.)
This directory contains miscellaneous architecture-independentfiles which don't require a separate subdirectory under/usr/share.
The following files, or symbolic links to files, must be in/usr/share/misc, if the corresponding subsystemis installed:
File | Description |
---|---|
ascii | ASCII character set table (optional) |
magic | Default list of magic numbers for the file command (optional) |
termcap | Terminal capability database (optional) |
termcap.db | Terminal capability database (optional) |
Other (application-specific) files may appear here, but a distributormay place them in /usr/lib at their discretion.[34]
/usr/share/sgml containsarchitecture-independent files used by SGML applications, suchas ordinary catalogs (not the centralized ones, see/etc/sgml), DTDs, entities, or stylesheets.
The following directories, or symbolic links to directories,must be in /usr/share/sgml, if the correspondingsubsystem is installed:
Directory | Description |
---|---|
docbook | docbook DTD (optional) |
tei | tei DTD (optional) |
html | html DTD (optional) |
mathml | mathml DTD (optional) |
Other files that are not specific to a given DTD may reside intheir own subdirectory.
/usr/share/xml containsarchitecture-independent files used by XML applications, suchas ordinary catalogs (not the centralized ones, see/etc/sgml), DTDs, entities, or stylesheets.
The following directories, or symbolic links to directories,must be in /usr/share/xml, if the correspondingsubsystem is installed:
Directory | Description |
---|---|
docbook | docbook XML DTD (optional) |
xhtml | XHTML DTD (optional) |
mathml | MathML DTD (optional) |
Source code may be place placed in thissubdirectory, only for reference purposes.[35]
/var contains variable data files. Thisincludes spool directories and files, administrative and logging data,and transient and temporary files.
Some portions of /var are not shareablebetween different systems. For instance,/var/log, /var/lock, and/var/run. Other portions may be shared, notably/var/mail, /var/cache/man,/var/cache/fonts, and/var/spool/news.
/var is specified here in order to make itpossible to mount /usr read-only. Everythingthat once went into /usr that is written toduring system operation (as opposed to installation and softwaremaintenance) must be in /var.
If /var cannot be made a separatepartition, it is often preferable to move /varout of the root partition and into the /usrpartition. (This is sometimes done to reduce the size of the rootpartition or when space runs low in the root partition.) However,/var must not be linked to/usr because this makes separation of/usr and /var more difficultand is likely to create a naming conflict. Instead, link/var to /usr/var.
Applications must generally not add directories to the top levelof /var. Such directories should only be addedif they have some system-wide implication, and in consultation withthe FHS mailing list.
The following directories, or symbolic links to directories, arerequired in /var.
Directory | Description |
---|---|
cache | Application cache data |
lib | Variable state information |
local | Variable data for /usr/local |
lock | Lock files |
log | Log files and directories |
opt | Variable data for /opt |
run | Data relevant to running processes |
spool | Application spool data |
tmp | Temporary files preserved between system reboots |
Several directories are `reserved' in the sense that they mustnot be used arbitrarily by some new application, since they wouldconflict with historical and/or local practice. They are:
/var/backups /var/cron /var/msgs /var/preserve |
The following directories, or symbolic links to directories,must be in /var, if the corresponding subsystemis installed:
Directory | Description |
---|---|
account | Process accounting logs (optional) |
crash | System crash dumps (optional) |
games | Variable game data (optional) |
User mailbox files (optional) | |
yp | Network Information Service (NIS) database files (optional) |
This directory holds the current active process accounting logand the composite process usage data (as used in some UNIX-likesystems by lastcomm andsa).
/var/cache is intended for cached data fromapplications. Such data is locally generated as a result oftime-consuming I/O or calculation. The application must be able toregenerate or restore the data. Unlike/var/spool, the cached files can be deletedwithout data loss. The data must remain valid between invocations ofthe application and rebooting the system.
Files located under /var/cache may beexpired in an application specific manner, by the systemadministrator, or both. The application must always be able torecover from manual deletion of these files (generally because of adisk space shortage). No other requirements are made on the dataformat of the cache directories.
Rationale | |
---|---|
The existence of a separate directory for cached data allowssystem administrators to set different disk and backup policies fromother directories in /var. |
Directory | Description |
---|---|
fonts | Locally-generated fonts (optional) |
man | Locally-formatted manual pages (optional) |
www | WWW proxy or cache data (optional) |
Package specific cache data (optional) |
The directory /var/cache/fonts should be used to store anydynamically-created fonts. In particular, all of the fonts which areautomatically generated by mktexpk must be located inappropriately-named subdirectories of /var/cache/fonts.[36]
Other dynamically created fonts may also be placed in this tree,under appropriately-named subdirectories of/var/cache/fonts.
This directory provides a standard location for sites that provide aread-only /usr partition, but wish to allow caching oflocally-formatted man pages. Sites that mount /usr as writable(e.g., single-user installations) may choose not to use/var/cache/man and may write formatted man pages into thecat directories in /usr/share/man directly. Werecommend that most sites use one of the following options instead:
Preformat all manual pages alongside the unformatted versions.
Allow no caching of formatted man pages, and require formatting to bedone each time a man page is brought up.
Allow local caching of formatted man pages in /var/cache/man.
The structure of /var/cache/man needs toreflect both the fact of multiple man page hierarchies and thepossibility of multiple language support.
Given an unformatted manual page that normally appears in
Man pages written to /var/cache/man mayeventually be transferred to the appropriate preformatted directoriesin the source man hierarchy or expired; likewiseformatted man pages in the source man hierarchymay be expired if they are not accessed for a period of time.
If preformatted manual pages come with a system on read-onlymedia (a CD-ROM, for instance), they must be installed in the sourceman hierarchy(e.g. /usr/share/man/cat)./var/cache/man is reserved as a writable cachefor formatted manual pages.
Rationale | |
---|---|
Release 1.2 of the standard specified/var/catman for this hierarchy. The path hasbeen moved under /var/cache to better reflect thedynamic nature of the formatted man pages. The directory name hasbeen changed to man to allow for enhancing thehierarchy to include post-processed formats other than "cat", such asPostScript, HTML, or DVI. |
This directory holds system crash dumps. As of the date of thisrelease of the standard, system crash dumps were not supported underLinux but may be supported by other systems which may comply with theFHS.
Any variable data relating to games in /usrshould be placed here. /var/games should holdthe variable data previously found in /usr;static data, such as help text, level descriptions, and so on, mustremain elsewhere, such as/usr/share/games.
Rationale | |
---|---|
/var/games has been given a hierarchy ofits own, rather than leaving it merged in with the old/var/lib as in release 1.2. The separationallows local control of backup strategies, permissions, and diskusage, as well as allowing inter-host sharing and reducing clutter in/var/lib. Additionally,/var/games is the path traditionally used by BSD. |
This hierarchy holds state information pertaining to anapplication or the system. State information is data that programsmodify while they run, and that pertains to one specific host. Usersmust never need to modify files in /var/lib toconfigure a package's operation.
State information is generally used to preserve the condition ofan application (or a group of inter-related applications) betweeninvocations and between different instances of the same application.State information should generally remain valid after a reboot, shouldnot be logging output, and should not be spooled data.
An application (or a group of inter-related applications) mustuse a subdirectory of /var/lib for its data.There is one required subdirectory,/var/lib/misc, which is intended for state filesthat don't need a subdirectory; the other subdirectories should onlybe present if the application in question is included in thedistribution.[38]
/var/lib/
The following directories, or symbolic links to directories, arerequired in /var/lib:
Directory | Description |
---|---|
misc | Miscellaneous state data |
The following directories, or symbolic links to directories, must be in /var/lib, if thecorresponding subsystem is installed:
Directory | Description |
---|---|
Editor backup files and state (optional) | |
Packaging support files (optional) | |
State data for packages and subsystems (optional) | |
hwclock | State directory for hwclock (optional) |
xdm | X display manager variable data (optional) |
These directories contain saved files generated by anyunexpected termination of an editor (e.g., elvis,jove, nvi).
Other editors may not require a directory for crash-recoveryfiles, but may require a well-defined place to store other informationwhile the editor is running. This information should be stored in asubdirectory under /var/lib (for example, GNUEmacs would place lock files in/var/lib/emacs/lock).
Future editors may require additional state information beyondcrash-recovery files and lock files — this information shouldalso be placed under/var/lib/
Rationale | |
---|---|
Previous Linux releases, as well as all commercial vendors, use/var/preserve for vi or its clones. However,each editor uses its own format for these crash-recovery files, so aseparate directory is needed for each editor. Editor-specific lock files are usually quite different from thedevice or resource lock files that are stored in/var/lock and, hence, are stored under/var/lib. |
This directory contains the file/var/lib/hwclock/adjtime.
Rationale | |
---|---|
In FHS 2.1, this file was /etc/adjtime, butas hwclock updates it, that was obviouslyincorrect. |
This directory contains variable data not placed in asubdirectory in /var/lib. An attempt should bemade to use relatively unique names in this directory to avoidnamespace conflicts.[39]
Lock files should be stored within the/var/lock directory structure.
Lock files for devices and other resources shared by multipleapplications, such as the serial device lock files that wereoriginally found in either /usr/spool/locks or/usr/spool/uucp, must now be stored in/var/lock. The naming convention which must beused is "LCK.." followed by the base name of the device. For example,to lock /dev/ttyS0 the file "LCK..ttyS0" would be created.[40]
The format used for the contents of such lock files must be theHDB UUCP lock file format. The HDB format is to store the processidentifier (PID) as a ten byte ASCII decimal number, with a trailingnewline. For example, if process 1230 holds a lock file, it wouldcontain the eleven characters: space, space, space, space, space,space, one, two, three, zero, and newline.
This directory contains miscellaneous log files. Most logs mustbe written to this directory or an appropriate subdirectory.
The following files, or symbolic links to files, must be in/var/log, if the corresponding subsystem isinstalled:
File | Description |
---|---|
lastlog | record of last login of each user |
messages | system messages from syslogd |
wtmp | record of all logins and logouts |
The mail spool must be accessible through/var/mail and the mail spool files must take theform
User mailbox files in this location must be stored in the standardUNIX mailbox format.
Rationale | |
---|---|
The logical location for this directory was changed from/var/spool/mail in order to bring FHS in-linewith nearly every UNIX implementation. This change is important forinter-operability since a single /var/mail isoften shared between multiple hosts and multiple UNIX implementations(despite NFS locking issues). It is important to note that there is no requirement tophysically move the mail spool to this location. However, programsand header files must be changed to use/var/mail. |
Variable data of the packages in /opt mustbe installed in /var/opt/
Rationale | |
---|---|
Refer to the rationale for /opt. |
This directory contains system information data describing thesystem since it was booted. Files under this directory must becleared (removed or truncated as appropriate) at the beginning of theboot process. Programs may have a subdirectory of/var/run; this is encouraged for programs thatuse more than one run-time file.[42]Process identifier (PID) files, which were originally placed in/etc, must be placed in/var/run. The naming convention for PID files is
The internal format of PID files remains unchanged. The filemust consist of the process identifier in ASCII-encoded decimal,followed by a newline character. For example, ifcrond was process number 25,/var/run/crond.pid would contain threecharacters: two, five, and newline.
Programs that read PID files should be somewhat flexible in whatthey accept; i.e., they should ignore extra whitespace, leadingzeroes, absence of the trailing newline, or additional lines in thePID file. Programs that create PID files should use the simplespecification located in the above paragraph.
The utmp file, which stores informationabout who is currently using the system, is located in thisdirectory.
System programs that maintain transient UNIX-domain sockets must placethem in this directory.
/var/spool contains data which is awaitingsome kind of later processing. Data in/var/spool represents work to be done in thefuture (by a program, user, or administrator); often data is deletedafter it has been processed.[43]
The following directories, or symbolic links to directories,must be in /var/spool, if the correspondingsubsystem is installed:
Directory | Description |
---|---|
lpd | Printer spool directory (optional) |
mqueue | Outgoing mail queue (optional) |
news | News spool directory (optional) |
rwho | Rwhod files (optional) |
uucp | Spool directory for UUCP (optional) |
The lock file for lpd,lpd.lock, must be placed in/var/spool/lpd. It is suggested that the lockfile for each printer be placed in the spool directory for thatspecific printer and named lock.
Directory | Description |
---|---|
printer | Spools for a specific printer (optional) |
This directory holds the rwhod informationfor other systems on the local net.
Rationale | |
---|---|
Some BSD releases use /var/rwho for thisdata; given its historical location in /var/spoolon other systems and its approximate fit to the definition of`spooled' data, this location was deemed more appropriate. |
The /var/tmp directory is made availablefor programs that require temporary files or directories that arepreserved between system reboots. Therefore, data stored in/var/tmp is more persistent than data in/tmp.
Files and directories located in /var/tmpmust not be deleted when the system is booted. Although data storedin /var/tmp is typically deleted in asite-specific manner, it is recommended that deletions occur at a lessfrequent interval than /tmp.
Variable data for the Network Information Service (NIS),formerly known as the Sun Yellow Pages (YP), must be placed in thisdirectory.
Rationale | |
---|---|
/var/yp is the standard directory for NIS(YP) data and is almost exclusively used in NIS documentation andsystems.[44] |
This section is for additional requirements and recommendationsthat only apply to a specific operating system. The material in thissection should never conflict with the base standard.
This is the annex for the Linux operating system.
On Linux systems, if the kernel is located in/, we recommend using the namesvmlinux or vmlinuz, whichhave been used in recent Linux kernel source packages.
Linux systems which require them place these additional files into/bin:
setserial
The following devices must exist under /dev.
All data written to this device is discarded. A read from this devicewill return an EOF condition.
This device is a source of zeroed out data. All data written to thisdevice is discarded. A read from this device will return as many bytescontaining the value zero as was requested.
This device is a synonym for the controlling terminal of aprocess. Once this device is opened, all reads and writes will behaveas if the actual controlling terminal device had been opened.
Rationale | |
---|---|
Previous versions of the FHS had stricter requirements for/dev. Other devices may also exist in/dev. Device names may exist as symbolic links to other device nodeslocated in /dev or subdirectories of /dev. There is no requirementconcerning major/minor number values. |
Linux systems which require them place these additional files into/etc.
lilo.conf
The 64-bit architectures PPC64, s390x, sparc64 and AMD64 must place64-bit libraries in /lib64, and 32-bit(or 31-bit on s390) libraries in /lib.
The 64-bit architecture IA64 must place 64-bit libraries in/lib.
Rationale | |
---|---|
This is a refinement of the general rules for/lib |
The proc filesystem is the de-factostandard Linux method for handling process and system information,rather than /dev/kmem and other similar methods.We strongly encourage this for the storage and retrieval of processinformation as well as other kernel and memory information.
Linux systems place these additional files into /sbin.
Second extended filesystem commands (optional):
badblocks
dumpe2fs
e2fsck
mke2fs
mklost+found
tune2fs
Boot-loader map installer (optional):
lilo
Optional files for /sbin:
Static binaries:
ldconfig
sln
ssync
Static ln (sln) andstatic sync (ssync) areuseful when things go wrong. The primary use ofsln (to repair incorrect symlinks in/lib after a poorly orchestrated upgrade) is nolonger a major concern now that the ldconfigprogram (usually located in /usr/sbin) exists andcan act as a guiding hand in upgrading the dynamic libraries. Staticsync is useful in some emergency situations.Note that these need not be statically linked versions of the standardln and sync, but maybe.
The ldconfig binary is optional for/sbin since a site may choose to runldconfig at boot time, rather than only whenupgrading the shared libraries. (It's not clear whether or not it isadvantageous to run ldconfig on each boot.) Evenso, some people like ldconfig around for thefollowing (all too common) situation:
I've just removed /lib/
I can't find out the name of the library because ls isdynamically linked, I'm using a shell that doesn't have lsbuilt-in, and I don't know about using "echo *" as areplacement.
I have a static sln, but I don't know what to call the link.
Miscellaneous:
ctrlaltdel
kbdrate
So as to cope with the fact that some keyboards come up withsuch a high repeat rate as to be unusable,kbdrate may be installed in/sbin on some systems.
Since the default action in the kernel for the Ctrl-Alt-Del keycombination is an instant hard reboot, it is generally advisable todisable the behavior before mounting the root filesystem in read-writemode. Some init suites are able to disableCtrl-Alt-Del, but others may require thectrlaltdel program, which may be installed in/sbin on those systems.
These symbolic links are required if a C or C++ compiler isinstalled and only for systems not based on glibc.
/usr/include/asm -> /usr/src/linux/include/asm- |
For systems based on glibc, there are no specific guidelines forthis directory. For systems based on Linux libc revisions prior toglibc, the following guidelines and rationale apply:
The only source code that should be placed in a specificlocation is the Linux kernel source code. It is located in/usr/src/linux.
If a C or C++ compiler is installed, but the complete Linuxkernel source code is not installed, then the include files from thekernel source code must be located in these directories:
/usr/src/linux/include/asm- |
Note | |
---|---|
/usr/src/linuxmay be a symbolic link to a kernel source code tree. |
Rationale | |
---|---|
It is important that the kernel include files be located in/usr/src/linux and not in/usr/include so there are no problems when systemadministrators upgrade their kernel version for the first time. |
This directory contains the variable data for thecron and at programs.
The FHS mailing list is located at
Thanks to Network Operations at the University of California atSan Diego who allowed us to use their excellent mailing listserver.
As noted in the introduction, please do not send mail to the mailinglist without first contacting the FHS editor or a listed contributor.
The process of developing a standard filesystem hierarchy beganin August 1993 with an effort to restructure the file and directorystructure of Linux. The FSSTND, a filesystem hierarchy standardspecific to the Linux operating system, was released on February 14,1994. Subsequent revisions were released on October 9, 1994 and March28, 1995.
In early 1995, the goal of developing a more comprehensiveversion of FSSTND to address not only Linux, but other UNIX-likesystems was adopted with the help of members of the BSD developmentcommunity. As a result, a concerted effort was made to focus onissues that were general to UNIX-like systems. In recognition of thiswidening of scope, the name of the standard was changed to FilesystemHierarchy Standard or FHS for short.
Volunteers who have contributed extensively to this standard arelisted at the end of this document. This standard represents aconsensus view of those and other contributors.
Here are some of the guidelines that have been used in the developmentof this standard:
Solve technical problems while limiting transitional difficulties.
Make the specification reasonably stable.
Gain the approval of distributors, developers, and other decision-makersin relevant development groups and encourage their participation.
Provide a standard that is attractive to the implementors of differentUNIX-like systems.
This document specifies a standard filesystem hierarchy for FHSfilesystems by specifying the location of files and directories, andthe contents of some system files.
This standard has been designed to be used by systemintegrators, package developers, and system administrators in theconstruction and maintenance of FHS compliant filesystems. It isprimarily intended to be a reference and is not a tutorial on how tomanage a conforming filesystem hierarchy.
The FHS grew out of earlier work on FSSTND, a filesystemorganization standard for the Linux operating system. It builds onFSSTND to address interoperability issues not just in the Linuxcommunity but in a wider arena including 4.4BSD-based operatingsystems. It incorporates lessons learned in the BSD world andelsewhere about multi-architecture support and the demands ofheterogeneous networking.
Although this standard is more comprehensive than previousattempts at filesystem hierarchy standardization, periodic updates maybecome necessary as requirements change in relation to emergingtechnology. It is also possible that better solutions to the problemsaddressed here will be discovered so that our solutions will no longerbe the best possible solutions. Supplementary drafts may be releasedin addition to periodic updates to this document. However, a specificgoal is backwards compatibility from one release of this document tothe next.
Comments related to this standard are welcome. Any comments orsuggestions for changes may be directed to the FHS editor (DanielQuinlan
Before sending mail to the mailing list it is requested that youfirst contact the FHS editor in order to avoid excessive re-discussionof old topics.
Questions about how to interpret items in this document mayoccasionally arise. If you have need for a clarification, pleasecontact the FHS editor. Since this standard represents a consensus ofmany participants, it is important to make certain that anyinterpretation also represents their collective opinion. For thisreason it may not be possible to provide an immediate response unlessthe inquiry has been the subject of previous discussion.
The developers of the FHS wish to thank the developers, systemadministrators, and users whose input was essential to this standard.We wish to thank each of the contributors who helped to write,compile, and compose this standard.
The FHS Group also wishes to thank those Linux developers whosupported the FSSTND, the predecessor to this standard. If theyhadn't demonstrated that the FSSTND was beneficial, the FHS couldnever have evolved.
Brandon S. Allbery | |
Keith Bostic | |
Drew Eckhardt | |
Rik Faith | |
Stephen Harris | |
Ian Jackson | |
Andreas Jaeger | |
John A. Martin | |
Ian McCloghrie | |
Chris Metcalf | |
Ian Murdock | |
David C. Niemi | |
Daniel Quinlan | |
Eric S. Raymond | |
Rusty Russell | |
Mike Sangrey | |
David H. Silber | |
Thomas Sippel-Dau | |
Theodore Ts'o | |
Stephen Tweedie | |
Fred N. van Kempen | |
Bernd Warken | |
Christopher Yeoh |
[1] | Command binaries that are not essential enough to place into/bin must be placed in/usr/bin, instead. Items that are required onlyby non-root users (the X Window System, chsh,etc.) are generally not essential enough to be placed into the rootpartition. |
[2] | Programs necessary to arrange for the boot loader to beable to boot a file must be placed in /sbin.Configuration files for boot loaders must be placed in/etc. The GRUB bootloader reads its configurations file beforebooting, so that must be placed in /boot. However, it is aconfiguration file, so should be in /etc. The answer here is asymbolic link such as /etc/grub/menu.lst -> /boot/menu.lst. |
[3] | On some i386 machines, it may be necessary for/boot to be located on a separate partitionlocated completely below cylinder 1024 of the boot device due tohardware constraints. Certain MIPS systems require a /bootpartition that is a mounted MS-DOS filesystem or whatever otherfilesystem type is accessible for the firmware. This may result inrestrictions with respect to usable filenames within/boot (only for affected systems). |
[4] | The setup of command scripts invoked at boot time may resemble SystemV, BSD or other models. Further specification in this area may beadded to a future version of this standard. |
[5] | It is recommended that files be stored in subdirectories of/etc rather than directly in/etc. |
[6] | Systems that use the shadow password suite will have additionalconfiguration files in /etc(/etc/shadow and others) and programs in/usr/sbin (useradd,usermod, and others). |
[7] | On some Linux systems, this may be a symbolic link to/proc/mounts, in which case this exception is notrequired. |
[8] | /etc/X11/xdm holds the configuration files forxdm. These are most of the files previouslyfound in /usr/lib/X11/xdm. Some local variabledata for xdm is stored in/var/lib/xdm. |
[9] | Different people prefer to place user accounts in a variety of places.This section describes only a suggested placement for user homedirectories; nevertheless we recommend that all FHS-compliantdistributions use this as the default location for homedirectories. On small systems, each user's directory is typically one of themany subdirectories of /home such as/home/smith, /home/torvalds,/home/operator, etc. On large systems(especially when the /home directories are sharedamongst many hosts using NFS) it is useful to subdivide user homedirectories. Subdivision may be accomplished by using subdirectoriessuch as /home/staff,/home/guests,/home/students, etc. |
[10] | If you want to find out a user's home directory, you should use thegetpwent(3) library function rather than relyingon /etc/passwd because user information may bestored remotely using systems such as NIS. |
[11] | It is recommended that apart from autosave and lock files programsshould refrain from creating non dot files or directories in a homedirectory without user intervention. |
[12] | Shared libraries that are only necessary for binaries in/usr (such as any X Window binaries) must not bein /lib. Only the shared libraries required torun binaries in /bin and/sbin may be here. In particular, the librarylibm.so.* may also be placed in/usr/lib if it is not required by anything in/bin or /sbin. |
[13] | The usual placement of this binary is /usr/bin/cpp. |
[14] | This is commonly used for 64-bit or 32-bit support onsystems which support multiple binary formats, but require librariesof the same name. In this case, /lib32 and/lib64 might be the library directories, and/lib a symlink to one of them. |
[15] | /lib |
[16] | A compliant implementation with two CDROM drives might have/media/cdrom0 and/media/cdrom1 with/media/cdrom a symlink to either of these. |
[17] | If the home directory of the root account is notstored on the root partition it will be necessary to make certain itwill default to / if it can not belocated. We recommend against using the root account for tasks that can beperformed as an unprivileged user, and that it be used solely for systemadministration. For this reason, we recommend that subdirectories formail and other applications not appear in the root account's homedirectory, and that mail for administration roles such as root,postmaster, and webmaster be forwarded to an appropriate user. |
[18] | Originally, /sbin binaries were kept in/etc. |
[19] | Deciding what things go into"sbin" directories is simple: if a normal (not asystem administrator) user will ever run it directly, then it must beplaced in one of the "bin" directories. Ordinaryusers should not have to place any of the sbindirectories in their path. For example, files such as chfn which usersonly occasionally use must still be placed in/usr/bin. ping, although itis absolutely necessary for root (network recovery and diagnosis) isoften used by users and must live in /bin forthat reason. We recommend that users have read and execute permission foreverything in /sbin except, perhaps, certainsetuid and setgid programs. The division between/bin and /sbin was notcreated for security reasons or to prevent users from seeing theoperating system, but to provide a good partition between binariesthat everyone uses and ones that are primarily used for administrationtasks. There is no inherent security advantage in making/sbin off-limits for users. |
[20] | This is particularly important as these areas will often contain bothfiles initially installed by the distributor, and those added by theadministrator. |
[21] | Examples of such configuration files includeXconfig, XF86Config, orsystem.twmrc) |
[22] | Miscellaneousarchitecture-independent application-specific static files andsubdirectories must be placed in /usr/share. |
[23] | For example, the perl5 subdirectory forPerl 5 modules and libraries. |
[24] | Some executable commands such as makewhatis andsendmail have also been traditionally placed in/usr/lib. makewhatis is aninternal binary and must be placed in a binary directory; users accessonly catman. Newer sendmailbinaries are now placed by default in /usr/sbin.Additionally, systems using a sendmail-compatiblemail transfer agent must provide/usr/sbin/sendmail as a symbolic link to theappropriate executable. |
[25] | Host-specific data for the X Window System must not be stored in/usr/lib/X11. Host-specific configuration filessuch as Xconfig orXF86Config must be stored in/etc/X11. This includes configuration data suchas system.twmrc even if it is only made asymbolic link to a more global configuration file (probably in/usr/X11R6/lib/X11). |
[26] | The case where /usr/lib and /usr/lib |
[27] | Software placed in / or/usr may be overwritten by system upgrades(though we recommend that distributions do not overwrite data in/etc under these circumstances). For thisreason, local software must not be placed outside of/usr/local without good reason. |
[28] | /usr/local/man may be deprecated in future FHSreleases, so if all else is equal, making that one a symlink seemssensible. |
[29] | Locally installed system administration programs should be placed in/usr/local/sbin. |
[30] | Much of this data originally lived in /usr(man, doc) or/usr/lib (dict,terminfo, zoneinfo). |
[31] | Obviously, there are no manual pages in /because they are not required at boot time nor are they required inemergencies. Really. |
[32] | For example, if /usr/local/manhas no manual pages in section 4 (Devices), then/usr/local/man/man4 may be omitted. |
[33] | A major exception to this rule is theUnited Kingdom, which is `GB' in the ISO 3166, but `UK' for most emailaddresses. |
[34] | Some such files include:airport, birthtoken, eqnchar, getopt, gprof.callg, gprof.flat, inter.phone, ipfw.samp.filters, ipfw.samp.scripts, keycap.pcvt, mail.help, mail.tildehelp, man.template,map3270, mdoc.template,more.help, na.phone,nslookup.help, operator,scsi_modes, sendmail.hf,style, units.lib,vgrindefs, vgrindefs.db,zipcodes |
[35] | Generally, source should not be built within this hierarchy. |
[36] | This standard does not currently incorporate the TeX DirectoryStructure (a document that describes the layout TeX files anddirectories), but it may be useful reading. It is located atftp://ctan.tug.org/tex/ |
[37] | For example, /usr/share/man/man1/ls.1 isformatted into /var/cache/man/cat1/ls.1, and/usr/X11R6/man/ |
[38] | An important difference between this version of this standard andprevious ones is that applications are now required to use asubdirectory of /var/lib. |
[39] | This hierarchy should contain files stored in/var/db in current BSD releases. These includelocate.database andmountdtab, and the kernel symbol database(s). |
[40] | Then, anything wishing to use /dev/ttyS0can read the lock file and act accordingly (all locks in/var/lock should be world-readable). |
[41] | Note that /var/mail may be a symbolic link toanother directory. |
[42] | /var/run should be unwritable for unprivilegedusers (root or users running daemons); it is a major security problemif any user can write in this directory. |
[43] | UUCP lock files must be placed in /var/lock. Seethe above section on /var/lock. |
[44] | NIS should not be confused with Sun NIS+, which uses a differentdirectory, /var/nis. |