Filesystem Hierarchy Standard
Contents
Directory structure[edit]
In the FHS, all files and directories appear under the root directory /
, even if they are stored on different physical or virtual devices. Some of these directories only exist on a particular system if certain subsystems, such as the X Window System, are installed.
Most of these directories exist in all Unix-like operating systems and are generally used in much the same way; however, the descriptions here are those used specifically for the FHS, and are not considered authoritative for platforms other than Linux.
Directory | Description |
---|---|
| Primary hierarchy root and root directory of the entire file system hierarchy. |
| Essential command binaries that need to be available in single user mode; for all users, e.g., cat, ls, cp. |
Boot loader files, e.g., kernels, initrd. | |
Device files, e.g., /dev/null , /dev/disk0 , /dev/sda1 , /dev/tty , /dev/random . | |
| Host-specific system-wide configuration files There has been controversy over the meaning of the name itself. In early versions of the UNIX Implementation Document from Bell labs, |
| Configuration files for add-on packages that are stored in /opt . |
| Configuration files, such as catalogs, for software that processes SGML. |
| Configuration files for the X Window System, version 11. |
| Configuration files, such as catalogs, for software that processes XML. |
| Users' home directories, containing saved files, personal settings, etc. |
| Libraries essential for the binaries in /bin and /sbin . |
| Alternative format essential libraries. Such directories are optional, but if they exist, they have some requirements. |
| Mount points for removable media such as CD-ROMs (appeared in FHS-2.3 in 2004). |
| Temporarily mounted filesystems. |
| Optional application software packages. |
Virtual filesystem providing process and kernel information as files. In Linux, corresponds to a procfs mount. Generally automatically generated and populated by the system, on the fly. | |
| Home directory for the root user. |
| Run-time variable data: Information about the running system since last boot, e.g., currently logged-in users and running daemons. Files under this directory must be either removed or truncated at the beginning of the boot process; but this is not necessary on systems that provide this directory as a temporary filesystem (tmpfs). |
| Essential system binaries, e.g., fsck, init, route. |
| Site-specific data served by this system, such as data and scripts for web servers, data offered by FTP servers, and repositories for version control systems (appeared in FHS-2.3 in 2004). |
| Contains information about devices, drivers, and some kernel features. |
| Temporary files (see also /var/tmp ). Often not preserved between system reboots, and may be severely size restricted. |
| Secondary hierarchy for read-only user data; contains the majority of (multi-)user utilities and applications. |
| Non-essential command binaries (not needed in single user mode); for all users. |
| Standard include files. |
| Libraries for the binaries in /usr/bin and /usr/sbin . |
| Alternative format libraries, e.g. /usr/lib32 for 32-bit libraries on a 64-bit machine (optional). |
| Tertiary hierarchy for local data, specific to this host. Typically has further subdirectories, e.g., bin , lib , share . |
| Non-essential system binaries, e.g., daemons for various network-services. |
| Architecture-independent (shared) data. |
| Source code, e.g., the kernel source code with its header files. |
| X Window System, Version 11, Release 6 (up to FHS-2.3, optional). |
| Variable files—files whose content is expected to continually change during normal operation of the system—such as logs, spool files, and temporary e-mail files. |
| Application cache data. Such data are locally generated as a result of time-consuming I/O or calculation. The application must be able to regenerate or restore the data. The cached files can be deleted without loss of data. |
| State information. Persistent data modified by programs as they run, e.g., databases, packaging system metadata, etc. |
| Lock files. Files keeping track of resources currently in use. |
| Log files. Various logs. |
| Mailbox files. In some distributions, these files may be located in the deprecated /var/spool/mail . |
| Variable data from add-on packages that are stored in /opt . |
| Run-time variable data. This directory contains system information data describing the system since it was booted. In FHS 3.0, |
| Spool for tasks waiting to be processed, e.g., print queues and outgoing mail queue. |
| Deprecated location for users' mailboxes. |
| Temporary files to be preserved between reboots. |
FHS compliance[edit]
Most Linux distributions follow the Filesystem Hierarchy Standard and declare it their own policy to maintain FHS compliance. GoboLinux and NixOS provide examples of intentionally non-compliant filesystem implementations.
Some distributions generally follow the standard but deviate from it in some areas. The FHS is a 'trailing standard', and so documents common practices at a point in time. Times of course change, and distribution goals and needs call for experimentation. Some common deviations include:
- Modern Linux distributions include a
/sys
directory as a virtual filesystem (sysfs, comparable to/proc
, which is a procfs), which stores and allows modification of the devices connected to the system, whereas many traditional Unix-like operating systems use/sys
as a symbolic link to the kernel source tree. - Many modern Unix-like systems (like FreeBSD via its ports system) install third party packages into
/usr/local
while keeping code considered part of the operating system in/usr
. - Some Linux distributions no longer differentiate between
/lib
versus/usr/lib
and have/lib
symlinked to/usr/lib
. - Some Linux distributions no longer differentiate between
/bin
versus/usr/bin
and/sbin
versus/usr/sbin
. They may symlink/bin
to/usr/bin
and/sbin
to/usr/sbin
. Other distributions choose to consolidate all four, symlinking them to/usr/bin
.
Modern Linux distributions include a /run
directory as a temporary filesystem (tmpfs) which stores volatile runtime data, following the FHS version 3.0. According to the FHS version 2.3, such data were stored in /var/run
but this was a problem in some cases because this directory is not always available at early boot. As a result, these programs have had to resort to trickery, such as using /dev/.udev
, /dev/.mdadm
, /dev/.systemd
or /dev/.mount
directories, even though the device directory isn't intended for such data. Among other advantages, this makes the system easier to use normally with the root filesystem mounted read-only. For example, below are the changes Debian made in its 2013 Wheezy release:
/dev/.*
→/run/*
/dev/shm
→/run/shm
/dev/shm/*
→/run/*
/etc/*
(writeable files) →/run/*
/lib/init/rw
→/run
/var/lock
→/run/lock
/var/run
→/run
/tmp
→/run/tmp
History[edit]
FHS was created as the FSSTND (short for "Filesystem Standard"), largely based on similar standards for other Unix-like operating systems. Notable examples are these: the hier(7) description of file system layout, which has existed since the release of Version 7 Unix (in 1979); the SunOS filesystem(7) and its successor, the Solaris filesystem(5).
Release history[edit]
Version | Release Date | Notes |
---|---|---|
1.0 | 1994-02-14 | FSSTND |
1.1 | 1994-10-09 | FSSTND |
1.2 | 1995-03-28 | FSSTND |
2.0 | 1997-10-26 | FHS 2.0 is the direct successor for FSSTND 1.2. Name of the standard was changed to Filesystem Hierarchy Standard. |
2.1 | 2000-04-12 | FHS |
2.2 | 2001-05-23 | FHS |
2.3 | 2004-01-29 | FHS |
3.0 | 2015-05-18 | FHS |
Legend: Old version Older version, still supported Latest version |
See also[edit]
- Unix directory structure
- Intel Binary Compatibility Standard (iBCS)
hier(7)
– Linux Programmer's Manual – Overview, Conventions and Miscellanea