Unix filesystem: Difference between revisions

Content deleted Content added
added /var/tmp because there's often irritation about it
Thunder491 (talk | contribs)
m Move {{Redirect}} to relevant section
 
(216 intermediate revisions by more than 100 users not shown)
Line 1:
{{Short description|Directory structure used by a Unix-like operating system}}
In [[Unix]] and [[Unix-like]] [[operating system]]s, the '''Unix directory structure''' is a convention for [[filesystem]] layout.
{{Redirect|Unix file system|UFS, a specific file system used by many Unix and Unix-like operating systems|Unix File System}}
[[File:Version 7 UNIX SIMH PDP11 Filesystem Layout.png|thumb|[[Version 7 Unix]] filesystem layout: subdirectories of "/" and "/usr"]]
[[File:Standard-unix-filesystem-hierarchy.svg|thumb|An overview of a [[Unix]] filesystem layout]]
 
In [[Unix]] and [[operating system]]s inspired by it, the [[file system]] is considered a central component of the operating system.<ref name="Ritchie">{{cite journal |last1= Ritchie |first1= D.M. |author-link1= Dennis Ritchie |last2= Thompson |first2= K. |author-link2= Ken Thompson |title= The UNIX Time-Sharing System |journal= Bell System Tech. J. |volume= 57 |issue= 6 |pages= 1905–1929 |date= July 1978 |doi=10.1002/j.1538-7305.1978.tb02136.x|citeseerx= 10.1.1.112.595 }}</ref> It was also one of the first parts of the system to be designed and implemented by [[Ken Thompson]] in the first experimental version of Unix, [[History of Unix|dated 1969]].<ref name="evolution"/>
Several attempts exist to standardize the Unix filesystem layout, such as the "[[Filesystem Hierarchy Standard]],"<ref name="Filesystem Hierarchy Standard">{{cite web |url=http://www.pathname.com/fhs/ |title=Filesystem Hierarchy Standard |accessdate=2007-07-25}}</ref> however, targeted primarily at [[Linux]]. Also, as part of the "[[Linux Standards Base]]", a common filesystem layout is defined, to encourage interoperability among different Linux distributions.<ref name="Linux Standards Base">{{cite web |url=http://www.linux-foundation.org/en/LSB |title=Linux Standards Base |accessdate=2007-07-25}}</ref>
 
As in other operating systems, the filesystem provides information storage and retrieval, and one of several forms of [[interprocess communication]], in that the many small programs that traditionally form a Unix system can store information in files so that other programs can read them, although [[Pipeline (Unix)|pipes]] complemented it in this role starting with the [[Research Unix|Third Edition]]. Also, the filesystem provides access to other resources through so-called ''[[device file]]s'' that are entry points to [[computer terminal|terminals]], [[computer printer|printers]], and [[computer mouse|mice]].
What follows is a generalized overview of common locations of files in a Unix operating system:
 
The rest of this article uses ''Unix'' as a [[Generic trademark|generic name]] to refer to both the original Unix operating system and its many [[Unix-like|workalikes]].
* '''<tt>/</tt>''' — the slash <tt>/</tt> character alone denotes the root of the virtual filesystem tree.
 
==Principles==
:* '''<tt>/bin</tt>''' — stands for "[[computer program|binaries]]" and contains certain fundamental utilities, such as <tt>ls</tt> or <tt>cp</tt>, needed by all users.
The filesystem appears as one [[rooted tree]] of directories.<ref name="Ritchie"/> Instead of addressing separate volumes such as [[Disk partitioning|disk partitions]], removable media, and [[network share]]s as separate trees (as done in [[DOS]] and [[Microsoft Windows|Windows]]: each ''drive'' has a drive letter that denotes the root of its file system tree), such volumes can be ''[[mount (Unix)|mounted]]'' on a directory, causing the volume's file system tree to appear as that directory in the larger tree.<ref name="Ritchie"/> The root of the entire tree is denoted <code>/</code>.
 
In the original [[Research Unix|Bell Labs Unix]], a two-disk setup was customary, where the first disk contained startup programs, while the second contained users' files and programs. This second disk was mounted at the empty directory named <code>usr</code> on the first disk, causing the two disks to appear as one filesystem, with the second disk’s contents viewable at <code>/usr</code>.
:* '''<tt>/sbin</tt>''' — stands for "[[computer program|system (or "superuser") binaries]]" and contains fundamental utilities, such as <tt>init</tt>, usually needed to start, maintain and recover the system.
 
Unix directories do not ''contain'' files. Instead, they contain the names of files paired with references to so-called [[inode]]s, which in turn contain both the file and its [[metadata]] (owner, permissions, time of last access, etc., but no name). Multiple names in the file system may refer to the same file, a feature termed a ''[[hard link]]''.<ref name="Ritchie"/> The mathematical traits of hard links make the file system a limited type of [[directed acyclic graph]], although the ''directories'' still form a tree, as they typically may not be hard-linked.<!--Mac OS X allows this, according to the article 'Hard link'.--> (As originally envisioned in 1969, the Unix file system would in fact be used as a general graph with hard links to directories providing navigation, instead of path names.<ref name="evolution">{{cite conference |first=Dennis M. |last=Ritchie |year=1979 |title=The Evolution of the Unix Time-sharing System |conference=Language Design and Programming Methodology Conf. |url=http://cm.bell-labs.com/cm/cs/who/dmr/hist.html |access-date=2014-04-20 |archive-date=2015-04-08 |archive-url=https://web.archive.org/web/20150408054606/http://cm.bell-labs.com/cm/cs/who/dmr/hist.html |url-status=dead }}</ref>)
:* '''<tt>/etc</tt>''' — contains configuration files and system databases.
 
===File types===
:* '''<tt>/dev</tt>''' — stands for "devices". Contains file representations of peripheral devices.
{{Main |Unix file types}}
 
The original Unix file system supported three types of files: ordinary files, [[Directory (computing)|directories]], and "special files", also termed device files.<ref name="Ritchie"/> The [[Berkeley Software Distribution]] (BSD) and [[UNIX System V|System V]] each added a file type to be used for [[interprocess communication]]: BSD added [[Berkeley sockets|sockets]],<ref name="43bsd">{{cite book |last1= Leffler |first1= Samuel J. |author-link1= Samuel J Leffler |last2= McKusick |first2= Marshall Kirk |author-link2= Marshall Kirk McKusick |last3= Karels |first3= Michael J. |author-link3= Michael J. Karels |last4= Quarterman |first4= John S. |author-link4= John Quarterman |title= The Design and Implementation of the 4.3BSD UNIX Operating System |date= October 1989 |publisher= [[Addison-Wesley]] |isbn= 978-0-201-06196-3 |url-access= registration |url= https://archive.org/details/designimplementa0000unse }}</ref> while System V added [[Named pipe#In Unix|FIFO files]].
::*'''<tt>[[dev-null|/dev/null]]</tt>''' — also known as the "bit bucket" or "black hole", this [[pseudo device]] discards all contents written to it, and is typically used to pipe away unwanted data.
 
BSD also added [[symbolic link]]s (often termed "symlinks") to the range of file types, which are files that refer to other files, and complement hard links.<ref name="43bsd"/> Symlinks were modeled after a similar feature in [[Multics]],<ref name="FFS">{{cite web|last1=McKusick|display-authors=etal|first1=Marshall Kirk|title=A Fast Filesystem for Unix|url=https://docs.freebsd.org/44doc/smm/05.fastfs/paper.pdf|website=Freebsd.org|publisher=CSRG, UC Berkeley|access-date=16 November 2016}}</ref> and differ from hard links in that they may span filesystems and that their existence is independent of the target object. Other Unix systems may support additional types of files.<ref>{{man|2|stat|Linux}}</ref>
::* '''<tt>[[/dev/random]]</tt>''' — this pseudo device returns [[pseudorandom numbers]] (subject to the limitations of [[random number generator]]s in [[computing]]) when read from. It uses system noise to generate random numbers and blocks if not enough entropy in the noise is available. Random is commonly used by programs that absolutely need cryptographically-strong random data such as [[SSH]] to generate an [[encryption]] key.
 
==Conventional directory layout==
::* '''<tt>/dev/urandom</tt>''' — similar to <tt>/dev/random</tt>, except it always returns random numbers, even if there is not enough entropy in the system noise available.
{{Redirect|Usr||USR (disambiguation)}}
Certain conventions exist for locating some kinds of files, such as programs, system configuration files, and users' [[home directory|home directories]]. These were first documented in the <code>hier(7)</code> [[man page]] since [[Version 7 Unix]];<ref name="v7">{{man|7|hier|v7}}</ref> subsequent versions, derivatives and clones typically have a similar man page.<ref>{{man|7|hier|FreeBSD}}</ref><ref name="openbsd">{{man|7|hier|OpenBSD}}</ref><ref>{{cite web|title=hier(7) man page for 2.9.1 BSD|url=http://www.freebsd.org/cgi/man.cgi?query=hier&manpath=2.9.1+BSD}}</ref><ref>{{cite web|title=hier(7) man page for ULTRIX 4.2|url=http://www.freebsd.org/cgi/man.cgi?query=hier&manpath=ULTRIX+4.2}}</ref><ref>{{cite web|title=hier(7) man page for SunOS 4.1.3|url=http://www.freebsd.org/cgi/man.cgi?query=hier&manpath=SunOS+4.1.3}}</ref><ref>{{man|7|hier|Linux}}</ref>
 
The details of the directory layout have varied over time. Although the file system layout is not part of the [[Single UNIX Specification]], several attempts exist to standardize (parts of) it, such as the [[UNIX System V|System V]] [[Application Binary Interface]], the [[Intel Binary Compatibility Standard]], the Common Operating System Environment, and [[Linux Foundation]]'s [[Filesystem Hierarchy Standard]] (FHS).<ref>{{cite web |title=Where to Install My Products on Linux? |url=http://www.linuxjournal.com/article/4121 |website=[[Linux Journal]] |date=1 November 2000 |author=George Kraft IV |access-date=13 November 2014}}</ref>
:* '''<tt>/home</tt>''' — contains the home directories for the users.
 
Here is a generalized overview of common locations of files on a Unix operating system:
:* '''<tt>/mnt</tt>''' — contains filesystem mount points.
{|class="wikitable"
!Directory or file
!Description
|-
|<code>/</code>
|The slash <code>/</code> character alone denotes the root of the filesystem tree.
|-
|
<code>/bin</code>
|Stands for ''[[computer program|binaries]]'' and contains certain fundamental utilities, such as <code>ls</code> or <code>cp</code>, that are needed to mount <code>/usr</code>, when that is a separate filesystem, or to run in one-user (administrative) mode when <code>/usr</code> cannot be mounted. In System V.4, this is a symlink to <code>/usr/bin</code>. Otherwise, it needs to be on the root filesystem itself.
|-
|
<code>[[/boot]]</code>
|Contains all the files needed for successful booting process. In [[Research Unix]], this was one file rather than a directory.<ref name="upe"/> Nowadays usually on the root filesystem itself, unless the system, bootloader etc. require otherwise.
|-
|
<code>[[/dev]]</code>
|Stands for ''devices''. Contains [[device node|file representations]] of peripheral devices and [[Device file#Pseudo-devices|pseudo-devices]]. See also: [[Linux Assigned Names and Numbers Authority]]. Needs to be on the root filesystem itself.
|-
|
<code>/etc</code>
|Contains system-wide configuration files and system databases; the name stands for ''[[et cetera]]''<ref name="upe">{{cite book |first1=Brian W. |last1=Kernighan |author-link1=Brian Kernighan |first2=Rob |last2=Pike |author-link2=Rob Pike |title=The UNIX Programming Environment |publisher=Prentice-Hall |year=1984 |pages=[https://archive.org/details/unixprogramminge0000kern/page/63 63–65]|title-link=The UNIX Programming Environment |bibcode=1984upe..book.....K }}</ref> but now a better expansion is '''e'''ditable-'''t'''ext-'''c'''onfigurations. Originally also contained "dangerous maintenance utilities" such as <code>init</code>,<ref name="v7"/> but these have typically been moved to <code>/sbin</code> or elsewhere. Needs to be on the root filesystem itself.
|-
|
<code>/home</code>
|Contains user home directories on Linux and some other systems. In the original version of Unix, home directories were in <code>/usr</code> instead.<ref name="notes72">{{cite web|last=Ritchie|first=Dennis|title=Unix Notes from 1972|url=https://www.bell-labs.com/usr/dmr/www/notes.html|access-date=14 January 2018}}</ref> Some systems use or have used different locations still: [[macOS]] has home directories in <code>/Users</code>, older versions of BSD put them in <code>/u</code>, [[FreeBSD]] has <code>/usr/home</code>.
|-
|
<code>/lib</code>
|Originally ''essential libraries'': [[C (programming language)|C]] libraries, but not [[Fortran]] ones.<ref name="upe"/> On modern systems, it contains the shared libraries needed by programs in <code>/bin</code>, and possibly [[loadable kernel module]], [[device driver]]s or [[binary blob]]s. Linux distributions may have variants <code>/lib32</code> and <code>/lib64</code> for multi-architecture support.
|-
|
<code>/media</code>
|Default mount point for removable devices, such as USB sticks, media players, etc. By common sense, the directory itself, whose subdirectories are mountpoints, is on the root partition itself.
|-
|
<code>/mnt</code>
|Stands for ''mount''. Empty directory commonly used by system administrators as a temporary mount point. By common sense, the directory itself, whose subdirectories are mountpoints, is on the root partition itself.
|-
|
<code>/opt</code>
|Contains locally installed software. Originated in [[UNIX System V|System V]], which has a [[package manager]] that installs software to this directory (one subdirectory per package).<ref>''[http://www.sco.com/developers/devspecs/gabi41.pdf System V Application Binary Interface]'' Edition 4.1 (1997-03-18)</ref>
|-
|
<code>/proc</code>
|[[procfs]] virtual [[File system|filesystem]] showing information about [[process (computing)|processes]] as files.
|-
|
<code>/root</code>
|The home directory for the [[superuser]] ''root'' - that is, the system administrator. This account's home directory is usually on the initial filesystem, and hence not in /home (which may be a mount point for another filesystem) in case specific maintenance needs to be performed, during which other filesystems are not available. Such a case could occur, for example, if a hard disk drive suffers failures and cannot be properly mounted.
|-
|
<code>/sbin</code>
|Stands for "[[computer program|system (or superuser) binaries]]" and contains fundamental utilities, such as <code>init</code>, usually needed to start, maintain and recover the system. Needs to be on the root partition itself.
|-
|
<code>/srv</code>
|Server data (data for services provided by system).
|-
|
<code>/sys</code>
|In some [[Linux distribution]]s, contains a [[sysfs]] virtual [[File system|filesystem]], containing information related to hardware and the operating system. On BSD systems, commonly a symlink to the kernel sources in <code>/usr/src/sys</code>.
|-
|
<code>/tmp</code>
|A place for temporary files not expected to survive a reboot. Many systems clear this directory upon startup or use [[tmpfs]] to implement it.
|-
|
<code>/unix</code>
|The Unix [[kernel (operating system)|kernel]] in Research Unix and [[UNIX System V|System V]].<ref name="upe"/> With the addition of [[virtual memory]] support to [[Berkeley Software Distribution#3BSD|3BSD]], this got renamed <code>/vmunix</code>.
|-
|
<code>/usr</code>
|The "user file system": originally the directory holding user home directories,<ref name="notes72"/> but already by the Third Edition of [[Research Unix]], ca. 1973, reused to split the operating system's programs over two disks (one of them a 256K fixed-head drive) so that basic commands would either appear in <code>/bin</code> or <code>/usr/bin</code>.<ref name="reader">{{cite web |author-link=Doug McIlroy |author=M. D. McIlroy |date=1987 |url=http://www.cs.dartmouth.edu/~doug/reader.pdf |title=A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 |id=CSTR 139 |publisher=Bell Labs}}</ref> It now holds executables, libraries, and shared resources that are not system critical, such as the [[X Window System]], [[window manager]]s, [[scripting language]]s, etc. In older Unix systems, user home directories might still appear in <code>/usr</code> alongside directories containing programs, although by 1984 this depended on local customs.<ref name="upe"/>
|-
|
<code>/usr/include</code>
|Stores the development headers used throughout the system. [[Header file]]s are mostly used by the <code>#include</code> directive in [[C (programming language)|C]] language, which historically is how the name of this directory was chosen.
|-
|
<code>/usr/lib</code>
|Stores the needed libraries and data files for programs stored within <code>/usr</code> or elsewhere.
|-
|
<code>/usr/libexec</code>
|Holds programs meant to be executed by other programs rather than by users directly. E.g., the [[Sendmail]] executable may be found in this directory.<ref>{{cite web |url=http://docs.cray.com/books/S-2341-22/html-S-2341-22/z1028736068smg.html |website=[[UNICOS]]/mp Networking Facilities Administration |publisher=[[Cray]] |title=Chapter 7. sendmail |access-date=14 September 2013 |archive-date=9 November 2017 |archive-url=https://web.archive.org/web/20171109075438/http://docs.cray.com/books/S-2341-22/html-S-2341-22/z1028736068smg.html |url-status=dead }}</ref> Not present in the FHS until 2011;<ref>{{cite web |url=http://bzr.linuxfoundation.org/loggerhead/lsb/devel/fhs-spec/revision/44 |title=fhs-spec revision 44 |access-date=2016-07-14 |archive-date=2017-03-05 |archive-url=https://web.archive.org/web/20170305015621/http://bzr.linuxfoundation.org/loggerhead/lsb/devel/fhs-spec/revision/44 |url-status=dead }}</ref> Linux distributions have traditionally moved the contents of this directory into <code>/usr/lib</code>, where they also resided in 4.3BSD.
|-
|
<code>/usr/local</code>
|Resembles <code>/usr</code> in structure, but its subdirectories are used for additions not part of the operating system distribution, such as custom programs or files from a [[BSD]] [[Ports collection]]. Usually has subdirectories such as <code>/usr/local/lib</code> or <code>/usr/local/bin</code>.
|-
|
<code>/usr/share</code>
|Architecture-independent program data. On Linux and modern BSD derivatives, this directory has subdirectories such as <code>man</code> for [[manpage]]s, that used to appear directly under <code>/usr</code> in older versions.
|-
|
<code>/var</code>
|Stands for ''variable''. A place for files that might change frequently - especially in size, for example e-mail sent to users on the system, or process-ID [[lock file]]s.
|-
|
<code>/var/log</code>
|Contains system log files.
|-
|
<code>/var/mail</code>
|The place where all incoming mail is stored. Users (other than <code>root</code>) can access their own mail only. Often, this directory is a [[symbolic link]] to <code>/var/spool/mail</code>.
|-
|
<code>/var/spool</code>
|[[spooling|Spool]] directory. Contains print jobs, mail spools and other queued tasks.
|-
|
<code>/var/src</code>
|The place where the uncompiled source code of some programs is.
|-
|
<code>/var/tmp</code>
|The <code>/var/tmp</code> directory is a place for temporary files which should be preserved between system reboots.
|}
 
==See also==
:* '''<tt>/lib</tt>''' — contains system libraries.
*[[Btrfs]]
 
*[[ext2]]
:* '''<tt>/root</tt>''' — the home directory for the [[superuser]] root.
*[[ext3]]
 
*[[ext4]]
:* '''<tt>/tmp</tt>''' — a place for temporary files. Many Unices clear this directory upon start up.
*[[Filesystem Hierarchy Standard]]
 
*[[HAMMER (file system)|HAMMER]]
:* '''<tt>/usr</tt>''' — originally the directory holding user home directories, its use has changed, and it now holds executables, libraries, and shared resources that are not system critical, like the [[X Window System]], [[KDE]], [[Perl]], etc. (The name "Unix System Resources" is a ''post hoc'' [[backronym]].) However, on some [[Unix]] systems, some user accounts may still have a home directory that is a direct subdirectory of /usr, such as the default ast in [[Minix]].
*[[JFS (file system)]]
 
*[[Unix File System]]
::* '''<tt>/usr/bin</tt>''' — this directory stores all binary programs distributed with the operating system not residing in <tt>/bin</tt>, <tt>/sbin</tt> or (rarely) <tt>/etc</tt>.
*[[Veritas File System]]
 
*[[ZFS]]
::* '''<tt>/usr/include</tt>''' — <tt>/usr/include</tt> stores the development headers used throughout the system.
 
::* '''<tt>/usr/lib</tt>''' — the required libraries for executables within <tt>/usr</tt> or elsewhere for that matter, live here.
 
::* '''<tt>/usr/local</tt>''' — resembles <tt>/usr</tt>, except that its subdirectories are used for additions not part of the operating system distribution, such as custom programs or files from a [[BSD]] [[Ports collection]]. Usually has subdirectories such as <tt>/usr/local/lib or <tt>/usr/local/bin.
 
:* '''<tt>/var</tt>''' — a short for "variable." A place for files that may change often.
 
::* '''<tt>/var/log</tt>''' — contains system log files.
 
::* '''<tt>/var/mail</tt>''' — the place where all the incoming mails are stored. The user can access his/her own mail only unless he/she has admin rights.
 
::* '''<tt>/var/spool</tt>''' — [[spool]] directory; contains print jobs, mail spools and other queued tasks.
 
::* '''<tt>/var/tmp</tt>''' — A place for temporary files preserved between system reboots.
 
==References==
*{{Citizendium}}
{{reflistReflist|30em}}
 
{{Unix}}
 
{{DEFAULTSORT:Unix Directory Structure}}
[[Category:Unix]]
[[Category:Unix file system technology]]
[[Category:File system management]]