+ All Categories
Home > Documents > Důležité části jádra

Důležité části jádra

Date post: 23-Jan-2016
Category:
Upload: eris
View: 55 times
Download: 0 times
Share this document with a friend
Description:
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. - PowerPoint PPT Presentation
38
Důležité části jádra Programy uživatelské úrovně Rozhraní pro volání systému Správa virtuálního souborového systému Správce paměti Správce procesů Abstraktní síťové služby (sockety) Ovladače souborovýc h systémů Ovladače HDD Ovladače FDD, CD Ovladače protokolu TCP/IP Ovladač síťové karty HDD FDD Síťová karta Jádro Pro projekt „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil ([email protected]). Modifikace a šíření dokumentu podléhá licenci CC-BY-SA. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
Transcript
Page 1: Důležité části jádra

Důležité části jádra

Programy uživatelské úrovně

Rozhraní pro volání systému

Správa virtuálního

souborového systému

Správce paměti

Správce procesů

Abstraktní síťové služby

(sockety)

Ovladače souborových

systémů

Ovladače HDD

Ovladače FDD, CD

Ovladače protokolu TCP/IP

Ovladač síťové karty

HDD FDD

Síťová karta

Jád

ro

Pro projekt „Cesta k vědě“ (veda.gymjs.net) vytvořil V. Pospíšil ([email protected]). Modifikace a šíření dokumentu podléhá licenci CC-BY-SA.

Evropský sociální fond Praha & EU: Investujeme

do vaší budoucnosti

Page 2: Důležité části jádra

Disky a záznamová média

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.

Stopa

Sektor (např. 512 byte)

Čtecí a zapisovací

hlavy

Plotna (deska)

Magnetické vrstvy

Cylindr

Typické uspořádání pevného disku

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.

Page 3: Důležité části jádra

Disky a záznamová média

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.

Master Boot Record

Zaváděcí sektor

Datová oblast oddílu

Zaváděcí sektor

Datová oblast oddílu

Neformátovaný oddíl

Nevyužitý zaváděcí s.

Datová oblast oddílu

Nevyužitý zaváděcí s.

Datová oblast oddílu

Primární oblast

Primární oblast

Rozšířená oblast

Logická oblast

Logická oblast

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ý.

Page 4: Důležité části jádra

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.

Page 5: Důležité části jádra

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.

Page 6: Důležité části 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í.

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í:

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.

/bin/dev/home/etc/lib/usr/tools/data

/simulace/analyzy/vypocty

Primární oblast

Primární oblast

/novak/svoboda/pospisil/mcSweeney

Logická oblast

/sim2005/sim2006/ana2005/ana2006

Logická oblast

první fyzický IDE disk druhý fyzický IDE disk třetí fyzický IDE disk

Page 7: Důležité části jádra

Disky a záznamová média

/bin/dev/home/etc/lib/usr/tools/data

/simulace/analyzy/vypocty

Primární oblast

Primární oblast

/novak/svoboda/pospisil/mcSweeney

Logická oblast

/sim2005/sim2006/ana2005/ana2006

Logická oblast

první fyzický IDE disk

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í:

/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.

Page 8: Důležité části jádra

Disky a záznamová média

/bin/dev/home/etc/lib/usr/tools/data

/simulace/analyzy/vypocty

/novak/svoboda/pospisil/mcSweeney

/sim2005/sim2006/ana2005/ana2006

prv

IDE

dru

ID

E

Výsledná struktura adresářů by tedy měla být následující:

třet

í ID

E

/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

Pro připojování disků do stromu slouží příkaz mount:

mount /dev/hda1 / mount /dev/hda2 /toolsmount /dev/hdb1 /homemount /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.

Page 9: Důležité části jádra

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.

Page 10: Důležité části jádra

Systém ext2

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

Skupina bloků 0

Skupina bloků n-1

Skupina bloků n

Super blok

Podpis skupiny bloků

Bitmapa bloků

Bitmapa inodů

Tabulka inodů

Datové bloky

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ě.

Page 11: Důležité části jádra

Systém ext2

Skupina bloků 0

Skupina bloků n-1

Skupina bloků n

Super blok

Podpis skupiny bloků

Bitmapa bloků

Bitmapa inodů

Tabulka inodů

Datové bloky

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.

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í.

Page 12: Důležité části jádra

Systém ext2

Mód

Vlastník

Velikost

Časové údaje

Přímé bloky

Nepřímé bloky

Nepřímé bloky 2. úrovně

Nepřímé bloky 3. úrovně

Data

Data

Data

Data

Data

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.

• datové b. 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.

Page 13: Důležité části jádra

i1 .

i2 ..

i3 jméno souboru

i4 jméno souboru

i4 jméno souboru

Adresář

Systém ext2

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ů.

tabulka 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.

Page 14: Důležité části jádra

VFS

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.

VFS

ResierFS FAT32 ext3

Datové buffery fyzických zařízení

Ovladače fyzických zařízení

Vyrovnávací paměť inodů VFS

Vyrovnávací pa-měť adresířů VFS

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.

Page 15: Důležité části jádra

Správa 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.

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 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.

Page 16: Důležité části jádra

Abstraktní model virtuální paměti

VPFN 0

VPFN 1

VPFN 2

VPFN 3

VPFN 4

VPFN 0

VPFN 1

VPFN 2

VPFN 3

VPFN 4

Tabulka stránek procesu X

Tabulka stránek procesu Y

PFN 0

PFN 1

PFN 2

PFN 3

PFN 4

proces X proces Y

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.

Page 17: Důležité části jádra

Abstraktní model virtuální paměti

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.

VPFN 0

VPFN 1

VPFN 2

VPFN 3

VPFN 4

Tabulka stránek procesu

PFN 0

PFN 1

PFN 2

PFN 3

PFN 4

jen pro čtení

zápissegmentation

violation

čteníVráceno : 1F

1F

neplatná stránka

čtenísegmentation

violation

Page 18: Důležité části jádra

Stránkování

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.

VPFN 0

VPFN 1

VPFN 2

VPFN 3

VPFN 4

Tabulka stránek procesu

PFN 0

PFN 1

PFN 2

PFN 3

PFN 4neplatná stránka

čtenístránka na disku

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.

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á.

Page 19: Důležité části jádra

Procesy

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ů.

task

task_struct

task_struct

task_struct

task_struct

• 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“.

Page 20: Důležité části jádra

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.

Page 21: Důležité části jádra

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í.

Page 22: Důležité části jádra

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

Page 23: Důležité části jádra

stoutProgram 2stdin

stout

Programováni pro BASH

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 1stdin

stoutProgram 1stdin

sterr

sterrsterr

Page 24: Důležité části jádra

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.

Page 25: Důležité části jádra

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

pak provede výběr řádků jako předtím. Stejně by samozřejmě fungoval příkaz

ls -1 | sed “s/[aeio]/u/g“ > podivny_list.txt

Podivuhodný seznam souborů se všemi samohláskami nahrazenými písmenem u pak zapíšeme do souboru příkazem

list.txt > grep “.txt“

grep “.txt“ list.txt

Pozn. : chcete-li nějaký výstup úplně zahodit, přesměrujte jej do souboru /dev/null .

Page 26: Důležité části jádra

Programováni pro BASH

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.

1 0 1 0 0 0 1 1

1 1 1 1 0 0 0 1

0 1 0 1 0 1 0 1

35448 :

35449 :35450 :

35451 :35452 :

STRINGjméno

proměnnéhodnota

proměnné je někde v

paměti

#!/bin/bash

STRING=“Hello, world!“

echo $STRING

„Ahoj, světe!“ s použitím proměnné:

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!

Page 27: Důležité části jádra

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.

Page 28: Důležité části jádra

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.

alias buon='ssh -X [email protected]'alias cern='ssh -C [email protected]'alias cvsa="cvs -d :pserver:[email protected]:/soft/cvsroot"alias cvsr="cvs -d :pserver:[email protected]:/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

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.

Page 29: Důležité části jádra

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.

Page 30: Důležité části jádra

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

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é!

#!/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

Page 31: Důležité části jádra

Programováni pro BASH

Logické výrazySouborové operátory

[ -e soubor ] soubor existuje

[ -d soubor ] soubor existuje a je to adresář

[ -f soubor ] soubor existuje a je to obyčejný soubor

[ -L soubor ] soubor existuje a je to symbolický link

[ -s soubor ] soubor existuje a má nenulovou velikost

[ -r soubor ] soubor existuje a dá se číst

[ -w soubor ] soubor existuje a dá se do něj zapisovat

[ -x soubor ] soubor existuje a je spustitelný

[ f1 -nt f2 ] soubor f1 je novější než soubor f2

[ f1 -ot f2 ] soubor f1 je starší než soubor f2

Číselné operátory

[ x -eq y ] Testuje, jestli x = y

[ x -ne y ] Testuje, jestli x y

[ x -qt y ] Testuje, jestli x > y

[ x -lt y ] Testuje, jestli x < y

Řetězcové operátory

[ x = y ] Testuje, jsou-li řetězce shodné

[ x != y ] Testuje, jsou-li řetězce rozdílné

[ -n x ] Je pravdivý, není-li řetězec prázdný

[ -z x ] Je pravdivý, je-li řetězec prázdný

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

Page 32: Důležité části jádra

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

Page 33: Důležité části jádra

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.

Page 34: Důležité části jádra

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.

Page 35: Důležité části jádra

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

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.

#!/bin/bashVYBER=“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

Page 36: Důležité části jádra

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 ;}

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.

#!/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!!!

Page 37: Důležité části jádra

Programováni pro BASH

Podrobější informace na webu (CZ):

http://cs.wikibooks.org/wiki/Bash

Podrobější informace na webu (EN):

http://www.ss64.com/bash/

http://www.gnu.org/software/bash/manual/bashref.html

http://docs.linux.cz/programming/interpreted/bashdoc-1.4/index.html

http://en.wikipedia.org/wiki/Bash

Příklady složitějších skriptů:

http://veda.gymjs.net/

Page 38: Důležité části jádra

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


Recommended