UNIX (LINUX) Operační systém UNIX (LINUX) 1. Vlastnosti OS Linux Historie Linuxu 1965 –Bell Telephone Labs firmy AT&T, General Electric a MIT– Multics 1970 – Ken Thompson, Dennis Ritchie, Brian Kernighan (název Unix) 1971 – UNIX 1973 – přepsán do C jazyka 1991 – Linux (student Linus Thorvalds z Finska)
Distribuce Linuxu Distribuce = jádro Linuxu + použitelný sw, typicky open source sw, dostupný na Internetu . Každá distribuce je jinak zaměřena (nováček, výuka, vývojář, server...) Typická distribuce pro desktopový systém obsahuje linuxové jádro, nástroje a knihovny, dokumentaci, nástroj pro grafické rozhraní, desktopové prostředí a další software Některé distribuce: UBUNTU – největší počet uživatelů na světě i v Česku ● laptopy, stolní počítače, servery ● česká verze ● aktualizace každého půl roku ● varianty jsou např. Kubuntu, Xubuntu nebo Edubuntu. První obsahuje místo grafického prostředí GNOME konkurenční KDE, varianta s X na začátku je vybavena dietním prostředím Xfce a Edubuntu je určeno pro školy – obsahuje výběr softwaru pro vzdělávání ● původně založen na Debianu
● balíčkovací systém používá formát DEB a obsahuje tisíce programů ● výborná podpora HW, jeho detekce a nastavení ● pro instalaci softwaru či hardwaru se obvykle používá příkazová řádka FEDORA ● založená na balíčkovacím systému RPM ● vyvíjená komunitou vývojářů okolo Fedora Project, sponzorovaného společností Red Hat, od jejíž distribuce se projekt oddělil ● vyvíjena s důrazem na použití na domácích počítačích ● nové verze Fedory vycházejí pravidelně každých šest až osm měsíců ● díky tomu podporuje nový hw, lze ji zprovoznit i na moderních počítačích ● základní grafické prostředí GNOME, dobře podporováno je však i prostředí KDE MANDRIVA ● francouzský operační systém ● instalace používají prostředí KDE ● čeština ● výborné schopnosti detekce a nastavení hardwaru ● propracované konfigurační centrum ● určen začátečníkům ● balíčkovací systém RPM, který kdysi původně vznikl pro Red Hat ● lze stáhnout ve verzích Free nebo si lze koupit PowerPack (obsahuje navíc kodeky, komerční software a prostředí pro hraní her z Windows) SUSE ● balíčkovací systém RPM, balíky nejsou kompatibilní s balíky v Mandrivě ● obsahuje vlastní konfigurační centrum - snadná konfigurace hardwaru, softwaru či běžících služeb ● V současnosti je nositelem vývoje firma Novell (SUSE Linux Enterprise Server, SUSE Linux Enterprise Desktop) ● Pro nasazení v domácnosti či malé firmě se hodí openSUSE ● openSUSE lze stáhnout zdarma z internetu či zakoupit, SLES a SLED lze zakoupit v krabicových verzích DEBIAN ● podpora pro jedenáct platforem a více než 18000 balíčků se softwarem ● nejuniverzálnější systém ● základem pro množství jiných operačních systémů (např. Ubuntu) ● používá vlastní systém pro instalaci softwarových balíčků (DEB) – APT ● Instalace Debian GNU/Linuxu je v porovnání s jinými systémy o dost náročnější
23/2/2012
UNIX (LINUX)
2
Vlastnosti OS -
Multiprogramový
-
Multiprocesový
Terminál – monitor + klávesnice
síťový systém
-
„tichý“ – neoznamuje správně vykonané příkazy, vypisuje pouze chybová hlášení - case-sensitivity – rozlišuje velká a malá písmena - zdrojové texty systému jsou dostupné Musí být zabezpečena: - ochrana uživatelského prostředí - ochrana souborů - ochrana procesů - ochrana systému proti uživatelům
Uživatelské účty Na podporu zmíněných mechanismů se zavádějí tzv. uživatelské účty (user account). Správce (administrátor) systému vytvoří každému uživateli jeho účet. Ten jednoznačně definuje uživatele a jeho pracovní prostředí. Účty se většinou zapisují do souboru /etc/passwd). Ne všechny uživatelské informace jsou však jenom v tomto souboru. Uživatelský účet obsahuje následující položky: Uživatelské jméno (login name) Je to skupina zpravidla 3 až 8 znaků, která jednoznačně určuje konkrétního uživatele v systému. Touto skupinou znaků se uživatel „hlásí" do systému. Jméno začíná písmenem a zapisuje se malými písmeny. Může obsahovat i číslice. Heslo (password) Každý uživatel si volí svoje heslo. V počítači se uchovává pouze v zakódované podobě, buď v souboru /etc/passwd, nebo v /etc/shadow. Druhý případ je bezpečnější, protože souboru shadow se nastaví právo 23/2/2012
UNIX (LINUX)
3
čtení pouze pro správce systému, a tudíž se nikdo jiný k heslům (i v zakódovaném tvaru) nedostane. Heslo není povinné; účty nemusejí být chráněny heslem. Pokud však k počítači přistupuje více než jeden uživatel (nebo je počítač zapojen do sítě), je heslo žádoucí. Mělo by mít alespoň 6 znaků a neměla by to být jenom písmena. Heslo může obsahovat i jiné znaky než písmena a číslice. V heslech jsou významnými znaky i mezery, control-znaky, rozlišují se malá a velká písmena apod. Heslo by nemělo obsahovat údaje, které se o osobě majitele dají snadno zjistit, tedy např. křestní jméno, datum narození, rodné číslo apod. Při pokusu o uhádnutí hesla by každý jistě začal právě zde. Uživatelské číslo UID (user identification) Další jednoznačná identifikace uživatele v systému. Používá se uvnitř datových struktur, nikoli pro komunikaci s uživatelem. Při komunikaci s uživatelem se přes soubor passwd překládá do textové podoby uživatelského jména. Primární skupina GID (primary group identification) Každý uživatel je členem alespoň jedné skupiny uživatelů. V účtu se zaznamenává pouze primární skupina, tj. skupina nastavená uživateli po přihlášení do systému. Další skupiny, jichž může být uživatel členem, jsou uvedeny v souboru /etc/group. Z jedné skupiny do jiné se uživatel přepíná příkazem newgrp. Skupiny mají význam ve vlastnictví souborů a adresářů (viz dále). Doplňující uživatelské údaje Další nezbytné údaje o jeho majiteli: jméno a příjmení, příp. adresa, telefon. Domovský adresář (home directory) Absolutní cesta k adresáři, který se po přihlášení nastaví jako běžný adresář a je nadále označován jako domovský adresář uživatele. Shell Jméno a cesta k souboru, jehož obsah se spustí jako shell (interpret příkazů) po přihlášení uživatele do systému. Není-li zde nic uvedeno, použije se /bin/sh. Další informace o uživateli (např. čas posledního přihlášení) se ukládají v jiných souborech.
Superuživatel V každém systému typu UNIX existuje jeden uživatel, kterému se nekontrolují jeho práva. Nazývá se superuživatel a je představován uživatelským jménem root s uživatelským číslem 0. Pod tímto uživatelem provádí administrátor systému jeho správu. Účet se však nehodí na běžnou práci, protože neúmyslnou chybou lze systém snadno poničit. 23/2/2012
UNIX (LINUX)
4
Tento uživatel má právo zasahovat do všech datových, souborových a procesových struktur systému. Jeho ochrana před nepovolaným přístupem je proto více než podstatná.
Práce v systému - Přihlášení do systému První operací, kterou uživatel při příchodu k terminálu musí udělat, je přihlášení do systému. Uživatel musí vyvolat stav, ve kterém se na obrazovce vypíše výzva login:. Na tuto výzvu odpoví svým uživatelským jménem, které mu administrátor přidělil. Uživatelské jméno se musí zadávat malými písmeny. Pokud je zadáme velkými písmeny, bude si ovladač terminálu myslet, že terminál malá písmena nezná (v minulosti byly i terminály pouze s velkými písmeny). Počítač navíc v tomto okamžiku nemusí znát typ našeho terminálu, a proto nemusejí fungovat klávesy BACKSPACE a DEL. Jakmile zapíšeme všechny znaky uživatelského jména, stiskneme klávesu ENTER. Nemá-li uživatel heslo, a jméno bylo zadáno správně, je tímto okamžikem přihlášen do systému. Pokud uživatel heslo má, nebo bylo jméno zadáno nesprávně, ptá se počítač na heslo výzvou Password:. Nyní se zadává heslo. Heslo se při zadávání neopisuje na obrazovku, takže je nutné je zapsat poslepu. Opět nemusejí fungovat klávesy BACKSPACE a DEL. Po zadání hesla se stiskne ENTER . Jestliže počítač vypíše Login incorrect, potom jsme zadali špatně buď jméno, nebo heslo. V tomto případě se znovu vypíše výzva login:. Některé systémy zařazují pro zvýšení bezpečnosti před výzvu login: časovou prodlevu, aby ztížily mechanické hádání hesel. Ze stejných důvodů se vypisování výzvy po několika neúspěšných pokusech může ukončit. Po úspěšném přihlášení se vypíše informace o času posledního přihlášení aktuálního uživatele. Tuto informaci je užitečné sledovat. Dá se z ní zjistit neoprávněné použití účtu. Dále se nastaví UID, GID, proměnné HOME, PATH, SHELL, TERM, MAIL, LOGNAME, domovský adresář a spustí se shell podle informace v účtu uživatele. Během přihlašování se vypisují sdělení správce systému ze souboru /etc/motd. Další chování je už záležitostí spuštěného shellu. Heslo si uživatel mění zpravidla příkazem passwd. V konkrétních podmínkách tomu však může být i jinak. Po zadání příkazu passwd se příkaz nejprve dotáže na původní heslo. Zadáme mu heslo, kterým jsme se hlásili do systému. Potom se příkaz zeptá na nové heslo a nechá si je zadat ještě jednou pro kontrolu, zda nedošlo k překlepu (heslo se na obrazovku neopisuje). Teprve po této kontrole se nové heslo uloží. Příště se už hlásíme novým heslem.
23/2/2012
UNIX (LINUX)
5
- Odhlášení ze systému Stejně důležitou operací jako přihlášení do systému je i odhlášení ze systému. Před odchodem od terminálu by to měl uživatel například z důvodu ochrany svých souborů udělat. Uživatel se odhlašuje zadáním příkazu exit nebo logout. Odhlášení se vyvolá ukončením shellu, který byl přihlášením spuštěn. Po odhlášení uživatele by se na terminálu měla vypsat výzva login:. - Zadávání příkazů shellu Shell přijímá příkazy po vypsání vlastního promptu (výzvy) – - # - superuživatel - $ - běžný uživatel. V operačním systému UNIX se ve jménech příkazů a souborů dělají rozdíly mezi malými a velkými písmeny (např. na rozdíl od operačního systému DOS). Proto je nutné příkay zapisovat přesně tak, jak jsou popsány. Příkazy lze shellu zadávat „do zásoby". Shelly si navíc pamatují dříve zadávané příkazy v rámci tzv. historie příkazů. Příkazy pak lze ze zásobníku příkazů vybírat, příp. opravovat a znovu spouštět. Shell zahájí interpretaci příkazů až po stisku klávesy ENTER. Do té doby je možné příkaz na řádku opravovat. Poslední znak na řádku mažeme speciálním znakem erase. Celý řádek zrušíme speciálním znakem kill. Znak erase může být představován stiskem klávesy BACKSPACE, znak kill stiskem kombinace CONTROL a U (v Unixu zapisujeme ^U). Operace Backspace se zpravidla zapisuje ^H a Delete ^?. V Linuxu však z důvodu kompatibility s terminálem vtl00 vysílá klávesa BACKSPACE znak^?. Nastavení těchto speciálních znaků zjistíme z výpisu příkazu stty -a Nezobrazitelné znaky se v Unixu vypisují následovně: buď jako ^C pro kombinaci CONTROL a C, nebo \nnn jako tři osmičkové číslice ordinální hodnoty znaku. Běžící proces násilně ukončíme speciálním znakem intr (zpravidla ^C nebo klávesou DEL), vstup z klávesnice se ukončí speciálním znakem eof (zpravidla ^D), výstup na obrazovku se pozastaví speciálním znakem stop (zpravidla ^S) a obnoví speciálním znakem start (zpravidla ^Q). Poslední znak je vhodné vyzkoušet tehdy, pokud terminál „ztuhl" a nechce nic vypisovat. Zmíníme se o použití jednoho zvláštního znaku, který dokáže správci systému s uživateli-začátečníky přidávat starosti. Jde o speciální znak susp (zpravidla představován ^Z). Tento znak je určen k pozastavení běžícího procesu. Provádění procesu se tímto zastaví, vypíše se prompt shellu a uživatel může zadat další příkaz. Laický uživatel může nabýt dojmu, že jeho proces tímto skončil. Není to však pravda. Proces se pouze dočasně neprovádí, alokuje pro sebe potřebnou kapacitu paměti a zabírá místo v systémových tabulkách. Pokud je proces navíc imunní proti ukončení signálem SIGHUP, zůstane v paměti i po odhlášení uživatele. Po jisté době provozu takto zatěžovaného systému dojde k zahlcení kapacity paměti.
23/2/2012
UNIX (LINUX)
6
Pozastavený proces můžeme opět převést mezi běžící například příkazem fg, nebo zjistíme číslo procesu z výpisu příkazu ps a proces násilně ukončíme příkazem kill číslo, příp. kill -9 číslo (pokud předchozí varianta selže). - Nápověda Typický systém typu UNIX je vybaven sadou tzv. manuálových stránek. V nich jsou popsány jak jednotlivé příkazy, tak i volání knihovních podprogramů a najdete zde i další informace. Typicky jsou rozděleny do následujících skupin (tzv. sekcí) s těmito čísly: 1. Příkazy uživatelské úrovně. 2. Systémová volání. 3. Knihovní funkce. 4. Zařízení a ovladače zařízení. 5. Formáty (konfiguračních) souborů. 6. Hry. 7. Různé popisy. 8. Nástroje pro údržbu systému. 9. Popis interních volání specifických pro Linux Odkazy na jednotlivé příkazy se potom vypisují ve tvaru chmod(l) kde chmod je jméno příkazu a jeho popis je v sekci číslo 1. Nápovědu k tomuto příkazu potom vypíšeme příkazem man chmod Pokud by bylo sporné číslo sekce (stejnojmenný odkaz se vyskytuje ve více sekcích), zadáme číslo sekce příkazu man -S 2 chmod V tomto případě se vypíše nápověda k volání chmod(2). Znaky -S jsou však nepovinné a stačí tedy zapsat pouze: man 2 chmod K uživatelské nápovědě slouží ještě i další příkazy: apropos a whatis. První příkaz prohledává informační databáze na zadané řetězce a druhý na zadané klíče (tj. na rozdíl od prvního na celá jména). Potom všechny odkazy na stty najdeme příkazem apropos stty - Vstupy a výstupy příkazů Každý proces (tedy i příkaz) v Unixu má automaticky přístup ke třem zvláštním souborům: standardnímu vstupu, standardnímu výstupu a standardnímu chybovému výstupu. Tyto tři zvláštní soubory existují proto, aby bylo možné příkazy jednoduše propojovat. Pokud totiž první příkaz bude výstup posílat na standardní výstup a druhý příkaz bude vstup číst ze standardního vstupu, potom
23/2/2012
UNIX (LINUX)
7
stačí spojit standardní výstup prvního příkazu se standardním vstupem druhého příkazu a příkazy jsou propojeny. Příkazy spuštěné z terminálu mají typicky všechny tyto tři soubory spojené s terminálem. Standardní vstup se označuje číslem 0, standardní výstup číslem 1 a standardní chybový výstup číslem 2. Programátor může použít i vyšší čísla, automaticky však existují pouze tyto tři. Propojování do kolon a přesměrování vstupů a výstupů je popsáno v rámci shellu.
Procesy V systému typu UNIX mohou souběžně běžet řádově stovky až tisíce procesů. Omezení maximálního počtu vyplývají z aktuálních technických a implementačních podmínek. Od jednoho programu (tj. spustitelné podoby uložené v souboru na disku) může v jednom okamžiku běžet více kopií jako procesy (dynamická běžící instance programu). Z těchto důvodů není možné se na procesy odkazovat jmény, je nutné je očíslovat. Každý proces je jednoznačně identifikován číslem procesu (PID). Proces 0 se vytvoří při zavádění systému a v Linuxu během chodu systému nic nevvkonává (idle task). Proces 1 se nazývá init a je předkem každého z procesů existujících v systému. Informace o běžících procesech vypisuje příkaz ps. Spustíme-li jej bez voleb, vypíše informace o procesech náležejících aktuálnímu uživateli. Spustíme-li jej s volbami -ax, vypíše informace o všech procesech. V prvním sloupci je zmiňované č. procesu. Procesům posíláme signály příkazem kill. Pomocí signálů procesy například žádáme o ukončení (signál 15 SIGTERM) nebo je násilně ukončujeme (signál 9 SIGKILL). Ke každému procesu se váží dvě uživatelská identifikační čísla. Reálné UID identifikuje uživatele zodpovědného za běžící proces. Efektivní UID se používá k přiřazení vlastnictví nově vytvářeným souborům, ke kontrole přístupových práv k souboru a ke kontrole oprávnění posílání signálů. Zpravidla je efektivní UID shodné s reálným UID. Jiné efektivní UID se nastavuje buď po spuštění SUID programů nebo po provedení volání jádra setuid.
Vstup uživatelů do systému: -
Jednouživatelský režim (singleuser mode) o Při startování systému o Při objevení chyb o Při práci administrátora systému (běžný uživatel se s tímto režimem nesetká)
-
Víceuživatelský režim (multiuser mode) o Pracuje v něm běžný uživatel
23/2/2012
UNIX (LINUX)
8
o Každý uživatel má zřízen účet (account) – základní informace o uživateli o Vlastní jméno, heslo se zadává při přihláčení o Uživatelé si nejsou rovni - 3 skupiny uživatelů: Běžní uživatelé – fyzické osoby (jméno a heslo) Systémoví uživatelé – nereprezentují fyzické osoby, mají speciální význam, jsou nezbytné pro chod systémových služeb (daemon, mail, news, nobody) Superuživatelé (root) – neomezená privilegia k administraci systému, instalaci software a správě účtů Přihlášení do systému: 1. Lokální přihlášení (Local login) Uživatel je fyzicky přítomen u počítače nebo terminálu a může v něm pracovat přímo.
autentizace (uživatelské jméno + heslo) Uživatelské jméno se skládá ze znaků a čísel. Heslo musí mít nejméně 6 znaků, obsahovat malá a velká písmena, čísla a interpunkční znaménka, nesmí být slovníkové.
login: uživatelské jméno (ENTER)
password: heslo (ENTER) Pokud se přihlášení nezdaří, vypíše se hlášení „login incorrect“.
2. Vzdálené přihlášení (Remote login)
Pracuje se vzdáleným počítačem
Na vzdáleném počítači musí být zřízený účet a obousměrná podpora práce
Na hostiteli musí běžet program, který zajišťuje vzdálené přihlášení, říká se mu remote login daemon
23/2/2012
UNIX (LINUX)
9
Uživatel používá speciální přihlašovací program klient
Oba procesy (daemon a klient) spolu komunikují prostřednictvím internetu a používají smluvený přihlašovací protokol.
Šifrované služby - citlivá data se posílají šifrovaná Nešifrované služby - bez ochrany dat
Nejznámější služby pro vzdálené přihlášení: Telnet - starší - nešifrovaná, používaná v uzavřené síti SSH (Secure Shell) – obsahuje služby Telnet, umožňuje různé druhy autentizace, dobře zabezpečená
Základní části operačního systému: 1) jádro (kernel) – obstarává správu zdrojů počítače a poskytuje služby ostatním procesům 2) interpret příkazů (shell) – umožňuje uživateli komunikovat se systémem, zadávat příkazy, spouštět uživatelské programy. Pro komunikaci s uživatelem používá příkazový režim (textový). Shell je také programovací jazyk, který umožňuje uživateli vytvářet vlastní funkce. 3) obslužné programy (utility) – vykonávají elementární operace se soubory a procesy, mohou poskytovat systémové informace
Vrstvy operačního systému
23/2/2012
UNIX (LINUX)
10
Vrstvy operačního systému spolu komunikují přes jednotlivá rozhraní (assembler, volání jádra, příkazy a ovládání). Jádro spravuje veškerý hardware, umožňuje přístup k počítači programátorům, ale ne běžným uživatelům. Pro uživatele jsou určeny programy, které jim umožňují s jádrem komunikovat pomocí příkazového řádku nebo grafického rozhraní. Jádro je program, který běží na holém stroji (tzv. standalone program). Ostatní programy, které uživatelé nebo správa systému používají, jsou sice také prováděny strojem, ale pod dohledem a řízením jádra (říkáme, že jádro je supervizorem běžících programů). Po zapnutí počítače pomocné hardwarové programy (tzv. firmware, programy monitoru hardwaru) jádro zavedou do operační paměti a předají mu řízení. Tím je operační systém nastartován. Jádro obalí hardware a od tohoto okamžiku až do zastavení jádra nelze přistupovat k hardwaru jinak než pomocí požadavků na jádro tzv. volání jádra (system calls). Uživatelé jsou od jádra odděleni aplikačními programy. Funkcí vrstvy jádra je převádět aktivitu programů na příkazy assembleru stroje. Operační systém - zajišťuje splnění požadavku uživatele na hardware - ochraňuje programy uživatele před zásahy jiných uživatelů. Jádro systému zajišťuje : 1/ správu dat – systém souborů ( file systems): vytvoření souboru, jeho otevření, čtení nebo zápis dat do souboru, uzavření souboru, zrušení souboru, vytvoření nebo zrušení adresáře, nastavení pracovního adresáře, vytvoření nebo zrušení speciálního souboru, který představuje periferii, test atributů existujícího souboru, adresáře nebo periferie, změna těchto atributů, rychlé přemístění na požadovanou pozici v otevřeném souboru, vytvoření zámku pro výlučný přístup k souboru. (Atributy souborů: D - directory, A - archived, S - system, H -hidden, R - read only) 2/ operaci nad daty – systém procesů ( processes): vytvoření nového procesu, čekání na jeho dokončení, ukončení procesu, výměna programu, který řídí proces, za jiný, komunikace mezi procesy pomocí signálů, rour, front zpráv, sdílené paměti a semaforů, zjišťování a nastavování atributů běžícího procesu, změna priority běhu procesu, práce s datovou pamětí procesu, její rozšiřování nebo zmenšování, zamykání v operační paměti. 3/ činnosti, které nelze zařadit:
23/2/2012
UNIX (LINUX)
11
ladění programů, zjišťování spotřebovaného času stroje procesem, práce se systémovou vyrovnávací pamětí, identifikace instalace operačního systému. Volání jádra Jednotlivá volání jádra jsou organizována jako volání funkcí programem. Vyvolá se modul standardní knihovny konkrétního jazyka (např. C). Požadavek na jádro je převeden do assembleru - pomocí tohoto jazyka stroje je řízení předáno z uživatelského procesu do jádra (používá se jméno volání jádra a parametry). Vstup do jádra znamená dále práci jádra pro proces až do ukončení práce. Princip práce jádra pro proces, který otevírá soubor voláním jádra open, a současně pro jiný proces, který vytváří nový proces voláním jádra fork, ukazuje obrázek. Volání jádra jsou realizována jádrem postupně podle jejich příchodu. Jádro je v okamžiku realizace volání jádra jiným procesem nepřerušitelné. Způsob manipulace v programu v jazyce C je tentýž, jako je obvyklé volání funkce. Programátor má k dispozici argumenty funkce pro vyjádření svého požadavku, jádro mu odpovídá především návratovou hodnotou funkce volání jádra. Návratová hodnota je vždy celočíselná (int nebo long, případně ukazatel) a má význam daný popisem v dokumentaci. Jednotně je ale sdělována kolize, tj. případ, kdy jádro požadavek nemůže vyřídit, a proto jej odmítne (špatný formát volání jádra, neexistující výpočetní zdroj, překročení mezních hodnot tabulek jádra atd.). Návratová hodnota je potom -1.
23/2/2012
UNIX (LINUX)
12
2. Systém souborů Nosiče dat a souborové systémy Podsystém jádra starající se o souborové systémy a nosiče dat má obvykle vrstevnou architekturu. Rozvrstvení je do velké míry dáno i hardwarem. Cílem vrstevné architektury je vždy oddělit od sebe logicky nesouvisející části. Například i manipulace s diskem na fyzické úrovni je zcela jiná než programátorská manipulace se souborem. Vrstevná architektura umožňuje zaměňovat jednotlivé prvky bez nutnosti měnit ostatní. V důsledku lze provozovat starší typ souborového systému na novém hardwarovém zařízení a je v podstatě jedno, zdali v době vzniku souborového systému bylo konkrétní zařízení k dispozici, či nikoliv. Obvykle se rozlišují tři vrstvy. • Nejspodnější vrstvou je nosič dat, například pevný disk nebo diskové pole. Nosič dat musí být podporován operačním systémem, tzn. operační systém musí být schopen získat od nosiče dat informace o jeho stavu a musí být schopen dávat nosiči povely k fyzickému čtení a zápisu dat. • Nosiče dat jsou zpravidla rozděleny na diskové oblasti - disk partitions. Diskové oblasti mohou být dvojího druhu: 1. Nejrozšířenější jsou statické diskové oblasti vytvořené před nebo během instalace základního softwaru na počítač. Nejčastěji používaným typem diskových oblastí na počítačích platformy Intel byl MS-DOS Partition Table. Na ostatních platformách se používají jiné typy oblastí, dost často se lze setkat se statickými oblastmi typu Disk Label. Statické oblasti mají řadu nevýhod, během práce je nelze příliš pružně zvětšovat či zmenšovat dle aktuální potřeby. 2. Tento problém řeší dynamické diskové oblasti, které jsou implementovány ve většině vyspělých operačních systémů. Svou implementaci dynamických diskových oblastí má již i operační systém Linux, jedná se o LVM - Logical Volume Manager. • Jednotlivé diskové oblasti jsou obsazovány souborovými systémy - systémy pro organizaci dat reprezentovaných datovými soubory. Souborový systém představuje vrstvu nad nosičem dat. Jednotlivé entity v rámci souborového systému se nazývají soubory.
23/2/2012
UNIX (LINUX)
13
Koncepce souborových systémů operačního systému Unix je mezi ostatními operačními systémy unikátní. Již od počátku implementace souborových systémů se v Unixu dbalo na čtyři základní požadavky: 1. Souborový systém by měl organizovat volné místo s maximálním ohledem na jeho možné přidělování. Pokud je v souborovém systému dostupné volné místo, musí být možné přidělit jej libovolnému souboru, jestliže je to potřeba. Požadavek přidělování volného místa se samozřejmě netýká některých speciálních souborových systémů - například systémů, které slouží pouze pro čtení dat (souborový systém na CD-ROM). 2. Každý datový soubor je v systému jednoznačně identifikovatelný. Jednoznačnou identifikovatelnost je nutné provést na systémové i na uživatelské úrovni - pro uživatele by identifikace souborů měla být co možná nejintuitivnější. 3. Základní systémovou ideou je, aby se s datovými soubory manipulovalo stejným způsobem jako s fyzickým zařízením. Tento požadavek vyústil v možnost reprezentovat hardwarová zařízení pomocí speciálních souborů. 4. Implementace by měla být co možná nejvíce abstraktní. Mělo by být možné pracovat zároveň s několika souborovými systémy na různých diskových oblastech a zařízeních. Současně používaným souborovým systémům by měla být ponechána volnost, co se týče vnitřní organizace dat. V současnosti poskytují souborové systémy ještě další služby, které dříve nebyly stěžejní: - Jedná se například o diskovou kvótu umožňující pružně omezovat diskový prostor uživatelům. - Další významnou vlastností souborového systému je transakční zpracování metadat neboli journaling. Transakční zpracování slouží k udržení konzistence záznamů o datech i v případě náhlého pádu systému způsobeného výpadkem proudu. - Architektura souborového systému v Unixu V Unixu existuje jeden fundamentální pojem - soubor. Téměř vše je soubor. Systém souborů je hlavním úspěchem a výhodou Unixu. Pojetí souboru v Unixu je totiž mnohem obecnější než v jiných operačních systémech. Někdy je totiž soubor chápán pouze jako „konečná posloupnost znaků ". Každý soubor - file sestává ze tří částí: ∙ jména souboru ∙ administrativních informacích ∙ obsahu. První dvě složky se souhrnně nazývají metadata souboru a jsou povinné. Metadata jsou ve své podstatě „data popisující data". V tomto případě jsou metadata jméno a administrativní informace o souboru. Obsah souboru je někdy označován jako data souboru a je nepovinný. V systému existují soubory se speciálním významem, které nepotřebují udržovat žádná data. Jedná se například o pevné odkazy.
23/2/2012
UNIX (LINUX)
14
Data lze chápat jako konečnou posloupnost znaků. Obsah souboru sám o sobě nemá žádný význam, interpretace je mu dána až programem nebo uživatelem, který jej používá. Struktura souboru je na obrázku.
Při manipulaci se soubory na uživatelské úrovni se pro jejich rozlišení používají jména. Administrativní informace má každý soubor uloženy ve svém i-uzlu - i-node. Z pohledu systému je jednoznačným identifikátorem souboru právě i-uzel. Jména jsou souborům zaváděna z důvodu snazší uživatelské práce. Mezi administrativní informace obsažené v i-uzlu patří délka souboru, informace o vlastníkovi souboru, údaje o času vzniku a modifikace souboru, přístupová práva a další. Souborový systém v Linuxu Operační systém Linux již od počátku podporoval větší množství různých souborových systémů. Kromě svých vlastních souborových systémů podporuje i souborové systémy jiných operačních systémů, třeba HPFS, NTFS, FAT a řadu dalších. V současnosti počet podporovaných souborových systémů přesahuje 20. Vzhledem k tomuto počtu bylo nutné oddělit implementaci reálných souborových systémů od systémových služeb abstraktní vrstvou. Vznikl tak nový souborový systém. Virtuální souborový systém je navržen s ohledem na podporu velmi rozdílných souborových systémů, některé z nich se používají pouze ve speciálních případech. Virtuální souborový systém poskytuje pro každý reálný souborový systém jednotné programové rozhraní. Detaily implementací jednotlivých souborových systémů jsou pro zbytek jádra skryty. Programátorům se zvenčí jeví všechny souborové systémy stejné, protože při manipulaci se souborovým systémem využívají pouze služeb VFS. Stejně tak uživatelé mohou používat tytéž nástroje pro práci s různými souborovými systémy. Vztah virtuálního souborového systému k reálným souborovým systémům je zobrazen v následujícím schématu.
Jednou z hlavních předností virtuálního souborového systému je možnost snadno pracovat s několika různými souborovými systémy zároveň.
23/2/2012
UNIX (LINUX)
15
Unix umožňuje jednotlivé souborové systémy připojovat a odpojovat na požadavek uživatele.
Souborový systém (systém souborů) Souborový systém je algoritmus ukládání souborů na disk a způsob organizace dat, závisí mimo jiné na typu paměti (pevný disk, CD, síťové externí paměti atd.) • založen na hierarchicky organizovaném systému souborů a adresářů • v záznamech jméno souboru, umístění, časové známky, informace o vlastnících, přístupových právech • umístěn na konkrétním oddílu, proto lze mít více nezávislých souborových systémů (typ souborového systému závisí na HW) • software implementující souborový systém bývá součástí OS • OS podporuje více různých souborových systémů – Linux ext2, ext3, ext4, ReiserFS, JFS, XFS, NTFS, ISO 9660 atd. Pro podporu více souborových systémů a pro současnou práci s nimi vznikl tzv. virtuální souborový systém, který poskytuje pro každý reálný souborový systém jednotné programové rozhraní. Soubor = logická reprezentace dat, programů, záznamů . V Linuxu (Unixu) je téměř vše soubor, tedy i adresář a fyzické zařízení. Soubor chápe jako posloupnost osmibitových slov.
23/2/2012
UNIX (LINUX)
16
Operační systém: áření a rušení souborů, áření a rušení adresářů, a jednoduchých operací pro manipulaci se soubory a s adresáři, ární paměti, ání souborů na energeticky nezávislá média. Správce souborů má tyto funkce: soubor, jeho umístění, užití, stav atd., soubor přidělen, realizuje požadavky na ochranu informací uložených v souborech a realizuje operace přístupu k souborům, soubor, tj. otevírá soubor, soubor, tj. uzavírá soubor. Údaje o souboru (metadata): átor
… Jméno souboru a adresáře - Jméno souboru • Jméno souboru smí být dlouhé nejvýše 255 znaků. Na tuto délku je zkracováno bez varování. • Může obsahovat libovolné znaky, v kořenovém adresáři nesmí být soubor jména "/". • Rozlišují se malá a velká písmena. • Zvláštní význam mají jména souborů začínající znakem ".", např. ".profile" (skryté soubory). • Jméno se fyzicky nerozděluje na jméno a příponu. Pokud hovoříme o příponě, máme na mysli „znaky za poslední tečkou“. Přípony souborů: .c - zdrojový text v jazyce C .C, .cpp - zdrojové texty v C++ .asm, .s - zdrojové texty v Assembleru .f - zdrojový text ve Fortranu .gz - soubor komprimovaný programem gzip .h - hlavičkové soubory C nebo C++ 23/2/2012
UNIX (LINUX)
17
.html - HTML dokument pro World Wide Web .java - zdrojové texty v Javě .man - manuálové stránky .o - objektový soubor .p - zdrojový text v jazyce Pascal .out - výstupní soubor, často spustitelný soubor .php – zdrojový text v PHP .py - zdrojový text v Pythonu .sh - skripty pro shell .shar - archív vytvořený programem shar .tar - archív vytvořený programem tar .z - soubor komprimovaný programem pack .Z - soubory komprimované programem compress - Jména adresářů • Oddělovačem jmen adresářů je znak "/" (lomítko). • Kořenový adresář (root) "/" • Běžný (pracovní) adresář • Rozlišujeme cestu absolutní "/.../.../..." (z kořenového adresáře) a relativní ".../.../..." (z pracovního adresáře). • Každý adresář obsahuje položky "." (tento adresář) a ".." (nadřazený adresář)
Reprezentace souboru na disku Z pohledu operačního systému je soubor posloupností Bytů. Systém obsah souboru neinterpretuje. Poznámka: V textovém souboru se řádky oddělují znakem LF (vs. MS-DOS odděluje řádky znaky CR LF). • Informace o souborech jsou soustředěny do jednoho místa na paměťovém médiu – do seznamu i-uzlů (i-node). • Jeden soubor (nebo adresář) je popsán právě jedním i-uzlem. Maximální počet souborů na disku nemůže překročit počet i-uzlů vyhrazených při vytváření systému. Každý i-uzel obsahuje diskovou adresu uložení dat a velikost souboru na disku. Jméno souboru je uloženo v adresáři. Všechny uzly se na daném médiu číslují od jedničky.
23/2/2012
UNIX (LINUX)
18
• i-uzly neobsahují jméno souboru. • "ls -il" vypíše obsah adresáře včetně čísla i-uzlu. • i-uzel číslo 2 ukazuje vždy na kořenový adresář. Reprezentace adresáře na disku Adresář je zvláštní případ souboru. Obsahuje pouze jméno souboru a číslo i-uzlu. Kořenový adresář a jeho podadresář:
Prázdná položka má číslo i-uzlu nulové. Na soubor obsahující položky kořenového adresáře ukazuje vždy i-uzel číslo 2. Čísla i-uzlů vypíše příkaz „ls –i“. Na jeden fyzický soubor na disku může odkazovat i více jmen. Formát i-uzlu • i-uzel na disku • i-uzel v paměti - na disku • volný x obsazený • UID vlastníka souboru • GID skupiny vlastníků • typ souboru (obyčejný, adresář, symbolický odkaz, znakový nebo blokový speciální soubor, FIFO) • přístupová práva
23/2/2012
UNIX (LINUX)
19
• datum a čas poslední modifikace obsahu souboru, modifikace i-uzlu, přístupu k souboru • počet odkazů na soubor • seznam diskových adres uložení souboru • velikost souboru v bajtech - v paměti navíc obsahuje • identifikaci uzamknutí (pro výlučný přístup) • ... • počet odvolávek (např. kolik instancí souboru je otevřených) • indikace, že soubor je místem připojení dalšího systému souborů Všechny systému souborů jsou propojeny do jednoho adresářového stromu ( v OS je jeden kořenový adresář, disky jsou připojeny přes podadresáře).
Odkaz (link) Odkazem je každá adresářová položka, která ukazuje na i-tý uzel (je zde uveden počet odkazů na i-uzel). - Tvrdý odkaz (hard link) ● lze vytvořit pouze v rámci jednoho fyzického systému souborů ● nově vytvořený odkaz náleží vlastníkovi souboru ● nelze vytvářet odkazy na adresáře ● při vytvoření nového souboru je v i-uzlu uložen jeden odkaz Situace: vytvořili jsme soubor "jméno1"
Vytvořili jsme nový odkaz „ln jméno1 jméno3“
23/2/2012
UNIX (LINUX)
20
Zjištili jsme počet odkazů na soubor: „ls –l“ -rw-r--r-- 2 ucitel users 5 Mar 10 21:25 jméno1 -rw-r--r-- 2 ucitel users 5 Mar 10 21:25 jméno3 • Hodnota "2" je počet odkazů na soubor. • Úvodní "-" (minus) znamená, že jde o obyčejný soubor. • Položky "jméno1" a "jméno3" jsou rovnocenné. Zrušili jsme původní soubor „rm jméno1“
„ls –l“ -rw-r--r-- 1 ucitel users 5 Mar 10 21:25 jméno3 - Odkazy a adresáře Vytvořením nového adresáře se vytvoří i-uzel, přidělí se mu minimální prostor v datové oblasti a vytvoří se dvě adresářové položky (. a .. – tvrdé odkazy na vlastní adresář a na nadřazený adresář). Potřebná čísla i-uzlů spolu se jmény adresářů a počty odkazů zobrazí příkaz „ls –ild“. 81937 drwxr-xr-x 3 ucitel users 1024 Mar 10 22:09 test
- Symbolické odkazy Symbolické odkazy se používají častěji a umožňují: • Odkazy na adresáře • Odkazy mimo jeden systém souborů Situace: máme soubor „jméno3“
23/2/2012
UNIX (LINUX)
21
Vytvoříme symbolický odkaz na „jméno9“: „ln -s jméno3 jméno9“
Vytvořením symbolického odkazu „jméno9“ se nezměnil i-uzel číslo 12 ani adresářová položka „jméno3“. Vytvoří se nový i-uzel typu „symbolický odkaz“ a data obsahují jméno odkazovaného objektu. „ls –l“ -rw-r--r-1 ucitel users 5 Mar 10 22:46 jméno3 lrwxrwxrwx 1 ucitel users 6 Mar 10 22:48 jméno9 -> jméno3 • Úvodní "l" (písmeno L) znamená, že jde o symbolický odkaz. • Hodnota 6 je velikost souboru, tj. počet písmen "jméno3". • Položky "jméno3" a "jméno9" nejsou v žádném vztahu. Příklad: „ln jméno9 jméno8“
Výjimka: Zrušení symbolického odkazu „rm jméno9“
- Speciální soubory ◦1. Speciální soubory představují hardwarová zařízení. • Rozlišujeme: – Znakový speciální soubor (např. klávesnice, tiskárna apod.) – Blokový speciální soubor (např. disky) 23/2/2012
UNIX (LINUX)
22
• Součástí jádra jsou "ovladače zařízení" • Uživatelské rozhraní se vůči zařízením se realizuje prostřednictvím systému souborů • Speciální soubor je odkaz na i-uzel, který ukazuje na ovladač Příkaz pro vytvoření speciálního souboru: „mknod jméno typ hlavní_číslo vedlejší_číslo“ typ - je "b" (blokové zařízení) nebo "c" (znakové zařízení) hlavní_číslo - je číslo udávající typ zařízení – ukazuje do tabulky zařízení vedlejší_číslo - je číslo jednotky • Znakový a blokový speciální soubor vytváří superuživatel • Zpravidla jsou uloženy v adresáři /dev • Ve výpise příkazu „ls –l“ se objeví (údaje v pořadí hlavní číslo, vedlejší číslo) např.: crw-rw-rw- 1 root sys 14, 4 Apr 25 1995 audio brw-rw-r-- 1 root mail 2, 0 Jan 1 1980 fd0 Příklady speciálních souborů /dev/console - konzola počítače (obrazovka a klávesnice), /dev/fd0 - disketa číslo 0, /dev/hda1 - první IDE disk a jeho první oblast, /dev/sda1 - první SCSI disk a jeho první oblast, /dev/lp1 - paralelní rozhraní Centronics odpovídající LPT1:, /dev/cua0 - sériové rozhraní RS-232 odpovídající COM1:, /dev/tty1 - první virtuální konzola, /dev/null - prázdné zařízení, které přijme všechna data a které při čtení předá ihned eof (konec souboru) V Linuxu se příkazem mount – všechny disky, paměťová média a další zařízení připojují do adresářové struktury, parametry připojení v souboru /etc/fstab. ◦2.FIFO – pojmenovaná roura Vytváří se příkazem: „mknod jméno p“ • p (pipe) roura • Pro přenos dat mezi procesy • Při zápisu do roury se data ukládají na disk téměř stejně jako při zápisu do souboru • i-uzel obsahuje ukazatel pro čtení a ukazatel pro zápis • Ukazatele nelze měnit jinak než čtením/zápisem – důsledně FIFO „mknod trubka p“ „ls –l“ prw-r--r-- 1 ucitel users 0 Mar 18 22:12 trubka „man mknod > trubka &“ Přesměrováním > výstup nepůjde na obrazovku, ale do souboru "trubka". Ukončením příkazu znakem & jej spustíme na pozadí. 23/2/2012
UNIX (LINUX)
23
„more trubka“ Výpis obsahu souboru po obrazovkách. „rm trubka“ Zrušení položky "trubka" v adresáři a zrušení i-uzlu. - Speciální adresáře • / - kořen souborového systému, začátek stromové struktury • /bin - základní spustitelné soubory pro použití všemi uživateli • /boot - zde je umístěno jádro (kernel) systému a jeho mapa, initrd, soubory zavaděče (boot loader) GRUB • /dev - fyzická zařízení nebo pseudozařízení • /etc - globální konfigurační soubory systému Etc/passwd Etc/shadow Etc/group • /home - domovské adresáře uživatelů • /lib - základní sdílené knihovny systému, mapování klávesnice a konzolové fonty, moduly pro jádro systému (kernel) • /lost+found - ztracené a opravené soubory po chybách FS (ext2,ext3) • /mnt - do místních podadresářů se připojují další souborová zařízení, např. do "/mnt/floppy" disketa, do "/mnt/cdrom" CD ap. • /opt - zde bývají SW aplikace, které nejsou standardní součástí distribuce •/proc - soubory nastavení a stavu systému a jednotlivých procesů - dalo by se říci, že je to mapa stavu paměti RAM • /root - domovský adresář superuživatele (root) • /sbin - systémové privilegované spustitelné soubory, používané uživatelem root • /sys - virtuání adresář (jádra 2.6.x) • /tmp - adresář pro odkládací a pomocné soubory • /usr - další stromová struktura, obsahuje velké množství informací, jako knihovny, zdrojové kódy, spustitelné soubory, konfigurační soubory pro jednotlivé uživatele • /var - soubory, jejichž obsah se během chodu systému většinou mění;
23/2/2012
UNIX (LINUX)
24
- Struktura systému souborů a superblok Kompletní systém souborů obsahuje tyto komponenty: ◦Zaváděcí blok – je umístěn na začátku systému souborů. Může obsahovat zaváděcí program, který se načítá v okamžiku zavádění systému do počítače. Pokud jej neobsahuje, je zaváděcí blok prázdný. ◦Superblok • velikost systému souborů • počet volných bloků v systému souborů • seznam volných bloků • index následujícího volného bloku v seznamu • velikost seznamu i-uzlů • počet volných i-uzlů • seznam volných i-uzlů • index následujícího volného i-uzlu v seznamu • pole zámků pro seznam volných bloků a i-uzlů • příznak modifikace superbloku ◦Seznam i-uzlů – jeho velikost určuje administrátor při vytváření systému souborů. ◦Datové bloky – každý blok patří nejvýše jednomu souboru popsanému v seznamu i-uzlů. - Přístupová práva V i-uzlu pro vyhodnocení přístupových práv jsou: vlastník souboru Číselné UID toho uživatele, který soubor vytvořil nebo kterému jej superuživatel věnoval. skupina vlastníka Číselné GID skupiny, do které byl uživatel v okamžiku vytváření souboru přihlášen nebo na kterou bylo GID změněno. Přístupová práva jsou v objektu uložena ve 12 bitech viz Poznámka. Zjednodušeně pro běžné uživatele jsou přístupová práva v objektu uložena v 9 bitech. práva Ve výpisu „ls –l“: - rwx r-x r-x 1 novák student ... lze oktalově zapsat 7 5 5 u g o a vlastník (označuje se u jako ’user’) Vlastníkem je ten, jehož UID je zapsáno v i-uzlu. skupina (označuje se g jako ’group’) ostatní (označuje se o jako ’others’) všichni (označuje se a jako ’all’) Systémy soubor °u
23/2/2012
UNIX (LINUX)
25
Přístupová práva souboru:e: r - Soubor je povoleno číst (read). w - Do souboru je povoleno zapisovat (write). x - Soubor je povoleno spustit (provést) – execute. Systémy soubor °u Přístupová práva adresáře (d):e operace tyto významy: r - Adresář je povoleno vypsat; nikoli však zpřístupnit soubory v něm odkazované. w - Do adresáře je povoleno zapisovat; tj. lze vytvářet a rušit soubory. x - Do adresáře je možné vstoupit; tj. adresář může být argumentem příkazu cd a lze zpřístupnit i-uzly souborů, na které se adresář odkazuje. Přístupová práva se vyhodnocují v pořadí ugo. Vytvořit soubor mohu v kterémkoli adresáři, do kterého mám právo vstupu (x) a současně zápisu (w). Zrušit soubor libovolného vlastníka mohu v libovolném adresáři, do kterého mám právo vstupu (x) a současně zápisu (w).
Příkaz pro změnu práv chmod (symbolicky - relativně) akceptuje parametry jako [ugoa][-+=][rwxst]. Tedy nejprve uvedeme komu měníme práva, pak uvedeme, jestli odebíráme právo (-), přidáváme (+), nebo nastavujeme přesně podle následujícího výčtu (=). Oprávnění můžeme také zapsat jiným způsobem (oktalově - absolutně).
23/2/2012
UNIX (LINUX)
26
Poznámka: Ještě existují 3 méně známé bity oprávnění, a to sticky (t) - 1000, setgid (s u skupiny) 2000 a setuid (s u uživatele) - 4000. Tedy pokud k oprávnění 640 budeme chtít přidat bit setgid, musíme použít oprávnění 2640. Příznak sticky - Soubor uložený v adresáři, který má pro skupinu uživatelů právo zápisu, může kterýkoliv člen této skupiny smazat. To může být někdy nevýhodné, například u adresáře /tmp, kam si může kdokoliv něco odložit (právo zápisu do tohoto adresáře mají všichni uživatelé systému). Nastavíme-li na takový adresář sticky bit, změníme tím chování systému. Soubory (i adresáře) v tomto adresáři pak může smazat jen jejich vlastník (nebo uživatel root - správce systému). K nastavení tohoto příznaku slouží u příkazu chmod volba +t. - Přesměrování vstupu a výstupu (¦, >, >>, <) Občas je zapotřebí přesměrovat výstup programu do nějakého souboru nebo naopak řídit běh programu pomocí příkazů, které jsou obsaženy v některém souboru. - Roura (pipe, pipeline) neboli „¦" Tento operátor nespadá do žádné známé kategorie. Tedy nepředává vstupní informace na výstup ani naopak. Slouží ke kombinaci příkazů a jejich rozšiřování. S jeho pomocí lze například upravit výpis příkazu ls. Často se totiž dostaneme do situace, kdy výpis adresáře bude delší než počet řádků obrazovky. Jak už jsme si řekli, k řízení tohoto výpisu můžeme použít příkaz ls. Použijeme rouru: „ls -laF ¦ less“ V tuto chvíli se výpis adresáře podřídí stránkovému formátování a obdržíme výstup, který se bude vypisovat po jednotlivých obrazovkách. - Přesměrování výstupu Pokud chceme vložit výstup činnosti některého příkazu do souboru, máme na výběr. Buď můžeme tento soubor přepsat (pokud neexistuje, bude založen; pokud existuje, bude vymazán a následně zaplněn přesměrovaným výstupem), nebo můžeme tento soubor doplnit, tj. na jeho konec bude vložen námi přesměrovaný výpis: • Syntaxe přepsání: příkaz > soubor „ls -laF > vypis.txt“ • Syntaxe doplnění: příkaz » soubor „cat /etc/shadow » hesla.txt“ - Přesměrování vstupu Občas se dostaneme i do situace, kdy nechceme řídit činnost programu ručně z terminálu, ale raději bychom ji zautomatizovali. Zde nastává jedinečná příležitost pro využití přesměrování vstupu ze souboru. • Syntaxe: příkaz < soubor Často se toto přesměrování používá například při automatizované konfiguraci nebo řízení FTP připojení, kdy chceme definovat, kam se má počítač přihlásit, co tam má udělat a jak se má odhlásit apod.
23/2/2012
UNIX (LINUX)
27
3. Systém procesů Proces je instance programu, který je právě spuštěn operačním systémem. V systému UNIX může proces vzniknout jedině voláním jádra fork. UNIX, jakožto představitel víceúlohového systému, je schopen provádět v jednom okamžiku více než jednu úlohu (proces). Stejně tak i v rámci jednoho programu může být v jednom okamžiku realizováno několik různých procesů. Proces, který vyvolal volání jádra fork, se nazývá „rodičovský“ (parent) či prostě jen „předek“. Nově vytvořenému procesu říkáme „potomek“ (child) někdy též „dceřiný/synovský proces“. Každý proces má jednoho rodiče, ale zároveň může mít i větší počet potomků. Je-li proces operačním systémem vykonáván, říkáme o něm (o systému), že běží v kontextu procesu. Když se jádro systému rozhodne, že by mělo vykonávat jiný proces, provede přepnutí kontextu. Jádro uschová dostatek informací, takže později může zpracování přerušeného procesu obnovit. Kontext procesu se skládá z obsahu jeho uživatelského adresového prostoru a obsahu strojových registrů, datových struktur jádra, které se k procesu vztahují. Každý proces je identifikovatelný podle svého celočíselného 16 bitového identifikátoru PID (Process Identification). Tuto celočíselnou hodnotu přiděluje jádro v okamžiku vytvoření nového procesu. Až na výjimky nemají hodnoty PID žádnou vypovídající hodnotu o procesu samotném, přidělují se lineárně v určitém rozsahu. Po jeho „přetečení“ se přidělují zase od začátku. Jádro udržuje dvě základní datové struktury – tabulku procesů a tzv. u-blok. - UNIXová tabulka procesů obsahuje informace pro všechny procesy - i pro ty, které nejsou momentálně v paměti. Proto je také tabulka stále v paměti přítomna. Udržované informace o procesech jsou například jejich PID, stav a parametry příkazové řádky, ale také hodnota registrů (programový čítač, ukazatel zásobníku, …), status otevřených souborů atd. Operační systém spravuje procesy na základě jejich identifikátoru PID, který funguje v tabulce procesů jako index. Na rozdíl od tabulky procesů nejsou informace u-bloku stále přítomny v paměti. Pokud je asociovaný proces mimo paměť, jsou jeho informace odloženy (odswapovány). Účelem je nezabírat místo v paměti daty, které nejsou potřeba. Ublok tedy obsahuje informace o procesu, které nejsou potřebné pokud je mimo paměť. Příkladem porovnání tabulky procesů a u-bloku může být zaslání signálu procesu. Signály lze zasílat i procesům momentálně nenacházejícím se v paměti, proto informace s tímto svázané musí být v tabulce procesů. Na druhou stranu informace o souborech, se kterými proces pracuje, jsou udržovány v u-bloku. Tyto informace jsou potřebné jen pokud je proces v paměti a je možno jej vykonávat. Následuje přehled informací udržovaných v u-bloku: • Registry procesoru. Po instrukci trap se uloží obsahy všech registrů (včetně FPU – floating point unit) do u-bloku. • Stav systémového volání. Číslo právě probíhajícího systémového volání, jeho parametry a výsledky. • Tabulka popisovačů souborů. Pracuje-li systémové volání se soubory, je deskriptor 23/2/2012
UNIX (LINUX)
28
souboru použit jako index do této tabulky. Ukazuje na i-uzel odpovídající danému souboru. • Účtování. Ukazatel do tabulky, která sleduje čas, který proces strávil v uživatelském kontextu a v kontextu jádra. Některé systémy nastavují limitní hodnoty času CPU, které procesor smí „spotřebovat“. • Zásobník jádra. Jak již napovídá název, ukládá se sem zásobník používaný procesem běžícím v kontextu jádra. Technicky vzato je nový proces vytvořen stávajícím procesem, který vyvolá patřičné systémové volání. Toto systémové volání přímo či nepřímo říká operačnímu systému jaký program v procesu poběží. Během práce v systému se lze setkat se třemi druhy procesů. • Uživatelské procesy - userspace processes jsou spouštěny jednotlivými uživateli, zpravidla pomocí interpretu příkazů. Obrazem procesu je obvykle program uložený na některém souborovém systému. Pokud má program nastaven SUID bit, vlastníkem procesu se stává vlastník tohoto programu. V opačném případě je vlastníkem procesu uživatel, který jej spustil. Vlastníkovi procesu se jinými slovy říká efektivní uživatel. • Systémové procesy - daemons jsou spouštěny během startu systému a zajišťují různé služby. Systémový proces běží zpravidla v nekonečné smyčce a plní vymezené úkoly. Typickou činností systémového procesu je například periodická obsluha klientů. Systémové procesy jsou zpravidla odpojené od terminálů. Vlastníkem systémového procesu je buďto superuživatel root, nebo některý ze systémových uživatelů. Systémový proces se někdy nazývá daemon. • Vlákna jádra - kernel threads jsou v podstatě speciální části jádra operačního systému běžící jako speciální procesy. Například vlákno kmod se stará o zavádění vyžadovaných modulů jádra do paměti. Na počítači s jedním procesorem může v jednom okamžiku běžet vždy jen jeden proces a ostatní musí čekat, až na ně přijde řada. Díky velmi krátkým intervalům, po které je proces aktivní, se zdá, že programy běží současně – mluvíme o preemptivním multitaskingu, protože procesy jsou přepínány bez jejich vědomí. Který proces bude v příštím okamžiku aktivní rozhoduje operační systém na základě tzv. plánovače procesů (scheduler). Zkráceně řečeno, plánovač přiděluje procesor procesům. Ty buď procesor dobrovolně uvolní, například protože čekají na systémové zdroje, nebo je jádro nuceně přeruší. K tomu dojde ve chvíli, kdy čas jejich posledního běhu dosáhne hodnoty přiděleného časového intervalu. Z procesů, které přicházejí v úvahu, pak plánovač vybere ke zpracování proces s nejvyšší prioritou. Původní proces bude znovu spuštěn, jakmile se stane vhodným kandidátem.
23/2/2012
UNIX (LINUX)
29
Jedna z mála oblastí, ve které se operační systém Linux liší od tradičního UNIXu je právě algoritmus plánování procesů. Základní rozdíl spočívá v tom, že se zde nepracuje s procesy jako takovými, ale s vlákny (thread). Pomocí nastavení setuid můžeme docílit stavu, kdy proces vlastněný uživatelem A má privilegia, která má uživatel B. Pokud program zavedený do paměti má v i-uzlu nastaven bit setuid, pak: – efektivní UID je rovno UID vlastníka souboru s programem, – reálné UID se nemění a je shodné s UID vlastníka procesu. V situaci, kdy bit setuid není nastaven, se obě hodnoty (EUID i RUID) nemění a obsahují UID vlastníka procesu. Stavy a přechody procesu v systému UNIX Existuje devítistavový model. Jedná se o stavový diagram popisující přechody mezi jednotlivými stavy procesu.
23/2/2012
UNIX (LINUX)
30
Stavy procesů OS UNIX
Proces vstoupí do stavového modelu ve stavu „vytvořený“, když rodičovský proces provedl volání jádra fork a poté přejde do stavu, ve kterém je připravený ke zpracování 3 nebo 5. Pro jednoduchost předpokládejme, že proces přejde do stavu „připravený ke zpracování v paměti“. Plánovač procesů jej dříve či později vybere ke zpracování a proces přejde do stavu „běžící v režimu jádra“, kde dokončí svou část volání jádra fork. Když proces dokončí volání jádra, může přejít do stavu „běžící v uživatelském režimu“. Po uplynutí časového úseku může časovač přerušit procesor a proces vstoupí znovu do stavu „běžící v režimu jádra“. Když přerušovací rutina časovače dokončí obsluhu přerušení, může si jádro vybrat ke zpracování jiný proces, takže první proces přejde do stavu „nuceně přerušený“ a běží jiný proces. Stav „nuceně přerušený“ je ve skutečnosti totožný se stavem „připravený ke zpracování v paměti“ (přerušovaná čára na obrázku, která spojuje tyto dva stavy, naznačuje jejich ekvivalenci), ale pro zdůraznění skutečnosti, že proces pracující v režimu jádra může být nuceně přerušený jen když se chystá k návratu do uživatelského režimu, jsou znázorněny samostatně. Pokud by to bylo nezbytné, mohlo by jádro následně ještě proces ve stavu „nuceně přerušený“ odložit. Plánovač posléze vybere proces znovu ke zpracování a ten se vrátí do stavu „běžící v uživatelském režimu“. Když proces provádí volání jádra, opustí stav „běžící v uživatelském režimu“ a přejde do stavu „běžící v režimu jádra“. Předpokládejme, že volání jádra vyžaduje diskový I/O, při kterém proces musí čekat na jeho dokončení. Zablokuje sám sebe až do chvíle, kdy je informován o jeho dokončení. Když je později I/O operace skutečně
23/2/2012
UNIX (LINUX)
31
dokončena, přeruší technické prostředky procesor, přerušovací rutina proces aktivuje a způsobí jeho přechod do stavu „připravený ke zpracování v paměti“. Předpokládejme, že v systému běží mnoho procesů, které se nevejdou najednou do hlavní paměti, takže je proces vyměňovacím procesem odložen, aby udělal místo pro jiný proces, nacházející se ve stavu „připravený ke zpracování, ale odložený“. Když je proces z hlavní paměti odstraněn, přejde do stavu „připravený ke zpracování, ale odložený“. Časem vybere vyměňovací proces tento proces za nejvhodnějšího kandidáta uložení do hlavní paměti a proces se znovu dostane do stavu „připravený ke zpracování v paměti“. Plánovač posléze vybere tento proces ke zpracování, ten přejde do stavu „běžící v režimu jádra“ a pokračuje. Když proces končí, provede volání jádra exit a přejde proto nejprve do stavu „běžící v režimu jádra“ a na závěr do stavu zombie. Při pohledu na stavový diagram vidíme, že jádro povolí přepnutí kontextu za čtyř okolností: • proces zablokuje sám sebe, • proces skončí, • proces se vrací z volání jádra do uživatelského režimu, ale není nejvhodnějším kandidátem pro další běh, • vrací se do uživatelského režimu poté, co jádro dokončilo zpracování přerušení, a proces není nejvhodnějším procesem pro další běh. Jádro zajišťuje integritu a konzistenci svých interních datových struktur tím, že zakazuje libovolné přepnutí kontextu. Tedy žádný proces nemůže např. přerušit jiný proces, který běží v režimu jádra. Každý proces má přiřazeno minimálně šest identifikátorů zobrazených v následující tabulce:
• reálné UID a GID – identifikátor uživatele a skupiny, která je skutečným vlastníkem procesu. Tyto dvě položky jsou uloženy v /etc/passwd a za běžných podmínek se v průběhu přihlášení se do systému nemění. (Proces superuživatele je však změnit může.) • efektivní UID a GID, ID doplňkových skupin – určují přístupová práva k souborům. Doplňkové skupiny jsou (za předpokladu, že uživatel patří do více skupin) uloženy v /etc/group, kde jsou uživatelskému jménu přiřazeny ve formě 23/2/2012
UNIX (LINUX)
32
seznamu. • Záloha SUID a SGID – obsahují kopie efektivních UID a GID, které proces měl při spuštění. Za normálních okolností jsou reálné a efektivní ID shodné. Tedy pokud uživatel spustí program, tak RUID a EUID (a samozřejmě RGID a EGID) vzniklého procesu mají stejné hodnoty. Je však možné použít speciální příznak, který program při spuštění přinutí změnit svůj efektivní UID na UID vlastníka souboru (podobně i pro skupinu). Programu s takto nastaveným příznakem říkáme „program s nastaveným uživatelem“, obvykle se, ale používá označení „setuid“ z anglického set-user-ID. Vzniklý proces pak obvykle disponuje silnějšími právy. Například, je-li vlastníkem souboru s programovým kódem uživatel root (superuživatel), pak po spuštění souboru bude mít vzniklý proces superuživatelská práva. Při přístupu k souborům se provádí následující sada testů. Kroky se prochází od začátku, tedy vyhovuje-li pravidlo č. 1, přístup je povolen bez testování ostatních kroků: 1. Pokud je efektivní UID procesu rovno 0 (proces superuživatele), přístup je povolen. 2. Je-li efektivní UID procesu shodný s vlastníkem souboru, přístup je povolen či odepřen v závislosti na přístupových právech ke konkrétní činnosti (čtení, zápis, spuštění). 3. Je-li efektivní GID procesu nebo ID některé doplňkové skupiny roven vlastnické skupině souboru, pak je opět přístup povolen nebo odepřen s ohledem na patřičná přístupová práva. 4. Pokud jsou souboru nastavena práva pro „Ostatní“, je přístup povolen či odepřen dle těchto práv. Následující obrázek schematicky zachycuje základní stavy procesu. Uživatelé systému by však měli být seznámeni se zjednodušeným schématem stavu procesů.
Seznam procesů v systému lze získat programem „ps“ (podrobně viz Příkazy Linuxu). Program ps má mnoho argumentů. Použijeme-li jej bez argumentu, ps
23/2/2012
UNIX (LINUX)
33
vypíše seznam aktivních procesů spojených s aktuálně používaným terminálem. Ve výpisu nebudou zobrazeny procesy spuštěné z jiných terminálů. Zobrazované stavy mohou nabývat hodnot S - spící proces, R - běžící proces a T pozastavený proces. - Běh procesů na pozadí Spuštěním každého programu vždy vznikl proces, který proběhl a skončil. Všechny předchozí příklady měly jeden společný rys, všechny procesy běžely na popředí foreground. To znamená, že v době běhu procesu uživatel nemohl používat shell. Příkazový interpret coby rodičovský proces čekal na dokončení synovského procesu - spuštěného programu. Jelikož je systém Unix víceúlohový, vzniká přirozený uživatelský požadavek spouštět některé procesy na pozadí - background. Od procesu běžícího na pozadí se očekává, že nebude omezovat uživatele v práci v shellu. Dalším plynoucím požadavkem je samostatnost procesu běžícího na pozadí. Proces běžící na pozadí by v žádném případě neměl být interaktivní. Komunikace procesu s jeho okolím by měla být orientována například na práci se soubory, v žádném případě by proces na pozadí neměl vypisovat hlášení na terminál. To by bylo silně rušivé. Proces na pozadí rovněž nemůže čekat na uživatelský vstup, protože by okamžitě přešel ze stavu běžící do stavu pozastavený. Operační systém Unix disponuje mechanismy pro přesměrování vstupu a výstupu procesů do souboru. Nyní budeme pro jednoduchost předpokládat, že všechny procesy běžící na pozadí budou „úplně tiché". Příkladem úplně tichého procesu je komprese. Standardní kompresní program gzip pracuje naprosto tiše, během komprese a dekomprese neukazuje zhola nic, proto se výborně hodí jako proces spuštěný na pozadí. Pokud by uživatel chtěl spustit na pozadí proces vypisující výstup na terminál, musí výstup programu patřičně přesměrovat. Předpokládejme, že uživatel novakj chce spustit program ~/data/archivuj archivující velké množství dat. Z důvodu předpokládaného dlouhého běhu by bylo rozumné spustit proces na pozadí. Proces lze spustit na pozadí uvedením metaznaku ampersand „&" na konci příkazu spuštění. Viz příklad. $ -/data/archivuj & [1] 15635 Bezprostředně pro spuštění procesu na pozadí shell uživateli zobrazí informační řádek. Jsou na něm napsána dvě čísla. První číslo, uvedené v hranatých závorkách, je identifikátor procesu v rámci aktuálního shellu. Druhé číslo je PID procesu. V rámci každého shellu jsou procesy číslovány od jedné. Na proces spuštěný v shellu se lze při další práci odkazovat oběma čísly. Na proces spuštěný z jiného shellu se lze z pochopitelných důvodů odkazovat pouze pomocí PID. Jinými slovy, informace o číslech PID si uchovává samotné jádro systému, čísla v rámci shellu jsou uchovávána každým shellem zvlášť. Úspěšné dokončení činnosti programu archivuj je oznámeno uživateli následujícím hlášením [1]+ Done ~/data/archivuj V případě, že je proces ukončen voláním jádra exit (), hlášení bude mít tvar 23/2/2012
UNIX (LINUX)
34
[1]+ Exit 10 ~/data/archivuj kde číslo za slovem „Exit", v tomto případě 10, vyjadřuje návratovou hodnotu programu. Každý program v Unixu po svém ukončení navrací hodnotu. Standardní hodnota je 0 a znamená úspěšný konec běhu. Ostatní hodnoty označují chyby nebo výjimečné situace. Jednotlivé hodnoty chybových stavů lze nalézt v manuálových stránkách příslušných programů. - Přesun na pozadí a na popředí Při práci v systému se často stává, že uživatel spustí proces, který běží nad očekávání dlouhou dobu. V takovém případě je vhodné přesunout proces na pozadí. Uživatel musí vyřešit problém, jak přesunout na pozadí proces, jenž byl původně spuštěn na popředí. To je trochu jiný problém než přímé spuštění procesu na pozadí pomocí příkazu ukončeného metaznakem „&". Předpokládejme, že uživatel novakj spustil program archivuj na popředí a délka jeho činnosti začala být neúnosná. Uživatel se rozhodne přesunout proces na pozadí. Shell umožňuje pomocí Ctrl - Z pozastavit chod programu. Viz příklad.
Hlášení „Stopped" oznamuje pozastavení procesu. To potvrzuje i stav procesu ve výpisu. Pokud se proces nalézá ve stavu T, jedná se o pozastavený proces. Pozastavený proces není zařazován plánovačem mezi vykonávané procesy. Uživatel musí dát procesu pokyn, aby přešel do stavu R. Je nutné uvědomit si, že pozastavený proces není ekvivalentní procesu běžícímu na pozadí. Proces ve stavu T skutečně „stojí", plánovač jej nezařazuje do fronty procesů čekajících na přidělení procesorového času,
Při pozastavení procesu uživatel obdržel identifikátor, v tomto případe je to číslo 1. Následně byl použit příkaz „bg 1“ a hlášení dává najevo, že proces byl přesunut na pozadí. To lze ověřit i výpisem procesů.
23/2/2012
UNIX (LINUX)
35
Nyní je proces označen symbolem R - running. To je již v pořádku. Příkazem bg lze manipulovat pouze s procesy v rámci jednoho shellu, to je dáno i jeho argumentem. Příkazu bg nelze předat jako argument PID. Není-li pro bg uveden argument, bere se poslední použitý identifikátor procesu v rámci aktivního shellu. K příkazu bg existuje i protějšek - příkaz „fg“. Příkaz fg slouží k přesunu procesu na popředí. Přesunout na popředí lze jednak proces běžící na pozadí, ale i proces pozastavený. - Změna priority procesů K dalším problémům správy procesů patří změny priority procesu. Priorita procesů určuje, jak často jim bude plánovač přidělovat procesorový čas. Priorita se v systému Unix značí číselně. Čím vyšší číslo, tím menší má proces prioritu. Změnu priority může provádět superuživatel root, ale i běžní uživatelé. Superuživatel root může manipulovat s prioritou procesu zcela libovolně. Běžný uživatel může pouze snižovat prioritu vlastních procesů. Pro manipulaci s prioritou procesu jsou v Unixu k dispozici programy „nice“ a „renice“. Programem nice je možné spustit proces s pozměněnou prioritou. Pomocí programu renice lze změnit prioritu již běžícímu procesu. - Ukončení života procesu Vazba synovského procesu na jeho rodiče je v operačním systému Unix velmi těsná. S ukončením rodičovského procesu jsou ukončeny i všechny jeho děti. Tato vazba je ve většině případů výhodná - při ukončení rodičovského procesu jsou automaticky ukončeny i všechny procesy nacházející se v hierarchii níže. Při manipulaci s procesy je nutné dbát velké opatrnosti. Pokud se správci systému nedopatřením podaří ukončit proces /sbin/init během víceuživatelského režimu, uživatelé z toho nebudou plesat nadšením. Samotný zánik procesu je doprovázen několika jevy. - Signály Původní funkce signálů byla podobná k „přerušení“. Například k přerušení provádění příkazu před jeho normálním ukončením sloužil (a slouží) signál SIGINT. Ten se obvykle vyvolá pomocí klávesové kombinace Ctrl–C. Používání signálů však postupně přerostlo oblast pouze výjimečných událostí a proniklo i do komunikace a řízení procesů. Signály, které dorazí k procesu, lze totiž ignorovat, což není příliš přínosné, a nebo obsloužit definovaným programem (signal handler). Signály se obvykle objevují asynchronně, což znamená, že proces nikdy předem neví, kdy se signál objeví. Celkem existuje pět možností generování signálů: • Volání jádra kill umožňuje procesu, aby odeslal signál jinému procesu nebo sám sobě. V prvním případě je nezbytné, aby odesílající i přijímající proces měli totožné ID efektivního uživatele (nebo musí být odesílající superuživatelem). • Příkaz kill se také používá k odeslání signálů. Interně se, ale opět použije systémové 23/2/2012
UNIX (LINUX)
36
volání kill. Typicky se příkazem kill bez parametrů posílá signál SIGTERM. • Některé terminálové znaky jsou navázány na signály. Příkladem je znak přerušení (Ctrl-C nebo Delete), které vygenerují signál SIGINT (viz tabulka níže) a ukončí tak proces, který právě probíhá. Pak také znak ukončení (Ctrl-\), který signálem SIGQUIT ukončí běžící proces a generuje obraz jeho paměti. V neposlední řadě existuje terminálový znak pozastavení procesu, vyvolaný kombinací Ctrl-Z. Ten generuje signál SIGTSTP. • I HW problém způsobuje zasílání signálů. Např. kolize aritmetiky, reálných čísel má za následek signál SIGFPE. Odkaz na adresu mimo adresový prostor procesu vede k SIGSEGV. • Poslední možnou příčinou je hlídání určitých stavů jádrem. Například při příchodu dat překračujících rozsah dojde ke slovu signál SIGURG. Zjevně tedy může signály odesílat jeden proces druhému nebo sám sobě, a pak také jádro procesu. Názvy signálů jsou definovány v hlavičkovém souboru signal.h. Výpis těch nejdůležitějších je uveden v následující tabulce:
Kromě zasílání signálů disponuje systém Unix ještě dalšími mechanismy meziprocesové komunikace, jedná se zejména o roury, sockety, sdílenou paměť a zasílání zpráv. Některé z nich jsou hojně využívány i na uživatelské úrovni . Při ukončení svého běhu proces navrací celočíselnou hodnotu. Rodičovský proces může čekat na dokončení synovského procesu a poté přebere jeho návratovou hodnotu. K tomu v systému slouží volání jádra wait (). Při použití volání jádra wait () je proces 23/2/2012
UNIX (LINUX)
37
pozastaven a jádro jej znovu rozeběhne až po dokončení některého ze synovských procesů. Je-li synovský proces ukončen, avšak rodičovský proces dosud nepřevzal informace o jeho skončení pomocí wait (), jádro si informace o synovském procesu neustále udržuje. Již neběžící synovský proces, o kterém si jádro stále udržuje informaci, se nazývá mátoha - zombie. Jelikož je převzetí informací o ukončeném procesu důležité, jádro informuje rodiče o dokončení synovského procesu signálem SIGCHLD. - Skupiny procesů Absolutní závislost synovského procesu na jeho rodiči může být v některých případech omezující. Uživatelé mohou spouštět procesy, například náročné výpočty, jejichž ukončení bude trvat řádově několik dní. V takových případech je vhodné, aby se uživatel mohl odhlásit ze systému, zároveň by ale některé jeho procesy měly i nadále běžet. Uživatel by měl být schopen ukončit práci s příkazovým interpretem bez nutnosti ukončit běh všech procesů spuštěných z shellu. Kdyby byly všechny procesy těsně vázané na svého rodiče, v tomto případě shell, po jeho ukončení by rovněž zanikly. Přirozený požadavek samostatnosti některých procesů řeší systém Unix zavedením skupin procesů. Každá skupina procesů má svého vedoucího člena. Pokud se chce proces vymanit z existenční závislosti na svém rodiči a vedoucím skupiny, provede volání jádra setpgrp (). Po tomto volání se sám stává vedoucím skupiny a je již na svém rodiči existenčne nezávislý. Pomocí programu ps lze u procesů vypisovat i PID jejich vedoucího skupiny. $ ps -u novakj --forest -o pid,ppid,pgrp,comm
Třetí sloupec představuje PID vedoucího skupiny. Pro přehlednost byl při výpisu použit argument --forest, který graficky vyznačuje hierarchii procesů. Z předchozího výpisu plyne, že uživatel novakj pracuje se dvěma příkazovými interprety. V jednom si prohlíží manuálovou stránku a v druhém spustil program „ps“. Po spuštění si program man vytvoří několik pomocných synovských procesů - je to samostatný shell, program gzip na dekompresi zformátované manuálové stránky a program pager zobrazující výslednou stránku. Všechny tyto procesy jsou existenčně závislé na jejich vedoucím skupiny - procesu man. Všechny ostatní procesy ve výpisu jsou existenčně nezávislé. Ukončí-li uživatel proces číslo 31120, budou ukončeny i všechny jeho synovské procesy. Příkazový interpret bash standardně spouští všechny programy způsobem zaručujícím jejich nezávislost. Princip je velmi 23/2/2012
UNIX (LINUX)
38
jednoduchý. Shell nejprve vytvoří nový proces pomocí volání jádra fork () a v něm zavolá setpgrp (), bezprostředně poté překryje svůj obraz volaným programem pomocí execve (). Jelikož nebyl po volání setpgrp () vytvořený nový proces, ale došlo pouze ke změně obrazu, volaný program tímto způsobem podědí samostatnost. Příkaz „nohup“ provede spuštění programu, který poběží i po odhlášení uživetele. Program je spuštěn popsaným způsobem, nohup navíc provede přesměrování jeho výstupu do souboru nohup.out. Viz příklad. $ nohup -/data/archivuj &
Po dokončení procesu si uživatel může ze souboru nohup.out přečíst případné výstupní informace vytvořené procesem během jeho života. - Plánované spouštění procesů V systému Unix je možné plánovat spouštění procesů. Jinak řečeno, uživatel může definovat čas a proces, který má být spuštěn. Plánovaně spouštěné procesy lze využít například k přesunutí běhu procesu do časově výhodné doby nebo například k periodickému spouštění procesů. Na počátku je dobré upozornit na fakt, že o plánované spouštění procesů se nestará jádro operačního systému, je plně v režii systémových daemonů. - 1/ Jednorázové spouštění procesů Systémový proces „atd“ se stará o plánované spouštění uživatelských procesů a de facto zprostředkovává samotnou službu plánovaného spouštění procesů. Uživatelé mohou plánovat spuštění procesů pomocí programu „at“. Uživatelský program at umožňuje spouštět příkazy v předem zadaný čas. Program at používá vlastní prompt „at>". Důvodem je odlišení programu at od shellu. Seznam naplánovaných procesů lze zobrazit programem „atq“. Běžný uživatel může vidět pouze procesy, které sám naplánoval. Superuživatel root je díky svým neomezeným privilegiím oprávněn vidět všechny naplánované procesy v systému. - 2/ Periodické spouštění procesů K periodickému plánování spouštění procesů slouží daemon cron. Tento daemon běží na většině systémů a obstarává základní činnosti, které je nutné periodicky vykonávat. Sem patří například rotace logu, čištění dočasných adresářů, synchronizace času a podobně. Obvykle je používání programu cron vyhrazeno jen superuživateli root. Informace pro deamona cron lze zadávat a prohlížet pomocí programu „crontab“. - 3/ Systémový kalendář Další z užitečných služeb týkajících se plánování úloh je program „calendar“. Nejedná se o klasický plánovač úloh, spíš o pomocný program upozorňující uživatele na nadcházející události. Program calendar není spouštěn uživatelem, ale zpravidla jej jednou denně spustí program cron. Po svém spuštění calendar prohledá domovské adresáře uživatelů, a pokud narazí na soubor -/ . calendar, prohledá jeho 23/2/2012
UNIX (LINUX)
39
obsah a pošle uživateli poštou oznámení o všech záznamech týkajících se aktuálního nebo nadcházejícího dne. Obsah souboru -/.calendar je velmi jednoduchý. Každý řádek specifikuje jednu událost. Událost obsahuje datum a popis. Popis formátu data nalezne uživatel v manuálové stránce. Následující příklad ukazuje obsah souboru -/ . calendar. $ cat -/.calendar
K informacím ze souboru -/ . calendar lze připojovat i informace z globálních databází svátků a událostí. K tomuto účelu slouží direktiva #include. V ukázce byla direktiva použita k zahrnutí informací o základních historických faktech. Program calendar bývá někdy omylem zaměňován s programem „cal“. Program cal slouží k vypisování kalendáře, umožňuje například přehledně zobrazit kalendář na daný měsíc či rok. Program cal. ale nemá nic společného s plánovaným spouštěním procesů.
4. Interprety příkazů (shell) Unixu Interpret příkazů je program, který se chová jako vyrovnávací paměť mezi uživatelem a operačním systémem. Jako interpret příkazů by měl pracovat ve většině případů na pozadí a uživatel by si neměl být vědom jeho přítomnosti. Interpret příkazů lze také využít k tvorbě jednoduchých programů. - Účel interpretu příkazů Interpret příkazů je používán nejvíce k těmto třem účelům: • Interaktivní komunikace se systémem. • Přizpůsobení pracovního prostředí. • Programování. •Interaktivní komunikace se systémem Pokud interpret příkazů pracuje v interaktivním režimu, čeká na zadání příkazů od uživatele, které posléze zpracuje (interpretuje speciální znaky jako například expanzní znaky) a provede. Interpret příkazů také poskytuje množinu zabudovaných příkazů, které nahrazují některé samostatné programy Linuxu. •Přizpůsobení pracovního prostředí Interpret příkazů Linuxu definuje proměnné (jako například nastavení uživatelova domovského adresáře nebo poštovní schránky), pomocí kterých kontroluje chování uživatele. Některé proměnné jsou přednastaveny systémem, jiné jsou nastaveny uživatelem v inicializačních souborech interpretu příkazů, které jsou načítány při startu interpretu příkazů. Tyto inicializační soubory mohou také obsahovat příkazy, které se provedou ihned po přihlášení k systému.
23/2/2012
UNIX (LINUX)
40
•Programování Sekvence příkazů (ať příkazů interpretu příkazů, nebo jiných příkazů dostupných v systému) tvořící program se nazývá skript interpretu příkazů. Něco podobného jsou i dávkové soubory v systému MS-DOS. Interpret bash je považován za silný programovací nástroj, zatímco o csh se traduje, že je nebezpečný pro zdraví uživatele. - Různé druhy interpretu příkazů V Linuxu existuje velké množství interpretů příkazů: • Bourne Again shell (bash), který je založen na interpretu příkazů Bourne shell a je standardním interpretem příkazů v Linuxu. • C shell (csh), který používá syntaxi velmi podobnou jazyku C a má mnoho výhod. • tcsh, což je rozšíření interpretu csh, které jej nahrazuje v mnoha distribucích Linuxu. Na většině systémů je nainstalováno více interpretů příkazů a uživatelé často jeden používají pro psaní skriptů a druhý pro interaktivní práci. Při přihlašování systém určí pomocí obsahu souboru /etc/passwd, který interpret příkazů je potřeba spustit. Použité zdroje informací: [1] SKOČOVSKÝ,L. Principy a problémy operačního systemu UNIX. 1.vyd. Brno, Science, 1993. 288s. ISBN 80-901475-0-X. [2] SIEVER,E. a kol.Linux v kostce: Pohotová referenční příručka. 1.vyd. Praha, Computer Press, 1999. 560s. ISBN 80-7226-227-0. [3] MCCARTY,B. Učíme se RedHat Linux. 1.vyd. Praha, Computer Press, 2000. 292s. ISBN 80-7226-227-7. [4] SOBELL,M.G. Mistrovství v Linuxu. 1.vyd. Brno, Computer Press, 2007. 878s. ISBN 978-80-251-1726-2. [5] BRANDEJS,M. Linux: Praktický průvodce. 2.vyd. Brno, Konvoj, 2003. 312s. ISBN 80-7302-050-5. [6] LASSER,J. Rozumíme Unixu. 1.vyd. Brno, Computer Press, 2002. 252s. ISBN 807226-706-X. [7] VYCHODIL,V. Operační system Linux: Příručka českého uživatele. 1.vyd. Brno, Computer Press, 2003. 260s. ISBN 80-7226-333-1. [8] KYSELA,M. Přecházíme na Linux. 1.vyd. Brno, Computer Press, 2003. 190s. ISBN 80-7226-844-9. [9] KYSELA,M. a kol. 333 tipů a triků pro Linux. 1.vyd. Brno, CP Books, 2005. 168s. ISBN 80-722-6866-X. [10] BARRETT,D.J. Linux: Kapesní přehled. 1.vyd. Brno, Computer Press, 2006. 160s. ISBN 80-251-0838-4.
23/2/2012
UNIX (LINUX)
41