Budowa systemu operacyjnego Linux

Linux to system wielodostępny i wielozadaniowy, z pełnym zestawem narzędzi zgodnych z systemem UNIX. System plików pasuje do tradycyjnej semantyki uniksowej, zrealizowano też w pełni sieciowy standard systemu UNIX. Na wewnętrzne szczegóły projektu Linux wywarły duży wpływ kolejne jego powstawania. Dziś Linux może z powodzeniem działać na maszynie wieloprocesorowej z setkami megabajtów pamięci operacyjnej i wieloma gigabajtami przestrzeni dyskowej, a jednocześnie wciąż jest w stanie pracować poprawnie z pamięcią RAM mniejszą niż 4 MB. System Linux zaprojektowano tak, aby pozostawał w wyraźniej zgodzie z istotnymi opisami standardu POSIX. Oficjalne certyfikaty komitetu normalizacyjnego POSIX zdobyły co najmniej dwie dystrybucje systemu Linux.

Na mocy ustaleń zastępczych, interfejs programisty w systemie Linux odpowiada semantyce systemu SVR4 UNIX, a nie zachowaniu systemu BSD. Do realizacji semantyki BSD w miejscach, gdzie oba sposoby działania istotnie się różnią, służy oddzielny zbiór bibliotek.

Składowe systemu Linux

System Linux składa się z trzech głównych fragmentów kodu, zgodnych z większością tradycyjnych implementacji systemu UNIX. Są to:

  • Jądro: Jest odpowiedzialne za realizację wszystkich istotnych abstrakcji systemu operacyjnego, łącznie z takimi elementami, jak pamięć wirtualna i procesy.

  • Biblioteki systemowe: Definiują standardowy zbiór funkcji, za pomocą których aplikacje mogą współdziałać z jądrem i które realizują wiele właściwości systemu operacyjnego nie wymagających pełnych przywilejów kodu jądra.

  • Pomoce systemowe: Są programami, które wykonują osobne, specjalizowane zadania administracyjne. Z niektórych pomocy systemowych można korzystać tylko jeden raz w celu zapoczątkowania i skonfigurowania pewnych elementów systemu; inne (w terminologii unixowej na-zywane demonami) mogą działać nieustannie, obsługując takie zadania, jak odpowiadanie na sygnały nadchodzące z sieci, przyjmowanie z terminali zamówień na rozpoczęcie sesji lub uaktualnianie plików z dziennikami zdarzeń systemowych.

Na rysunku 2.1 widać różne części, z których składa się system Linux. Najważniejsza linia podziału biegnie tu między jądrem a wszystkim innym. Cały kod jądra jest wykonywany w uprzywilejowanym trybie procesora, z pełnym dostępem do wszystkich fizycznych zasobów komputera. W systemie Linux ów uprzywilejowany tryb nazywa się trybem jądra (ang. Kornel mode) i jest równoważny trybowi monitora . W jądro systemu Linux nie jest wbudowany żaden kod działający w trybie użytkownika. Zamiast tego wszelki kod wspierający system operacyjny, a nie wymagający wykonywania w trybie jądra, umieszczono w bibliotekach systemowych.

 

rys.2.1.Składowe sytemu Linux

 

Cały kod jądra i wszystkie struktury danych są trzymane w jednej przestrzeni adresowej, więc gdy proces wywołuje funkcję systemu operacyjnego albo gdy sprzęt zgłosi przerwanie, nie ma potrzeby przełączania kontekstu. W tej samej przestrzeni adresowej przebywa nie tylko kod centralnego planowania i pamięci wirtualnej, lecz także cały kod jądra ze wszystkimi modułami obsługi urządzeń, systemami plików i oprogramowaniem sieci.

Jądro systemu Linux może dynamicznie ładować (i rozładowywać) moduły podczas pracy. Jądro nie musi obowiązkowo wiedzieć z góry, które moduły będą potrzebne - są to elementy ładowalne w pełni niezależnie.

Jądro Linux tworzy rdzeń systemu operacyjnego Linux. Jądro realizuje całość cech wymaganych, aby zasłużyć na miano systemu operacyjnego. Jednak system operacyjny tworzony przez samo jądro Linux ma niewiele wspólnego z systemem UNIX. Interfejs systemu operacyjnego, widoczny dla wykonywanych aplikacji, nie jest bezpośrednio realizowany przez jądro. Zamiast tego programy użytkowe odwołują się do bibliotek systemowych (ang. system libraries), w których z kolei następują niezbędne odwołania do usług systemu operacyjnego.

Biblioteki systemowe dostarczają wielorakich działań. Na najprostszym poziomie pozwalają one aplikacjom zamawiać systemowe usługi jądra. Odwołanie do systemu wymaga przekazania sterowania z nieuprzywilejowanego trybu użytkownika do uprzywilejowanego trybu jądra. Szczegóły tego przejścia zmieniają się w zależności od rodzaju architektury. Biblioteki dopilnowują zbierania argumentów wywołań funkcji systemowych i w razie konieczności nadawania tym argumentom specjalnej postaci, niezbędnej do wykonania wywołania.

Biblioteki mogą również dostarczać bardziej złożonych wersji podstawowych funkcji systemowych. Na przykład wszystkie funkcje buforowanych działań na plikach w języku C są zrealizowane w bibliotekach systemowych, umożliwiając bardziej zaawansowane sterowanie plikowymi operacjami wejścia-wyjścia niż to zapewniają podstawowe funkcje systemowe jądra. Biblioteki zawierają także podprogramy, które nie mają odpowiedników w odwołaniach do systemu, takie jak algorytmy sortowania, funkcje matematyczne i operacje na napisach. Wszystkie funkcje niezbędne do wspierania działań aplikacji standardu UNIX lub POSIX są zaimplementowane właśnie w bibliotekach systemowych.

System Linux zawiera ponadto szeroki repertuar programów działających w trybie użytkownika - zarówno pomocy systemowych, jak i narzędzi dla użytkowników. W skład pomocy systemowych wchodzą wszystkie programy niezbędne do rozpoczęcia pracy systemu, takie jak programy do konfigurowania urządzeń sieciowych lub do ładowania modułów jądra. Programy serwerów pracujące nieustannie też zalicza się do pomocy systemowych. Obsługują one rozpoczynanie sesji przez użytkowników, sygnały nadchodzące z sieci oraz kolejki do drukarek.

Środowisko użytkownika systemu UNIX zawiera dużą liczbę standardowych pomocy do wykonywanych prostych, codziennych prac, takich jak wyprowadzenie zawartości katalogów, przemieszczanie i usuwanie plików lub wyświetlanie zawartości pliku. Bardziej skomplikowane narzędzia mogą przetwarzać teksty, na przykład porządkować dane tekstowe lub poszukiwać w tekście wejściowym zadanych wzorców. Łącznie pomoce te tworzą standardowy zestaw narzędziowy, którego użytkownicy mogą się spodziewać w każdym systemie uniksowym. Choć nie wykonują one żadnej funkcji systemu operacyjnego, pozostają ważną częścią podstawowego systemu Linux.

Dyski i partycje

Partycje, na których znajdują się dyski logiczne w systemach typu windows są widziane od razu, jednakże w Linuxie tak nie jest. Dlaczego? Ponieważ lepiej jest gdy samemu się decyduje kiedy chcemy, aby były widziane dane dyski. W Linuxie zatem zanim zobaczymy jakiś dysk trzeba go najpierw zamontować. Windows montuje automatycznie na samym początku ładowania systemu, robi to też automatycznie, gdy zmieniamy dyskietkę lub cd-rom. Jest jeszcze jedna różnica miedzy systemem windows a linux.

W Windowsie (DOSie) wszystkie dyski są widoczne pod nazwami A: B: C: D: E: F: G: H: itd. Dyski dostają odpowiednią literkę w zależności od tego, który jest pierwszy. W linuxie jest zupełnie inna sytuacja. Na początku, przy włączaniu systemu montuje się główny system plików, który oczywiście ma jakieś katalogi. Aby zamontować jakiś dodatkowy dysk trzeba wybrać sobie, do którego katalogu w systemie plików mamy podmontować ten dysk. Może to być dowolny, pusty katalog. To daje nam pewną elastyczność co do nazw tych dysków. Możemy je nazywać jakkolwiek chcemy. W windows’ie tego nie możemy zrobić, muszą się nazywać jedną z literek alfabetu. Można jeszcze wspomnieć, że w tej chwili można już odpowiednio skonfigurować Linuxa do tego, aby zachowywał się tak, jak windows i montował automatycznie CD-ROMy i stacje dysków wtedy tylko, gdy chcemy je używać.

Krotki opis organizacji katalogów

Poniżej znajduje się minimalny zestaw katalogów dla naszego głównego systemu plików:

/dev – urządzenia, wymagane do operacji wejścia/wyjścia,
/proc – katalog wymagana przez system plików proc,
/etc – pliki konfiguracyjne systemu,
/sbin – programy krytyczne dla działania systemu,
/bin – podstawowe programy uważane za część systemu,
/lib – biblioteki dzielone,
/mnt – miejsce montowania innych systemów plików,
/usr – dodatkowe narzędzia i aplikacje,
/var – znajduje się w nim wiele plików z informacjami o działaniu systemu i nie tylko,
/home – katalog przeznaczony na podkatalogi użytkowników,
/tmp – składowane są tam przeważnie pliki tymczasowe.

/dev - katalog ten zawiera specjalne pliki dla każdego wykorzystywanego przez system urządzenia, katalog ten jest obowiązkowy. Jest to zwykły katalog, więc może zostać stworzony poleceniem mkdir. Jednak poszczególne pliki urządzeń muszą zostać utworzone w nietypowy sposób, za pomocą komendy mknod. Dobrym pomysłem jest usunięcie niepotrzebnych urządzeń z katalogu (kompilacja jądra o czym będzie później). Wiele urządzeń jest kompletnie nieprzydatnych w konkretnych systemach. Na przykład jeśli nie posiadasz żadnych dysków SCSI, możesz bez żadnych problemów usunąć wszystkie urządzenia zaczynające się na sd. Jeśli nie masz zamiaru korzystać z portu szeregowego, możesz usunąć wszystkie pliki zaczynające się od cua.

/etc - ten katalog zawiera większość plików konfiguracyjnych. Oprócz nich znajdują się tam pliki, które zawierają informacje, kto, gdzie i jaki ma dostęp do odpowiednich usług, katalogów i plików. Niektóre pliki znajdują się tam we wszystkich systemach Linuxowych, niektóre zaś w zależności od dystrybucji. Aby było łatwiej orientować się w katalogu tym są jeszcze podkatalogi.

/bin i /usr/bin - katalog zawiera wiele programów, bardzo często używanych w czasie pracy na systemie. Programy opowiadające za kopiowanie, przenoszenie, kasowanie plików, tworzenie katalogów, modyfikowanie praw itd. Jest ich tam naprawdę dużo. Przeważnie do tych plików mają dostęp wszyscy użytkownicy systemu.

/sbin i /usr/sbin - tutaj znajdują się programy pozwalające konfigurować system. Dostęp do nich może być zabroniony dla zwyczajnych użytkowników, choć nie musi, ponieważ zwykły użytkownik nie będzie specjalnie ich potrzebował. Administrator systemu zaś bardzo często ich używa.

/lib - w katalogu umieszczane są potrzebne biblioteki dzielone oraz programy służące do ich ładowania. Jeśli wymagane biblioteki nie zostaną odnalezione w katalogu /lib, to system nie wystartuje. Przy odrobinie szczęścia możesz ujrzeć komunikat mówiący o błędzie. Prawie każdy program wymaga co najmniej biblioteki libclibc.so.N, gdzie N to numer wersji.

/var - w katalogu znajdują się pliki, gdzie składowane są logi systemu. Chodzi o to, aby administrator mógł zobaczyć co się działo w systemie, kiedy podczas jego nieobecności. Bardzo pomaga to w wykrywaniu czy przypadkiem coś złego nie zaczyna się dziać, czy przypadkiem ktoś nie próbował się włamać na system lub czy tego już nie zrobił. Znajdują się tez tam pliki, w których składowana jest poczta elektroniczna, na użytkowników systemu i wiele innych.

/mnt - katalog przeznaczony jest do tego, aby zamontować tam inne dyski. Zamontować dodatkowy dysk możemy w każdym (pustym) katalogu. Powoduje to, że jak się wchodzi do tego katalogu to wchodzimy na dysk zamontowany. Gdy zaś nie zamontujemy tam żadnego dysku katalog będzie pusty.

/proc - jeden z ciekawszych katalogów. Znajdują się w nim pliki i katalogi, które są tworzone dynamicznie przez system. Każdy aktualnie włączony w systemie program posiada podkatalog w tym katalogu. Są w nim pliki z opisem, np. kto włączył dany program, z jakiego katalogu go włączył, ile program zabiera pamięci itd. W katalogu tym znajdują się tez informacje dotyczące systemu. Jakie karty PCI są zainicjowane, jaki jest procesor w systemie, ile ma pamięci i tego typu informacje.

/home - katalog ten zawiera podkatalogi użytkowników, ponieważ każdy użytkownik w systemie powinien mieć własny katalog, aby mógł zapisywać sobie tam różne swoje dane, ponieważ przeważnie nigdzie indziej nie może tego robić oprócz katalogu /tmp. Często też znajdują się tam katalogi, w których są składowane różne inne dane, np. katalog z plikami HTML dla głównej strony serwera albo katalog z plikami, które są dostępne na publicznym FTP.

/tmp - w tym katalogu składowane są tymczasowe pliki w czasie pracy.

System wielu użytkowników

Jak możemy się domyśleć pierwszą czynnością przed rozpoczęciem pracy na systemie typu Linux jest zalogowanie się. Wygląda to w ten sposób, że podajemy swój login, czyli nazwę użytkownika i później uwierzytelniamy się podawanym hasłem, aby udowodnić systemowi, ze to naprawdę my. Aby jednak to zrobić musimy mieć założone konto na tym systemie. Zakłada nam je użytkownik, który jest administratorem w systemie. Jak on to robi? Sprawa jest dość prosta. W systemie są dwa pliki, w których mamy informacje na temat tego, jacy użytkownicy mogą się zalogować na system, i różne inne, jak np. gdzie znajduje się jego katalog domowy, czyli katalog, który należy do niego i może w tym katalogu robić sobie co dusza zapragnie, do jakiej grupy użytkowników należy, gdyż każda grupa może mieć różne prawa dostępu do zasobów systemu itd.

Można jeszcze powiedzieć, że istnieje w systemie linux użytkownik, który ma prawa do wszystkiego na systemie. Nazywa się „root”. Jest to administrator systemu. On jest bogiem na systemie, nie możesz mu nic zabronić.