System plików





Systemy uniksowe używają innego układu katalogów, niż systemy Microsoftu. Według mnie jest on bardziej przejrzysty i logiczny. Elegancko rozdziela pliki różnych typów i zastosowań oraz przestrzenie różnych uprawnień. Warto go poznać, gdyż jego znajomość znacząco ułatwi wyszukiwanie plików i wyeliminuje dylematy dotyczące miejsca umieszczenia własnych plików. Układ katalogów, według FHS 2.2, wygląda następująco:
/
Zawartość głównego systemu plików jest niewielka, pozwala na bootowanie i naprawę systemu.
bin/
Zawiera komendy użyteczne zarówno dla zwykłego użytkownika, jak i dla administratora. Jest tu wyłącznie ich niezbędny zestaw.

boot/
Zawiera wszystko, co jest potrzebne programowi bootującemu, za wyjątkiem konfiguracji i instalatora map.

dev/
Ten katalog zawiera pliki urządzeń.

etc/
Zawiera pliki konfiguracyjne specyficzne dla maszyny.
X11/
Konfiguracja systemu X Window.
opt/
Konfiguracja dla /opt.

home/
Zawiera katalogi domowe użytkowników. Wewnętrzny układ dobiera administrator.

lib/
Zawiera te biblioteki współdzielone, które są niezbędne do zbootowania systemu oraz uruchamiania komend z głównego systemu plików, zawiera również moduły jądra.
modules/
Dynamicznie ładowalne moduły jądra.



mnt/
Służy do tymczasowego montowania systemów plików przez administratora.

opt/
Zarezerwowane do instalacji dodatkowych aplikacji. Aplikacje powinny być instalowane w osobnych podkatalogach w /opt/.

proc/
Informacje o pracy jądra. Zawartość tego katalogu nie znajduje się na dysku, lecz jest generowana dynamicznie przez jądro.

root/
Katalog domowy użytkownika root.

sbin/
Zawiera programy używane do administracji systemem i inne komendy użyteczne dla roota. Zawiera jedynie zestaw niezbędny do bootowania i naprawy systemu.

tmp/
Katalog ten służy do zapisu plików tymczasowych. Zawartość tego katalogu może być kasowana przy restarcie systemu. Każdy użytkownik ma prawo zapisu.

usr/
Katalog ten jest drugą główną sekcją systemu plików. Zawiera dane tylko do odczytu, które mogą być współdzielone między maszynami.
X11R6/
Zawiera pliki systemu X Window.
bin/
Większość komend użytkownika znajduje się w tym katalogu.
games/
Gry i binaria edukacyjne.
include/
Tutaj umieszczone są pliki nagłówkowe języka C/C++.
lib/
Zawiera pliki obiektowe, biblioteki i wewnętrzne binaria, które nie powinny być wykonywane bezpośrednio przez użytkownika czy skrypt.
local/
Katalog do wykorzystania przez administratora przy lokalnej instalacji oprogramowania.
bin/
Lokalne binaria.
games/
Lokalne binaria gier.
include/
Lokalne pliki nagłówkowe C.
lib/
Lokalne biblioteki.
man/
Lokalne strony podręcznika.
sbin/
Lokalne binaria systemowe.
share/
Lokalna hierarchia niezależna od architektury.
src/
Lokalny kod źródłowy.

sbin/
Binaria używane przez administratora, które nie są niezbędne do uruchomienia systemu.

share/
Jest to miejsce dla plików tylko do odczytu, które są niezależne od architektury.
dict/
Listy słów.
doc/
Dokumentacja systemowa.
games/
Dane statyczne dla /usr/games.
info/
Główny katalog systemu GNU Info.
locale/
Informacje locale.
man/
Strony podręcznika systemowego.
misc/
Różne dane niezależne od architektury.
nls/
Pliki tłumaczeń dla NLS - wsparcia dla narodowych języków.
sgml/
Dane SGML i XML.
terminfo/
Katalogi dla bazy danych terminfo.
tmac/
Makra troff nie dystrybutowane z groffem.
zoneinfo/
Informacje i konfiguracja stref czasowych.

src/
Tutaj należy umieścić nielokalne kody żródłowe, przykładowo kody źródłowe jądra.

var/
Zawiera zmienne dane. Są to m.in. kolejki, logi, pliki danych oraz pliki tymczasowe.

cache/
Miejsce na cachowane dane aplikacji. Zwykle generowane są jako wynik drogich operacji I/O lub obliczeń. Dane te są możliwe do odtworzenia.
fonts/
Lokalnie wygenerowane fonty.
man/
Lokalnie wygenerowane strony podręcznika.
www/
Dane cache/proxy WWW.


games/
Zawiera wszelkie zmienne dane związane z grami w /usr/games.

lib/
Zawiera informacje stanu aplikacji lub systemu. Informacje stanu to takie dane, które są modyfikowane przez pracujący program i będące przywiązane do specyficznej maszyny.

local/
Zmienne dane dla /usr/local.

lock/
Pliki blokad dla urządzeń i innych zasobów są umieszczane tutaj.

log/
Pliki logów.

mail/
Poczta użytkowników w uniksowym formacie mailbox.

opt/
Zmienne dane dla /opt.


run/
Zawiera informacje systemowe opisujące system od bootowania. Pliki z tego katalogu są kasowane na początku procesu bootowania. Zawiera gniazda domenowe Uniksa oraz pliki PID informujące o pracy procesów.

spool/
Zawiera dane, które oczekują na dalsze przetworzenie. Dane w /var/spool reprezentują pracę przeznaczoną do wykonania w przyszłości. Często dane są usuwane po przetworzeniu.
lpd/
Kolejka drukarki.
mqueue/
Kolejka wychodząca poczty.
news/
Spool newsów.
rwho/
Pliki demona rwho.
uucp/
Katalog spool dla UUCP.

tmp/
Pliki tymczasowe zachowywane między rebootami systemu.

Pliki specjalne
W Uniksie system plików nie zawiera tylko i wyłącznie miejscem składowania plików. Znajdują się w nim również obiekty specjalne, służące do interakcji z systemem. Ponadto i same pliki zachowują się lekko inaczej, niż w systemach Windows - między innymi możliwe jest stworzenie wielu dowiązań do jednego pliku. Zacznijmy od głębszej inspekcji katalogów /lib i /dev, używając ls:
tilk@lucifer:~$ cd /lib
tilk@lucifer:/lib$ ls -l
razem 4244
(...)
lrwxrwxrwx 1 root root 18 2001-09-26 20:32 ld-linux.so.1 -> ld- linux.so.1.9.11
-rwxr-xr-x 1 root root 24789 2001-09-26 20:32 ld-linux.so.1.9.11 (...)
-rwxr-xr-x 2 root root 99552 2000-05-03 19:07 ld.so
-rwxr-xr-x 2 root root 99552 2000-05-03 19:07 ld.so.1.9.11 (...)
lrwxrwxrwx 1 root root 14 2002-03-15 15:32 libcap.so.1 -> libca p.so.1.10
-rw-r--r-- 1 root root 11600 2001-12-18 05:35 libcap.so.1.10 (...)
drwxr-xr-x 13 root root 4096 2003-01-25 22:58 modules
drwxr-xr-x 2 root root 4096 2002-09-05 17:21 security
tilk@lucifer:/lib$ cd /dev
tilk@lucifer:/dev$ ls -l
razem 52
(...)
brw-rw---- 1 root disk 3, 0 2000-07-05 19:43 hda
brw-rw---- 1 root disk 3, 1 2000-07-05 19:43 hda1 (...)
crw-rw---- 1 root dialout 4, 64 2001-10-01 14:02 ttyS0
crw-rw---- 1 root dialout 4, 65 2001-10-01 14:02 ttyS1 (...)
tilk@lucifer:/dev$

Opcja -l do ls powoduje włączenie długiego formatu listowania. Dzięki temu uzyskuje się dodatkowe informacje o pliku. Kolumny oznaczają w kolejności: typ pliku i uprawnienia, ilość dowiązań, właściciel pliku, grupa, rozmiar, data modyfikacji i nazwa. Kolumna typu pliku i uprawnień zawiera dziesięć znaków, z czego pierwszy określa typ pliku, natomiast pozostałe dziewięć - uniksowe uprawnienia dostępu. Istnieją następujące typy plików:
Plik zwykły, określany symbolem -. W Uniksach plik jest po prostu ciągiem bajtów. Jest on bardzo podobny do pliku, który znamy z Windows; może jednak istnieć w kilku miejscach w systemie plików jednocześnie. Sytuacja taka jest widoczna w przypadku plików /lib/ld.so i /lib/ld.so.1.9.11 na naszym listingu - zauważmy identyczny rozmiar i datę modyfikacji oraz licznik dowiązań równy 2. Oba dowiązania są na równych prawach - zmiana w jednym z nich będzie widoczna w drugim, ponadto usunięcie jednego z nich nie wpłynie na stan drugiego. Dowiązania tego typu tworzy się poleceniem ln.
Dowiązanie symboliczne, określane symbolem l, w działaniu jest podobne do windowsowego skrótu. Dowiązanie symboliczne nie wskazuje na sam plik, jak dowiązanie sztywne, lecz na jego nazwę. Dzięki temu dowiązania symboliczne mogą łączyć pliki pomiędzy różnymi systemami plików. Ponadto możliwe jest wykonanie dowiązania symbolicznego do katalogu - tworzenie dowiązań sztywnych do katalogów przez użytkownika jest zabronione ze względu na możliwość powstawania cykli. Dowiązanie symboliczne przestaje działać, jeśli usunie się plik, na który wskazuje. Dowiązaniami symbolicznymi na naszym listingu są /lib/ld-linux.so.1 i /lib/libpcap.so.1. Własne dowiązania tego typu można tworzyć poleceniem ln -s.
Katalogi są oznaczane znakiem d. Katalog zawiera listę plików oraz katalogów znajdujących się wewnątrz. Typowe operacje dostępu do pliku, np. otwarcie, nie działają dla katalogu. Dowiązania sztywne do katalogu są tworzone jedynie pośrednio przez system. Każdy katalog zawiera dwie specjalne pozycje - ., wskazująca na ten katalog, oraz .., wskazująca na katalog zawierający. Na przedstawionym listingu katalogami są /lib/modules i /lib/security. Dziwna ilość dowiązań związana jest z tym, że dowiązania specjalne . i .. również są liczone.
System plików jest również wykorzystywany do komunikacji ze sprzętem. Odpowiadają za to dwa specjalne rodzaje plików, b od block - dla urządzeń blokowych, oraz c od char - dla urządzeń znakowych. Urządzenia blokowe to takie, które zawierają własną przestrzeń adresową - przykładowo dysk twardy, /dev/hda z naszego listingu. Urządzenia znakowe natomiast zapewniają odczyt i zapis strumienia bajtów bez możliwości adresowania - przykładowo port szeregowy, /dev/ttyS0 z listingu. Pliki urządzeń są identyfikowane przez dwie liczby - większą i mniejszą. Na listingu są one w miejscu, gdzie normalnie znajduje się rozmiar pliku.
Istnieją jeszcze dwa rodzaje plików, służące do komunikacji między procesami. Plik oznaczony literą p to tak zwany potok nazwany. Potok nazwany służy do komunikacji bez połączenia w jedną stronę między dwoma procesami. Natomiast plik oznaczony s to gniazdo uniksowe. Pozwala ono na komunikację z połączeniem z dowolną ilością procesów na tym samym komputerze. Te rodzaje plików są używane wewnętrznie przez niektóre programy i typowy użytkownik nie powinien się nimi martwić.
Uprawnienia dostępu do plików
Czas najwyższy na wprowadzenie uniksowego systemu uprawnień dostępu do plików, czyli tego mechanizmu, który pozwala na ograniczenie uprawnień użytkownika w systemie.
Każdy plik posiada swojego właściciela. Właściciel pliku ma prawo określić do niego uprawnienia dostępu, aby ograniczyć lub zapewnić dostęp do niego innym użytkownikom. Czytelny dla człowieka zapis uniksowych uprawnień składa się z trzech grup po trzy znaki, po jednej dla właściciela, grupy (omówimy je później) i reszty świata, tzn. użytkowników, którzy nie należą do grupy pliku. Każda trójka znaków definiuje możliwość skorzystania z trzech rodzajów dostępu do niego: odczytu (r), zapisu (w), oraz wykonania (x). Jeśli w odpowiednim miejscu występuje litera, dostęp jest dozwolony, natomiast jeśli w jej miejscu jest myślnik - dostęp jest zabroniony.
Znaczenie tych symboli jest trochę inne w przypadku katalogu. Bit odczytu oznacza uprawnienie do obejrzenia zawartości katalogu, bit zapisu - możliwość tworzenia plików wewnątrz katalogu i usuwania plików, również cudzych. Bit wykonania natomiast jest pozwoleniem na wejście do katalogu.
Istnieją również trzy bity, które mają specjalne znaczenie. Bit t, zwany sticky bit, ma obecnie znaczenie tylko dla katalogów. Jeśli katalog ma ten bit ustawiony, to użytkownicy mający w nim prawo zapisu nie mogą modyfikować nawzajem swoich plików. Jest to więc bit używany do katalogów współdzielonych między wieloma użytkownikami, jak /tmp czy /var/mail. Bit ten pojawia się w zapisie w miejscu bitu wykonania dla reszty świata. Natomiast bity setuid i setgid, obydwa oznaczane jako s, mają znaczenie tylko dla plików wykonywalnych. Ich obecność powoduje, że uruchamiany program przybierze uprawnienia dostępu właściciela i grupy pliku. Jest to element ważny dla działania systemu bezpieczeństwa Uniksa. Bity te występują w trójce użytkownika i grupy w miejscu bitu x. Symbole bitów specjalnych zapisywane są dużymi literami, jeśli odpowiadające im bity wykonania nie są ustawione.
Wróćmy teraz do naszego listingu. Plik /lib/ld.so ma uprawnienia typowe dla biblioteki współdzielonej i pliku wykonywalnego. Jego właścicielem jest root, który to posiada do niego pełne uprawnienia dostępu. Pozostałym użytkownikom dozwolono jedynie odczyt i wykonanie. Natomiast plik urządzenia /dev/ttyS0 ma tak ustawione uprawnienia, żeby chronić go przed niepowołanym dostępem. Dostęp do niego ma tylko root i użytkownicy z grupy dialout. Jako, że urządzenia nie są wykonywalne, uprawnienie wykonania nie jest przydzielone nikomu.
Uprawnienia dostępu można zapisać również w bardziej zwięzłej formie, mianowicie w postaci czterech cyfr ósemkowych. Pierwsza z nich odpowiada bitom specjalnym, kolejne trzy odpowiednio bitom użytkownika, grupy i reszty świata. Bit wykonania ma wartość 1, bit zapisu - wartość 2, zaś bit wykonania - wartość 4. W trójce bitów specjalnych wartość 1 ma bit sticky, 2 - setgid, 4 - setuid. Zestaw uprawnień, zapisywany wcześniej jako rwxr-xr-x, można więc zapisać ósemkowo jako 0755. Zapis ten może być pomocny przy dokładnej zmianie uprawnień dostępu do plików.
Do zmiany uprawnień dostępu do plików służy polecenie chmod, zmiany właściciela - chown, a zmiany grupy - chgrp. Polecenia te mają bardzo prostą składnię - sprawdzenie jej w podręczniku systemowym pozostawiam jako ćwiczenie.