System plików Linuxa

Znacie anegdotę o facecie, który, chcąc uporządkować swój twardy dysk, utworzył katalog exe i umieścił w nim wszystkie pliki *.exe, następnie w katalogu dll wszystkie pliki *.dll i tak dalej. Jeżeli uważacie, że to zabawne, przygotujcie się na szok! Tak bowiem mniej więcej zorganizowane jest drzewo katalogów Linuxa (i każdego innego Unixa).

Jak to drzewiej bywało

Czyli dlaczego system plików, czyli organizacja dysku(ów) Unixa tak bardzo różni się od organizacji plików w dowolnym systemie klasy PC (dziadek DOS, Windows 9X, OS/2)?

Dawno, dawno temu, w okolicach drugiej połowy lat osiemdziesiątych XX wieku, w domach naszych pradziadków królowały komputery ośmiobitowe. Nieliczni szczęśliwcy dysponowali porażającym swymi osiągami sprzętem klasy XT czy AT. Ówczesne komputery z rzadka wyposażane były w twarde dyski, w większości przodkom naszym wystarczyć musiały dyskietki sto kilkadziesiąt KB (Amstrad) czy całe 360 KB (PC XT). Taka dyskietka mieściła z reguły jeden tylko program, np. edytor tekstu i zawierała nieco pustego miejsca na pliki własne użytkownika. Potem, w momencie upowszechnienia twardych dysków i ,,wynalezieniu'' katalogów dyskowych, przeniesiono stare nawyki do nowych warunków. I tak w złotej erze dosa 5.0 dalej każdy program mieszkał sobie spokojnie w swoim podkatalogu dysku C: razem z plikami przezeń tworzonymi. I ten schemat przetrwał praktycznie do dnia dzisiejszego, z niewielkimi modyfikacjami jakimi jest wydzielenie katalogu Moje Dokumenty na pliki użytkownika.

Mniej więcej w tym samym czasie, w jakim zaczyna się poprzedni paragraf, ,,elita'' skomputeryzowanej części społeczeństwa, w większości składająca się z pracowników naukowych uniwersytetów na wydziałach nauk ścisłych, otoczona nimbem tajemnicy, pracuje na tekstowych terminalach podpiętych do ,,dużego'' komputera. Korzystają z jednej z odmian systemu UNIX. UNIX umożliwia pracę wielu użytkownikom na raz w taki sposób, aby nie wchodzili sobie nawzajem w paradę. Jak zaprojektowano system plików do tych potrzeb? Trzymanie plików danych w katalogu aplikacji oczywiście nie wchodziło w rachubę ze względu na konieczność rozdzielenia danych użytkowników.

UNIX posiada tylko jedno drzewo katalogowe i tylko jeden katalog główny oznaczany znakiem /. Nie stosuje się literowych oznaczeń dysków jak w komputerach PC; zadaniem systemu jest ukrycie przed użytkownikami fizycznego rozmieszczenia katalogów na partycjach czy dyskach. O tym, gdzie w drzewie katalogowym będzie podpięta dana partycja decyduje administrator systemu, użytkownicy nie muszą się tym zajmować. Cały system plików UNIXa jest zaprojektowany w celu maksymalnego uproszczenia życia użytkownikom (co niestety oznacza czasem utrudnienie życia administratorowi). Za chwilę zobaczymy, dlaczego.

Jak już napisałem, główny katalog w UNIXie (root directory) oznacza się symbolem /. W początkowych latach istnienia UNIXa drzewo podkatalogów / miało stosunkowo prostą strukturę:

Tak było dawniej, kiedy jeszcze nie było sieci komputerowych, a system komputerowy składał się z głównej maszyny i paru terminali przyłączonych przez złącza szeregowe. W momencie, gdy komputery staniały na tyle, aby ośrodek badawczy mógł pozwolić sobie na zakup kilku maszyn, pojawił się pomysł, aby programy zainstalować tylko na jednej, a pozostałym udostępniać je poprzez dyski sieciowe. Jednak system musiało dać się ,,postawić'' również w sytuacji awaryjnej, bez sieci. Programy niezbędne dla pracy systemu pozostały w /bin, /lib, /etc, natomiast pozostałe przeniesiono do odpowiednich podkatalogów katalogu /usr (/usr/bin, /usr/lib itd.). Również maszyny ,,nieusieciowione'' skorzystały na tym o tyle, że programy mogły zostać rozbite na dwie partycje czy zgoła dwa różne dyski (katalog / na dysku startowym, a /usr na jakimś innym) co w przypadku awarii jednego z nich pozwalało zminimalizować straty. Katalogi użytkowników przeniesiono do /home, gdzie pozostały do dziś.

Co jednak, jeżeli chcemy zainstalować jakiś program tylko na jednej maszynie, katalog /usr jest współdzielony, a w katalogu / nie ma miejsca (zwykle partycje / są bardzo małe)? Zdecydowano się zatem wydzielić jeszcze jedno (to już ostatnie, obiecuję) poddrzewo, tym razem /usr/local. Zatem mamy katalogi /usr/local/bin, /usr/local/lib itd.

Linux zawiera jeszcze kilka katalogów o specjalnym przeznaczeniu. Krótko:

To zamyka naszą krótką wycieczkę po systemie plików Linuxa. Mam nadzieję, że nie zniechęciła Was jego złożoność. Wbrew pozorom jest bardzo uporządkowany i logicznie zaprojektowany. Ma tylko jedną wadę: spróbujcie ręcznie odinstalować jakiś program, który swoje pliki trzyma w /usr/bin, /usr/lib, /usr/share, /usr/etc i paru jeszcze miejscach. Na szczęście dystrybucje Linuxa dysponują wydajnymi metodami zarządzania pakietami, w tym instalowania/odinstalowywania. Co jednak jeżeli chcemy zainstalować nie program dostępny w formie pakietu, a własnoręcznie skompilowaną aplikację? I tutaj napotykamy kolejną zmianę przeznaczenia katalogów systemu. Otóż pakiety zwykle instaluje się w /usr i podkatalogach, a samodzielnie instalowane programy w /usr/local. Dzięki temu /usr/local zawiera mało plików i łatwiej jest wybrać te właściwe przy ręcznym usuwaniu aplikacji.

Co wolno wojewodzie ... czyli prawa dostępu do plików

System praw dostępu do plików Linuxa jest najbardziej standardowym rozwiązaniem spotykanym w UNIXach od początku ich dziejów. Jest on prosty i przejrzysty, a zarazem wystarczająco mocny do większości zastosowań. Zacznijmy od tego, że każda sesja użytkownika w systemie Linux zaczyna się od logowania. Każdy użytkownik ma przypisany jednoznaczny login (nazwę użytkownika). Zwykle uwierzytelnienie następuje po podaniu hasła. Użytkownicy przypisani są do grup. Każdy może znajdować się w dowolnej liczbie grup, ale jedna z nich jest tzw. grupą główną lub domyślną. Każdy plik w systemie Linux posiada dwóch właścicieli: jednym jest użytkownik, a drugim grupa. Prawa dostępu obejmują prawo do odczytu pliku, zapisu oraz wykonania zawartego w nim kodu. Prawa definiuje się oddzielnie dla właściciela, grupy oraz innych użytkowników. Do wyświetlenia praw dostępu służy komenda ls -l. Wyjaśnię teraz działanie praw dostępu na przykładzie:
[mac@mac mac]$ ls -l *.pdf
-rw-rw-r--    1 mac      mac        123677 sie 19 23:28 southpark.pdf
[mac@mac mac]$
  
Widzimy tu znak zachęty systemu, po którym wpisałem polecenie ls -l *.pdf. W odpowiedzi uzyskałem listę plików *.pdf z mojego katalogu domowego. Kolejne kolumny wydruku oznaczają: prawa dostępu zakodowane w specjalnej notacji opisanej poniżej, liczbę tzw. twardych dowiązań do pliku, właściciela pliku, grupę, rozmiar, datę modyfikacji pliku i jego nazwę. Jak zatem odczytać tajemniczy ciąg -rw-rw-r--? Pierwszy znak (-) oznacza typ pliku. Minus to zwyczajny plik. Inne znaki wyjaśnione są w następnej sekcji, np. d oznacza katalog. Kolejne 9 znaków brane trójkami oznacza kolejno prawa dostępu dla właściciela pliku, grupy i innych użytkowników. Literka r oznacza prawo odczytu (Read), w - zapisu (Write), a x umieszczana w trzecim polu - wykonania zawartego w pliku programu (eXecute). Zatem plik southpark.pdf mogę przeczytać i zapisać ja i członkowie grupy mac (czyli też tylko ja). Inni użytkownicy mogą ten plik jedynie przeczytać. Ponieważ southpark.pdf nie jest programem, nikt nie ma prawa go wykonać. Prawa dostępu może zmienić jedynie właściciel pliku lub root (który i tak wszystko może).

Typy plików

Abym mógł opowiedzieć o typach plików w Linuksie, muszę najpierw wyjaśnić czym tak naprawdę jest plik. A więc plik ogólnowojskowy składa się z ... eee ... nie ta bajka. Jeszcze raz. W największym skrócie każdy plik reprezentowany jest przez tzw. i-węzeł (i-node). Każdemu plikowi na dysku (oczywiście mówimy tu o dyskach sformatowanych w Linuxowym systemie ext2, nikt nie oczekuje, że na dysku fat32 skądinąd również obsługiwanym przez Linuxa pojawią się nagle jakieś i-węzły) przyporządkowany jest dokładnie jeden i-węzeł. I-węzły zapisywane są w pewnym wydzieonym obszarze dysku. To właśnie w nich zapisane są takie informacje jak właściciel pliku, grupa, prawa dostępu, czas utworzenia pliku, ostatniej modyfikacji i ostatniego dostępu, tytułowy typ pliku, jego rozmiar no i oczywiście najważniejsze - numer i-noda. Zauważcie, że w i-nodzie nie jest zapisana nazwa pliku. Mogą się tu za to znaleźć informacje o blokach dyskowych, w których zapisano znajdujące się w pliku dane, ale nie jest to konieczne. Np. wspomniane już pliki urządzeń w katalogu /dev nie zajmują przestrzeni dyskowej poza oczywiście przestrzenią i-nodów. Odnajdywanie plików po numerach i-węzłów byłoby co najmniej żmudne, dlatego utworzono dodatkowe struktury zwane katalogami (chodzi tu o zwyczajne katalogi dyskowe czasem niepoprawnie :-) zwane folderami). Katalog jest plikiem specjalnego typu, w którym umieszczono listę nazw plików wraz z numerami i-węzłów. Do jednego i-węzła mogą istnieć odwołania z różnych katalogów, dlatego zapisuje się w nim informację o liczbie takich dowiązań. Gdy liczba ta osiągnie zero, plik można bezpiecznie skasować. Oznacza to, że jeden plik może mieć kilka nazw w jednym lub w wielu katalogach. Jest to istotna różnica pomiędzy systemami plików klasy UNIX a PC. Informację o liczbie dowiązań pokazuje polecenie ls -l w drugiej kolumnie.

Pora zatem na opis rozmaitych typów plików spotykanych w Linuksie. Będę go ilustrował przykładowymi wydrukami z polecenia ls -l. Jak pamiętamy, typ pliku kodowany jest w pierwszej literce.

Aby zakończyć definitywnie temat plików w Linuksie należy jeszcze wspomnieć o dwóch dodatkowych atrybutach pliku.

Acha, nazwy plików są case-sensitive czyli np. Ala_ma_kota.txt i Ala_ma_kota.TXT to dwa zupełnie różne pliki!

Instalujemy Linuxa

Koniec suchej zaprawy, dalsze ćwiczenia przeprowadzać będziemy na żywym organizmie! Dla naszych celów posłużymy się najpopularniejszą obecnie dystrybucją Linuxa - RedHat 6.2.

Czego będziemy potrzebować?

Przese wszystkim komputera osobistego wyposażonego przynajmniej w 32 MB pamięci operacyjnej, procesor Pentium i jakieś 2 GB wolnej przestrzeni dyskowej. RedHata da się zainstalować na mniejszej przestrzeni (powinien wystarczyć 386 z 8 MB RAM'u i 200MB twardym dyskiem), ale mieliśmy się sprawą zająć poważnie. Przez wolną przestrzeń dyskową rozumiem nie wolne miejsce na partycji Windows (o ile takową posiadamy, ja np. nie), ale miejsce nie zajmowane przez żadną partycję. Ponieważ większość z Was ma zapewne zagospodarowaną całą powierzchnię dysku powstaje zasadniczy problem - jak wygospodarować wolną przestrzeń? W najlepszej sytuacji są ci, którzy posiadają na dysku kilka partycji. W tym wypadku wystarczy tylko skasować jedną lub więcej niepotrzebnych partycji i już mamy miejsce. Co jednak, gdy nasz dysk okupowany jest przez jedną wielką partycję? Wtedy trzeba ją jakoś ,,skurczyć''. Świetnie nadaje się do tego celu program PartitionMagic, jednak niestety trochę on kosztuje. Darmową alternatywą jest FIPS znajdujący się na płycie instalacyjnej RedHata. Dokumentacja FIPSa znajduje się również na kompakcie. W skrócie należy najpierw zdefragmentować dysk aby utworzyć dostatecznie dużo wolnej przestrzeni na jego końcu. Następnie tworzymy dyskietkę systemową i umiesczamy na niej FIPSa (pliki RESTORRB.EXE , FIPS.EXE i ERRORS.TXT) i bootujemy system z tej dyskietki. Po uruchomieniu FIPSa stosujemy się do poleceń na ekranie. NIE ZAPOMNIJ DOKŁADNIE PRZECZYTAĆ DOKUMENTACJI FIPSA ZANIM ZACZNIESZ EKSPERYMENTOWAĆ ZE SWOIM DYSKIEM. ISTNIEJE GROŹBA UTRATY DANYCH. Fips tworzy na wolnej przestrzeni dysku partycję dosową, będzie trzeba ją usunąć w programie instalacyjnym RedHata. Po uruchomieniu programu ujrzymy na ekranie aktualny stan partycji naszego dysku, np:
     |        |     Start      |      |      End       | Start  |Number of|
Part.|bootable|Head Cyl. Sector|System|Head Cyl. Sector| Sector |Sectors  |  MB
-----+--------+----------------+------+----------------+--------+---------+----
1    |    yes |   0  148      1|   83h|  15  295     63|  149184| 149184  |  72
2    |     no |   1    0      1|   06h|  15  139     63|      63| 141057  |  68
3    |     no |   0  140      1|   06h|  15  147     63|  141120| 8064    |   3
4    |     no |   0    0      0|   00h|   0    0      0|       0| 0       |   0
  
Następnie program zapyta, którą partycję podzielić (jeżeli jest więcej niż jedna). Po wyświetleniu dodatkowych informacji i sprawdzeniu, czy wybrana partycja nie ma błędów, zostajemy spytani o punkt podziału partycji. Wybieramy go strzałkami lewo - prawo. Wybór zatwierdzamy klawiszem Enter. FIPS wyświetli poprawioną tablicę partycji. Jeżeli wszystko jest OK zatwierdzamy zmiany klawiszem c i odpowiadamy y na końcowe pytanie. Miejsce dla Linuxa zostało zrobione.

Zaczynamy

Jeżeli mamy już odpowiednią ilość miejsca na dysku, możemy przystąpić do instalacji. Ustawiamy w BIOSie opcję bootowania z CD-ROMu (jeżeli BIOS takiej nie posiada, należy utworzyć dyskietkę startową. Narzędzia i instrukcje są na płycie instalacyjnej) i restartujemy komputer. Po chwili powinien zgłosić się ekran powitalny instalatora. Wyświetlone zostają pomocne informacje, a na dole ekranu pojawia się znak zachęty boot:. Wciskamy Enter aby przejść dalej. Następnie pojawia się pytanie o nośnik na którym zapisano wersję instalacyjną systemu. Wybieramy CD-ROM. W tym momencie system wykrywa nasz CD-ROM i zgłasza się instalator pracujący w trybie graficznym. Na kolejnych ekranach wybieramy: język instalacji (jest to zarazem język w którym później system będzie się z nami komunikował o ile różne programy go obsługują; obsługa wielojęzycznych komunikatów w Linuksie jest ustandaryzowana i zaawansowana, to dobry temat na dalszy artykuł), typ klawiatury i myszy. Następnie pojawia się ekran powitalny RedHata. Dalej decydujemy o typie instalacji. Proponuję zrezygnować z gotowych profili i wybrać typ Custom. Kolejnym ekranem jest ekran wyboru i ustawiania partycji. Można skonfigurować partycje narzędziem graficznym albo (wciskając CTRL+ALT+F2) przejść na konsolę tekstową i skorzystać z narzędzia fdisk. Może się to okazać konieczne w paru wypadkach: Powrót do trybu graficznego następuje poprzez wciśnięcie CTRL+ALT+F7. Linux oznacza partycje dysków IDE symbolami hdXY, gdzie X jest oznaczeniem literowym kolejnego dysku (a, b, c, d), a Y numerem partycji na tym dysku. Partycje primary numeruje się 1, 2, 3, 4, a dyski logiczne partycji extended od 5 w górę. Jeżeli numeru partycji nie ma, oznacza to cały dysk. Tak więc plik /dev/hdc9 oznacza piąty dysk logiczny partycji rozszerzonej dysku master na drugim kanale kontrolera IDE. Linux obsługuje do dziesięciu kontrolerów IDE, a więc do dwudziestu dysków. Pliki hdXY zwykle umieszczone są w katalogu /dev, ale podczas instalacji wyjątkowo należy ich szukać w /tmp. Aby zatem ręcznie przepartycjonować główny dysk systemu, należy wydać na konsoli tekstowej polecenie
fdisk /tmp/hda

Tutaj mała uwaga. Linux wymaga dla siebie co najmniej dwóch partycji. Jedna będzie zawierała wszystkie pliki niezbędne do pracy systemu i zostanie sformatowana w systemie ext2, natomiast druga będzie tzw. partycją wymiany (swap) służącą do czasowego zrzucania nieużywanych fragmentów (tzw. stron) pamięci. Jaki rozmiar wybrać dla tych partycji? Główna może mieć od 200MB (nie polecam) w górę. Pełna instalacja RedHata (wszystkich pakietów) zajmie nam jakieś 1,5 gigabajta. Pamietajmy, że chcemy zostawić trochę miejsca na dane użytkowników! Partycja swap powinna być dwa razy większa niż pamięć operacyjna komputera. Nie należy jednak przesadzać, w warunkach domowych przy niewielkim obciążeniu przeznaczanie na ten cel więcej niż 128 MB nie ma raczej sensu.

Załóżmy, że do tworzenia partycji wykorzystamy DiskDruida (narzędzie graficzne, patrz wyżej). W okienku programu zobaczymy wszystkie partycje naszego dysku (górna ramka) i statystykę dysku z ilością wolnej przestrzeni (ramka dolna). Po środku znajdują się przyciski do dodawania, usuwania i edycji partycji. Jeżeli na dysku nie ma wolnego miejsca, usuwamy jakąś partycję, np. tę utworzoną przez FIPSa. Następnie dodajemy nową partycję:

wybierając z listy właściwy dysk, jako typ podając Linux native, a jako mount point / (katalog główny). Włączając opcję Grow to fill disk zapewniamy, że partycja uzyska maksymalny możliwy rozmiar wypełniając całe wolne miejsce na dysku. Nie musimy wtedy podawać jej rozmiaru. Podobnie tworzymy partycję Linux swap (tu oczywiście podajemy rozmiar). Korzystając z DiskDruida możemy wybrać punkt montowania partycji dosowych. Proponuję wybrać jakieś podkatalogi katalogu /mnt, np. /mnt/Win95 . Dysk dosowy będzie wówczas automatycznie podmontowywany i widziany jako powyższy katalog. Jeszcze mała, ale niezwykle istotna uwaga. Bez specjalnych zabiegów LILO, czyli program ładujący Linuxa nie może wczytać jądra systemu, jeżeli znajduje się ono poza 1024 cylindrem dysku. Wynika to z ograniczeń BIOSu peceta. Jeżeli nasz dysk ma więcej niż 1024 cylindry, warto rozważyć utworzenie małej partycji na jego początku i ustawienie mount point na /boot. W przeciwnym razie system może nie wystartować i czeka nas uruchamianie go z dyskietki lub dosa poleceniem loadlin.

Na następnym ekranie wybieramy, które partycje chcemy sformatować. Wybieramy /.

Następne okienko dotyczy konfiguracji LILO, menedżera startu Linuxa.

Musimy wybrać miejsce instalacji. Jest kilka możliwości:

LILO potrafi wystartować dowolny system, stąd możliwość ustawienia dla każdej partycji tzw. boot label. Boot label wpisuje się po znaku zachęty LILO: podczas startu komputera. Powoduje to wybranie i załadowanie odpowiedniego systemu. Mamy tu też możliwość utworzenia dyskietki ratunkowej. Pola Use linear mode oraz Kernel parameters można zostawić nie wypełnione.

Na następnym ekranie możemy od razu skonfigurować sieć TCP/IP. Nie będę się tym na razie zajmował. Jeżeli posiadasz kartę sieciową, potrafisz pewnie sam to skonfigurować.

Kolejny etap to wybranie strefy czasowej. Wybieramy Europe/Warsaw. Można ustawić trzymanie czasu zegara płyty głównej w GMT, ale Windows od tego zgłupieje.

Następnie zostajemy poproszeni o wybranie hasła roota (administratora systemu). Wybierz hasło trudne do odgadnięcia, np. 6t;k.+12Jh. Można tu, a nawet powinno się założyć konto zwykłego użytkownika. Nie powinno się pracować w Linuksie z konta roota, gdyż można przypadkowo usunąć potrzebne pliki. Zwykły użytkownik na pewno nie usunie żadnych plików systemowych, gdyż nie ma do nich praw.

Następne okno dotyczy konfiguracji systemu autoryzacji. Wybieramy Enable MD5 passwords (umożliwia stosowanie dłuższych haseł) i Enable shadow passwords (trzyma zaszyfrowane hasła w pliku niemożliwym do odczytania przez zwykłego użytkownika).

W końcu dochodzimy do momentu wyboru pakietów do instalacji. Szczerze polecam wybranie wszystkiego (opcja select all na dole listy). Jeżeli nie jest to możliwe, mogę tylko doradzić uważne czytanie opisów pakietów i wybór najpotrzebniejszych rzeczy. System sam zatroszczy się o zależności między pakietami, zatem po instalacji wszystko powinno działać. Wybór pakietów, zwłaszcza jeżeli się nie wie co do czego, to zabawa na kilkadziesiąt minut. Ale w końcu do tego służy Linux, do zabawy. Zabawy w poznawanie dużego i złożonego systemu informatycznego.

Po wyborze pakietów mamy możliwość skonfigurowania X Window System do naszej karty graficznej. Jeżeli instalacja na tym etapie powiedzie się (przycisk Test this configuration) można konfigurację zostawić. Szczerze odradzam zaznaczanie opcji Use graphical login. Logowanie w X-ach można włączyć później, a w razie kłopotów (zawieszenia karty graficznej) będziemy mieli trudności z uruchomieniem systemu.

Następnie instalują się wybrane pakiety, po czym dostajemy możliwość utworzenia dyskietki startowej. Po reboocie system powinien podnieść się do pracy.

Linux zainstalowany!

powrót