380 likes | 559 Views
Důležité části jádra. Programy uživatelské úrovně. Rozhraní pro volání systému. Správce paměti. Správce procesů. Abstraktní síťové služby (sockety). Správa virtuálního souborového systému. Jádro. Ovladače souborových systémů. Ovladače protokolu TCP/IP. Ovladače HDD. Ovladače FDD, CD.
E N D
Důležité části jádra Programy uživatelské úrovně Rozhraní pro volání systému Správce paměti Správce procesů Abstraktní síťové služby (sockety) Správa virtuálního souborového systému Jádro Ovladače souborových systémů Ovladače protokolu TCP/IP Ovladače HDD Ovladače FDD, CD HDD FDD Ovladač síťové karty Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Síťová karta Pro projekt „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil (gdermog@seznam.cz). Modifikace a šíření dokumentu podléhá licenci CC-BY-SA.
Disky a záznamová média Stopa Sektor (např. 512 byte) Čtecí a zapisovací hlavy Plotna (deska) Magnetické vrstvy Cylindr Procesor (CPU) a disky spolu komunikují pomocí řadiče. Různé typy disků potřebují různé řadiče, rozhraní systém-řadič je ale už standardizováno a ostatní části počítače se už o typ disku nemusí starat. Nejrychlejší přístup k datům dosáhneme, když uložíme soubor na jeden cylindr, nebo sekvenčně na jeden sektor. O to druhé se linux zpravidla snaží. Pozn. : problém fragmentace. Typické uspořádání pevného disku
Disky a záznamová média Master Boot Record Zaváděcí sektor Datová oblast oddílu Neformátovaný oddíl Primární oblast Zaváděcí sektor Datová oblast oddílu Nevyužitý zaváděcí s. Primární oblast Datová oblast oddílu Nevyužitý zaváděcí s. Logická oblast Datová oblast oddílu Rozšířená oblast Logická oblast Abychom mohli s diskem pracovat, musí být na magnetických plotnách uložena nějaká struktura (škatulky) pro ukládání dat. První taková struktura je rozdělení disků do oddílů (partitions). Pro práci s oblastmi disku slouží pod linuxem příkaz fdisk případně příslušný program v grafickém prostředí. Pod Windows je to například PartitionMagic. Při startu počítače se spustí krátký prográmek uložený v MBR. Ten rozhodne, ze kterého primárního oddílu se bude natahovat OS. Pozn. : je-li poškozený MBR, počítač „zapomene“, kde má uložená data a veškerý obsah disku bude nedostupný.
Disky a záznamová média Možností, jakým způsobem ukládat soubory do datových oblastí je mnoho. Proto je další „škatulkování“ disku, tzv. souborový systém. Ten tvoří metody a struktury dat, ve kterých se systém orientuje, když ukládá nebo čte data. V současnosti nejpoužívanější souborové systémy jsou následující: • FAT File Allocation Table – starší souborový systém používaný původně systémem DOS. Umožňoval ukládání na dnešní poměry malých souborů na malé disky. V současnosti používaný na FDD. • FAT32 Pokročilejší verze FAT. Umožňuje ukládat až 2GB soubory a zvládá velké disky. Nativní souborový systém Windows 98. Linux jej zvládá bez problémů. • NTFS New Technology File System – souborový systém poprvé používaný ve Windows NT. V současnosti nativní pro Windows XP. Linux z něj bez problémů čte, zapisování se nedoporučuje. • ext2 Nativní linuxový souborový systém. • ext3 Pokročilejší verze ext2 s žurnálováním. • ReiserFS Relativně novýžurnálovací souborový systém, většina moderních distribucí s ním umí pracovat.
Disky a záznamová média Dva speciální souborové systémy pod linuxem jsou swap a proc. • swap Kvůli multitaskingu a rozsáhlým aplikacím potřebuje OS leckdy více paměti, než má počítač fyzicky k dispozici. Řešením je dočasné ukládání části paměti na pevný disk. Je to o několik řádů pomalejší, než přímý přístup do paměti, ale pro aplikace, které vyžadují jen málo výpočetního času, to stačí. Windows zrovna nepoužívaná data z paměti ukládá do speciálního souboru (pagefile), linux raději používá nenaformátovanou část disku (swap partition). Tj. swap vlastně není souborový systém v pravém slova smyslu, jen říká, že jádro přistupuje na daný diskový oddíl přímo bez použití dalších struktur. • proc Proc je pouze zdánlivý souborový systém. Ve skutečnosti všechny soubory, které obsahuje, jsou přímé přístupy na datové struktury jádra. Jedná se například o seznam běžících procesů (odtud jeho jméno) a další. Zapisovat do adresáře /proc, kde jeho soubory uloženy, je samozřejmě absolutně nepřípustné! Soubory v /proc samozřejmě fyzicky na žádném disku vůbec nejsou, existují pouze v „představách“ jádra.
Disky a záznamová média Souborové systémy na disku vytváříme obvykle při instalaci systému současně s diskovými oddíly. Vytvoření s. s. na diskovém oddíle se nazývá formátování. Je-li toto potřeba později, například po zakoupení dodatečného disku, je možné použít programy fdisk a mkfs, nebo nějaký pohodlnější program s grafickým rozhraním. Souborové systémy je třeba před použitím připojit, namontovat (mount). Představme si například, že máme rozdělení disku a adresářů na nich následující: /bin /dev /home /etc /lib /usr /tools /data Primární oblast /sim2005 /sim2006 /ana2005 /ana2006 /novak /svoboda /pospisil /mcSweeney /simulace /analyzy /vypocty Logická oblast Logická oblast Primární oblast první fyzický IDE disk druhý fyzický IDE disk třetí fyzický IDE disk
Disky a záznamová média /novak /svoboda /pospisil /mcSweeney /bin /dev /home /etc /lib /usr /tools /data /sim2005 /sim2006 /ana2005 /ana2006 Logická oblast Logická oblast Primární oblast druhý fyzický IDE disk třetí fyzický IDE disk IDE disky dostávají označení podle pořadí, oddíly pak podle disků. Označení hda, hdb, hdc, hdd znamenají první, druhý, třetí a čtvrtý IDE disk. Jednotlivé oddíly jsou pak určeny připojeným číslem. Jednotlivá zařízení jsou vidět v adresáři /dev. Dle tohoto klíče pak máme k dispozici následující úložná zařízení: /simulace /analyzy /vypocty Primární oblast první fyzický IDE disk /dev/hda1 /dev/hda2 /dev/hdb1 /dev/hdc1 V tomto uspořádání je /dev/hda1 primární systémová oblast. Bez ní systém vůbec nenaběhne. Ta se připojí do adresáře / , tedy v podstatě obsah disku /dev/hda1 tvoří kořenový adresář. Dále chceme, aby se obsah /dev/hda2 zobrazil v adresáři /tools, obsah /dev/hdb1 v adresáři /home a obsah /dev/hdc1 v adresáři /data.
Disky a záznamová média Výsledná struktura adresářů by tedy měla být následující: /bin /dev /home /etc /lib /usr /tools /data Pro připojování disků do stromu slouží příkaz mount: mount /dev/hda1 / mount /dev/hda2 /tools mount /dev/hdb1 /home mount /dev/hdc1 /data Tyto příkazy se provádí pod super-uživatelským režimem (root). Adresáře, do kterých disky připojujeme, nemusí být prázdné, ale po připojení se už k jejich obsahu nedostaneme. Původní obsah bude nahrazen obsahem připojeného disku a ukáže se teprve po opětovném odpojení příkazem umount. /bin /dev /home /home/novak /home/svoboda /home/pospisil /home/mcSweeney /etc /lib /usr /tools /tools/simulace /tools/analyza /tools/vypocty /data /data/sim2005 /data/sim2006 /data/ana2005 /data/ana2006 první IDE /simulace /analyzy /vypocty /novak /svoboda /pospisil /mcSweeney druhý IDE /sim2005 /sim2006 /ana2005 /ana2006 třetí IDE
Disky a záznamová média Připojování pevných disků obvykle provádí systém automaticky při startu počítače. Je při tom naváděn souborem, který se nachází v adresáři /etc: /etc/fstab /dev/hda3 / reiserfs acl,user_xattr 1 1 /dev/hda1 /windows/C ntfs ro,users,gid=users,umask=0002,nls=utf8 0 0 /dev/hda5 /datastore vfat users,gid=users,umask=0002,iocharset=utf8 0 0 /dev/hda2 swap swap pri=42 0 0 devpts /dev/pts devpts mode=0620,gid=5 0 0 proc /proc proc defaults 0 0 usbfs /proc/bus/usb usbfs noauto 0 0 sysfs /sys sysfs noauto 0 0 /dev/dvd /media/dvd subfs noauto, fs=cdfss, ro, procuid, nosuid, nodev, exec, iocharset=utf8 0 0 /dev/fd0 /media/floppy subfs noauto,fs=floppyfss,procuid,nodev,nosuid,sync 0 0 Ovšem jak se systém na začátku dostane k této tabulce, když nemá připojený kořenový adresář / ? Jeho zařízení je uloženo v zaváděcím sektoru a zaváděcí program (LILO) jej předá jádru. To souborový systém připojí pro čtení, zkontroluje a pak připojí znovu i pro zápis. A pak začne připojovat souborové systémy zapsané v tabulce fstab.
Systém ext2 … Skupina bloků n Skupina bloků 0 Skupina bloků n-1 Super blok Podpis skupiny bloků Bitmapa bloků Bitmapa inodů Tabulka inodů Datové bloky Při každém vložení CD, DVD, flasdisku a podobně je třeba zavolat příkaz mount , aby byly data přístupná. Výměnné disky se obvykle objeví v adresáři /mnt nebo /media. Před vyjmutím média z mechaniky je nutné zavolat umount. Současné distribuce linuxu to obvykle provádějí automaticky při vložení/odebrání disku. Systém ext2 Data se ukládají ve stejně dlouhých blocích. Je-li soubor kratší než násobek velikosti bloků, zbylé místo se nevyužije. Disk je z pohledu systému jen sekvenční řada bloků. Chce-li systém načíst data, požádá ovladač o určený počet bloků jdoucích po sobě.
Systém ext2 … Skupina bloků n Skupina bloků 0 Skupina bloků n-1 Super blok Podpis skupiny bloků Bitmapa bloků Bitmapa inodů Tabulka inodů Datové bloky Superblok popisuje základní vlastnosti souborového systému, například velikost bloku, počet bloků ve skupině a podobně. Obvykle se pracuje pouze se superblokem ve skupině nula, každá další ale má jeho kopii pro případ poškození. Základní kámen ext2 je inode. Každý soubor a adresář v systému je popsán právě jedním inodem. Pro každou skupinu bloků je seznam inodů uložen v tabulce společně s bitovou mapou která říká, která místa na inody v tabulce jsou obsazena a která nikoliv. Bitmapa bloků určuje totéž, ale pro jednotlivé bloky – který blok ve skupině je obsazen a který nikoliv.
Systém ext2 Mód Data Vlastník Data Velikost Časové údaje Data Přímé bloky Nepřímé bloky Data Data Nepřímé bloky 2. úrovně Nepřímé bloky 3. úrovně Data Data Data inode • mód Obsahuje dvě informace : co daný inode popisuje a přístupová práva. Může popi-sovat soubor, adresář, symbolický odkaz, blokové zařízení, znakoví zařízení či FIFO. • vlastník Uživatelský identifikátor souboru nebo adresáře (důležité pro řízení přístupu). • velikost Velikost souboru v byte. • časové z. Čas vytvoření a poslední modifikace inodu. Ukazatel na blok obsahující data, která inode popisuje. Přímé bloky obsahují ukazatele na fyzické bloky. Je-li soubor delší než 12 bloků, zavádí další tři ukaza-tele nepřímé adresování dat. Z toho je vidět, že k velkým souborům se přistupuje pomaleji. • datové b.
Systém ext2 tabulka inodů Adresář i1 . i2 .. i3 jméno souboru i4 jméno souboru i4 jméno souboru Adresáře jsou v ext2 reprezentovány jako speciální soubory, které slouží jako „sklad“ přístupových cest k dalším souborům. Kromě toho pouze zde nalezneme jména souborů, které jsou jinak reprezentovány jako čísla inodů. První dvě položky v adresáři jsou vždy „.“ (tento adresář) a „..“ (rodičovský adresář). Jména adresářů se oddělují lomítky „/“. Při vyhledávání určeného souboru systém postupně odděluje jména adresářů, nachází je v seznamu a překládá na číslo inodu. To dělá rekurzivně tak dlouho, dokud nedojde k položce, která není adresářem – a to je hledaný soubor.
VFS Vyrovnávací paměť inodů VFS Vyrovnávací pa-měť adresířů VFS VFS ResierFS FAT32 ext3 Datové buffery fyzických zařízení Ovladače fyzických zařízení Aby bylo možné snadno spojit různé souborové systémy v jeden adresářový strom, je zaveden tzv. virtuální souborový systém (VFS). Funguje na obdobném principu jako ext2. Fyzická zařízení i souborové systémy mají vyrovnávací paměti – data, se kterými se zrovna pracuje se nemění přímo na disku, ale v RAM a uloží se na fyzické zařízení později. To zajiš-ťuje démon (rezidentní program) bdflush. Je-li počítač vypnut aniž by byly buffery uloženy, v lepším případě přijde uživatel o data, v horším případě o celý souborový systém.
Správa paměti Již od počátku výpočetní techniky bylo vždy potřeba více paměti, než jí je na počítači fyzicky k dispozici. Jedna z nejúspěšnějších strategií, jak tento nedostatek obejít, je použití virtuální paměti. Systém správy virtuální paměti linuxu zajišťuje sdílení dostupné paměti a znásobuje její velikost oproti fyzické tím, že momentálně nepotřebná data ukládá na disk. Navíc zajišťuje, aby každý proces měl svou paměť chráněnou před ostatními. Systém dovoluje programům zabrat část paměti pro své potřeby (alokace) – dle požadavku procesu paměť přidělí. Je-li to potřeba, systém umožňuje více procesům sdílet společné části paměti a zprostředkovává komunikaci mezi nimi.
Abstraktní model virtuální paměti VPFN 0 VPFN 0 VPFN 1 Tabulka stránek procesu X Tabulka stránek procesu Y VPFN 1 VPFN 2 VPFN 2 PFN 0 VPFN 3 VPFN 3 PFN 1 VPFN 4 VPFN 4 PFN 2 proces X proces Y PFN 3 PFN 4 Paměť (fyzická i virtuální) je pro jednoduchost operací rozdělena na tzv. stránky (pages). Stránka má velikost 4KB pro procesory s architekturou x86 (32bit Intel a Athlon). Každá stránka je označena číslem (Page Frame Number – PFN, resp. Virtual Page Frame Number - VPFN). Adresa nějakého byte v paměti se pak skládá ze dvou čísel – segment (číslo stránky, VPFN) a offset (číslo byte na stránce). Každý proces vidí svou paměť tak, jako by začínala adresou 0000:0000. Ve skutečnosti je toto ale virtuální schéma – na fyzické stránky se adresy, se kterými proces pracuje, překládají pomocí tabulky stránek.
Abstraktní model virtuální paměti čtení čtení zápis 1F K tabulce stránek se přistupuje tak, že segment (VPFN) slouží jako index v tabulce stránek procesu. Z tabulky pak procesor získá odkaz na fyzickou stránku paměti. Pokud ovšem odkaz v tabulce není platný, znamená to, že se proces pokouší přistupovat někam, kam nemá a událost musí řešit operační systém. Obvykle ji vyřeší zastavením programu a zprávou „Segmentation fault“ nebo „Segmentation violation“. Pokud je vše v pořádku, procesor vynásobí segment velikostí stránky, čímž získá základní (bázovou) adresu v paměti. K té pak přičte offset a dostane hledanou adresu. Vráceno : 1F VPFN 0 VPFN 1 segmentation violation Tabulka stránek procesu VPFN 2 PFN 0 jen pro čtení VPFN 3 segmentation violation PFN 1 VPFN 4 PFN 2 neplatná stránka PFN 3 PFN 4
Stránkování čtení Fyzické paměti je méně než virtuální. Ve fyzické paměti jsou pouze takové stránky, které proces zrovna potřebuje. Ostatní jsou na disku (diskový oddíl swap). Pokud program chce data z virtuální stránky, která je fyzicky uložená na disku, systém musí vyšetřit volnou fyzickou stránku a nahrát ji z disku. To trvá velmi dlouho a proces je zatím uspán – běží jiné procesy. Po transferu dat systém proces znovu zavolá a ten pokračuje v práci s načtenými daty. PFN 0 VPFN 0 Není-li ve fyzické paměti místo na další stránku, musí systém nějaké uvolnit. To udělá tak, že buď jednoduše zruší nějakou virtuální stránku, která od posledního nahrání nebyla změně-na, nebo pokud taková neexistuje, uloží na disk tu, se kterou nebylo nej-déle pracováno. PFN 1 VPFN 1 Tabulka stránek procesu PFN 2 VPFN 2 PFN 3 VPFN 3 PFN 4 VPFN 4 neplatná stránka stránka na disku dlouhé čekání data jsou v paměti, proces pokračuje. Pozn. : samotné jádro je pouze ve fyzické paměti – virtuální nepoužívá.
Procesy task_struct task_struct task task_struct task_struct Procesy provádějí pod operačním systémem úlohy. Může být jedna aplikace napsaná jako jeden proces, ale není to podmínkou – velká aplikace se často skládá z více nezávislých procesů. Podle obvyklé terminologie se rozlišuje proces a program – program je posloupnost instrukcí uložených na pevném disk. Proces je běžící program v paměti – na rozdíl od programu na disku se mění a vyvíjí. Každý proces může běžet pouze na jednom procesoru (resp. procesorovém jádru). Každý proces má svá práva, virtuální paměťový prostor a je striktně oddělen od ostatních. Tím je zajištěno, že při havárii jednoho procesu nespadnou i ostatní. Procesy mezi sebou můžou komunikovat pouze prostřednictvím bezpečných, jádrem řízených mechanizmů. • running Běžící – proces buď právě běží, nebo je připraven k běhu a čeká, až se pro něj najde procesorový čas. • waiting Proces čeká na nějakou událost nebo prostředek (např. stisk klávesy). • stopped Proces byl nějakým signálem zastaven. To je možné například při ladění programů. • zombie „Mrtvý“ proces. Proces byl ukončen, z nějakého důvodu ale zůstal jeho záznam v poli „task“.
Procesy Všechny procesy jsou zařazeny do jakési stromové struktury. Každý proces má svého „rodiče“, tj. jiný proces, který jej spustil. Nové procesy nevznikají jen tak, jsou „klonovány“ – spouštěny jako kopie již běžících procesů – nebo jsou z disku do paměti umístěny na popud již běžících procesů. V task_struct je vždy odkaz na rodiče. „Rodinné“ vztahy lze zjistit programem pstree. Procesy mají identifikátor uživatele (uid) a skupiny (gid). Tím sou určena jejich přístupová práva k souborovým systémům a prostředkům počítače. Čísla většinou dědí od procesu, který je spustil, popřípadě je mohou nastavit tzv. setuid programy. Plánovač Procesy se dělí o společný procesorový čas a je třeba, aby něco rozhodlo, který zrovna poběží a který si musí počkat. To dělá součást jádra zvaná plánovač. Ten přihlíží k důležitosti procesu, zda je proces uživatelský či systémový a podobně. Podle toho jim přiřazuje prioritu a tedy četnost, se kterou jim bude povoleno pokračovat v činnosti. Řadí tak procesy do jakési fronty (či více front, je-li systém víceprocesorový). Proces se dobrovolně vzdává práva na činnost, pokud čeká na nějakou událost (stisk klávesy). Jednotlivé časové úseky, po které procesy běží, jsou cca 200 ms.
Vytvoření procesu Kořenový proces, který se jako první spouští při startu systému, je init. Další procesy se spouští jako potomci initu. Init otevře systémovou konzoli, připojí kořenový souborový systém, odstartuje x-server a tak podobně. Po zavedení systému je proces označen jako čekající a běží jen v tom případě, že opravdu není nic jiného na práci. Další programy mohou uživatelé pouštět přes konzoli popřípadě přes grafické rozhraní.
Programování pro BASH Příkazy není nutné a někdy ani možné zadávat shellu po jednom. Je možné vytvořit soubor obsahující několik příkazů, které shell spustí postupně, nebo dokonce napsat krátký program, podle něhož se shell bude řídit. Tyto programy – tzv. skripty – jsou pro ovládání linuxu velmi důležité a nalezneme je prakticky všude. Velmi jednoduchý příklad takového skrpitu: #!/bin/bash echo Hello World Skript vytiskne na obrazovku klasický nápis „Ahoj, světe!“ První řádek určuje, který konkrétní shell se má pro jeho provádění použít, příkaz echo na druhém řádku pak vytiskne vše, co je napsáno za ním. Cokoliv jiného kdekoliv jinde za znakem # je bráno jako komentář – shell text ignoruje, uživatel či programátor si tam může napsat své poznámky. Skript je možné uložit do souboru pod jménem například hello.sh, označit jej jako spustitelný a pak normálně spouštět. Pokud soubor není spustitelný bash jej umožňuje uživateli zavolat snadno pomocí tečky: . hello.sh
Programováni pro BASH stdin stdin stdin stout stout stout sterr sterr sterr Existují tři standardizované „virtuální soubory“: • stdin – standardní vstup (standard input) • stdout – standardní výstup (standard output) • stderr – standardní chybový výstup (standard error output) Programy komunikují s jinými programy většinou skrz tyto „soubory“. Používají k tomu prostředky stejné jako při zápis/čtení souborů na disku. Co systém „pověsí“ na stdin, stdout či stderr z druhé strany programy nevidí a nestarají se o to. Bývá časté, že je stdin jednoho programu připojen na stdout druhého a zpracovává tak jeho výstupy. Na stdin také může být vstup z klávesnice, na stdout pak výstup na obrazovku. Program 1 Program 1 Program 2
Programováni pro BASH Chceme-li shellu přikázat, aby přesměroval výstup jednoho programu na jiný, použijeme znak „|“ (pipe). Například ls -1 | grep “.txt“ nejprve provede příkaz ls -1 (tj. vypíše seznam všech souborů v adresáři pod sebe) a výsledek místo na obrazovky pošle příkazu grep. Ten pak projde řádky vstupu a nalezne v něm všechny, které obsahují řetězec „.txt“ . Příkaz dělá v podstatě to samé co ls -1 *.txt Takovému spojení programů se také říká „roura“ (pipe). Jiný příklad - příkaz ls -1 | sed “s/[aeio]/u/g“ všechny samohlásky písmenem u.
Programováni pro BASH Pokud neřekneme jinak, stdin je vstup z klávesnice a stdout výstup na obrazovku. Výstup lze přesunout nejen na vstup jiného programu, ale i přímo do souboru na disku (případně z něj brát vstup). To se dělá pomocí znaku „>“. ls -1 > list.txt nejprve provede příkaz ls -1 (tj. vypíše seznam všech souborů v adresáři pod sebe), ale výsledek místo na obrazovku uloží do souboru list.txt v aktuálním adresáři. Příkaz list.txt > grep “.txt“ pak provede výběr řádků jako předtím. Stejně by samozřejmě fungoval příkaz grep “.txt“ list.txt Podivuhodný seznam souborů se všemi samohláskami nahrazenými písmenem u pak zapíšeme do souboru příkazem ls -1 | sed “s/[aeio]/u/g“ > podivny_list.txt Pozn. : chcete-li nějaký výstup úplně zahodit, přesměrujte jej do souboru /dev/null .
Programováni pro BASH 1 0 1 0 0 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 0 1 0 1 Ve skriptech lze používat proměnné. Proměnná je jakýsi šuplík, do kterého si můžete uložit libovolnou hodnotu (číslo, text). Proměnná má jméno, které je vlastně symbolickým odkazem do nějaké části paměti, jejíž přesnou polohu zná jen systém. 35448 : 35449 : STRING 35450 : jméno proměnné 35451 : hodnota proměnné je někde v paměti 35452 : „Ahoj, světe!“ s použitím proměnné: #!/bin/bash STRING=“Hello, world!“ echo $STRING Druhý řádek v tomto skriptu oznámí shellu, že nadále bude existovat proměnná se symbolickým jménem STRING (deklarace) a zároveň do ní rovnou uloží řetězec zapsaný mezi závorkami. Pokud je třeba tuto hodnotu z proměnné vyvolat, napíše se jméno proměnné spolu se znakem „$“ (dolar). Při ukládání hodnoty do proměnné nesmí být kolem rovnítka mezery!
Programováni pro BASH Proměnná platí (je deklarovaná) po celý průběh skriptu, pak ji systém „zapomene“. Někdy je ale výhodné, aby proměnné existovaly i nadále a uživatel k nim měl přístup z příkazové řádky (či aby k nim měly přístup i další spuštěné programy). To je možné pomocí příkazu export : #!/bin/bash export STRING=“Hello, world!“ echo $STRING Proměnná STRING bude existovat i po skončení shellu. Proměnným, které shell zná stále, se souhrnně říká proměnné prostředí (environment) a jejich seznam vypíše příkaz env. Tento seznam může být pro každou instanci shellu (pro každé otevřené okno) samozřejmě různý! • PATH – seznam adresářů, ve kterých se bude systém dívat po spustitelných souborech • LD_LIBRARY_PAH – seznam adresářů, ve kterých se bude systém dívat po knihovnách • HOME – domovský adresář uživatele Pozn. : proměnnou lze zadat i z klávesnice pomocí příkazu read.
Programováni pro BASH K nastavování proměnných prostředí typicky slouží skripty .profile a .bashrc, které má každý uživatel v domovském adresáři. První z nich by se měl spustit při přihlášení do systému, druhý z nich pak při každém novém otevření shellu bash. Příklad skriptu .bashrc pro složitý výpočetní a analyzační systém aliroot. Z .bashrc jsou volány další skripty setroot, setgeant3, setfluka a setaliroot s různými parametry. Tyto skripty jsou uloženy v /etc/environments . Povšimněte si použití příkazu alias, který usnadňuje uživateli práci s často volanými programy. alias buon='ssh -X pospisil@buon.fjfi.cvut.cz' alias cern='ssh -C vpospisi@lxplus.cern.ch' alias cvsa="cvs -d :pserver:cvs@alisoft.cern.ch:/soft/cvsroot" alias cvsr="cvs -d :pserver:cvs@root.cern.ch:/user/cvs" alias ali='cd /tools/aliroot/dev/head' #. /etc/environments/setroot 5.13.02 . /etc/environments/setroot 5.13.06 #. /etc/environments/setgeant3 default . /etc/environments/setgeant3 v1-6 . /etc/environments/setfluka default #. /etc/environments/setfluka 2006.3 . /etc/environments/setaliroot HEAD #. /etc/environments/setaliroot v4-04-Release
Programováni pro BASH Do proměnných lze ukládat například i výstupy externích programů. Skript #!/bin/bash DNESJE=`date +%Y%m%d` ZALOHUJDO=$HOME/backup/zaloha_${DNESJE}.tgz tar –cZf $ZALOHUJDO $HOME/work nejprve provede příkaz date +%Y%m%d , který vytiskne dnešní datum ve formátu YYYYMMDD (tj osm čísel počínaje letopočtem, ve prostřed měsíc a konče dnem) a výsledek uloží do proměnné DNESJE. Do proměnné ZALOHUJDO je pak uložena cesta a jméno souboru, do kterého se budou data zálohovat. Cesta je vytvořena z domovského adresáře uživatele (proměnná HOME) a podadresáře /backup, jméno souboru pak sestává z prefixu „zaloha_“, dnešního data (proměnná DNESJE) a přípony „.tar“. Poslední řádek pak sbalí a spakuje celý obsah podadresáře /work v domovském adresáři uživatele. Pozn : Jména proměnných by neměla začínat číslem. Výjimkou jsou proměnné $1, $2, $3 atd., které odkazují na argumenty příkazové řádky, ze které byl skript spuštěn. $0 obsahuje jméno skriptu. Zpětné uvozovky „`“ označují část, která se má ihned provést jako spustitelný příkaz.
Programováni pro BASH Větvení Do skriptů lze vkládat podmíněné příkazy. Tento příkaz má tvar if [ výraz ]; then příkaz fi if [ výraz ]; then příkaz else příkaz fi #!/bin/bash if [ -z “$1“]; then echo Malo parametru else if [ “$1“ = 1 ]; then echo Uzivatel zadal jednicku else echo Uzivatel zadal neco jineho fi fi Příkaz je proveden pouze tehdy, je-li výraz shledán pravdivým (tj. výraz je vlastně nějaký matematický výrok). Výraz může být jednoduchý například ve tvaru 2 -gt 1, může obsahovat proměnnou (např. $VELIKOST -gt 1) nebo i výstup z externího programu. Příkaz po else (je-li přítomen) bude proveden, bude-li výraz vyhodnocen jako nepravdivý. Pozn.: mezery kolem hranatých závorek jsou povinné!
Programováni pro BASH Logické výrazy Jako logické spojky fungují dvojznaky && (A) resp. || (NEBO) Je možné se setkat s vyhodno-cováním výrazů pomocí příkazu test místo hranatých závorek Podrobnější návod na http://www.ss64.com/bash/test.html
Programováni pro BASH Smyčka typu for Do skriptů lze vkládat cykly. For-cyklus má tvar for proměnná in seznam hodnot ; do příkaz done Cyklus postupně prochází seznam hodnot, přiřazuje je proměnné a pokaždé pak vykoná příkaz. Příkaz se tedy zopakuje tolikrát, kolik je položek v seznamu a při každém jeho provedení je v proměnné jiná hodnota ze seznamu (čehož příkaz může, ale nemusí využít). V první části cyklus vytiskne postupně všechna slova v seznamu, v druhé části skriptu pak cykl vytiskne čísla od jedné do dvaceti po dvou (tj. 1, 3, …) . Patřičný seznam vytvoří program seq. #!/bin/bash LIST1=“prvy druhy treti ctvrty paty“ for i in list $LIST1; do echo rozpocitavam : $i done LIST2=`seq 1 2 20` for i in list $LIST2; do echo prvek $i done
Programováni pro BASH Smyčka typu while Do skriptů lze vkládat cykly. While-cyklus má tvar while [ výraz ]; do příkaz done Cyklus opakuje příkaz tak dlouho, dokud je výraz pravdivý. Je samoz-řejmé, že příkaz musí měnit podmínky pro vyhodnocení výrazu, jinak se bude cyklus opakovat donekonečna. V příkladovém skriptu se cyklus provede 9x – a pokaždé hodnota proměnné COUNTER vzroste o jedna. Ve výrazu –lt znamená menší než (less than). Obdobně –gt znamená větší než (greater than) a –eq rovno (equal). #!/bin/bash COUNTER=1 while [$COUNTER –lt 10]; do echo COUNTER = $COUNTER COUNTER=$[$COUNTER+1] done Patvar $[cosi] shellu naznačuje, že má cosi brát jako aritmetický výraz. Obdobný vý-sledek by se dosáhl pomocí $((cosi)) nebo příkazem let COUNTER=COUNTER + 1.
Programováni pro BASH Smyčka typu until Do skriptů lze vkládat cykly. Until-cyklus má tvar until [ výraz ]; do příkaz done Cyklus opakuje příkaz tak dlouho, dokud je výraz nepravdivý. Je samoz-řejmé, že příkaz musí měnit podmínky pro vyhodnocení výrazu, jinak se bude cyklus opakovat donekonečna. V příkladovém skriptu se cyklus provede 11x – a pokaždé se hodnota proměnné COUNTER sníží o jedna. Cykl skončí v okamžiku, kdy COUNTER má hodnotu 9. #!/bin/bash COUNTER=20 until [ $COUNTER –lt 10 ]; do echo COUNTER = $COUNTER COUNTER=$[ $COUNTER-1 ] done Patvar $[ cosi ] shellu naznačuje, že má cosi brát jako aritmetický výraz. Obdobný vý-sledek by se dosáhl pomocí $((cosi)) nebo příkazem let COUNTER=COUNTER + 1.
Programováni pro BASH Uživatelské rozhraní Protože interakce skriptu s uživatelem je leckdy důležitá, má BASH zavedenu jednoduchou textovou nabídku ve tvaru #!/bin/bash VYBER=“Seznamit Pocitat Odejit“ select volba in $VYBER; do if [ “$volba“ = „Seznamit“ ]; then echo Ahoj, ja jsem skript $0 ! fi if [ “$volba“ = „Pocitat“ ]; then echo Ahoj, 1 + 1 = $((1 + 1)) ! fi if [ “$volba“ = „Odejit“ ]; then echo Tak se mej ! break fi done select proměnná do seznam hodnot; do příkaz done Příkaz dá uživateli na výběr ze seznamu hodnot a jeho odpověď uloží do proměnné. Poté provede příkaz (ovšem právě jednou). Pak se vrátí zpět na nabídku.
Programováni pro BASH Funkce Je časté, že se některé části skriptu musí opakovat na mnoha místech v té samé podobě. V takovém případě lze použít funkce. Funkce se definuje pomocí příkazu function jméno { příkazy ;} #!/bin/bash function vynadej { echo Tak tos pohnil, $1 ! echo Uz se s tebou nebudu bavit! echo Vyhod pocitac z okna! ; } vynadej Karle echo vynadej Josefe echo vynadej $USER echo echo Jsem nejlepsi!!! V hranatých závorkách se napíší libovolné příkazy shellu. V jiných částech shellu pak lze tyto příkazy spustit prostým napsáním jména funkce. Funkci lze i předat parametry, které se zapíší bezprostředně po jménu. Ty jsou pak k dispozici v proměnných $1, $2, $3 a tak dále.
Programováni pro BASH Příklady složitějších skriptů: http://veda.gymjs.net/ Podrobější informace na webu (CZ): http://cs.wikibooks.org/wiki/Bash http://docs.linux.cz/programming/interpreted/bashdoc-1.4/index.html Podrobější informace na webu (EN): http://www.ss64.com/bash/ http://www.gnu.org/software/bash/manual/bashref.html http://en.wikipedia.org/wiki/Bash
Shrnutí • Důležité části jádra • Disky a diskové operace • Souborový systém ext2 a VFS • Správa paměti a virtuální paměťové stránky • Procesy • Programování pro shell bash