Kapitola 5. Architektura GNU/Linuxu

Obsah

Od hardwaru až k aplikaci
Jádro, kernel, Linux
Kernel panic a oops
Číslování verzí jádra
Vanilla a distribuční jádra
Kompilace jádra
Iniciální ramdisk (initrd)
Předávání parametrů jádru
Soubory a adresáře
Souborové systémy, diskové oddíly a pevné disky
Soubory
Adresářová struktura
Adresářová struktura a software
Uživatelé a skupiny
Přístupová práva
Práva adresářů
Speciální práva
Sticky bit
SetUID a SetGID
Procesy
Řízení procesů
Signály
Démoni
Uživatelská rozhraní
Textový režim, shell
Grafické rozhraní
Grafický desktop
Okenní manažer (window manager)
Běh systému
Spuštění systému
Úrovně běhu (runlevely) a startovací skripty
Síť a servery
Síť
Druhy připojení
Zasíťování
Servery
Firewall
Zdroje a odkazy

Pokud chceme efektivně spravovat GNU/Linux, musíme porozumět tomu, jak vlastně funguje. Musíme se podívat "pod kapotu" a pochopit, jaké principy leží pod slupkou grafických rozhraní a pomocných grafických nástrojů pro konfiguraci. Vzhledem k tomu, že GNU/Linux je unixový systém, očekávejte v dokumentaci velmi časté zmiňování o "unixových systémech", jelikož se převážně jedná o obecně platné principy.

Základní charakteristika GNU/Linuxu je modulárnost. To znamená, že se sestává z mnoha relativně nezávislých částí. Pro většinu z nich navíc existují alternativy, a proto vždy záleží na správci distribuce, jak systém sestaví. Modulárnost také vysvětluje rozdíly mezi jednotlivými distribucemi. I když je vše GNU/Linux, odlišnosti bývají natolik markantní, že při přechodu na jinou distribuci může být uživatel minimálně lehce zmaten. Já vám budu sdělovat informace nezávislé na zvolené linuxové distribuci.

Modularita vychází z unixové filozofie. Ta je založena na existenci mnoha jednoduchých programů, které provádí jednu věc, ale provádí ji velice dobře. Jejich kombinací prostřednictvím příkazové řádky lze dosáhnout přesně toho, co člověk potřebuje. Tyto prográmky tvoří základ každého unixového systému a i když je člověk nechce využít, je dobré alespoň vědět, že tam jsou.

Je jasné, že GNU/Linux už dávno není pouze o příkazové řádce. Je to komplexní systém nabízející přívětivá grafická rozhraní a klasická integrovaná řešení (jeden program realizující mnohé). Podstatné je, že to vše stojí na pevném unixovém základě a je jenom na uživateli, jestli bude pracovat v pohodlí grafického rozhraní, jestli se posune níže nebo jestli obojí zkombinuje. Volba je na vás.

Většina záležitostí se v unixovém systému realizuje prostřednictvím souborového systému. Narozdíl od jiných systémů, v unixových systémech existuje pouze jediná adresářová struktura, do které se připojují všechy další souborové systémy (tj. média, síťové disky, flash disky, apod.). Práce se systémem i práce s hardwarem je de facto prací se soubory, neboť v unixových systémech platí heslo "vše je soubor", tudíž v těchto systémech je i vaše tiskárna či pevný disk soubor, se kterým lze zacházet prostřednictvím obslužných programů, nebo přímo pomocí unixových nástrojů.

Unixová architektura je jednoduchá, vnitřně konzistentní, a umí velmi dobře využívat svých výhod. Kupříkladu, pravidlo "vše je soubor" koresponduje s výše zmíněným pravidlem o mocných nástrojích, které mj. velmi dobře pracují se soubory. To je důvodem, proč jsou tyto systémy stále tolik populární.

Navíc už od počátku byly tyto systémy navržené jako víceúlohové a víceuživatelské, a proto s nimi může bez problémů a bezpečně pracovat více uživatelů, třeba i najednou. Uživatele jednouživatelského počítače bude z těchto vlastností zajímat ona zmiňovaná bezpečnost. Tu zajišťuje systém oprávnění, který dává uživatelům pocit jistoty, že dokud nezískají oprávnění uživatele root (superuživatele), nemohou systém poškodit.

Od hardwaru až k aplikaci

Hierarchie komponent GNU/Linuxu začíná jádrem systému, tedy kernelem. Ten zodpovídá za ty nejzákladnější funkce, inicializace hardware a jeho prostředky poskytuje programům podle specifických pravidel. Zároveň hlídá oprávněnost přístupu k jednotlivým prostředkům, a zajišťuje tak bezpečí samotného systému. Programům poskytuje svoje programátorské komunikační rozhraní zvané API.

Nad jádrem stojí knihovny v čele s libc (knihovna poskytující ty nejzásadnější funkce, součást projektu GNU). Knihovna je soubor funkcí, které mohou programy volat. Díky tomu si s sebou prohlížeče obrázků nemusí vláčet schopnost zpracovat obrázek PNG. Prostě zavolá patřičné funkce knihovny libpng, která vše zařídí. Toto oddělení funkcionality má nesporné výhody. Pokud někdo nalezne způsob, jak zpracovávat tyto obrázky rychleji, stačí mu pozměnit knihovnu a všechny programy, které pracují s těmito obrázky, tuto vlastnost okamžitě přebírají.

Má to ovšem i stinné stránky. Knihovny se vyvíjejí a svoje komunikační rozhraní mění. Může se stát, že starší program bude vyžadovat starší verzi knihovny. V GNU/Linuxu s tím není problém, protože číslo její verze je součástí názvu patřičného souboru, takže můžete mít v systému současně nainstalováno více verzí jedné knihovny. Dále je jasné, že výše zmíněný prohlížeč obrázků bez správné knihovny odmítne fungovat. Proto je nutné zajistit, aby měl program k dispozici všechny potřebné knihovny.

Knihovny tedy stojí mezi jádrem a programy, ale samotné programy mohou využívat rozhraní jádra taktéž. Je jasné, že některé programy mohou pro svou funkci potřebovat další programy. Kupříkladu, známý vypalovací program K3B pro svou funkci vyžaduje řádkové nástroje pro vypalování. Vyžaduje ale i grafické prostředí a knihovnu qt. Program, který stojí přímo nad jádrem a knihovnami, a který nepotřebuje jiné programy, se nazývá nízkoúrovňový. Naopak program, který vyžaduje jiné programy je vysokoúrovňový.

Nezbytným vazbám mezi konkrétními komponenty se říká říká závislosti. Ty zpravidla řeší místo uživatele správce balíčků.

Jádro, kernel, Linux

Primární komponentou systému GNU/Linux je kernel, jádro operačního systému, Linux. Zajišťuje správu procesů (alias běžících programů), správu paměti, multitasking (práce více úloh současně) a TCP/IP síťování.

Linux je monolitické jádro, takže veškerá jeho funkcionalita je uložena v jednom celku, ovšem s rozšířením o moduly (ovladače hardwaru a další funkcionalita), které lze do jádra vložit a opět z něho vyjmout, a to přímo za běhu. Jádro běží v plně privilegovaném režimu procesoru (tj. s plným přístupem k hardwaru). Naopak všechno ostatní běží v plně neprivilegovaném režimu a musí o přístup k danému prostředku požádat jádro, které pečlivě kontroluje, má-li daný program příslušné oprávnění.

Kernel panic a oops

Při běhu jádra může dojít k chybovému stavu. Ty jsou podle fatálnosti dva, kernel oops a kernel panic. Kernel oops je nefatální chyba, ze které se kernel zotaví, i když při tom dojde k určitým škodám na běžícím systému, některé prostředky již nemusí být k dispozici. Informace o chybovém stavu bývají dohledatelné v systémovém logu (ve /var/log). Kernel panic oznamuje fatální chybu, ze které se jádro nemá šanci zotavit.

Tyto chyby mohou být způsobeny buď skutečnou programátorskou chybou v jádře, ale mohou být také projevem špatně fungujícího hardwaru nebo ovladače. Typickým problémem je chyba v paměti RAM.

Číslování verzí jádra

Verze jádra má tvar A.B.C.D, kde A je verze jádra, B je hlavní revize jádra, přičemž liché číslo značí vývojovou a sudé stabilní revizi, C je vedlejší revize, která se mění s provedením nějaké podstatnější změny (přidání ovladače, apod.), a konečně D je číslo, jehož povýšení naznačuje drobnou změnu (opravu chyby, apod.). Momentálně existují dvě řady jádra, starší 2.4 a novější 2.6. Aktuální verzi jádra zjistíte třeba z webu kernel.org, odkud si můžete samotné jádro stáhnout.

Vanilla a distribuční jádra

Jádro lze různými způsoby upravovat, lze na něj aplikovat patche, které do něj přidávají další (neoficiální) funkcionalitu. Čistému jádru bez patchů se říká vanilla jádro a lze jej získat přímo ze stránek kernel.org. Jádra, která se nachází v distribucích, bývají patchovaná a upravená třeba tak, aby distribuce fungovala na téměř jakémkoliv hardwaru.

Kompilace jádra

Jádro si můžete sestavit sami, odstranit z něj podporu zařízení, která nepoužíváte, a přizpůsobit jej přesně pro váš počítač. Můžete sami rozhodnout, kterou funkcionalitu zkompilujete jako modul a kterou pevně zakotvíte v jádře. Můžete sami aplikovat patřičné patche, které uznáte za vhodné. A samozřejmě, můžete kód jádra upravit sami. Kompilaci jádra bych doporučil pouze v případě, kdy k tomu máte dobrý důvod.

Iniciální ramdisk (initrd)

Už jsme si řekli, že některá funkcionalita a některé ovladače mohou být v jádře přístupné jako moduly. Moduly se samozřejmě nacházejí mimo jádro, jsou to obyčejné soubory. Je jasné, že k tomu, aby se jádro mohlo dostat k modulu, potřebuje připojit příslušný oddíl, na kterém jsou moduly uloženy. Má-li však třeba ovladač řadiče nebo souborového systému zakompilovaný jako modul, nemá šanci se k němu dostat. V takovém případě ohlásí kernel panic a odmítne pokračovat.

Tuto situaci řeší malý komprimovaný souborový systém obsahující mj. příslušné moduly, který se zkopíruje do paměti za jádro, jádro jej rozbalí a připojí na kořenový adresář. Z něj pak natáhne příslušné moduly a může pokračovat dále.

Předávání parametrů jádru

Parametry se jádru předávají pomocí zavaděče (LILO nebo GRUB). Ty mu třeba řeknou, který oddíl má připojit na kořenový adresář, které činnosti má a nemá provádět, jak velikou má očekávat paměť, apod. Parametry jádra tedy umožňují upravovat jeho funkci a vyřešit některé problémy se špatně fungujícím hardwarem (tak, že danou funkcionalitu vypnou).

Soubory a adresáře

Soubory a adresáře se nachází v rámci souborových systémů, které jsou vytvořeny v oddílech pevných disků nebo výměnných zařízeních. V unixech jsou jednotlivé souborové systémy připojovány na adresáře, takže vše se jeví jako jedna veliká adresářová struktura. Nejenom z toho důvodu má adresářová struktura v unixových systémech specifická pravidla, kde se co nachází. Ale začněme od začátku.

Souborové systémy, diskové oddíly a pevné disky

Souborový systém je sada pravidel pro ukládání souborů a adresářů na pevný disk tak, aby bylo možné je opět přečíst. Bývá v ní vymezeno, kde na pevném disku se daný soubor nachází, jak se jmenuje, v jakém je adresáři a jaká má přístupová práva. Souborové systémy existují na pevných discích v oblasti definované jako tzv. diskový oddíl. Těch může mít pevný disk více. Výměnná zařízení obsahují zpravidla pouze jediný souborový systém, nejsou členěny na oddíly.

V unixových systémech jsou souborové systémy na oddílech pevných disků i na jiných zařízeních připojovány na adresáře. Základ tvoří kořenový souborový systém, který se připojí na kořenový adresář, a do jeho struktury se pak zapouštějí (připojují) další souborové systémy podle požadavků uživatele. Připojování souborových systémů může probíhat automaticky (např. po vložení média), nebo může být vyžadováno provést ruční připojení.

Soubory

V unixových systémech platí, že vše je soubor. Na rozdíl od jiných systémů nerozděluje GNU/Linux název souboru na jména a příponu. Přípona, pokud je, je prostě součástí jména souboru. Unixové systémy také rozlišují velká a malá písmena v názvech souborů, takže, kupříkladu, soubor se jménem "novak" je něco jiného než soubor "Novak". Soubor (adresář) se jménem začínajícím tečkou je považován za skrytý soubour, na což reagují příslušné programy tak, že jej nezobrazí. K zobrazení takových souborů je zpravidla nutné použít adekvátní volbu v nastavení příslušného programu. Rozlišujeme následující typy souborů:

  • obyčejný soubor

  • adresář (v terminologii MS Windows "složka")

  • symbolický odkaz

  • pevný odkaz

  • znakové zařízení

  • blokové zařízení

  • pojmenovaná roura

  • socket

Adresář (directory)

Adresář je vlastně určitý typ souboru, který obsahuje odkazy na jiné soubory. Tyto odkazy musí být alespoň dva, odkaz na sama sebe (reprezentovaný tečkou) a odkaz na předchozí adresář (reprezentovaný dvěma tečkami).

Symbolický odkaz (symbolic link)

Symbolický odkaz je de facto soubor s odkazem na jiný soubor. Vztah mezi odkazem a původním souborem řídí jádro, takže všechny programy se k symbolickým odkazům chovají stejně. Respektive, pokusíte-li se otevřít odkaz příslušným programem (třeba textovým editorem, nebo prohlížečem či jiným programem), jádro zachytí patřičný požadavek, a jelikož ví, že se jedná o odkaz, provede přesměrování na původní soubor. Takže vám se zobrazí obsah souboru, na který odkaz odkazuje. Při kterékoliv jiné operaci (kopírování, přesouvání, mazání, apod.) se změna dotkne pouze odkazu samotného, a nikoliv původního souboru. Symbolický odkaz může odkazovat i na neexistující (nebo dočasně neexistující) soubor.

Pevný odkaz (hard link)

Pevný odkaz je vlastně jiný název pro stejný soubor. Stejná data jsou přístupná pod více soubory. Na rozdíl od symbolického odkazu je tedy omezen na stejný souborový systém. Při vytvoření pevného odkazu se zvýší patřičný počet odkazů v záznamech souborového systému. Rozlišení na původní soubor a odkaz pozbývá smyslu, protože oba soubory vedou ke stejným datům. Data se však nekopírují, prostě oba soubory odkazují na stejné místo na pevném disku. Pokud smažete pevný odkaz, klesne počet odkazů na příslušná data. Klesne-li na nulu (v případě, že smažete poslední odkaz), dojde k uvolnění souboru ze souborového systému (vymazání).

Znaková a bloková zařízení

Zařízení jsou speciální soubory, kde práce s nimi je jádrem zachycena a provedena na zařízení, které reprezentují. Dělí se na znaková a bloková, přičemž bloková jsou schopna náhodného přístupu (třeba pevný disk - přečti sektor 24), zatímco znaková zařízení pracují s proudy dat (tiskárna, scanner, apod.). Tyto speciální soubory jsou umístěny v adresáři /dev a z jejich symboliky bych rád probral alespoň symboliku médií (hvězdička supluje libovolnou chybějící část):

  • IDE zařízení - hd* (pevné disky i CD mechaniky)

    • primární zařízení na prvním řadiči - hda

    • sekundární zařízení na prvním řadiči - hdb

    • primární zařízení na druhém řadiči - hdc

    • sekundární zařízení na druhém řadiči - hdd

    • oddíly: první oddíl hda1, druhý oddíl hda2, třetí oddíl hda3, atd.

  • SCSI/SATA zařízení - pevné disky sd*, CD mechaniky scd*

    • primární zařízení na prvním řadiči - sda

    • sekundární zařízení na prvním řadiči - sdb

    • primární zařízení na druhém řadiči - sdc

    • sekundární zařízení na druhém řadiči - sdd

    • oddíly: první oddíl sda1, druhý oddíl sda2, třetí oddíl sda3, atd.

    • rozlišení jednotlivých CD mechanik: první mechanika scd0, druhá scd1, atd.

  • disketová mechanika - fd*

    • rozlišení jednotlivých mechanik: první mechanika fd0, druhá mechanika fd1, atd.

Mezi další zajímavá zařízení patří:

  • /dev/random - generátor náhodných čísel

  • /dev/urandom - generátor pseudo-náhodných čísel (je rychlejší, ale "méně náhodný")

  • /dev/null - černá díra, cokoliv sem přesunete, to zmizí

  • /dev/zero - generátor nul

Zařízení jsou rozpoznávána pomocí dvou čísel identifikujících příslušný hardware, tzv. major a minor. Názvy souborů zařízení jádro v úvahu nebere.

Pojmenovaná roura (named pipe)

Pojmenovaná roura je způsob, jakým si vyměňují informace procesy (běžící programy). Jejich použití je automatické, pro uživatele nemají význam. Velký význam mají naopak pro programátory. Tyto pojmenované roury se často vyskytují v adresáři /tmp, a proto je krajně nevhodné jej za běhu systému mazat, protože tak běžícím programům utnete jejich vzájemné komunikační kanály.

Socket

Socekty jsou záležitostí programátorů, ve zkratce, jsou to soubory, které reprezentují síťové spojení.

Adresářová struktura

Adresářová struktura začíná kořenovým adresářem, který se označuje normálním lomítkem. Následují jednotlivé adresáře a jejich popis:

/bin

Nepostradatelné spustitelné soubory využívané všemi uživateli. Nalezneme tu mj. interprety příkazové řádky (shelly) a základní řádkové nástroje pro práci se systémem.

/boot

Obrazy jader (zpravidla soubory začínající na vmlinuz) a iniciální ramdisky.

/dev

Soubory zařízení, tedy speciální soubory, které reprezentují jednotlivá zařízení.

/etc

Konfigurační soubory, přesněji struktura konfiguračních souborů. V podadresáři init.d (v některých distribucích je to rc.d) se ukrývají skripty potřebné pro spouštění a vypínání systémových služeb (v unixových systémech se jim říká démoni).

/home

Domovské adresáře uživatelů. Podadresář s vaším uživatelským jménem je vaše území, kde můžete provádět skoro cokoliv.

/lib

Ty nejdůležitější knihovny potřebné pro běh systému. V podadresáři modules se nachází moduly jádra.

/media, /mnt

Adresáře, kde bývají připojena média (CD, DVD, flash disky, diskety) a další diskové oddíly.

/proc

Speciální soubory, které tvoří komunikační rozhraní s jádrem. Zde se můžete dozvědět mnohé o činnosti jádra a vhodnými změnami příslušných souborů můžete upravovat jeho funkci.

/opt

Adresář vhodný pro instalaci softwaru, který není původně vytvořen pro unixové systémy a neumí využívat jeho adresářovou strukturu.

/root

Domovský adresář uživatele root.

/sbin

Nepostradatelné spustitelné soubory určené výhradně pro uživatele root.

/usr

Tzv. sekundární hierarchie, obsahuje mj. podadresáře bin, sbin, lib a další, které se nachází v kořenovém adresáři. Tyto ale nejsou nutné k běhu systému, hnízdí v nich uživatelské programy. Podadresář local slouží jako prostor k instalaci softwaru mimo balíčkovací systém. Podadresář share obsahuje zpravidla datové soubory aplikací. Podadresář share/doc nebo doc obsahuje dodatečnou dokumentaci k jednotlivým programům.

/var

Proměnlivá data, soubory, u kterých se očekávají změny. Zde je nutné zajistit, aby vždy bylo k dispozici nějaké volné místo. Bez toho nebude systém fungovat správně. Podadresář log obsahuje systémové protokoly, soubory s informacemi o tom, co se v systému událo během poslední doby. Velmi cenný informační zdroj.

/tmp

Dočasné soubory. Stejně jako v případě adresáře /var je nutné zajistit dostatek volného prostoru. Pokud místo dojde, systém přestane fungovat správně. Soubory zde uložené rozhodně nemažte při běhu systému! Byť jsou dočasné, mohou být pro právě spuštěné programy klíčový význam (viz "pojmenovaná roura" výše).

Adresářová struktura a software

Jak je z této struktury patrné, nejsou programy umístěny vždy v jednom adresáři, kde mají svoje spouštěcí i datové soubory, ale jejich spouštěcí soubory se nachází v /bin či /usr/bin, sdílené knihovny mají k dispozici v /lib či /usr/lib, konfigurační soubory mají zpravidla v /etc a jejich datové soubory se nachází v /usr/share. Pokud máte software, který se s takovou hierarchií nevypořádá, pak můžete použít adresář /opt, který je tomuto účelu vyhrazen. Teď vás možná napdá, jak odlišit, co patří jednotlivým programům. To má na starosti balíčkovací systém, který ví, co patří ke kterému programu a je schopný selektivně odstranit daný program tak, že po něm nezbyde vůbec nic, přičemž je schopen se vypořádat se závislostmi.

Uživatelé a skupiny

Každý uživatel je v systému veden pod určitým číslem, kterému se příká UID. Může být zařazen do jedné nebo více skupin, které jsou v systému vedené také pod určitým číslem, kterému se říká GID. Skupiny slouží v rámci systému přístupových práv, aby uživatelé mohli pracovat na společných projektech bez toho, aby dávali práva ke svým datům všem uživatelům.

Domovské adresáře uživatelů nalezneme v adresáři /home. Kromě domovského adresáře má uživatel jen velmi omezená práva měnit cokoliv v systému, tudíž i zapisovat do mnoha adresářů. Jeden z adresářů, do kterých kterýkoliv uživatel zapisovat smí, je /tmp. Speciálním případem je uživatel root, přezdívaný superuživatel. Pro něj žádná omezení neplatí, on může vše.

Přidání nového uživatele a odebrání stávajícího lze realizovat v pohodlí grafického rozhraní snad ve všech distribucích. Informace o uživatelích a skupinách naleznete v následujících konfiguračních souborech:

  • /etc/passwd - základní informace o uživatelích: login, heslo (bývalo dříve, nyní je v /etc/shadow), uid, gid, jméno uživatele, adresář, implicitní shell

  • /etc/shadow - obsahuje mj. md5 hashe hesel, takže, na rozdíl od /etc/passwd, není čitelný obyčejnými uživateli

  • /etc/group - obsahuje informace o skupinách a kdo do nich patří

Při založení nového uživatele se zpravidla z adresáře /etc/skel zkopíruje vše do uživatelova domovského adresáře. Po přihlášení uživatele do příkazové řádky se mu zobrazí obsah souboru /etc/motd.

Přístupová práva

Model přístupových práv v unixových systémech je velmi jednoduchý. Každý soubor má svého vlastníka a skupinu, do které patří. Oprávnění mohou být různá pro vlastníka, skupinu a ostatní uživatele. Přístupová práva jsou tři, právo číst (r, jako read), právo zapisovat (w, jako write) a právo vykonat kód, tedy spouštět (x, jako eXecute).

Mám-li soubor s vlastníkem "michal", skupinou "projekt" a oprávněními rwxr-xr--, znamená to, že vlastník má právo soubor číst, zapisovat do něj a spustit jej. To nám říkají první tři znaky tohoto symbolického zápisu. Další tři znaky nám říkají, co mohou se souborem provádět uživatelé patřící do skupiny "projekt". Ti mohou soubor číst a spouštět jej, nemají však právo do něj zapisovat. Jak si můžete všimnout, místo práva w je v symbolickém zápisu pomlčka, která nám říká, že dané právo přiděleno nebylo. Ostatní uživatelé, soudě dle posledních třech znaků symbolického zápisu, mají pouze oprávnění soubor číst. K zápisu a ke spuštění oprávnění nemají.

Práva adresářů

Jak jsme si řekli, adresář je speciální typ souboru, který obsahuje odkazy na jiné soubory. Proto na něj mají práva poněkud jiný účinek. Právo čtení nám umožní přečíst si jeho obsah, tj. jaké soubory se v něm nachází. Právo zápisu nám umožní vytvářet či mazat soubory, které se v něm nachází. Ano, když soubor ochráníme proti zápisu i čtení, ale je v adresáři, do kterého má jiný uživatel povolený zápis, může soubor vymazat. Výmaz souboru je v podstatě zápis do příslušného adresáře, kde se odstraní položka ukazující na daný soubor. Existuje však možnost, jak i to ošetřit, viz "Sticky bit" níže. Právo ke spuštění nám umožní adresář otevřít.

Speciální práva

Kromě výše uvedených práv existují ještě tři takové malé "hacky", sticky bit, setuid bit a setgid bit.

Sticky bit

Jak už jsem podotkl, na výmaz souboru stačí mít oprávnění k zápisu do adresáře, kde se nachází. Pak i v případě, že bude daný soubor proti nám chráněn sebelépe, stejně jej budeme moci vymazat. Tato situace určitě není přijatelná, a proto existuje způsob, jak tomu zabránit. Tím způsobem je nastavit danému adresáři sticky bit. V takto ošetřeném adresáři bude moci soubory mazat jenom jejich vlastník.

SetUID a SetGID

Pro některé operace může být z nějakého důvodu třeba vyšších práv, než má uživatel k dispozici. V případě vypalování je tím důvodem přímý přístup k mechanikám. Pokud uživatel tato oprávnění nemá, ale přesto chce danou činnost provádět, může být řešením právě setuid nebo setgid oprávnění, které způsobí, že se při spuštění daného programu nastaví jeho "výkonný" vlastník (setuid) nebo skupina (setgid) na vlastníka souboru. Pokud je jím root, získá program jeho oprávnění a má mj. plný přístup k hardwaru. Ale tato oprávnění získá pouze daný program při svém provádění, uživatel, který jej spustil, je nezíská. Pomocí těchto oprávnění je tedy možné, aby uživatel pracoval bez oprávnění uživatele root, a přesto prováděl operace, které vyžadují vyšší oprávnění, než má k dispozici.

Procesy

Běžícím programům se říká procesy. GNU/Linux je (stejně jako ostatní unixové systémy) víceúlohový systém, což znamená, že v něm může najednou běžet více procesů (na jednom či více procesorech). Procesy jsou v systému identifikovány číslem zvaným PID (process ID). Rodičem všech procesů je init (/sbin/init, PID=1), který je zodpovědný za nastartování celého systému.

Řízení procesů

Procesy řídí jádro, které jim přiděluje systémové prostředky. Čas procesoru je procesům přidělován podle jejich "niceness" (slušnost). Ta může nabývat hodnot od -20 do 19, přičemž čím je číslo nižší, tím je na běh programu kladen větší důraz a je mu přidělováno více času procesoru. Pouze uživatel root je oprávněn nastavit procesům slušnost menší než nula.

I když je systém plně zažížen, jádro vždy uspokojuje všechny procesy, takže i když vám zrovna běží nějaký žrout obecný se slušností -20, dostane se časem ke slovu i slušňák devatenáctého stupně.

Signály

Procesům se dají posílat signály, které mohou program donutit chovat se určitým způsobem či provést určitou operaci. Z hlediska uživatele jsou nejpodstatnější dva signály, signál TERM a signál KILL. První požádá program o ukončení, druhý ho bez milosti sestřelí. Pro uživatele není až tak podstatné se učit význam signálů, ale programátor by je znát měl. V souvisejících odkazech naleznete na toto téma velmi dobrý článek.

Démoni

Démoni jsou procesy běžící na pozadí, ty, které uživatel nemá přímo pod svou kontrolou, neovládá je interaktivně, ale které zajišťují určitou činnost. Jejich ovládací skripty (umožňující je spustit, zastavit či restartovat) se nachází zpravidla v /etc/init.d.

Uživatelská rozhraní

Dnes existují všeho všudy dvě uživatelská rozhraní, textové (příkazová řádka) a grafické. GNU/Linux nabízí obojí a u každého typu ještě řadu možností k výběru.

Textový režim, shell

Základním rozhraním GNU/Linuxu (tedy tím, které by mělo fungovat vždy a všude), je příkazová řádka. Shell je interpret příkazové řádky, program, který zpracovává příkazy, které píšete. Těch má GNU/Linux celou řadu, ale tím nejpoužívanějším je Bash, inovovaná verze unixového Bourne Shellu. Existují samozřejmě i jiné shelly.

V příkazové řádce je možné realizovat mnohé, a to rychle a efektivně. Bohužel, tyto možnosti jsou vyváženy nutností se s tímto nástrojem naučit efektivně pracovat, a to chvilku trvá. Je na vás, jestli tomu ten čas dáte, nebo budete preferovat grafické rozhraní.

Grafické rozhraní

V unixových systémech tvoří grafické rozhraní tzv. X-Window System. Je to software s architekturou klient/server a využívá síťové rozhraní (je tedy možné přihlásit se vzdáleně k jinému systému, ale tento systém stejně dobře funguje i na počítači odpojeném od sítě). Serverem je X-Server (nebo familiérně Xka) a poskytuje ty nejzákladnější funkce (zobrazovací funkce, polohovací zařízení, klávesnice). Samotná grafická prostředí a okenní manažeři vystupují v roli klientů, kteří se připojí k "serveru" a využívají jeho funkce.

Grafický desktop

Grafický desktop je velmi pravděpodobně to, o co budete stát nejvíce, plně vybavené grafické prostředí spravující okna i plochu, tvořící komplexní prostředí. Jejich výhodou je množství funkcí, nevýhodou pak těžkopádnost a náročnost na systémové zdroje (paměť, procesor). Příklady grafických desktopů jsou KDE a Gnome.

Okenní manažer (window manager)

Kromě grafických desktopů existují i odlehčená prostředí, přesněji správci oken. Ty se třeba nestarají o plochu a pozadí, spravují základní operace s okny a nabízí jednoduchá menu. Jejich konfigurace je zpravidla otázkou editace konfiguračních souborů. Jejich výhodou je lehkost, svižnost, nenáročnost na systémové zdroje. Taková prostředí poběží dobře i na starších počítačích. Jejich nevýhodou je naopak nedostatek funkcí a někdy obtížná konfigurace (ruční úprava konfiguračních souborů). Příklady takových prostředí mohou být Fluxbox, IceWM, twm, apod.

Běh systému

Spuštění systému

Po zapnutí počítače se spustí program obsažený na čipu v základní desce s názvem BIOS. Ten se podívá, co za hardware se vlastně v počítači nachází, provede základní diagnostiku, najde zařízení označené pro zavádění systému (zpravidla je to "primary master" pevný disk) a předá řízení zavaděči (bootloader).

Prvním 512 bytům na začátku pevného disku se říká MBR (Master Boot Record). Z nich prvních 446 bytů tvoří zavaděč (bootloader), dalších 64 bytů tvoří tabulka rozdělení disku (partition table) a zbylé dva byty tvoří tzv. magic number. Zavaděč se může vejít do oněch 448 bytů (např. LILO), nebo nemusí, a v takovém případě se zavaděč pouze odkazuje na nějaké místo na pevném disku, kde se nachází hlavní zaváděcí program (GRUB).

Zavaděč natáhne do paměti linuxový kernel (jádro operačního systému), a ten spustí. Kernel si osahá hardware, připojí kořenový oddíl a spustí program /sbin/init, který zjistí, do které úrovně běhu má nastartovat (z /etc/inittab) a to pak také provede.

Úrovně běhu (runlevely) a startovací skripty

V adresáři /etc/rcX.d (kde X je číslo runlevelu) se nachází symbolické odkazy na skripty služeb v /etc/init.d, které jsou postupně spouštěny podle pořadí.

GNU/Linux má celkem šest úrovní běhu, do kterých lze nabootovat nebo je při běhu měnit příkazem init cislo_runlevelu. Úroveň běhu specifikuje, které služby se mají zavést, tedy co všechno má být funkční. Ve všech distribucích platí, že úroveň běhu 0 se rovná vypnutí počítače, zatímco úroveň běhu 6 se rovná restartu počítače.

Jednička představuje jednouživatelský režim bez sítě pro provádění záchranných operací. Úroveň běhu můžete specifikovat i jako parametr jádru v rámci zavaděče. Parametr 1 nebo single by vás měl systém nastartovat do úrovně běhu 1. Úrovně běhu 2-5 bývají v různých distribucích různě definované.

Síť a servery

Síť

Práce v síťovém prostředí je pro unixové systémy přirozeností, dokonce řada programů (včetně X-Serveru) využívá síť, a to i na počítači, který není k žádné připojen. K tomu se využívá místní smyčka (tzv. local loopback), IP adresa je 127.0.0.1, a je to reprezentace místního počítače (toho vašeho nepřipojeného). Místní smyčka je pro fungování mnoha programů nezbytná, naopak bez připojení ke klasické síti se GNU/Linux bez problémů obejde.

Druhy připojení

Nejběžnější připojení je přes ethernet, tedy síťová karta ve vašem počítači a kabel vedoucí třeba k síťové přípojce, speciálnímu modemu nebo jinému počítači. Identifikovaná síťová karta bude zprovozněna jako rozhraní ethX, kde X je číslo síťové karty (první síťová karta je tedy eth0, další eth1, atd.).

Připojení přes modem běží pomocí point-to-point protokolu (PPP), rozhraní má symboliku pppX, kde X je číslo zprovozněného modemu (první zprovozněný modem bude ppp0). Velmi dobrý grafický klient k tomuto typu připojení je kppp.

Připojení přes wifi mívá symboliku wlanX (první rozhraní je wlan0) a nastavuje se příkazem iwconfig.

Zasíťování

Pokud je na síti DHCP server (server, který odpovídá na otázku vašeho počítače "kdo jsem?"), systém jej najde a nastaví síť podle něj (v přívětivých distribucích automat nebo klikátko, jinde příkaz dhclient). Bez DHCP serveru je potřeba nastavit síť ručně. Tady opět pomohou grafická klikátka nebo příkaz ifconfig či novější ip.

K tomu raději dodám trošku teorie. Každý počítač v síti musí být jednoznačně identifikován, a to IP adresou (ve tvaru xxx.xxx.xxx.xxx, např. 192.168.0.1). Aby se od sebe odlišily různé sítě, používá se tzv. síťová maska (ve tvaru xxx.xxx.xxx.xxx, např. 255.255.255.0). To ale nestačí. Je potřeba vědět, na jaký počítač (resp. na jakou IP adresu) se mají posílat pakety, které nepatří do žádné ze známých sítí, což je brána (tzv. gateway). A pořád ještě nám něco chybí. Asi bychom rádi do prohlížeče zadávali adresy ve tvaru www.google.com a nikoliv 66.249.93.104. K tomu potřebujeme nějaký server, kterého by se náš počítač vždy zeptal, kterou IP adresu má daná URL, potřebujeme jmenný server (nameserver). Ty se zapisují do /etc/resolv.conf.

Servery

Servery jsou služby poskytované daným počítačem ostatním počítačům v síti. V GNU/Linuxu máte na výběr z mnoha serverů zajišťujících nejrůznější služby, namátkou webový server, poštovní server, FTP server, databázový server a řada dalších. Servery se ovládají pomocí skriptů v /etc/init.d nebo pomocí příslušných grafických nástrojů.

Server funguje tak, že si zabere příslušný port (číslo od 1 do 65535), a na něm naslouchá. Na tento port zašle klient požadavek o spojení a začíná komunikace. Pokud si nepřejeme, aby měl k serverům přístup každý počítač v síti, musíme je chránit firewallem.

Firewall

Komunikace mezi počítači prostřednictvím sítě probíhá za pomoci paketů, kterými se přenáší informace a požadavky mezi počítači. Teď už víme, že pakety směřují na určité porty, kde naslouchají patřičné servery. Firewall je de facto paketový filtr, umožňuje definovat jednoduchá i složitá pravidla, jak s pakety zacházet. Chceme-li servery chránit, musíme vytvořit filtr, který zahodí všechny pakety z počítačů mimo místní síť. GNU/Linux má velmi komplexní paketový filtr, Netfilter.

Dlužno dodat, že v přívětivých distribucích je nastavení firewallu otázkou několika kliknutí. Navíc existují grafické nástroje, které uživateli usnadňují tvorbu firewallu (KMyFirewall, Fwbuilder, Guarddog, apod.), ale i grafické nástavby fungující jako osobní firewall (Firestarter), které bych doporučil začátečníkům, kteří obdrželi distribuci bez klikátka nastavující firewall.

Firewall je přímo součástí linuxového jádra, přičemž utilita, kterou se firewall nastavuje, je iptables. Ručnímu stavění firewallu pomocí iptables se věnují některé články v odkazech.

Zdroje a odkazy