Otwierasz terminal, wpisujesz ls / i widzisz dwadzieścia katalogów o zagadkowych trzyliterowych nazwach. /bin, /etc, /usr, /var – żaden nie przypomina znajomego C:\Program Files ani „Pulpitu”. Jeśli przesiadasz się z Windowsa na Linuksa, ten widok budzi uzasadnione pytanie: kto to wymyślił i po co?

Odpowiedź sięga roku 1971 i laboratorium Bell Labs, gdzie Ken Thompson i Dennis Ritchie budowali Uniksa na dyskach o pojemności 2,5 MB. Filesystem Hierarchy Standard (FHS) porządkuje ten układ od ponad 30 lat, a decyzje projektowe z tamtej epoki żyją w każdej współczesnej dystrybucji.

TL;DR: Linux organizuje pliki według standardu FHS 3.0 wydanego w 2015 roku. Katalog root (/) zawiera ok. 20 podkatalogów – od /bin (programy) przez /etc (konfiguracja) po /home (dane użytkownika). Nazwy pochodzą z wczesnego Uniksa z lat 70. Nowoczesne dystrybucje łączą /bin z /usr/bin w ramach procesu zwanego usr merge.

Czym jest FHS i kto decyduje o układzie katalogów?

Filesystem Hierarchy Standard (FHS) to specyfikacja określająca, gdzie w systemie Linux i Unix powinny znajdować się pliki i katalogi. Aktualną wersję – FHS 3.0 – opublikowała Linux Foundation w czerwcu 2015 roku. Standard definiuje układ ok. 20 katalogów root i zapewnia spójność między dystrybucjami.

Prace nad standaryzacją rozpoczęły się w sierpniu 1993 roku na liście mailingowej Linux Mail-Net. Pierwszą wersję – FSSTND 1.0 – koordynował Daniel Quinlan i wydano ją 14 lutego 1994 roku. Początkowo standard dotyczył wyłącznie Linuksa, ale od 1995 roku objął też inne systemy uniksowe (dołączyła społeczność BSD) i zmienił nazwę na FHS.

Dzięki FHS programiści wiedzą, gdzie instalować pliki, administratorzy wiedzą, gdzie ich szukać, a menedżery pakietów (apt, dnf, pacman) rozmieszczają pliki automatycznie według tego standardu. W naszej praktyce, gdy migrowaliśmy klientowi pakiet wewnętrzny z CentOS-a 7 na Debiana 12, brak ścisłego trzymania się FHS w starym pakiecie zajął nam dwa dni dłużej niż reszta migracji – cała sprawa rozbiła się o pliki konfiguracyjne wepchnięte do /usr/local/etc zamiast /etc.

Dokumentację hierarchii możesz otworzyć bezpośrednio w terminalu:

man hier

Jak wygląda drzewo katalogów root?

Katalog root (/) to korzeń całego systemu plików w Linuksie – odpowiednik „Tego komputera” w Windowsie, tyle że bez liter dysków. Wszystkie partycje, pendrive’y i pliki konfiguracyjne są zamontowane gdzieś pod /. FHS 3.0 wymaga obecności 14 katalogów w root i dopuszcza kilka opcjonalnych.

Aby zobaczyć pierwszą warstwę struktury, wpisz w terminalu:

tree -L 1 /

albo po prostu:

ls /

Poniższa tabela przedstawia wszystkie główne katalogi root zdefiniowane w FHS 3.0.

KatalogPochodzenie nazwyCo zawieraPrzykład zawartości
/binbinariesPodstawowe programy użytkownikals, cp, bash, cat
/sbinsystem binariesProgramy administracyjne (root)fsck, reboot, iptables
/etcet ceteraKonfiguracja systemu (pliki tekstowe)fstab, hosts, passwd
/homehomeKatalogi domowe użytkowników/home/anna/Dokumenty
/rootrootKatalog domowy superużytkownika.bashrc, .ssh/
/varvariableDane zmienne – logi, cache, kolejki/var/log/syslog
/tmptemporaryPliki tymczasowe (czyszczone przy restarcie)pliki sesji, buildy
/usruser → Unix System ResourcesProgramy i dane systemowe (read-only)/usr/bin/python3
/optoptionalOprogramowanie firm trzecich/opt/google/chrome
/bootbootJądro systemu i bootloadervmlinuz, initramfs, GRUB
/liblibraryBiblioteki współdzielone i moduły jądralibc.so, /lib/modules/
/lib64library 64-bitBiblioteki 64-bitoweld-linux-x86-64.so
/devdevicesPliki urządzeń (dyski, terminale)sda, null, tty, random
/procprocessWirtualny FS – procesy i jądrocpuinfo, meminfo, uptime
/syssystemWirtualny FS – urządzenia i sterownikiinformacje o sprzęcie
/mntmountPunkt montowania (ręczny)ręcznie zamontowany dysk
/mediamediaNośniki wymienne (automontowanie)pendrive, CD-ROM, karta SD
/runruntimeDane uruchomieniowe na tmpfsPID-y, sockety systemd
/srvserviceDane usług sieciowych/srv/www, /srv/ftp

Gdzie system trzyma programy? /bin, /sbin i /usr

Programy w Linuksie mieszkają w trzech głównych katalogach: /bin przechowuje podstawowe komendy jak ls czy cp, /sbin gromadzi narzędzia administracyjne wymagające uprawnień roota, a /usr/bin zawiera większość oprogramowania zainstalowanego przez menedżer pakietów. Ten historyczny podział nowoczesne dystrybucje zacierają poprzez usr merge.

Katalog /bin zawiera programy niezbędne do startu systemu i pracy w trybie awaryjnym: ls, cp, mv, cat, mount, bash. Początkujący korzysta z niego przy każdym wpisaniu podstawowej komendy. Katalog /sbin gromadzi narzędzia takie jak fsck (naprawa systemu plików), iptables (firewall) czy reboot – odwiedzisz go, gdy będziesz administrować systemem z uprawnieniami roota.

Największym katalogiem jest /usr – FHS definiuje go jako „drugą główną gałąź systemu plików”. Podkatalogi /usr odzwierciedlają strukturę roota:

  • /usr/bin – programy użytkownika (python3, gcc, vim, firefox)
  • /usr/sbin – dodatkowe programy administracyjne
  • /usr/lib – biblioteki współdzielone aplikacji
  • /usr/share – dane niezależne od architektury (strony man, ikony, szablony)
  • /usr/local – oprogramowanie instalowane ręcznie, poza menedżerem pakietów

Osobny katalog /opt to przestrzeń dla oprogramowania firm trzecich. Google Chrome instaluje się np. jako /opt/google/chrome, a komercyjne IDE od JetBrains trafiają do /opt/jetbrains. W jednym z naszych projektów wdrożeniowych aplikacja CRM klienta lądowała w /opt/firma-crm – oddzielenie od /usr uprościło późniejsze backupy i upgrade’y.

Skąd nazwa /etc i co tam znajdziesz?

Katalog /etc (od łacińskiego „et cetera” – „i inne rzeczy”) przechowuje systemowe pliki konfiguracyjne w formacie tekstowym. We wczesnym Uniksie /etc pełnił rolę szuflady na wszystko, co nie pasowało do /bin ani /dev – z czasem wyspecjalizował się jako centrum konfiguracji systemu.

Kernighan i Pike w książce The UNIX Programming Environment (1984) opisali /etc jako katalog zawierający „różne pliki administracyjne, takie jak plik haseł i niektóre programy systemowe”. Według FHS 3.0 katalog /etc nie powinien już zawierać plików wykonywalnych – wyłącznie konfigurację. Kluczowe pliki, z którymi zetkniesz się jako początkujący:

  • /etc/fstab – tabela partycji montowanych automatycznie przy starcie systemu
  • /etc/hosts – lokalne mapowanie nazw domenowych na adresy IP
  • /etc/hostname – nazwa komputera w sieci
  • /etc/passwd – lista kont użytkowników (wbrew nazwie, hasła są w /etc/shadow)
  • /etc/apt/sources.list – repozytoria pakietów (Debian/Ubuntu)
  • /etc/ssh/sshd_config – konfiguracja serwera SSH

Sprawdź informacje o swojej dystrybucji jedną komendą:

cat /etc/os-release

Popularne backronimy – „Editable Text Configuration” czy „Extended Tool Chest” – to późniejsze reinterpretacje, nie oryginalne znaczenie nazwy /etc.

Co przechowują /var, /tmp i /run?

Katalog /var (od ang. „variable”) gromadzi dane zmieniające się podczas normalnej pracy systemu: logi, cache, kolejki drukowania i bazy danych pakietów. Gdy katalog /usr jest zamontowany jako read-only, /var pozostaje głównym miejscem na zapisy. To pierwszy katalog do sprawdzenia, gdy brakuje miejsca na dysku.

Kluczowe podkatalogi /var, które odwiedzisz jako początkujący:

  • /var/log – logi systemowe (syslog, auth.log, kern.log) – zajrzysz tu przy debugowaniu problemów
  • /var/cache – cache menedżera pakietów i aplikacji
  • /var/lib – dane stanu programów (/var/lib/apt, /var/lib/docker, /var/lib/mysql)
  • /var/tmp – pliki tymczasowe przetrwujące restart systemu
  • /var/www – pliki serwera WWW (na dystrybucjach z Apache/Nginx)

Gdy dysk się zapełnia, sprawdź rozmiar /var komendą:

du -sh /var

W praktyce serwerowej zdecydowana większość alertów o pełnym dysku, które obsłużyliśmy, sprowadzała się do dwóch katalogów: /var/log (rozjechany journald bez rotacji) lub /var/lib/docker (nieużywane obrazy i wolumeny). Komenda journalctl --vacuum-size=500M rozwiązywała pierwszy problem w sekundę.

Katalog /tmp przechowuje pliki tymczasowe dostępne dla wszystkich użytkowników. Wiele dystrybucji montuje /tmp jako tmpfs (system plików w pamięci RAM), czyszczony przy każdym restarcie.

Katalog /run pojawił się w FHS 3.0. Przechowuje ulotne dane uruchomieniowe (pliki PID, sockety) na tmpfs. Wcześniej dane te trafiały do /var/run, ale katalog /var bywa niedostępny we wczesnej fazie startu systemu – /run rozwiązuje ten problem.

Gdzie mieszkasz w Linuksie? /home i /root

Katalog /home zawiera katalogi domowe zwykłych użytkowników – tu trafiają dokumenty, projekty, pliki konfiguracyjne aplikacji i osobiste ustawienia. Każdy użytkownik otrzymuje własny podkatalog (np. /home/anna). Umieszczenie /home na osobnej partycji pozwala przeinstalować system bez utraty danych.

Konfiguracja aplikacji trafia do ukrytych plików i katalogów, tzw. dotfiles: .bashrc (ustawienia powłoki), .ssh/ (klucze SSH), .config/ (konfiguracja programów według specyfikacji XDG). Początkujący spędza w /home większość czasu – to odpowiednik folderu C:\Users\Anna w Windowsie.

Katalog /root to katalog domowy superużytkownika. Znajduje się bezpośrednio pod /root (nie w /home/root), aby był dostępny nawet gdy partycja /home nie jest jeszcze zamontowana. Odwiedzisz go rzadko – wyłącznie pracując jako administrator systemu.

Sprawdź rozkład partycji i wykorzystanie dysków komendą:

df -h

Dlaczego sprzęt ma swoje pliki? /dev, /proc i /sys

W filozofii Linuksa wszystko jest plikiem – dyski twarde, klawiatura, a nawet informacje o procesorze. Katalogi /dev, /proc i /sys realizują tę fundamentalną zasadę uniksową, prezentując sprzęt i parametry jądra jako pliki w drzewie katalogów. Dzięki temu wystarczy komenda cat, by odczytać parametry CPU.

Katalog /dev (devices) zawiera pliki urządzeń zarządzane przez podsystem udev. Zajrzysz tu, gdy będziesz partycjonować dysk lub formatować pendrive:

  • /dev/sda – pierwszy dysk SATA (partycje: /dev/sda1, /dev/sda2…)
  • /dev/null – „czarna dziura” pochłaniająca wszelkie dane (przydatna w skryptach)
  • /dev/random – generator liczb losowych oparty o entropię systemową

Katalog /proc to wirtualny system plików (procfs) – nie zajmuje miejsca na dysku. Jądro Linuksa generuje jego zawartość dynamicznie. Każdy uruchomiony proces ma tu swój katalog (/proc/<PID>/), a pliki systemowe udostępniają informacje o sprzęcie:

cat /proc/cpuinfo

Katalog /sys (sysfs) pojawił się w jądrze Linux 2.6 i udostępnia uporządkowane informacje o urządzeniach i sterownikach. Pełni podobną rolę do /proc, ale ma czytelniejszą, hierarchiczną strukturę.

Jak Linux montuje dyski? /mnt, /media i /boot

Katalog /mnt to tradycyjny punkt montowania dla ręcznie podłączanych systemów plików, a /media – nowsze miejsce, gdzie system automatycznie montuje nośniki wymienne: pendrive’y, płyty CD i karty SD. Podział wynika z ewolucji sprzętu – /media pojawił się dopiero w FHS 2.3 w 2004 roku, gdy hot-plug USB stał się normą.

W erze, gdy podłączanie dysków „na gorąco” nie istniało, wystarczał /mnt. Ręczne montowanie wygląda tak:

sudo mount /dev/sdb1 /mnt

Środowisko graficzne (GNOME, KDE) montuje pendrive automatycznie np. jako /media/anna/DYSK_USB – bez potrzeby wpisywania komend.

Katalog /boot przechowuje pliki niezbędne do uruchomienia systemu: jądro Linuksa (vmlinuz), obraz initramfs i konfigurację bootloadera GRUB. Na maszynach z UEFI katalog /boot często obejmuje partycję EFI System Partition. Usunięcie zawartości /boot uniemożliwi start systemu – odwiedzisz ten katalog przy aktualizacji jądra lub konfiguracji GRUB-a.

Dlaczego /bin i /usr/bin istnieją osobno? Historia z 1971 roku

Podział na /bin i /usr/bin to nie przemyślany projekt architektoniczny – to wynik braku miejsca na dysku w Bell Labs około 1971 roku. Ken Thompson i Dennis Ritchie rozwijali Uniksa na maszynie PDP-11 wyposażonej w dwa dyski RK05 o pojemności zaledwie 2,5 MB każdy. Gdy system urósł, programy „wyciekły” na drugi dysk.

Pierwszy dysk RK05 zawierał system operacyjny z katalogami /bin, /sbin i /lib. Drugi dysk – zamontowany jako /usr – przechowywał katalogi domowe użytkowników: /usr/ken (Thompson) i /usr/dmr (Ritchie). Nazwa /usr oznaczała po prostu „user”.

Gdy system przestał mieścić się na pierwszym dysku, twórcy przenieśli część programów na drugi dysk, tworząc /usr/bin, /usr/sbin i /usr/lib. Zasada podziału była prosta: na pierwszym dysku zostawić tylko to, co potrzebne do zamontowania drugiego – bo program mount musiał działać, zanim /usr stał się dostępny.

Rob Landley, deweloper BusyBox, podsumował to zjawisko na liście mailingowej wprost: podział /bin vs /usr/bin to artefakt implementacyjny z lat 70., powielany przez dekady bez głębszego uzasadnienia.

Gdy pojawił się trzeci dysk, zamontowano go jako /home i przeniesiono katalogi domowe. Nazwa /usr straciła pierwotne znaczenie – dziś bywa interpretowana jako Unix System Resources, co jest wygodnym, choć niehistorycznym backronimem.

Co to jest usr merge i jak zmienia Linuksa?

Usr merge to proces łączenia katalogów /bin, /sbin i /lib z odpowiednikami w /usr za pomocą dowiązań symbolicznych – faktyczne odwrócenie historycznego podziału z lat 70. Po scaleniu /bin staje się symlinkiem do /usr/bin, a wszystkie pliki binarne fizycznie rezydują w jednym miejscu.

Sprawdź, czy Twoja dystrybucja ma usr merge:

ls -la /bin

Jeśli wynik zawiera lrwxrwxrwx ... /bin -> usr/bin, system korzysta ze scalonego układu.

Fedora wprowadziła usr merge jako pierwsza duża dystrybucja w 2012 roku (Fedora 17). Arch Linux dołączył w 2013, Red Hat Enterprise Linux 7 w 2014, a Debian – po wieloletniej dyskusji społeczności – w wydaniu Bookworm w 2023 roku. Dziś praktycznie wszystkie popularne dystrybucje stosują usr merge.

Korzyści scalenia obejmują uproszczenie pakietowania, lepszą kompatybilność skryptów między dystrybucjami, możliwość montowania /usr jako read-only oraz łatwiejsze tworzenie kontenerów i snapshotów. Lennart Poettering opisał pełną argumentację w dokumencie „The Case for the /usr Merge” na stronie freedesktop.org.

Podsumowanie

Struktura katalogów Linux to nie chaos – to dojrzały, ustandaryzowany układ z ponad 50-letnią historią. Standard FHS 3.0 precyzyjnie definiuje, gdzie trafiają programy (/usr/bin), konfiguracja (/etc), dane zmienne (/var) i pliki użytkowników (/home). Nazwy jak /etc czy /usr to żywe echa wczesnego Uniksa z Bell Labs, a proces usr merge powoli prostuje historyczne naleciałości z epoki dysków RK05.

Kluczowe wnioski:

  • FHS 3.0 to obowiązujący standard układu katalogów we wszystkich dużych dystrybucjach.
  • Większość programów żyje dziś w /usr/bin, a /bin w nowych systemach to symlink.
  • Trzy katalogi – /etc, /var, /home – pokrywają 90% codziennej pracy administratora.
  • /proc i /sys to wirtualne FS – nie zajmują miejsca, ale zawierają realny stan systemu.

Najlepsza metoda nauki to eksploracja. Otwórz terminal i zacznij od dwóch komend:

tree -L 1 /
man hier

FAQ

Jaka jest różnica między /bin a /usr/bin?

Historycznie /bin zawierał programy niezbędne do startu systemu, a /usr/bin – pozostałe aplikacje. W dystrybucjach z usr merge (Fedora, Debian 12+, Ubuntu, Arch) oba katalogi wskazują na ten sam katalog fizyczny – /usr/bin. Podział ma dziś znaczenie wyłącznie historyczne.

Czym różni się struktura katalogów Linux od Windows?

Linux nie używa liter dysków (C:, D:). Cały system plików zaczyna się od jednego katalogu root (/). Dyski i partycje są montowane jako podkatalogi – np. pendrive jako /media/anna/USB. Programy nie trafiają do jednego folderu „Program Files”, lecz rozkładają się między /usr/bin (binaria), /etc (konfiguracja) i /usr/share (dane).

Gdzie instalować własne programy i czy mogę usunąć /tmp?

Programy kompilowane ze źródeł trafiają domyślnie do /usr/local, oprogramowanie komercyjne (IDE, przeglądarki) do /opt, a pakiety z repozytorium menedżer pakietów sam umieszcza w /usr/bin. Pliki w /tmp możesz bezpiecznie usuwać – wiele dystrybucji robi to automatycznie przy restarcie. Nie kasuj jednak /tmp w trakcie pracy aplikacji, które mogą tam trzymać aktywne pliki sesji.

Jaka jest różnica między /tmp a /var/tmp?

Pliki w /tmp mogą zostać usunięte przy każdym restarcie systemu, a w wielu dystrybucjach /tmp jest tmpfs w RAM-ie. Pliki w /var/tmp przetrwują restart i są czyszczone rzadziej – zazwyczaj dopiero po 30 dniach nieaktywności. Stąd /var/tmp nadaje się na dłuższe buildy, a /tmp na ulotne dane sesji.

Dlaczego /home warto trzymać na osobnej partycji?

Osobna partycja /home pozwala przeinstalować system operacyjny lub zmienić dystrybucję bez utraty danych użytkowników – dokumentów, kluczy SSH, ustawień aplikacji i konfiguracji powłoki. W naszej praktyce ten układ zaoszczędził klientom kilka godzin migracji przy przejściu Ubuntu 22.04 → Fedora 40.