# Filesystem Hierarchy Standard

De Filesystem Hierarchy Standard (FHS) definieert een open standaard voor de directory-structuur voor UNIX-achtige besturingssystemen. De standaardisatie van de directory-structuur is onder meer belangrijk voor software-ontwikkeling en pakketbeheer op platforms met een Unix-achtig bestandssysteem. Daarom is de directory-structuur die door BSD en Linux gebruikt wordt terug te vinden in de Filesystem Hierarchy Standard.
Voor het systeembeheer op een Unixachtig-platform, zoals een pc met een Linux-desktop, is inzicht in de basisprincipes en de opbouw van de FHS vereist. De FHS maakt deel uit van de Linux Standard Base en wordt ontwikkeld op basis van de IEEE 1003.n POSIX-norm. De FHS wordt onderhouden door The Linux Foundation.

## Inleiding

Hoe de 'schijfinhoud', de inhoud van een computer-systeem te zien is voor de gebruiker, is voor "MS-DOS-systemen" en "Unixachtige systemen" zeer verschillend. Op een Windows computer ziet men stationsletters (drive letters), C:\, D:\ enzovoorts met daarachter padnamen (path names) zoals C:\WINDOWS\SYSTEM32\ eindigend op de naam van een bestand, bijvoorbeeld NOTEPAD.EXE. Als een schijfeenheid zoals een harde schijf of USB-stick wordt toegevoegd, verschijnt een nieuwe stationsletter.
Op een 'Linux-achtig' systeem is een vaststaand systeem te zien. De top van de 'boom', de tophiërarchie is altijd een schuine streep (/) zonder toevoeging, ongeacht hoeveel schijven binnen de 'boom' vallen. De vaststaande directory's zijn /bin, /dev, /home, /lib enzovoorts, op alle POSIX-systemen is deze structuur terug te vinden. Deze structuur dient praktische doelen, elke directory heeft een functie. De vastgelegde afspraken over deze voorstelling van directory's en bestanden is waar FHS over gaat.

## Geschiedenis

De Filesystem Hierarchy Standard is ontwikkeld op initiatief van de Filesystem Hierarchy Standard Group. Voordat de eerste versies van de Filesystem Hierarchy Standard opgesteld werden, bestonden al een aantal conventies over de indeling van Unix-bestandssystemen. Voor de komst van package managers werd de installatie en het beheer van software op Unix-platforms vaak handmatig en op ad-hocbasis uitgevoerd.
* Op 14 februari 1994 werd FSSTND v1.0 gepubliceerd, waarna in ruim een jaar de 1.1 en 1.2 versies volgden.
* Op 26 oktober 1997 werd de FHS v2.0 gepubliceerd.
* Op 4 december 2000, werd FHS v2.1 gepubliceerd, ruim een half jaar later gevolgd door de 2.2-versie.
* Op 29 januari 2004, werd de FHS v2.3 gepubliceerd.
* Op 3 juni 2015 werd de FHS v3.0 gepubliceerd.

## Eigenschappen van bestanden

De bestanden in het bestandssysteem worden afhankelijk van hun functie en eigenschappen binnen een overzichtelijk systeem ingedeeld. In de tabellen worden een paar eigenschappen van de directory's en bestanden met een kleurcode aangegeven.

### Statisch vs. variabel

| Kleurcode | Eigenschappen |
| Statisch | De inhoud van een statische map of directory wordt meestal tijdens de installatie van het systeem in de directory geplaatst. Doorgaans kan de inhoud van een statische directory alleen door de systeembeheerder, de gebruiker met de naam 'root' veranderd worden tijdens het installeren, updaten of upgraden van software. |
| Variabel | Een variabele map of directory is bedoeld voor de opslag van tijdelijke en variabele gegevens en bestanden. De directory's voor variabele bestanden hebben meestal de naam var of tmp. Om een systeem te optimaliseren worden voor variabele directory's soms aparte, snel toegankelijke partities op een harde schijf aangemaakt. Tijdens het formatteren kunnen de cilinders op een harde schijf die het snelst toegankelijk zijn voor deze variabele directory's gereserveerd worden. |

### Essentieel vs. optioneel

| Kleurcode | Eigenschappen |
| Essentieel | In deze statische directory's bevinden zich essentiële onderdelen van het systeem die onder andere nodig zijn tijdens het opstarten en het werken in single user mode. |
| Optioneel | Optionele directory's hoeven niet aanwezig te zijn in een bestandssysteem dat aan de FHS-standaard voldoet. Deze mappen zijn binnen de FHS gedefinieerd om hun locaties binnen het bestandssysteem te reserveren en hun namen vast te leggen. De inhoud van een optionele directory kan zowel statisch als variabel zijn. |

### Bestanden delen

In de Filesystem Hierarchy Standard staan alle bestanden en directory's (mappen) onder de root directory "/". Dat is zelfs het geval als de bestanden zich op een andere fysieke locatie bevinden (een andere computer), bijvoorbeeld bij een netwerkbestandssysteem. Bestanden kunnen via netwerken met andere hosts gedeeld worden als ze aan een aantal voorwaarden voldoen. Architectuur-onafhankelijke bestanden zijn meestal deelbaar tussen verschillende hosts terwijl configuratiebestanden over het algemeen niet deelbaar zijn. In onderstaande tabel worden een paar voorbeelden gegeven.
| | Deelbaar | Niet deelbaar |
| Statisch | /usr/share/man /opt | /boot /etc |
| Variabel | /var/mail /var/spool/news | /var/run /var/lock |
Er is geen algemene regel waarmee in alle gevallen een onderscheid gemaakt kan worden tussen deelbare en niet-deelbare bestanden. Soms kan architectuur-afhankelijkheid een beperking zijn. Daardoor kan een bestand deelbaar zijn met een host met dezelfde architectuur terwijl dat bestand niet-deelbaar is met een host met een andere architectuur.

### Secundaire en tertiaire hiërarchieën

Behalve de primaire hiërarchie aan de basis van het bestandssysteem komen in de FHS secundaire en tertiaire hiërarchieën voor. De secundaire en tertiaire hiërarchieën zijn meestal afspiegelingen van de primaire hiërarchie. De secundaire en tertiaire hiërarchieën bevatten bestandssystemen met een speciale functie in relatie tot de bestanden in de primaire hiërarchie. Secundaire en tertiaire hiërarchieën zijn onder andere te vinden in /opt, /usr, /usr/local, /var en /var/opt.

## Bestandssysteem

De onderstaande omschrijvingen gelden voor de FHS-2.3-specificatie die door The Linux Foundation gepubliceerd is. De omschrijvingen in onderstaande tabellen hoeven niet juist te zijn voor andere versies of voor afwijkende implementaties van de FHS.
De slash, /, geeft de rootdirectory van het bestandssysteem op de host aan.
| Directory | Beschrijving, eigenschappen en eisen |
| / | Dit is de root directory voor het hele bestandssysteem. Door gebruikers mogen geen directory's of bestanden in de root-directory aangemaakt worden. |
| /bin | Essentiële command-line binary's die door alle gebruikers en in single user mode gebruikt kunnen worden, zoals mount, cat, ls en cp. Er mogen geen subdirectory's in /bin voorkomen. De (harde of symbolische link naar de) Bourne-shell sh moet in de /bin-directory staan. |
| /boot | Bestanden voor de bootloader en het opstarten van het systeem, zoals gegevensbestanden voor GRUB of LILO en init. De kernels moeten in / of in /boot staan. |
| /dev | Device files voor gegevensoverdracht via randapparatuur, zoals toetsenborden (tty), harde schijven (hda of sda) en de lege "vacuüm" en null-devices /dev/null en /dev/zero. In /dev moet (een link naar) een programma MAKEDEV staan waarmee device files aangemaakt kunnen worden. |
| /etc | Host-specifieke configuratiebestanden voor het hele systeem. Onder de /etc-hiërarchie mogen geen binary's voorkomen. Over het algemeen worden in /etc veel kleine configuratiebestanden opgeslagen. |
| /etc/opt | Bevat directory's met configuratiebestanden voor de applicaties in /opt. |
| /etc/sgml | Configuratiebestanden voor SGML. |
| /etc/X11 | Configuratiebestanden voor het X Window System, versie 11. In deze directory moet een Xconfig-, een XF86Config- of een Xmodmap-file staan. In subdirectory's kunnen configuratiebestanden voor onder meer xinit, xdm en windowmanagers staan. |
| /etc/xml | Configuratiebestanden voor XML. |
| /home | Directory met daarin de home directory's van de gebruikers, waarin bestanden en persoonlijke configuratiebestanden opgeslagen worden. |
| /lib | Library's met objectcode voor kernel-modules en drivers en de binary's in /bin/ en /sbin/. Essentiële objectcode om het systeem te kunnen opstarten en programma's te laden en uit te voeren. De (links naar de) libc.so-library's en de linker/loader ld.so moeten in deze directory staan. De (link naar de) C-preprocessor moet de naam /lib/cpp hebben. |
| /lib<qual> | Library's met objectcode voor een specifieke computerarchitectuur zoals lib32 of lib64 voor 32- en 64-bits processoren. |
| /media | Mount points voor verwisselbare gegevensdragers zoals cd-roms, USB-sticks, etc. |
| /mnt | Tijdelijk mount point voor een bestandssysteem. |
| /opt | Directory's voor optionele add-ons en andere software-packages. De subdirectory's in /opt moeten de naam van een softwarepakket (package) of een leverancier (provider) dragen, zoals /opt/<package> en /opt/<provider>. De provider moet een LANANA (Linux Assigned Names and Numbers Authority) registratie hebben. De directory's met de namen /opt/bin, /opt/doc, /opt/include, /opt/info, /opt/lib en /opt/man zijn gereserveerd voor systeembeheer. Voor de specifieke bestanden voor add-ons kunnen subdirectory's als /opt/<package>/bin en /opt/<package>/man aangemaakt worden. Configuratiebestanden en variabele bestanden moeten in hiërarchieën als /etc/opt/<package> of /var/opt/<package> ondergebracht worden. |
| /proc | Een virtueel of pseudo-filesysteem dat dient als interface voor de uitwisseling van gegevens tussen de kernel en applicaties. Via /proc kunnen applicaties datastructuren met de kernel uitwisselen die onder meer informatie bevatten over de toestand van processen en het gebruik van het geheugen. |
| /root | Home directory van de root user. |
| /sbin | Essentiële systeembinary's voor root-only-systeembeheer, configuratie, booting en initialisatie, zoals init, ip en fdisk. In /sbin moet (een link naar) shutdown staan. |
| /srv | Site-specifieke gegevens die door services op het systeem, zoals ftp en cvs, geleverd worden. |
| /tmp | Tijdelijke bestanden (zie ook /var/tmp). Deze gegevens blijven vaak niet bestaan tussen reboots. /tmp is vaak beperkt in grootte wanneer het door het systeemgeheugen wordt geleverd. |
| /usr | Root van de secundaire hiërarchie voor programma's en read-only gegevens van gebruikers. Bevat de meeste (multi-)user utilities en applicaties. |
| /var | Root van de secundaire /var hiërarchie met bestanden voor de opslag van gegevens die frequent veranderen tijdens een sessie, zoals log- en spool-files en tijdelijke e-mail-files. |

### /usr

De /usr-directory is de op een na grootste directory in het bestandssysteem. De afkorting staat voor ""unix system resources"" en heeft niets te maken met ""user"". Het is een gedeelde directory voor alle gebruikers op het systeem en het bevat alleen read-only-gegevens. Dat houdt in dat de /usr-directory gedeeld kan worden met verschillende hosts met een FHS-compliant bestandssysteem. Host-specifieke gegevens of veranderlijke gegevens dienen elders opgeslagen te worden.
| Directory | Beschrijving, eigenschappen en eisen |
| /usr | Root van de secundaire /usr-hiërarchie. Om compatibiliteit met oudere configuraties te verwezenlijken bevat /usr vaak de volgende symbolische links: /usr/spool -> /var/spool /usr/tmp -> /var/tmp /usr/spool/locks -> /var/lock |
| /usr/bin | Binaries en commando's die door alle gebruikers gedeeld worden, zoals de python-, perl- en tcl-interpreters. |
| /usr/games | Spelletjes en educatieve software. |
| /usr/include | Standaard header files voor algemene toepassingen. |
| /usr/lib | Libraries met objectcode voor programmeren, gebruikerssoftware en binaries in /usr/bin/ en /usr/sbin/. |
| /usr/lib<qual> | Libraries met objectcode voor een specifieke computerarchitectuur zoals lib32 of lib64 voor 32- en 64-bits processoren. |
| /usr/local | De tertiaire /usr/local hiërarchie voor lokale gegevens, specifiek voor deze host. De bestanden in de /usr/local-directory zijn bedoeld voor gebruik op de lokale host zodat /usr/local niet op een netwerk gemount dient te worden. |
| /usr/sbin | Niet-essentiële systeem binaries, zoals daemons voor verschillende network-services. |
| /usr/share | De tertiaire /usr/share hiërarchie met architectuur-onafhankelijke deelbare bestanden, zoals documentatiebestanden. |
| /usr/src | Source code, zoals de kernel source code met header files. |
| /usr/X11R6 | X Window System, Version 11, Release 6. Als /usr/X11R6 bestaat dan moeten de volgende links aangemaakt worden: /usr/bin/X11 -> /usr/X11R6/bin /usr/lib/X11 -> /usr/X11R6/lib/X11 /usr/include/X11 -> /usr/X11R6/include/X11 |

#### /usr/local

Tertiaire hiërarchie voor lokale, niet-deelbare gegevens en bestanden, specifiek voor deze host.
| Directory | Beschrijving, eigenschappen en eisen |
| /usr/local | De /usr/local/-directory is bedoeld voor gebruik op de lokale host zodat ze niet op een netwerk gemount dient te worden. |
| /usr/local/bin | Lokale binaries |
| /usr/local/etc | Host-specifieke systeem-configuratiebestanden voor lokale binaries. Mag als link: /usr/local/etc -> /etc/local |
| /usr/local/games | Lokale binaries van spelletjes en educatieve software |
| /usr/local/include | Lokale headers |
| /usr/local/lib | Binaire bibliotheek. |
| /usr/local/lib<qual> | Moet geïmplementeerd worden als /lib<qual> of /usr/lib<qual> bestaat. |
| /usr/local/man | Lokale manual pages |
| /usr/local/sbin | Lokale systeem binaries |
| /usr/local/share | Lokaal gedeelde bestanden |
| /usr/local/src | Broncode |

#### /usr/share

De tertiaire hiërarchie voor deelbare gegevens en bestanden die toegankelijk zijn voor verschillende hosts op een netwerk.
| Directory | Beschrijving, eigenschappen en eisen |
| /usr/share | Architectuur-onafhankelijke gedeelde gegevensbestanden zoals documentatie. |
| /usr/share/dict | Woordenlijsten. |
| /usr/share/doc | Documentatie. |
| /usr/share/games | Statische gegevens voor spelletjes. |
| /usr/share/info | GNU Info systeem-directory's. |
| /usr/share/locale | Locale (lokale) informatie. |
| /usr/share/man | Manual man-pagina's. |
| /usr/share/misc | Diversen. |
| /usr/share/nls | Catalogi voor ondersteuning in de taal van de gebruiker. |
| /usr/share/sgml | Gedeelde SGML-bestanden. |
| /usr/share/terminfo | Directory's voor de terminfo database. |
| /usr/share/tmac | troff-macros die niet bij groff geleverd worden. |
| /usr/share/xml | Gedeelde XML-bestanden. |
| /usr/share/zoneinfo | Tijdzone-informatie. |

### /var

/var bevat variabele gegevensbestanden. Dit omvat onder meer spool directory's en logbestanden en tijdelijke bestanden.
* Sommige delen van /var zijn niet-deelbaar tussen verschillende hosts, zoals /var/log, /var/lock en /var/run.
* Andere bestanden kunnen wel worden gedeeld, met name de bestanden in /var/mail, /var/cache/man, /var/cache/fonts en /var/spool/news.
| Directory | Beschrijving, eigenschappen en eisen |
| /var | Root van de secundaire /var-hiërarchie. Gebruikersapplicaties mogen geen bestanden in de root van de /var-directory aanmaken. |
| /var/account | De huidige actieve logs met process-gegevens. |
| /var/cache | Ruimte voor opslag van cache gegevens in software. De gegevens worden lokaal gegenereerd tijdens tijdrovende I/O-operaties of berekeningen. |
| /var/crash | Ruimte voor opslag van crash-dumpgegevens. |
| /var/games | Ruimte voor opslag van tijdelijke gegeven van spelletjes. |
| /var/lib | Hiërarchie met persistente informatie over de toestand van het systeem zoals: gegevens die tijdens het uitvoering van programma's veranderen; databases, packaging system-gegevens, etc. |
| /var/lock | Lock files. Bestanden die bijhouden welke middelen en files in gebruik zijn. |
| /var/log | Verschillende log-files. |
| /var/mail | Mailbox van gebruikers. |
| /var/opt | Variabele gegevens van de pakketten in /opt moeten worden opgeslagen in /var/opt/<subdir>, waar <subdir> de naam van de subdirectory in /opt is waar de statische gegevens van een add-on softwarepakket wordt opgeslagen |
| /var/run | Informatie over het systeem sinds de laatste boot, zoals gegevens over momenteel aangemelde gebruikers en actieve daemons. |
| /var/spool | Spool-taken die op verwerking wachten, zoals een print-queue en ongelezen mail. |
| /var/tmp | Tijdelijke bestanden die bewaard moeten blijven tussen opeenvolgende reboots. |
| /var/yp | Network Information Service (NIS) database. |