Struktura katalogów w Linuxie. Kompletny przewodnik dla początkujących
Kiedy pierwszy raz uruchamiasz terminal w Linuxie i widzisz coś takiego jak /usr/local/bin albo /var/log/syslog, w głowie pojawia się jedno pytanie. Skąd to wszystko się wzięło i dlaczego akurat tak.
W systemie Windows mamy dyski C: , D:, folder Program Files i wszystko wydaje się intuicyjne. W Linuxie struktura wygląda zupełnie inaczej. Nie ma liter dysków, wszystko zaczyna się od jednego znaku ukośnika, a foldery mają dziwne, trzyliterowe nazwy.
Ten artykuł rozkłada cały ten system na czynniki pierwsze. Dowiesz się, co dokładnie znajduje się w każdym z głównych katalogów, dlaczego Linux jest podzielony akurat w taki sposób, skąd wzięły się te nazwy i jak to wszystko układa się w logiczną całość. Po przeczytaniu przestaniesz bać się terminala i zaczniesz rozumieć, co dzieje się pod maską twojego systemu.
Zacznijmy od początku. Czym w ogóle jest system plików w Linuxie
W systemie Windows jesteśmy przyzwyczajeni do myślenia o danych w kategoriach dysków. Mamy dysk systemowy C:, dysk z danymi D: , może jeszcze pendrive pod literą E: . Każdy dysk to osobny świat, z własnym drzewem folderów.
Linux działa zupełnie inaczej. W Linuxie istnieje tylko jedno drzewo katalogów, które zaczyna się od korzenia oznaczonego pojedynczym znakiem ukośnika. Ten korzeń nazywa się katalogiem głównym (po angielsku root directory, co bywa mylące, bo root to także nazwa administratora systemu). Wszystko inne, absolutnie wszystko, co istnieje w systemie plików, znajduje się gdzieś wewnątrz tego jednego drzewa.
Co ciekawe, nawet podłączone dyski zewnętrzne, pendrive'y, partycje sieciowe czy obrazy ISO nie dostają własnej litery. Zamiast tego są montowane w konkretnym punkcie istniejącego drzewa. Na przykład po włożeniu pendrive'a do portu USB, jego zawartość może pojawić się w katalogu
/media/twoj_uzytkownik/NAZWA_PENDRIVE
Mogę Ci jakoś pomóc?
Z perspektywy systemu wygląda to tak, jakby cała zawartość pendrive'a była po prostu kolejnym folderem w drzewie.
Ta filozofia wywodzi się z systemu Unix, którego pierwsza wersja powstała pod koniec lat sześćdziesiątych w laboratoriach Bell Labs. Twórcy Uniksa uznali, że wszystko powinno być plikiem. Dokumenty to pliki, urządzenia to pliki, katalogi to też rodzaj plików, a nawet procesy działające w systemie mają swoje reprezentacje w postaci plików.
Ta idea, zwana zasadą "everything is a file", do dziś stanowi fundament tego, jak działa Linux.
Skąd właściwie wzięła się obecna struktura katalogów
Struktura katalogów w Linuxie nie powstała z dnia na dzień. To efekt kilkudziesięciu lat ewolucji, kompromisów i decyzji podejmowanych przez różne społeczności programistów. W 1994 roku, gdy Linux zaczął zyskiwać popularność, okazało się, że każda dystrybucja trzyma pliki w trochę innych miejscach.
Programiści aplikacji, które miały działać na różnych dystrybucjach, mieli przez to koszmar.
Żeby rozwiązać ten problem, powstał standard FHS (Filesystem Hierarchy Standard). To dokument, który dokładnie opisuje, co powinno znajdować się w poszczególnych katalogach głównego drzewa.
Dzisiaj praktycznie wszystkie poważne dystrybucje Linuxa, takie jak Debian, Ubuntu, Fedora, RHEL, Arch czy openSUSE, trzymają się tego standardu. Dzięki temu jeśli zainstalujesz serwer WWW na Ubuntu, a potem przesiądziesz się na Fedorę, konfiguracja i tak będzie leżeć w /etc, logi w /var/log, a binaria serwera w /usr/sbin. Różnice są minimalne.
Mogę Ci jakoś pomóc?
Niektóre nazwy katalogów wydają się dzisiaj trochę dziwne i archaiczne, ale mają swoje historyczne uzasadnienie. Nazwy takie jak bin , sbin, usr, etc, var czy tmp pochodzą z lat siedemdziesiątych i były dyktowane dwiema rzeczami.
Ograniczoną ilością miejsca na dyskach oraz krótkimi nazwami, które łatwo się pisało na klawiaturze bez autouzupełniania. To dziedzictwo zostało z nami do dzisiaj, mimo że dyski mają już terabajty pojemności, a powłoki potrafią autouzupełniać wszystko, czego dotkniesz.
Katalog główny, czyli gdzie wszystko się zaczyna
Kiedy w terminalu wpiszesz polecenie cd / a następnie ls , zobaczysz zawartość katalogu głównego. Na typowej instalacji Ubuntu lub Debiana pojawi się tam kilkanaście folderów.
To są właśnie te najważniejsze katalogi pierwszego poziomu, wokół których zbudowany jest cały system. Każdy z nich ma swoje ściśle określone zadanie. Przyjrzyjmy się im po kolei.
/bin, czyli podstawowe polecenia dla wszystkich użytkowników
Nazwa tego katalogu to skrót od "binaries", czyli plików binarnych, a po polsku programów wykonywalnych. Znajdziesz tu podstawowe polecenia, których używa każdy użytkownik systemu niemal codziennie. Są to między innymi
Mogę Ci jakoś pomóc?
ls
do wyświetlania zawartości katalogów,
cp
do kopiowania plików,
mv do przenoszenia,
rm do usuwania,
cat
do wyświetlania zawartości plików,
echo
do wypisywania tekstu,
bash
czyli sama powłoka systemowa, a także dziesiątki innych narzędzi.
To, co ważne, to fakt że katalog
/bin
zawiera wyłącznie programy absolutnie niezbędne do pracy z systemem. Również takie, które muszą być dostępne nawet wtedy, gdy system działa w trybie awaryjnym albo gdy z jakiegoś powodu nie udało się zamontować innych partycji. Właśnie dlatego dawniej /bin zawsze znajdował się na tej samej partycji co katalog główny.
Co ciekawe, na wielu nowoczesnych dystrybucjach, takich jak Fedora czy nowszy Ubuntu, katalog /bin jest już tylko linkiem symbolicznym prowadzącym do
/usr/bin
Nazywa się to "usrmerge" i stanowi kontrowersyjny krok w historii Linuxa. Część społeczności uważa to za uproszczenie i modernizację, inni widzą w tym zdradę klasycznej filozofii Uniksa. W praktyce dla użytkownika nic się nie zmienia.
/sbin, czyli polecenia dla administratora
Litera "s" w nazwie
/sbin
to skrót od "system" albo "superuser" (źródła różnią się w interpretacji). Ten katalog zawiera programy przeznaczone głównie dla administratora systemu, czyli użytkownika root. Znajdziesz tam narzędzia takie jak
fdisk
do zarządzania partycjami,
mkfs do tworzenia systemów plików,
ifconfig lub
ip do konfiguracji sieci,
reboot
do restartowania systemu,
shutdown
do jego wyłączania oraz
fsck
do sprawdzania spójności systemów plików.
Zwykły użytkownik też może uruchamiać te programy, ale wiele z nich wymaga uprawnień administratora, żeby faktycznie coś zrobić. Dzielenie programów na
/bin i
/sbin
to właśnie przykład myślenia, które wyróżnia Linuxa. System jasno rozdziela to, czego potrzebuje zwykły użytkownik, od tego, co jest w gestii administratora. Dzięki temu mniej doświadczeni użytkownicy nie mają nawet standardowej ścieżki do narzędzi, którymi mogliby sobie zrobić krzywdę.
/usr, czyli druga hierarchia wszystkich aplikacji
Katalog
/usr
to jeden z największych i najważniejszych katalogów w całym systemie. Nazwa pierwotnie oznaczała "user" i w pierwszych wersjach Uniksa faktycznie trzymano tam dane użytkowników. Bardzo szybko jednak katalogi domowe przeniesiono do
/home
, a /usr
przejęło zupełnie inne zadanie. Dzisiaj nazwa jest interpretowana jako skrót od "Unix System Resources", choć to interpretacja dorobiona po fakcie.
Co znajdziesz w
/usr
Praktycznie całą drugą hierarchię systemu, która w dużej mierze powiela strukturę katalogu głównego. Są tam podkatalogi
/usr/bin i
/usr/sbin , gdzie trafiają programy, które nie są absolutnie niezbędne do startu systemu, ale stanowią gros oprogramowania używanego na co dzień. Przeglądarki, edytory, kompilatory, narzędzia sieciowe, programy graficzne, wszystko to ląduje w /usr/bin.
Podkatalog
/usr/lib
zawiera biblioteki używane przez te programy. W
/usr/share
znajdują się dane niezależne od architektury procesora, takie jak dokumentacja, ikony, dźwięki, pliki tłumaczeń czy motywy graficzne. Katalog
/usr/lnclaude zawiera pliki nagłówkowe języków programowania, głównie C i C++, potrzebne do kompilowania programów ze źródeł.
Szczególną rolę pełni
/usr/local
To swoisty "piaskownica" dla administratora systemu. Jeśli chcesz zainstalować oprogramowanie samodzielnie, kompilując je ze źródeł albo pobierając z internetu, powinno ono trafić właśnie tam. Menedżer pakietów twojej dystrybucji nigdy nie dotyka /usr/local, dzięki czemu twoje własne instalacje nie kolidują z aktualizacjami systemu. Struktura /usr/local odtwarza strukturę samego /usr, więc znajdziesz tam /usr/local/bin , /usr/local/share i tak dalej.
/etc, czyli serce konfiguracji systemu
Nazwa
/etc
to jedna z najbardziej tajemniczych w całej strukturze. Pierwotnie oznaczała po prostu "et cetera", czyli "i tak dalej". Wrzucano tam wszystko to, co nie pasowało do innych katalogów. Z czasem jednak katalog ten przejął bardzo konkretną rolę. Dzisiaj /etc to miejsce, w którym znajdują się wszystkie pliki konfiguracyjne systemu i zainstalowanych w nim programów.
To właśnie tam zaglądasz, gdy chcesz zmienić konfigurację serwera SSH
/etc/ssh/sshd_config
, skonfigurować interfejsy sieciowe
/etc/network/interfaces
na Debianie,
/etc/sysconfig/network-scripts/ na RHEL, dodać nowego użytkownika
/etc/passwd ,
/etc/shadow ,
/etc/group
albo zaplanować zadania cykliczne
/etc/crontab i
/etc/cron.d
W /etc znajdziesz też plik
/etc/hosts
, który mapuje nazwy na adresy IP przed zapytaniem DNS, oraz
/etc/resolv.conf
, w którym skonfigurowane są serwery DNS używane przez system. Jest tam plik
/etc/fstab
określający, jakie dyski i partycje mają być montowane przy starcie systemu. Jest /etc/hostname z nazwą komputera, a także dziesiątki innych plików, które określają zachowanie systemu.
Reguła jest prosta. Pliki konfiguracyjne to zwykle pliki tekstowe, które można edytować dowolnym edytorem, takim jak nano , vim czy vi.
To zupełnie inne podejście niż w systemie Windows, gdzie konfiguracja siedzi ukryta w binarnym rejestrze. Filozofia Linuxa zakłada, że wszystko, co konfigurowalne, musi być czytelne dla człowieka. Dzięki temu administratorzy mogą edytować, porównywać, wersjonować i skryptować konfigurację w dowolny sposób.
/home, czyli twoje królestwo
Katalog
/home
to miejsce, w którym znajdują się foldery domowe wszystkich zwykłych użytkowników systemu. Jeśli twoja nazwa użytkownika to na przykład pawel, to twój katalog domowy znajduje się pod ścieżką /home/pawel.
To właśnie tam trafiają wszystkie twoje dokumenty, pobrane pliki, muzyka, zdjęcia, pulpit, ustawienia programów i całe mnóstwo innych rzeczy związanych z tobą jako konkretnym użytkownikiem.
Wewnątrz katalogu domowego znajdziesz standardowe podfoldery takie jak Dokumenty, Pobrane, Obrazy, Muzyka, Pulpit i tak dalej. Nazwy tych folderów mogą być lokalizowane na język systemu, więc na polskim Ubuntu zobaczysz je po polsku, a na angielskim po angielsku.
Szczególną rolę odgrywają ukryte pliki i foldery, które zaczynają się od kropki.
ls nie pokazuje ich domyślnie, trzeba użyć
ls -a
, żeby je zobaczyć. To właśnie w ukrytych plikach i folderach, takich jak
.bashrc ,
.config ,
.local ,
.ssh
czy
.cache
, przechowywane są indywidualne ustawienia programów, klucze SSH, historia poleceń i setki innych rzeczy konfiguracyjnych dotyczących twojego konta.
Filozofia jest tutaj następująca. /etc zawiera konfigurację systemową, która obowiązuje wszystkich użytkowników.
Natomiast w katalogu domowym każdy użytkownik może nadpisać te ustawienia swoimi własnymi preferencjami. To rozdzielenie jest bardzo potężne, bo pozwala jednemu systemowi obsłużyć dziesiątki albo setki użytkowników, z których każdy może mieć zupełnie inne środowisko pracy.
Administrator systemu, czyli root, ma swój katalog domowy osobno. Znajduje się on pod ścieżką
/root
Powód jest historyczny i praktyczny. Katalog domowy administratora musi być dostępny nawet wtedy, gdy /home z jakiegoś powodu nie jest zamontowany. Administrator musi móc się zalogować i naprawić system zawsze, bez względu na okoliczności.
/var, czyli dane, które się zmieniają
Nazwa
/var pochodzi od słowa "variable", czyli "zmienne". Ten katalog jest przeznaczony na dane, które w trakcie pracy systemu się zmieniają, rosną i ewoluują. To dopełnienie katalogu
/usr
, który teoretycznie mógłby być zamontowany tylko do odczytu, bo znajdujące się tam programy raczej się nie zmieniają.
Do najważniejszych podkatalogów /var należy /var/log, gdzie serwery i usługi zapisują swoje logi. Tam znajdziesz plik syslog, który zbiera wiadomości z całego systemu, auth.log z informacjami o logowaniach i próbach autoryzacji, kern.log z komunikatami jądra systemu, a także katalogi konkretnych usług takich jak Apache, Nginx, MySQL czy PostgreSQL. Logi to święty graal administratora.
Kiedy coś nie działa, pierwsze miejsce, w które zaglądasz, to właśnie /var/log.
.
Kolejny ważny podkatalog to /var/lib, gdzie programy trzymają swoje trwałe dane. Bazy danych MySQL przechowują tam swoje pliki bazowe ( /var/lib/mysql ) menedżer pakietów dpkg trzyma tam informacje o zainstalowanych pakietach, a Docker przechowuje obrazy i kontenery w /var/lib/docker. Jeśli chcesz zrobić backup usługi, w większości przypadków musisz zabezpieczyć jej dane właśnie z /var/lib .
Podkatalog /var/spool służy do kolejek, takich jak kolejka wydruków, poczta czekająca na wysłanie, zadania cron do wykonania. Natomiast /var/cache zawiera dane pamięci podręcznej, które mogą być usunięte bez utraty funkcjonalności, jedynie spowolni to system. W /var/www na wielu dystrybucjach domyślnie znajdują się pliki serwowane przez serwer WWW.
Warto pamiętać, że /var może rosnąć bardzo szybko, zwłaszcza na serwerach.
Logi potrafią zająć gigabajty, a bazy danych terabajty. Właśnie dlatego często w produkcji /var albo jego podkatalogi montuje się na oddzielnych, odpowiednio dużych partycjach lub wolumenach.
/tmp, czyli tymczasowa poczekalnia
Katalog
/tmp
służy do przechowywania plików tymczasowych. Programy używają go do zapisywania rzeczy, które potrzebne są tylko na chwilę. Na przykład podczas rozpakowywania archiwum, kompilacji programu, edycji pliku w jakimś edytorze czy wymiany danych między procesami.
Cechą charakterystyczną
/tmp
jest to, że jego zawartość zwykle jest czyszczona przy każdym uruchomieniu systemu. Wiele nowoczesnych dystrybucji montuje
/tmp
jako system plików
tmpfs
, co oznacza że katalog ten w rzeczywistości istnieje w pamięci operacyjnej, a nie na dysku. To ma dwie zalety. Po pierwsze, dostęp do plików jest błyskawiczny. Po drugie, przy każdym restarcie wszystko znika automatycznie, bo pamięć operacyjna nie zachowuje danych.
Z tego powodu nigdy nie powinieneś trzymać w /tmp niczego, co chciałbyś zachować. Jeśli po restarcie coś ważnego zniknie, nie będzie do kogo mieć pretensji.
Dodatkowo /tmp ma specjalne uprawnienia zwane "sticky bit", dzięki czemu każdy użytkownik może tworzyć tam pliki, ale tylko właściciel pliku lub administrator może go usunąć.
/opt, czyli opcjonalne oprogramowanie firm trzecich
Katalog
/opt
to miejsce przeznaczone na oprogramowanie, które nie pochodzi z repozytoriów dystrybucji i nie pasuje do filozofii rozbijania plików po standardowych miejscach. Kiedy instalujesz komercyjne oprogramowanie, takie jak Google Chrome, Spotify, VS Code instalowany ręcznie ze strony, czy jakiś wielki pakiet enterprise, często ląduje on właśnie w /opt.
Struktura /opt jest prosta. Każdy produkt trafia do swojego własnego podkatalogu, na przykład /opt/google/chrome albo /opt/spotify.
Wewnątrz tego podkatalogu znajduje się wszystko, co dany program potrzebuje do działania. Binaria, biblioteki, dane, konfiguracja. Dzięki temu całkowite odinstalowanie sprowadza się do usunięcia jednego folderu.
Takie podejście stanowi ciekawą odwrotność klasycznej filozofii Uniksa, gdzie pliki są rozbijane po wielu katalogach tematycznie. Filozofia /opt jest bliższa temu, co widzimy w systemach Windows czy macOS, gdzie aplikacja stanowi zamkniętą całość.
/dev, czyli magiczny katalog urządzeń
Pamiętasz zasadę "everything is a file"? W katalogu /dev widać ją najlepiej. Znajdują się tam specjalne pliki reprezentujące urządzenia podłączone do systemu.
To nie są prawdziwe pliki z zawartością, tylko interfejsy pozwalające programom komunikować się z urządzeniami tak, jakby czytały lub zapisywały zwykłe pliki.
Dysk twardy reprezentowany jest jako
/dev/sda , a jego pierwsza partycja to
/dev/sda1 . Dyski SSD NVMe pojawiają się jako
/dev/nvme0n1 . Karty graficzne to
/dev/dri/card0 . Terminal, w którym pracujesz, ma swoją reprezentację w
/dev/tty . Są też bardzo specjalne pliki jak
/dev/null , który jest jak czarna dziura pochłaniająca wszystko, co do niego zapiszesz, albo
/dev/zero , który na żądanie produkuje nieskończone zera, albo
/dev/random i
/dev/urandom , które generują losowe dane przydatne w kryptografii.
Dzięki tej abstrakcji można na przykład skopiować zawartość całego dysku do pliku jednym prostym poleceniem takim jak
dd if=/dev/sda of=dysk.img
. System operacyjny traktuje dysk jak plik i pozwala zrobić z nim wszystko, co można zrobić z plikiem.
/proc, czyli okno na duszę systemu
Katalog
/proc to kolejny przykład unixowej magii. Nie jest to prawdziwy katalog na dysku, tylko wirtualny system plików, który jądro systemu generuje w locie. Znajdziesz tam informacje o wszystkim, co dzieje się w systemie w danej chwili.
Każdy działający proces ma swój własny podkatalog o nazwie równej jego identyfikatorowi PID. Wewnątrz tego podkatalogu znajdziesz plik cmdline z poleceniem, którym proces został uruchomiony, plik status z aktualnym stanem, environ ze zmiennymi środowiskowymi, fd z listą otwartych deskryptorów plików i wiele innych.
Są tam też pliki globalne, takie jak /proc/cpuinfo z informacjami o procesorze, /proc/meminfo o pamięci, /proc/version z wersją jądra, /proc/uptime z czasem działania systemu. Wiele klasycznych narzędzi, takich jak ps , top czy free , tak naprawdę po prostu czyta pliki z /proc i ładnie je formatuje.
Zmienność i niezwykłość /proc polega na tym, że niektóre pliki można też modyfikować, zmieniając przez to zachowanie jądra. Na przykład zapis konkretnej wartości do /proc/sys/net/ipv4/ip_forward włącza lub wyłącza przekazywanie pakietów między interfejsami sieciowymi.
/sys, czyli nowocześniejszy kuzyn /proc
Katalog /sys to stosunkowo nowy wynalazek w historii Linuxa, wprowadzony razem z jądrem serii 2.6 na początku XXI wieku. Podobnie jak /proc, jest to wirtualny system plików generowany przez jądro. Z tą różnicą, że /sys jest bardziej uporządkowany i skupiony na urządzeniach oraz sterownikach.
Pod ścieżką /sys/class znajdziesz urządzenia pogrupowane według klas, na przykład wszystkie interfejsy sieciowe są w /sys/class/net, a baterie laptopa w /sys/class/power_supply. W /sys/devices masz fizyczną topologię wszystkich urządzeń w systemie, co dokładnie do czego jest podłączone.
Dla użytkownika codziennego /sys pozostaje raczej niewidoczny. Ale dla administratorów, programistów sterowników i twórców narzędzi monitorujących to kopalnia wiedzy o stanie sprzętu.
/boot, czyli kolebka systemu
Katalog /boot zawiera wszystko, co jest potrzebne do uruchomienia systemu. Najważniejszym elementem jest jądro Linuxa, czyli plik zwykle nazwany vmlinuz wraz z numerem wersji. Jest też plik initramfs albo initrd, który stanowi minimalny system plików ładowany do pamięci na samym początku startu.
Jeśli używasz bootloadera GRUB, znajdziesz w /boot/grub jego konfigurację oraz pliki pomocnicze. Na systemach z UEFI pojawia się dodatkowo /boot/efi z partycją EFI, zawierającą pliki startowe interpretowane bezpośrednio przez firmware komputera.
W katalogu /boot zwykle trzymanych jest kilka wersji jądra jednocześnie. Dzięki temu, jeśli nowa wersja jądra się nie uruchomi albo powoduje problemy, można łatwo wrócić do starszej wersji.
To jedna z ważnych zalet Linuxa, której w wielu innych systemach brakuje.
/lib, /lib32, /lib64, czyli biblioteki
Katalog
/lib zawiera biblioteki potrzebne do działania programów z /bin i /sbin i /sbin. Na większości dystrybucji znajdziesz obok niego także /lib64 z bibliotekami 64 bitowymi i czasem /lib32 z bibliotekami 32 bitowymi. Dokładny układ zależy od architektury systemu.
W Linuxie biblioteki są centralnym zasobem. Kilkadziesiąt różnych programów może korzystać z jednej biblioteki jednocześnie, ładując ją dynamicznie do pamięci tylko raz. To oszczędza miejsce na dysku i pamięć operacyjną. W systemie Windows każdy program często nosi ze sobą własne kopie bibliotek DLL, co prowadzi do tak zwanego "DLL hell" i marnowania miejsca.
Ważnym podkatalogiem jest /lib/modules, gdzie znajdują się moduły jądra. Moduły to fragmenty kodu jądra, które można ładować i wyładowywać dynamicznie, na przykład sterowniki urządzeń. W /lib/systemd znajduje się infrastruktura systemu inicjalizacji systemd, który na nowoczesnych dystrybucjach zarządza uruchamianiem i zatrzymywaniem wszystkich usług.
/mnt i /media, czyli gdzie podłącza się zewnętrzne nośniki
Dwa podobnie brzmiące katalogi, o podobnym przeznaczeniu, ale z niuansami.
/mnt
(od "mount") to tradycyjne miejsce, w którym administrator ręcznie montuje systemy plików. Kiedy na serwerze chcesz tymczasowo podłączyć udostępnioną partycję sieciową albo zamontować obraz ISO do przejrzenia jego zawartości, używasz właśnie /mnt jako punktu montowania.
/media to nowszy katalog, używany automatycznie przez środowisko graficzne do montowania nośników wymiennych. Gdy włożysz pendrive do laptopa, większość dystrybucji desktopowych automatycznie zamontuje go pod ścieżką typu /media/twoj_uzytkownik/NAZWA_PENDRIVE.
Różnica jest subtelna i czasami zacierana. Generalna zasada brzmi tak. /mnt dla administratora i ręcznych operacji, /media dla automatycznego montowania nośników przez system.
/run, czyli dane tymczasowe działających procesów
Katalog
/run to stosunkowo nowy dodatek do hierarchii Linuxa. Znajdziesz go na wszystkich nowoczesnych dystrybucjach, ale w starszych systemach jego rolę pełniły /var/run i /var/lock.
Zawiera pliki tymczasowe, które programy tworzą w trakcie swojego działania. Typowo znajdują się tam pliki PID, czyli takie, w których usługi zapisują swój identyfikator procesu, pliki gniazd Unix do komunikacji między procesami oraz pliki blokad zapobiegające uruchomieniu kilku instancji tej samej usługi jednocześnie.
Podobnie jak /tmp, katalog /run jest często montowany w pamięci, dzięki czemu dostęp jest błyskawiczny, a zawartość automatycznie znika po restarcie systemu.
/srv, czyli dane serwowanych usług
Nazwa pochodzi od słowa "serve" i ten katalog jest przeznaczony na dane, które serwer udostępnia na zewnątrz. Przykładem może być strona WWW w /srv/www lub /srv/http , serwer FTP w /srv/ftp , repozytoria w , repozytoria w /srv/git.
W praktyce użycie /srv bywa różne. Niektóre dystrybucje trzymają dane serwowane przez Apache w /var/www, inne w /srv/www. Debian i Ubuntu tradycyjnie używają /var/www, a openSUSE bardziej /srv.
Obydwa rozwiązania są poprawne, ale jeśli budujesz coś od zera, /srv jest bardziej zgodny z duchem standardu FHS.
Dlaczego w Linuxie obowiązuje akurat taki podział
Kiedy spojrzymy na całość, widać kilka zasad przewodnich, które kryją się za tą strukturą.
Po pierwsze, separacja danych statycznych od zmiennych. Pliki, które się nie zmieniają (programy, biblioteki, dokumentacja), trafiają do /usr.
Pliki, które rosną i ewoluują (logi, bazy danych, kolejki), trafiają do /var. Pliki chwilowe lądują w /tmp lub /run. Takie rozdzielenie teoretycznie pozwala zamontować /usr tylko do odczytu, co ma ogromne znaczenie dla bezpieczeństwa serwerów.
Po drugie, separacja ogólnosystemowego od użytkownika.
W /etc siedzi konfiguracja globalna, w /home/uzytkownik konfiguracja indywidualna. W /usr/bin programy zainstalowane systemowo, w /home/uzytkownik/bin lub /usr/local/bin programy własne.
Po trzecie, separacja niezbędnego od opcjonalnego. W /bin i /sbin znajdują się tylko te narzędzia, bez których system nie może wystać ani chwili. W /usr/bin i /usr/sbin wszystko inne.
Dzięki temu w razie katastrofalnej awarii można uruchomić system w trybie minimalnym, mając tylko katalog główny, a i tak mieć dostęp do podstawowych narzędzi naprawczych.
Po czwarte, separacja oprogramowania systemowego od oprogramowania zewnętrznego. W /usr siedzi to, co instaluje menedżer pakietów. W /usr/local to, co instaluje ręcznie administrator. W /opt duże komercyjne pakiety firm trzecich.
Po piąte, wszystko jest plikiem. Katalogi /dev, /proc, /sys pokazują, że ta filozofia w Linuxie nie jest sloganem, tylko rzeczywistą, głęboko zakorzenioną zasadą projektową.
Dzięki temu jednolite narzędzia do pracy z plikami działają na absolutnie wszystkim, co istnieje w systemie.
Jak to wszystko wygląda w praktyce codziennego użytkowania
Dla zwykłego użytkownika desktopowego praktycznie cały świat toczy się w katalogu /home/twoja_nazwa. Tam trzymasz swoje dokumenty, tam pobierasz pliki, tam też domyślnie zapisują się konfiguracje używanych programów.
Reszta struktury katalogów jest ci potrzebna w zasadzie tylko wtedy, gdy coś pójdzie nie tak albo gdy chcesz głębiej poznać swój system.
Dla administratora sytuacja wygląda inaczej. Regularnie zaglądasz do /etc, żeby coś skonfigurować. Do /var/log, żeby sprawdzić, co się dzieje. Do /home żeby zarządzać użytkownikami. Do /usr/local/bin, żeby dodać własne skrypty. Do /mnt żeby montować zasoby.
Dla programisty relewantne są /usr/include z plikami nagłówkowymi, /usr/lib z bibliotekami, /usr/share/man z dokumentacją man. Instalując własne projekty do testowania, często wybierasz /usr/local lub /opt.
Dla devopsa liczy się jeszcze co innego. Katalog /var/lib/docker z obrazami kontenerów, /etc/systemd/system z definicjami usług, /etc/nginx czy /etc/apache2 z konfiguracją serwerów, /srv lub /var/www z treściami WWW.
Na koniec kilka rad dla początkujących
Pierwsza rada. Nie bój się terminala. Wpisuj ls, przechodź między katalogami poleceniem cd, używaj cat do podglądania plików konfiguracyjnych.
To najlepszy sposób, żeby oswoić się ze strukturą.
Druga rada. Używaj autouzupełniania poprzez klawisz Tab. Kiedy zaczniesz wpisywać ścieżkę, powłoka podpowie ci dostępne katalogi.
To nie tylko przyspiesza pracę, ale też pomaga uczyć się, co gdzie jest.
Trzecia rada. Zaglądaj do /var/log, kiedy coś nie działa. To zbiorcze miejsce wszystkich komunikatów systemu. Polecenie
journalctl
na systemach z systemd robi podobną robotę, wyciągając logi z binarnego dziennika systemu.
Czwarta rada. Naucz się polecenia man. Wpisz man hier i przeczytaj opis struktury katalogów. Później man ls, man cp, man systemd i tak dalej.
Dokumentacja man to skarbnica wiedzy, która jest zawsze dostępna offline, na twoim komputerze.
Piąta rada. Nie bój się sprawdzać. Linux jest niezwykle otwarty. Wszystko jest plikiem, wszystko jest czytelne, wszystko można sprawdzić.
Jeśli zastanawia cię, dlaczego coś działa tak a nie inaczej, zawsze można zerknąć do odpowiedniego pliku konfiguracyjnego w /etc albo do logu w /var/log.
Podsumowanie
Struktura katalogów w Linuxie na pierwszy rzut oka wydaje się skomplikowana i pełna archaizmów. W rzeczywistości to jeden z najlepiej przemyślanych elementów systemu. Każdy katalog ma swoje miejsce, swoją rolę i swoje uzasadnienie, często sięgające głęboko do historii Uniksa.
Klucz do zrozumienia tej struktury leży w dostrzeżeniu, że Linux separuje rzeczy na wielu poziomach jednocześnie. Statyczne od zmiennych, systemowe od użytkownika, niezbędne od opcjonalnych, wbudowane od zewnętrznych. To tworzy system, który jest równocześnie elastyczny i stabilny, prosty w codziennej obsłudze i potężny w rękach administratora.
Kiedy następnym razem otworzysz terminal i zobaczysz ścieżkę typu
/usr/local/share/man/man1/cowsay.1.gz
, nie zadawaj sobie pytania "co za bałagan". Zadaj sobie pytanie "co mi ta ścieżka mówi o tym pliku". Bo mówi sporo. Że to coś zainstalowanego ręcznie przez administratora (bo /usr/local), że są to dane niezależne od architektury (bo /share), że to strona podręcznika systemowego (bo man), że sekcji pierwszej, czyli dla poleceń użytkownika (bo man1), i że jest to skompresowana strona dla polecenia cowsay.
Struktura katalogów w Linuxie to nie chaos. To język, którym system do ciebie mówi. Wystarczy się go nauczyć, żeby z każdym dniem rozumieć go coraz lepiej.
Mogę Ci jakoś pomóc?