A viděl Bůh, že vše, což učinil, bylo velmi dobré.
Genesis 1:31
Tato kapitola podává zevrubný přehled o operačním systému Linux. V první části jsou popsány nejdůležitější ze služeb, jež systém nabízí. Další části se bez poíliiných podrobností zabývají programy, které popsané služby realizují. Cílem kapitoly je podat výklad principů systému jako celku s tím, že každá část bude podrobněji probraná později, na jiném místě knihy.
Operační systém typu Unix se skládá z jádra systému a systémových programů. Uživatel systému pracuje s aplikačními programy. Jádro je srdcem operačního systému. Udržuje záznamy souborů na disku, spouští programy, řídí jejich současný běh, přiděluje paměť a další technické prostředky různým procesům, přijímá a odesílá pakety z a do počítačové sítě a tak dál. Jádro systému samotné toho dělá velmi málo, ale poskytuje základní služby různým nástrojům, pomocí kterých mohou být realizovány všechny ostatní služby. Jádro rovněž hlídá, aby nikdo nemohl přistupovat k zařízením přímo. Když chtějí uživatelé a procesy používat technické prostředky, musí používat nástroje, které nabízí jádro systému. Tímto způsobem je zabezpečená i vzájemná ochrana uživatelů. Nástroje jádra systému, o nichž byla řeč, lze využívat prostřednictvím volání systému (angl. system calls). Podrobnější informace o systémových voláních uvádí sekce 2 manuálových stránek.
Systémové programy realizují služby, které se vyžadují od operačního systému. Využívají při tom nástroje, které nabízí jádro systému. Systémové i všechny ostatní programy běží jakoby "na povrchu" jádra. Říká se tomu uživatelský režim (angl. user mode). Rozdíl mezi systémovými a aplikačními programy je v jejich určení. Pomocí aplikačních programů mohou uživatelé dělat některé užitečné věci (popřípadě se bavit - je-li aplikace, kterou si zrovna spustili, počítačová hra). Systémové programy jsou potřebné k tomu, aby systém vůbec fungoval.
Textový editor je aplikace, telnet je systémový program. Hranice mezi aplikačními a systémovými programy je často dost neostrá. Lze prohlásit, že takovéto rozdělení je samoúčelné - důležité čistě pro vymezení samotných klasifikačních kritérií.
Součástí operačního systému mohou být i překladače programovacích jazyků a jejich knihovny (v případě Linuxu knihovny překladačů GCC a C). Součástí operačního systému ale nejsou všechny programovací jazyky. Naopak, za jeho součást se často považuje dokumentace, někdy dokonce i některé hry. Tradičně se za operační systém pokládá obsah jeho instalační pásky, či instalačních disků. Pokud jde o systém Linux, není uvedená definice zcela jasná, protože na mnoha serverech FTP po celém světě existuje množství různých instalací systému.
Jádro Linuxu sestává z několika důležitých subsystémů. Jsou to části řízení procesů, správy paměti, ovladačů technických prostředků, ovladačů souborových systémů, správy sítě a různé další kusy a kousky.
Snad nejdůležitějšími subsystémy (bez nichž nic jiného nefunguje) jsou správa paměti a správa procesů. Subsystém správy paměti zajišťuje přidělování paměťových oblastí a odkládacího prostoru (angl. swap space) jednotlivým procesům, částem jádra a vyrovnávací paměti (angl. buffer cache). Subsystém správy procesů vytváří procesy a přepínáním mezi aktivními procesy, které využívají procesor, zabezpečuje multitasking.
Jádro systému na nejnižší úrovni obsahuje ovladače pro všechny druhy technických zařízení, které operační systém podporuje. Vzhledem k tomu, že na světě existuje celá řada různých typů hardwaru, je počet ovladačů zařízení velký. Je ale mnoho jinak podobných zařízení, které se často liší pouze v tom, jak spolupracují s programy. Takovéto podobnosti umožňují definovat obecné třídy ovladačů, jež podporují podobné operace. Každý člen takovéto třídy má stejné rozhraní k ostatním částem jádra. Liší se v tom, jak tyto operace implementuje. Například všechny ovladače disků vypadají pro zbytek jádra podobně. To znamená, že všechny znají operace jako "inicializuj diskovou jednotku", "čti sektor N" a "zapiš sektor N".
Některé softwarové služby, jež poskytuje jádro samotné, mají rovněž podobné vlastnosti. Proto mohou být také rozdělené do tříd. Ku příkladu různé síťové protokoly byly vyčleněné do jednoho programového rozhraní - knihovny "BSD socket library". Dalším příkladem je vrstva virtuálního souborového systému (angl. virtual filesystem, zkráceně VFS). Ta odděluje operace souborového systému od jejich implementace. Každý typ souborového systému obstarává implementaci určité množiny operací, společné všem systémům souborů. Když se některý z prvků systému pokouší využít určitý souborový systém, žádost jde přes VFS. Ten ji směřuje k požadovanému ovladači konkrétního systému souborů.
Tato podkapitola popisuje některé významnější služby systému Unix, avšak opět bez větších podrobností. Všechny služby budou později podrobně vysvětlené v dalších kapitolách.
Nejdůležitější služby v systému Unix poskytuje proces init. Spuštění procesu init (jako prvního z procesů) je v každém unixovém systému posledním krokem, který provede jádro systému při zavádění. Po spuštění proces init pokračuje v proceduře zavádění systému. Vykonává různé úkoly, které se při spouštění systému obvykle provádí (kontroluje a připojuje souborové systémy, spouští démony atd.).
Přesný seznam úloh, které init při zavádění dělá, závisí na verzi tohoto programu i operačního systému. Je na výběr několik možností. Proces init často obstarává tzv. jednouživatelský režim (angl. single user mode). V jednouživatelském režimu se do systému nemůže nikdo přihlásit. Příkazový interpret může z konzoly používat pouze superuživatel (správce).
Běžným režimem práce je víceuživatelský režim (angl. multiuser mode). Tyto režimy práce některé systémy Unix zobecňují do tzv. úrovní běhu systému (angl. run levels). Jednouživatelský a víceuživatelský režim tak představují dvě různé úrovně, na kterých může systém běžet. Kromě nich mohou existovat i další. Například úroveň, při které se na konzole spustí grafické rozhraní X Window a podobně.
V běžné situaci program init kontroluje, zda fungují procesy getty (umožňující uživatelům připojit se do systému) a adoptuje procesy - sirotky. Sirotci jsou procesy, jejichž rodičovské procesy byly z různých důvodů ukončeny - říká se, že "umoelii.. V systému Unix musí být všechny procesy součástí jediné hierarchické stromové struktury. Proto musí proces init sirotky adoptovat.
Když se systém vypíná, proces init zodpovídá za ukončení všech ostatních procesů, odpojení všech souborových systémů, zastavení procesoru a za vše ostatní, co má podle dané konfigurace udělat.
Přihlášení uživatelů prostřednictvím terminálů (pomocí sériových linek) a konzoly (v případě, že neběží X Window) do systému obstarává program getty. Proces init spouští zvláštní instanci getty pro každý terminál, ze kterého se bude možno do systému přihlásit. Program getty dále čte zadávané uživatelské jméno a spouští další program login, jenž čte přístupové heslo. Jestli jsou uživatelské jméno a heslo správné, spustí program login příkazový interpret neboli shell. Když je příkazový interpret ukončen - jakmile se uživatel odhlásí ze systému, nebo když je program login ukončen proto, že nesouhlasí uživatelské jméno a heslo - proces init to zjistí a spustí pro daný terminál novou instanci programu getty. Samotné jádro systému nemá vůbec pojem o přihlašování uživatelů do systému. Všechno kolem toho obstarávají systémové programy.
Jádro systému i mnoho systémových programů hlásí různé chyby, vypisuje varování a jiná hlášení. Velmi často je důležité, aby bylo možno tyto zprávy prohlížet později, dokonce i s velkým časovým odstupem. Je tedy vhodné je zapisovat do nějakých souborů. Program, který to má na starost, se jmenuje syslog. Lze jej nastavit tak, aby třídil zprávy a hlášení do různých souborů, a to podle původce, případně stupně významnosti. Hlášení jádra systému jsou obvykle směřována do jiného souboru, než hlášení jiných procesů a programů. Jsou většinou významnější a je potřeba číst je pravidelně, aby bylo možné rozeznat případné problémy v zárodku.
Uživatelé i správci systému často potřebují spouštět některé programy pravidelně. Například administrátor systému, který musí sledovat zaplněnost disku, by mohl chtít pravidelně spouštět příkaz, jenž by "vyčistili adresáře dočasných souborů (/tmp a /var/tmp). Program by odstranil starší dočasné soubory, které po sobě programy z různých důvodů korektně nesmazaly.
Takovéto služby nabízí program cron. Každý uživatel má vlastní tabulku crontab, jež obsahuje seznam příkazů, které chce vlastník spustit, a časy, kdy se mají tyto příkazy provést. Démon cron má na starost spouštění těchto příkazů v požadovaném čase. Služba at je podobná službě cron. Provede se ale jenom jednou. Příkaz je vykonán v určeném čase, ale jeho spouštění se neopakuje.
Unix a Linux nezačleňují uživatelská rozhraní do jádra systému. Místo toho je implementují pomocí programů uživatelské úrovně. To se týká jak textového módu, tak grafického uživatelského prostředí. Díky takovémuto řešení je samotný systém flexibilnější. Má to ale nevýhodu v tom, že je na druhou stranu velmi jednoduché implementovat pro každý program různá uživatelská rozhraní. Důsledkem je, že se takovýto systém uživatelé pomaleji učí.
Grafické prostředí, které Linux používá primárně, se nazývá "X Window System" (zkráceně X). Ale ani X přímo neimplementují uživatelské rozhraní. X Window pouze zavádí systém oken, tedy sadu nástrojů, pomocí kterých může být grafické uživatelské rozhraní implementované.
Tři z nejpopulárnějších stylů uživatelských rozhraní postavených na X jsou Athena, Motif a Open Look.
Komunikace pomocí počítačové sítě neboli síťování (angl. networking) je propojení dvou nebo více počítačů tak, že mohou komunikovat navzájem každý s každým. V současnosti používané metody propojování a komunikace jsou o něco komplikovanější, ale výsledný efekt stojí za to.
Operační systémy Unix mají řadu síťových funkcí. Většinu základních služeb - služby souborových systémů, tisky, zálohování atd., lze využívat i prostřednictvím sítě. To ulehčuje správu systému a umožňuje centralizovanou administraci. Zachovávají se výhody mikropočítačové technologie i přínos distribuovaných systémů (nižší náklady a lepší odolnost vůči poruchám).
Tato kniha se komunikací prostřednictvím počítačové sítě zabývá jenom zběžně. Podrobnosti o této problematice, včetně základního popisu principů počítačových sítí, přináší "Průvodce správce síti".
Přihlášení do systému ze sítě funguje trochu odlišně, než běžné přihlášení přes terminál. Pro každý terminál, prostřednictvím kterého je možné se přihlásit, je vyhrazená samostatná fyzická sériová linka. Pro každého uživatele, který se přihlašuje prostřednictvím sítě, existuje jedno samostatné virtuální síťové spojení. Tímto spojením se může realizovat libovolný počet běžných přihlášení. Proto není možné, aby běžely samostatné procesy getty pro všechna možná virtuální spojení. Kromě toho existuje několik různých způsobů přihlášení prostřednictvím sítě. Dva nejdůležitější způsoby v sítích TCP/IP jsou telnet a rlogin.
Síťová přihlášení mají místo řady procesů getty jednoho démona pro každý ze způsobů připojení (telnet a rlogin mají každý vlastního démona). Tento démon vyřizuje všechny přicházející žádosti o přihlášení. Dostane-li takovouto žádost, spustí svou novou instanci. Nová instance pak obsluhuje tuto jedinou žádost a původní instance nadále sleduje další příchozí žádosti o přihlášení. Nová instance pracuje podobně, jako program getty.
Jednou z nejužitečnějších věcí, kterou lze využít díky síťovým službám, je sdílení souborů pomocí síťového souborového systému (angl. network file system). Jeden z nejběžněji používaných typů se nazývá Network File System, zkráceně NFS, a byl vyvinut společností Sun.
V síťovém souborovém systému jsou všechny operace se soubory, které dělá program na jednom počítači, odesílány prostřednictvím počítačové sítě na jiný počítač. Pro program, který běží na lokálním počítači vzniká iluze, že soubory, které se nachází na vzdáleném počítači, jsou ve skutečnosti umístěny na počítači, na němž tento program běží. Takovýmto způsobem je velmi jednoduché sdílet informace, navíc lze používat již existující programy bez toho, že by je bylo potřeba měnit.
Elektronická pošta je obvykle tím nejdůležitějším způsobem počítačové komunikace. Elektronický dopis je uložený v souboru se zvláštním formátem. K jeho odeslání nebo přečtení se používají speciální programy.
Každý uživatel systému má vlastní schránku na příchozí poštu (angl. incoming mailbox). Je to soubor určitého formátu, ve kterém jsou uložené všechny nově příchozí zprávy. Když někdo odesílá poštu, program zjistí adresu poštovní schránky příjemce a připojí dopis k jeho souboru s příchozí poštou. Jestli je schránka příjemce na jiném počítači, je dopis odeslán na tento stroj a ten se bude snažit doručit jej do schránky příjemce.
Systém elektronické pošty se skládá z několika typů programů. Doručení pošty do místních nebo vzdálených poštovních schránek má na starost první z nich - agent pro přenos pošty (angl. Mail Transfer Agent - zkráceně MTA), např. sendmail nebo smail. Uživatelé používají ke čtení pošty množství různých programů, tzv. uživatelských poštovních agentů (angl. Mail User Agent - zkráceně MUA), např. pine nebo elm. Poštovní schránky uživatelů jsou obvykle uloženy v adresáři /var/spool/mail.
Tiskárnu může současně využívat pouze jeden uživatel. Nesdílet tiskárny mezi uživateli je ale dost neekonomické. Tiskárnu proto řídí program, jenž realizuje tzv. tiskovou frontu. Všechny tiskové úlohy všech uživatelů systému jsou zařazeny do fronty. Hned, jak tiskárna ukončí jednu úlohu, automaticky se jí odesílá další v pořadí. Uživatelé si nemusí zabezpečovat frontu požadavků na tisk organizačně a odpadá i nutnosti soupeřit a handrkovat se o přístup k tiskárně.
Program pro obsluhu tiskové fronty navíc ukládá metodou "spool" všechny tiskové výstupy na disk, takže pokud je tisková úloha ve frontě, je text uložen v nějakém souboru. Tento mechanismus aplikačním programům umožňuje rychle odeslat tiskové úlohy programu, jenž tiskovou frontu obsluhuje. Aplikace sama tak může pokračovat ve své práci. Nemusí čekat, než se úloha, která se právě tiskne, ukončí. To je v mnoha případech skutečně výhodné. Umožní vám to například zahájit tisk jedné verze dokumentu, přičemž nemusíte čekat, než se tisk ukončí, a můžete mezitím pracovat na nové, zcela pozměněné verzi.
Souborový systém je rozdělený na několik částí. Obvykle jsou hierarchicky uspořádané a nejvýše stojí kořenový souborový systém "root" (angl. root filesystem). Říká se mu rovněž kořenový svazek, označuje se "/". Souborový systém "root" obsahuje adresáře /bin, /lib, /etc, /dev a několik dalších. Dalším je systém souborů /usr. Obsahuje programy a data, která se nemění. Následuje souborový systém /var. Ukládají se v něm data, jež se naopak často mění (například tzv. log-soubory). Posledním je souborový systém /home.
Ukládají si v něm svá data a soubory uživatelé systému. Rozdělení souborového systému na jednotlivé svazky může být jiné. Závisí zejména na hardwarové konfiguraci systému a rozhodnutích jeho správce. Všechna data a soubory mohou být nakonec uložené i v jediném systému souborů.
Některé další detaily týkající se uspořádání systému souborů popisuje kapitola 3. Ještě více podrobností o tomto tématu přináší "Standard systému souborů operačního systému Linux".