Architektura Linuxu


I still maintain the point that designing a monolithic kernel in 1991 is a fundamental error. Be thankful you are not my student. You would not get a high grade for such a design :-)

-- Andrew Tanenbaum to Linus Torvalds

Na rozdíl od Microsoft Windows a jemu podobných, operační systém Linux není jednolitý, magický, celek. Je tvořen z mnoha částí, kde se každá stará o určitou část chodu systému. Každá tato část je podrobně zdokumentována tak, aby každou z nich mohl vyvíjet oddělený tým. Je podstatné se v této architektuře orientovat, protože pokud něco nefunguje a vy víte, kdo je za to zodpovědný, je váš úkol mnohem snazší.

Jádro systému

Jádro systému (tedy vlastní Linux) se zavádí při startu systému a zaručuje nejzákladnější operace. Svůj návrh dědí po operačním systému Unix, který ve své době způsobil převrat tím, že jádro jasně oddělil od zbytku systému a vypustil z něj většinu zbytečných služeb. To je vlastně důvod úspěchu Unixu. Protože je jádro úplně hloupé, velmi pomalu zastarává a tak i dnes, 30 let po svém vzniku je Unix řazen mezi moderní operační systémy.

Jádro Linuxu zodpovídá za:

Zprostředkování k přístupu k periferiím.
Přístup k periferiím je ožehavou záležitostí. Je možné tím počítač zablokovat a nebo i zničit. Navíc k jednomu zařízení většinou nemůže přistupovat více programů zároveň. To se prochází s filosofií Unixu, kde by běžné programy neměly stabilitu systému ohrožovat a kde zároveň pracuje mnoho uživatelů a běží mnoho procesů.

Proto je nutné, aby jádro procesy na hardware nepustilo a všechny přístupy dělalo za ně. Jednou z nejgeniálnějších myšlenek Unixu je, že veškerý tento přístup sjednotil pod práci se soubory. Hardwarová zařízení (třeba floppy disk) jsou pak pouze speciální soubory. Zápisem do takového soubory pak píšete na disketu. To umožňuje, aby i programy, které nejsou určeny pro práci se zařízením s ním pracovaly a ušetří se tak čas programátorovi, který se nemusí učit nové API.

Pokud hardware umí nějaké triky, které se špatně schovávají pod práci se souborem, může podporovat IOCTL, kterým se například nastavuje formát diskety, nebo samplovací frekvence při výstupu na disk.

O jednotlivé zařízení se starají ovladače, které v původním Unixu byly napevno zakompilované do jádra. To je poněkud nepříjemné, protože při změně hardwaru musíte překompilovávat jádro. Linux dnes podporuje dynamické zavádění těchto ovladačů pomocí modulů.

Linux má v poslední době velice dobrou podporu nejrůznějších periferií a mnoho hardwarových firem již distribuuje jejich vývoj. Přesto je ale dobré konzultovat seznam podporovaného hardware, než si něco nového koupíte.

Řízení procesů
Každý program běžící v Linuxu je proces. Tento proces je samostatná entita a jádro mu zprostředkovává své služby. Linux má preemptivní multitasking a používá ochranu paměti a tak proces se v podstatě cítí, jako kdyby běžel sám na čistém počítači. Některé operace jsou mu však odepřeny (jako už zmíněný přístup k periferiím), o které musí požádat jádro.

Mezi základní operace pro práci s procesy, které jádro umí je rozdělení procesu na dva běžící zároveň (fork) a vyměnění kódu běžícího procesu (exec) - daný proces se ukončí a je nahrazen novým programem.

Na rozdíl od klasického Unixu, Linux podporuje i multithreading.

Správa paměti
Jádro používá stránkování k vytvoření virtuální paměti. Každý proces má svůj oddělený adresní prostor a tak si programy nevidí navzájem "do karet" a nemůžou se navzájem ohrozit. Také nevidí do paměti jádra a tak nemohou ohrozit ani to. Jádro dovoluje procesu jeho adresní prostor modifikovat. Umí "namapovat" soubor na danou pozici - v paměti je pak vidět obsah daného souboru, který jádro v případě potřeby nahraje, nebo obnoví na disku (pokud program paměť modifikoval). Sdílet určitou část paměti mezi procesy apod.

Standardně se paměť procesu skládá z jeho kódu (který program nemůže měnit), neomezeně rostoucího zásobníku a z druhé strany adresního prostoru rostoucí haldy.

Navíc jádro vytváří virtuální paměť a odkládá části na disk, pokud to je třeba.

Jádro Linuxu obsahuje velmi kvalitní správu paměti. Mezi jeho přednosti patří:

  • Disková cache, která se dynamicky mění podle velikosti volné paměti.
  • Zavádění programu "po kouskách" - při startu programu se jeho kód nenahraje celý do paměti. Nahraje se pouze jeho první stránka a program se spustí. Pokud potřebuje další stránky, tak se mu nahrají později. Toto zrychluje start programů a šetří paměť.
  • Zpožděné přidělování paměti - pokud program požádá o volnou paměť, jádro si to pouze zapamatuje a přidělí ji až v době, kdy ji program začne používat.
  • Zpožděné kopírování paměti - když se běžící proces rozdělí na dva, jeho paměť by se měla zkopírovat. To se ale nestane a kopie se vytváří se zpožděním až v situaci, když jeden z programu začne do ni zapisovat.
Plánování procesů
Unix od počátku podporuje preemptivní multitásking a tak může běžet více programů zároveň. Linux přepíná procesy 100 krát do sekundy (a multitásking je tak plynulejší, než na většině ostatních systémů).
Bezpečnost
Unix je navržen jako multiuživatelský operační systém a tak jádro musí zpracovávat přístupová práva. Bezpečnostní model Unixu je velmi jednoduchý a dnes trochu zastaralý. Pro běžné použití však plně postačuje.

Unix zavádí pojem uživatele a skupiny, které se v jádře udávají jako čísla. Každý proces má svého uživatele a skupinu. Prostředky pak mají své vlastníky a skupiny mají nastavena přístupová práva zvlášť pro svého majitele, svoji skupinu a ostatní. U souborů jsou vždy tři základní parametry - přístup ke čtení, zápisu a spuštění.

Navíc Unix předpokládá existenci správce - speciálního uživatele "root", s identifikačním číslem 0. Tento uživatel může dělat vše, bez přihlédnutí k přístupovým právům. Navíc jádro zprostředkovává několik služeb pouze pro něj - například jako jediný má právo rebootovat systém.

Někdy však někdy chce správce (nebo i jiný uživatel) "propůjčit" uživateli nějaká práva. Například mu chce dovolit rebootovat systém, existuje ještě jedna berlička jménem "sbit". Má-li soubor s programem tento bit nastaven, program má povoleno na sebe převezmout přístupová práva vlastníka souboru. Tak například program "reboot" spuštěn normálním uživatelem na sebe může vzít práva superuživatele a restartovat systém.

Toto je poněkud nebezpečný trik, protože v případě, že program označený sbitem obsahuje chybu, a uživatel jej může donutit k tomu, aby udělal co potřebuje, vznikne bezpečnostní díra v systému. Je tedy třeba si na takové programy dát zvláštní pozor.

Díky tomu některé pozdější systémy existenci takto všemocných uživatelů ruší a zavádějí flexibilnější systém uživatelských práv. Linux zatím nic takového standardně neumí, i když se na tom pracuje. Tyto přístupy však mají jiná úskalí.

Obsluha filesystému
Unix jako jeden z prvních zavedl systém adresářů. Na rozdíl od Windows rozlišuje malá a velká písmena a podporuje některé další triky - jeden soubor může mít několik názvů, je možné vytvářet symbolické linky (které ukazují na jiný soubor a při jejich otevření se vlastně otevře odkazovaný soubor) a podporuje vytváření speciálních souborů - "devices", které odkazují na ovladače v jádře a pomocí kterých pak přistupujete na periferie, a FIFO - pojmenované fronty používané pro komunikaci mezi procesy.

Na rozdíl od Unixu, Linux obsahuje abstrakci mezi vlastním ovladačem filesystému a systémovým voláním. Umožňuje tak vyjma svého vlastního filesystému (ext2) i pracovat s jinými filesystémy: adfs, affs, coda, efs, msdos, vfat, hfs, hpfs, isofs minix, ncpfs, nfs, ntfs, qnx4, sysv, ufs, romfs, smbfs. A tak se domluví s většinou ostatních operačních systémů.

Na rozdíl o Windows v Unixu neexistují pojmenované disky (a:, c: apod.). Všechny disky jsou "naroubovány" do podadresářů hlavního filesystému. Roubování a odroubovávání filesystému se provádí voláním mount a umount.

Podpora sítě
Unix byl jeden z prvních operačních systémů, které se adaptovaly na použití protokolu TCP/IP. A proto Linux má dnes velmi dobrou podporu Internetových protokolů. Jeho TCP/IP stack patří k nejspolehlivějších a nejrychlejším vůbec.

Linux podporuje mnoho speciálních triků, jako je firewall, nebo Masquerading, který dokáže připojit celou síť k internetu pomocí jedné IP adresy. Proto je Linux jeden z nejlepších operačních systémů pro síťové servery.

Vyjma TCP/IP Linux podporuje i některé další protokoly například appletalk, nebo ipx. Proto poslouží třeba i jako "Novellový" server.

Pro práci v síti Linux používá API BSD soketů, které je dnes nejrozšířenější.

Komunikace mezi procesy
Klasický Unix podporoval komunikaci pomocí signálů a pipe (fronta, do které jeden proces zapisuje a druhý čte). Dnešní Unixové systémy podporují mnoho dalších primitiv, jako je sdílená paměť, zámky, semafory, zprávy apod.

Standardní knihovna

Rozhraní mezi jádrem a programem tvoří standardní knihovna jménem glibc. Ta na rozdíl od jádra sídlí v paměti procesu a tak její vývoj už není tak složitý. Proto se v Linuxu stará i o některá volání, která v klasickém Unixu provádí jádro. Knihovna navíc obsahuje standardní funkce požadované pro jazyk C a mnoho dalších vymožeností. Knihovna je sdílená a proto není zalinkována do každého programu a je v paměti pouze jednou. O její zavedení se stará při startu programu dynamický loader. Na disku ji najdete v adresáři /lib.

Standardní utlity a start systému

Hned po startu jádra převezme řízení program init, který pomocí souboru /etc/inittab má za úkol nastartovat systém. K tomu se používá bezpočet malých Unixových utilit se kterými se seznámíte později. Mezi nejdůležitější asi patří shell - interpretr příkazů, který zpracovává startovací skripty (uložené většinou v /etc/rc.d) a se kterým se setkáte po přihlášení. V Linuxu se používá nejčastěji bash z GNU projektu. Shell standardně najdete v /bin/sh.

Sytém při startu dělá několik důležitých věci:

Konfigurační soubory Linuxu najdete v adresáři /etc. Na rozdíl od Windows jsou to normální textové soubory a tak je můžete opravovat textovým editorem. To dodává velkou kontrolu na systémem a konfiguraci značně zjednodušuje. Pokud máte v oblibě user friendly okénka, existuje několik nástrojů, které soubory změní za Vás.

Práce v Unixu

Narozdíl od Windows a MS-DOSu Unix obsahuje mocnou příkazovou řádku. Jeho interpretr příkazů je mnohem chytřejší, a podporuje základní programátorské obraty - smyčky, funkce apod. Téměř všechny standardní utility v Unixu jsou jednoduché filtry, které čtou text ze vstupu, provádí operaci a posílají ji na výstup. Jejich kombinací můžete snadno dělat velmi komplikované operace a proto každému doporučuji naučit se při kazovou řádku dobře používat. Oproti cvakání myší ušetří mnoho času a práce.

Pokud toužíte po grafice a user friendly vymoženostech, můžete ale číst dál.

X window system

Do samotné filosofie Unixu grafika moc nezapadá. Proto je řešena odděleným systémem zvaným X Window system (krátce X, nebo X11). Jedná se o jedno z nejstarších okenních prostředí (1985), ale díky zajímavému návrhu se používá dodnes.

Základem X je grafický server, který je navržen tak, aby komunikoval s aplikací pomocí síťových soketů. To umožňuje, aby aplikace běžela na jednom počítači, ale zobrazovala se na druhém. Původně autoři zamýšleli, že aplikace poběží na sálovém počítači a Xserver bude speciální hardware. To se sice dnes moc nepoužívá, přesto ale není od věci mít možnost spustit program přes síť. Navíc do dává možnost, aby se k počítači připojilo více klávesnic a monitorů a pracovalo na něm tak více uživatelů.

Server obsahuje pouze nejzákladnější primitiva pro práci s grafikou (i když v průběhu let se díky snaze stále odpovídat moderním vymoženostem značně zkomplikoval). Vzhled aplikace už není jeho starost. Dokonce se nestará ani o dekorace oken, které ma na starosti zvláštní aplikace jménem WindowManager. O vzhled tlačítek a menu se zase stará speciální knihovna, kterou obsahuje aplikace.

Dále X systém obsahuje knihovnu Xlib, která se stará na aplikační straně o síťovou komunikaci, několik základních utilit a dnes zcela zastaralý window-manager twm a GUI toolkit Athena (který ale na svoji dobu obsahoval revoluční objektově orientovanou technologii a umožňoval vytvářet dialogy bez pevně zadrátovaných souřadnic, tak aby se přizpůsobovaly velikosti písma a délce textů)

Flexibilní návrh X je sice moc pěkný, ale vedl k problémům. Vzniklo totiž mnoho Window managerů a mnoho GUI toolkitů a tak každá aplikace vypadala dost jinak a aplikace spolu moc nespolupracovaly. To se podařilo řešit až v poslední době, kdy díky projektům GNOME a KDE, se prosadily jako defakto standard prosadily dvě knihovny (GTK a QT) a používá se jen několik málo Window managerů, jejichž schopnosti jsou téměř identické.

Proto doufám, že tento odvěký problém X se brzy stane minulostí. Další nevýhodou je poměrně velká složitost (a tím i náročnost na paměť), která vznikla snahou přizpůsobit se všem grafickým vymoženostem za 30 let. Jeho komplikovanost ale není větší, než u Windows či MacOS.

O společnou část kódu X se stará organizace Open Group (dříve X consorcium), která své kódy zpřístupňuje dalším firmám, které dodělávají podporu pro danou platformu. Free softwarovou implementace X vyvíjí organizace XFree86.

GNOME a KDE

Uživatelsky přítulné grafické desktopy dlouho Linuxu chyběly. Zhruba před rokem však vznikly dva konkurenční projekty GNOME a KDE, které oba mají za úkol takový desktop vytvořit. První stabilní verze obou projektů vznikly jen před několika málo měsíci. Dnes jsou to však velmi pokročilé projekty, které snad uspokojí každého okenního uživatele.

Tyto projekty byly poměrně důležitým mezníkem ve vývoji Linuxu, protože v podstatě odstartovaly seriózní snahy udělat Linux vhodný pro "normální uživatele". Za poslední rok vznikl grafický program GIMP, který odpovídá známému Photoshopu a rozjelo se několik projektů o vytvoření kancelářského balíku pro Linux. Uvidíme, jak budou úspěšné.