Seznameni se s moznostmi Linuxu


Predpokladam, ze ted jste aspon trochu "in", tedy umite se zalogovat ;-) V prvni kapitole jsem mozna trochu predcasne uvedl spoustu prikazu, nekterym treba ani nerozumite. Ale myslim, ze je to lepsi nez zacit vykladat schopnosti Linuxu jen tak nasucho. Pro zacatecniky je nejlepsi pouzivat Midnight Commander, ten vam usnadni porozhlednuti se po systemu. Midnight commander je vzdalene asi to jedine, co zacatecnikum bude pripominat dos - vypada skoro stejne jako norton commander a pripadne klony. Umi veci specificke pro Linux, ale ty zatim nebudu vyjmenovavat. Chtel bych vam nyni priblizit filozofii Unixu aby jste pochopili, k cemu a proc vubec jsou nektere prikazy a jake problemy mohou vzniknout.

"Koncept Unixu"


Unix a tedy i Linux stavi na abstrakci a odstineni hardwaru od uzivatele a programu. Co to znamena? Znamena to ze existuje cast operacniho systemu, ktera zna hardware a umi s nim zachazet a zprostredkovava ho ostatnim programum. Zprostredkovava ho pomoci dobre standardizovanych rozhrani a sluzeb. Mozna si vybavite, jak funguji treba diskove sluzby (ostatne vsechny) v dosu. Program kdyz potrebuje od operacniho systemu zapis ci cteni souboru, zavola sluzbu jadra operacniho systemu. Jadro je vzdy zavedeno v pocitaci a zprostredkovava nizkourovnove sluzby (rutiny, volani, funkce) pro programy. Protoze je Linux klonem Unixu, tam kde jde o specificky Linuxovou zalezitost budu psat Linux a jinde jen Unix.


Na rozdil od dosu kde se programy mohou vinstalovat kamkoli do OS (viz viry), v unixu jsou tyto nizkourovnove sluzby vrazeny primo do jadra. Jadro je mocnym zaklinadlem vsech Linuxaru, je to srdce, ktere dodava pocitaci zivot. Linuxove jadro je pouzitelne na pocitacich 386 a vyssich, protoze je plne 32 bitove a pouziva chraneny mod procesoru intel. Krome Intela bezi i na PowerPC, MIPSu, Motorole 680x0, Sparc a Alpha procesorech (64bitove).

To co vidite a chapete jako start Linuxu (vypisy ovladacu hw jez detekuji zarizeni) je priprava operacniho systemu na rozbehnuti. Do doby spusteni prvniho programu musi byt funkcni alespon filesystem, aby bylo z ceho spoustet programy. Mozna vam to prijde divne, vzdyt po nabootovani pocitace prece jsou dostupne disky alespon pres bios, proc tedy starosti s detekci zarizeni? Linux totiz vubec nepouziva BIOS. Linux ma vlastni ovladace a jakmile ho zavedete (tady ovsem bios ci dos je nutny) tak za sebou spali vsechny mosty - zakaze preruseni, prepne se do protected modu, zapne strankovaci jednotku a pozada vsechny zkompilovane ovladace, aby si nasly to svoje hw zarizeni. Jakmile probehne tato faze, namontuje se root filesystem (namontovat znamena ze se vybere partisna ktera na sobe ma prislusny adresar - root filesystem je nejvyse ve stromu adresaru). Jak jiste vite, unixy nemaji cislovani disku A: B: C:, ale maji jediny adresarovy strom. Dalsi disky a partisny se tvari jako adresare. Navic se v cestach k oddeleni pouziva lomitko / misto backslashe. Spusti se prvni proces - init.

"Prvotni proces init - fotr vsech procesu"


Jakmile bezi prvni proces init, je vyhrano. Init uz neni soucasti jadra. Zde se slusi vysvetlit, proc vubec proces init existuje a jak vlastne vznika a zanika proces. Asi tusite, ze kazdy program ktery se spusti z filesystemu se bude tvarit jako proces. Procesy jsou na sobe nezavisle a mohou byt spusteny ruznymi uzivateli.


Tito uzivatele nemaji pravo si je navzajem nicit, stejne tak uzivatel A nemuze spustit proces jako uzivatel B. To dovoluje mit na jednom pocitaci zaroven spoustu nezavislych uzivatelu, navic kazdy uzivatel toho muze mit spusteno vice a co je nejlepsi, kdyz se do pocitace da vice procesoru (SMP) tak muze paralelne bezet vice procesu nejen prepinanim prideleni jednoho procesoru mezi nimi, ale i fyzicky. Linux v SMP verzi tusim umi az 32 procesoru (jen defaultni nastaveni).

"Vznik procesu"


Proces muze vzniknout tak, ze se klonuje jiz existujici proces (fork - rozvetveni), anebo vznika jako novy program spusteny z disku (exec - spusteni). Klonovani procesu se sice muze zdat k nicemu ale ma v unixu sve misto. Druha metoda je pochopitelnejsi, alespon pro uzivatele dosu. Zde je nutno podotknout, ze spusteni programu z disku muze predchazet klonovani volajiciho procesu. Kdyz si totiz proces treba 400 (procesy jsou cislovany vzrustajicimi cisly) usmysli, ze by rad spustil program ls, stane se to, ze po zavolani systemove sluzby s parametrem programu /bin/ls se spusti skutecne program ls, ale jiz nikdy se nevrati do volajiciho procesu proto, ze kazdy novy program (proces) prepise kod a data existujiciho procesu. Takze jedinym zpusobem, jak vetvit procesy pripadne volat externi programy bez naruseni programu vyzadujiciho toto spusteni je klonovani procesu. Klonovana kopie se jmenuje syn a tento syn pak muze spustit externi program, znicujic sam sebe. Nikomu ale nevadi kdyz jeho dvojnik spacha harakiri, ze ;-)

"Mapovani fyzicke pameti do adresniho prostoru procesu"


Na tomto miste je nutno uvest (i kdyz to muzete vypustit z hlavy), ze klonovany proces se v pameti nekopiruje! Jeho pamet je namapovana do stranek druheho identickeho procesu. To velice setri pamet. Nekdo muze byt zmaten, co se stane kdyz zacnou oba procesy brane z jedine fyzicke pameti delat neco jineho? Je to jako kdyby jste ve skole psali pisemku a jeden student ji vypracovat ( k tomu se zneuziva nejlepsich studentu fyzickym nasilim :) . Vy ji potom opisete (zde okamzik klonovani). No a pak si kazdy na tu svou napise sve jmeno. Zde konkretne ale bylo potreba dvou papiru kdezto Linux bude potrebovat jen tri bloky pameti - jeden na pisemku a dva na podpisy.

No a aby se dale vyuzilo mechanismu sdileni jedne fyzicke pameti (stranky/ek) mezi vice procesu tak Linux umi to, ze kod jednoho programu (ano programu) ktery byl spusten z disku se timto mechanismem sdili mezi vsemi procesy, ktere vznikly spustenim tohoto programu! Kdyz tedy (i jako jiny uzivatel) spustite program mc a nekdo uz ho ma spusteny, tak vezte ze vsechny stranky ktere jsou stejne (nemodifikovane) se sdili. Takze se klidne muze stat ze spustite nekolik procesu a kdyz sectete jejich pametovou narocnou dostanete vice nez mate pameti. Vse zalezi na tom, jak to pocitate. Vsimnete si sloupcu RSS a SHARED v programu top. Nebudu zde radeji rozvadet dalsi vymozenost - totiz dynamicke zavadeni casti programu (stranek) az v okamziku, kdy jsou potreba (demand loading) - to zpusobuje takove to silene ruchani ide disku kdyz se spousti system nebo i jednotlivy program.

Tedy jak se spusti, vznikne a zanikne proces bychom meli. Ted uz vam asi je jasne, proc existuje proces init. Je to proto, ze kazdy proces musi mit jiny proces, ktery ho spusti. Vsechny procesy maji tedy jako nejakeho (pra)rodice proces init. Aby proces init vedel co ma vubec po startu systemu spustit, ma k tomu konfig soubor /etc/inittab. V jeho ramci jsou definovany tzv. runlevely a programy, ktere maji byt pro tyto runlevely spusteny initem. Runlevely jsou cislovane a normalni runlevel je multi user (pak je jeste definovan single user - to je pro spravu systemu jedinym uzivatelem - rootem a pouziva se to jedine kdyz se nekde neco posere). Pokud si budete prohlizet inittab tak si vsimnete ze vsechny cesty jsou absolutni - zacinaji / a dale si vsimnete skriptu, ktere se volaji aby uvedly system do daneho stavu. Tyto skripty jsou tradicne v /etc/rc.d/ adresari - jsou neco jako autoexec.bat v dosu. /etc/inittab by mohl byt povazovan za ekvivalent config.sys v dosu, ale neni to spravne - zde se totiz pouze definuji programy jez se maji spustit, zadne ovladace se zde neuvadeji, ovladace jsou totiz v jadre (kernel). Dale si vsimnete, ze se krome inicializacnich skriptu volanych jen pri zmene runlevelu se tam definuji programy getty spolu s runlevelem, v kterem maji bezet. Dostali jsme se do mista kde musim vysvetlit, k cemu jsou dobre.

"Terminaly - cesta do systemu"


Zkusenost nam veli ze s pocitacem se komunikuje pres klavesnici a obrazovku, pripadne mys. Napsal jsem ale, ze Linux je multiuserovy multitaskingovy operacni system a musim tedy jeste rici, jakym zpusobem na nem muze pracovat vice lidi kdyz pocitac ma jen jednu klavesnici a monitor (vetsinou - Linux taky nemusi mit vubec klavesnici anebo muze mit zase treba 4 monitory). Vsechny vstupni/vystupni zarizeni jsou hardwarove - jsou tedy spravovany ovladaci jadra. Jsou to vlastne cesty vedouci do systemu. Monitor je vystupni zarizeni, klavesnice a mys vstupni. Uzivatel predpoklada, ze neco napise na klavesnici, bude nejak komunikovat s procesem vytvarejicim rozumnou cinnost a ze proces bude mit moznost svuj vystup vypsat na monitor. Nicmene jenom proto, ze je klavesnice a monitor nejobvyklejsim v/v zarizenim to neznamena ze k pocitaci nemuzete pripojit treba seriovou linku terminal ci modem a ze tam nemuze byt dalsi uzivatel, ktery bude delat to same co my na klavesnici s jinym procesem. V unixu se tradicne rika klavesnici s monitorem console. Jenomze Linux klavesnici a vystup virtualizuje a umoznuje pouziti virtualnich terminalu - tedy jakychsi "okenek do systemu" mezi kterymi se muzete prepinat - klavesnice i monitor pak slouzi k praci s tou virtualni konzoli (virtualnim terminalem), na ktery jste zrovna prepnuti. Tyto virtualni terminaly umi posilat pismenka z klavesnice a prijimat pismenka k zobrazeni v standardu vt102. Pres seriovou linku muze byt pripojen take terminal vt100 - hloupe zarizeni ktere take umi jen posilat pismenka a zobrazovat znaky. Vsechny tyto "cesty do systemu" musi byt spravovany programy getty ktery na nich budou sedet, cekat az s nimi nekdo promluvi a napise svoje username a password (zaloguje se) a oni mu pak milostive spusti jeho procesy - zde se uplatni spousteni externiho programu jak jsem o nem psal. Vsimnete si ze program getty kontrolujici virtualni terminal tty1 (CTRL+F1) zmizi jakmile se na nem zalogujete - to proto ze volanim externiho programu prepise svuj kod (ktery jiz neni potreba). Vsechny procesy, spustene z tohoto teminalu pak budou oznaceny ze z neho byly spusteny - spustte si program w nebo ps -l ! Jakmile skoncite praci a vsechny svoje procesy ukoncite, uvolnite tim terminal, init to pozna a znovu na nej spusti proces getty, ktery bude cekat na dalsi uzivatele.


Jiste ted chapete, ze procesy getty jsou zprostredkovateli pristupu do systemu, at jiz bezi na virtualnich terminalech nebo seriovych linkach. Kdyz jsme u toho, v inittabu muzete definovat program mgetty ktery bude sedet na modemu a kdyz prijde datove volani nebo fax tak to zvedne a obslouzi. V pripade datoveho volani se zepta na username a password, stejne jako to delaji lokalni virtualni terminaly. Je krasne zavolat si z prace domu modemem, zalogovat se a smazat kompromitujici data drive nez tam dorazi softwarova policie =8-) . To ze na modemu sedi program mgetty take jeste neznamena ze z neho nemuzete take volat ven ci posilat faxy....

Ted jiz vite, ze v Linuxu nad vsim sedi vsemocne jadro a spravuje hardware. Jadro take spravuje procesy, zavadi je, klonuje, spousti procesy z programu na disku, stara se o preruseni, prenosy a prepinani kontextu, virtualizuje terminaly a spoustu dalsich veci... dalsi veci kterou bych zde mel zminit (ackoli to vice patri k klonovani a spousteni/vytvareni procesu) jsou knihovny.

"Knihovny - balicky s casto pouzivanymi volanimi (rutinami)"


Mozna vas nekdy napadlo, ze ve vsech programech je urcita cast volani a sluzeb, ktere jsou stejne. Prikladem jsou standardni volani cecka - printf, read, write.... Tyto volani ale jsou volanimi cecka a Linuxove jadro neni psane tak, aby vsechny tyto volani umelo obsluhovat samo...vzdyt se jedna o ceckovske volani a Linux muze umet spoustet i programy psane v asembleru, basicu, fortranu.. - cecko ac nejrozsirenejsi neni jedinym programovacim jazykem. Bylo by vhodne, aby se funkce a rutiny nejak zabalily a daly k dispozici programum jez je budou pouzivat - a take aby se timto mechanismem mohly zabalit libovolne funkce. Vubec by nebylo na skodu vyuzit mechanismu mapovani pameti z vice procesu do jedinych stranek.

Linux disponuje prostredkem, jak zpristupnit sluzby programum - knihovnami. Jsou to balicky se zabalenymi rutinami. Knihovna ma svuj nazev skrze ktery ji mohou vyzadovat programy a verzi - ta je tvorena vetsinou dvema cisly - hlavni a vedlejsi. Vedlejsi ma za ukol odlisit od sebe dve knihovny z teze serie zmenene treba jen o jediny bajt. Dovoluje to mit vice verzi te same knihovny. Proc ? - protoze knihovny se vyviji a neustale doplnuji, jev ktery vas bude neustale provazet pri praci s Linuxem. Rika se tomu upgradovani a je to oblibenou spolecenskou aktivitou mezi Linuxari - vetsinou se konverzace stoci na to, jake knihovny je treba mit aby vam fungovat program xyz. Knihoven je nepreberne mnozstvi - udrzuji se v adresarich nazvanych lib a jejich nazev vzdy zacina lib* . Kouknete se do /lib/ , /usr/lib/ , /usr/local/lib/ a /usr/X11/lib/ . A to vubec neni vsechno. Krome zakladni knihovny libc v knihovnach najdete matematicke funkce (libm), knihovny pro praci s grafikou (libvga), textovymi okynky (libncurses), mysi (libgpm), obrazky (libtiff, libpng,...), zvukem, 3d grafikou (libMesaGL) a spoustou dalsich veci - nektere programy si s sebou dokonce nesou vlastni specializovane knihovny a pak je v tom bordel kdyz to nainstalujete - zapomenete co k cemu a kam patri a nepodari se vam to odinstalovat.

Programy na disku maji jiz urceno k jakym knihovnam se linkuji, resp. ktere knihovny vyzaduji. Bez knihoven nedaji ani ranu, i kdyby se jejich funkce nevolaly ani jednou. Zjistit co vyzaduje program muzete prikazem ldd, napr. ldd /usr/local/bin/mc . Knihovny jsou sice vyzadovany jiz pri startu programu, ale dotahuji se podle pozadavku za behu (demand loading stejne jako u exacu). Z hlediska procesu se jim mapuji do urcite adresove oblasti - knihovny se mohou pro ruzne procesy mapovat do jinych adres. Ve vypisu ldd si muzete vsimnout ze program vyzaduje knihovnu bez posledniho cisilka - to je prave vedlejsi cislo tedy verze knihovny a z hlediska programu je nezajimave - existuje hlavne z vyse receneho duvodu. Dalo by se tedy rici, ze program vyzaduje jistou serii knihovny danou hlavni verzi - system pak vybere nejnovejsi podruznou (vedlejsi) verzi knihovny a pouzije ji. Prikazem ldconfig -v si muzete prohlednout a zaroven aktualizovat ukazatele verzi knihoven. Krome techto dynamickych knihoven si muzete pri kompilaci vsechny sluzby knihoven privarit do vysledneho exace - pak se o takovem programu rika ze je staticky linkovany.

To nejzakladnejsi co dela Linux Unixem bychom meli. Dalsimi vecmi ktere jsou v unixu elegantne vyreseny jsou sitovani a virtualizace obecnych hw zarizeni - disku, seriovych a paralelnich portu, streameru, cdrom, mysi a vlastne vsech zarizeni jez umi zpracovavat/prenaset/zaznamenavat data.

"Sitovani"


Krasnou veci ktera udelala unix prakticky jedinou rozumnou volbou internetovskych serveru je jeho podpora protokolu TCP/IP primo v jadre. Sitovani je domenou Linuxu a velkou vetsinu nasazeni a aplikaci Linuxu tvori ruzne serverove programy. TCP/IP je protokol ktery umoznuje prenos dat mezi systemy ktere maji rozdilnou architekturu. Je to jako kdyz si predstavite mesta. Kazda ulice (lokalni sit) bude mit cislo sve site a DNS jmeno (jmeno.domeny.cz). Kazdy dum v ulici ma svoje IP cislo a DNS jmeno (pocitac.jmeno.domeny.cz). Kdyz budete chtit s nekym komunikovat tak staci vedet jeho DNS jmeno nebo IP cislo. Protoze ale v takovem dome (rozumej pocitaci) je vice sluzeb tak se odlisuji jeste jednim cislem - v nasi analogii cislem bytu v dome (cislem socketu, obcas receno portu). Stejne jako v mestech jsou velke tridy a male ulicky, v Internetu tvorenem miliony pocitacu jsou lokalni site velke, stredni a male. Velikost site se urcuje podle maximalniho poctu pocitacu ktere se do ni vejdou - daji naadresovat jedinecnymi IP cisly v ramci lokalni site.

Pocitac poskytujici vice sluzeb bude muset mit vice procesu, ktere budou poslouchat na jednotlivych socketech, jestli se nekdo nedomaha jeho sluzby. Kdyz prijde najednou vice spojeni tak se v jadre zafrontuji a vyridi (az do urcite hloubky, pak je system zahlcen a zacne odmitat dalsi spojeni na tento socket). Procesy ktere na neco cekaji se rika demony - i obecne, nemusi to byt jen v pripade procesu obsluhujicich sit. Tito demoni nezerou vypocetni prostredky pocitace dokud po nich nekdo neco nechce. Demoni obsluhujici sit mohou bud primo bezet (vetsinou u casto pouzivanych sluzeb) a nebo se nechat spustit vzdy az v okamziku kdyz je nekdo zacne otravovat - pripoji se na cislo jejich portu. V systemu existuje jeden demon, ktery ma na starosti takoveto lenive malo casto volane programy. Jmenuje se inetd. Muzete ho videt v seznamu procesu pokud mate v Linuxu alespon minimalni podporu site. Seznam sluzeb o ktere se bude starat ma v souboru /etc/inetd.conf . Mozna vas udivi ze tam jsou jmena sluzeb a nikoli primo cisla socketu - to aby to bylo prehlednejsi, prekladova tabulka je v /etc/services . Na jednotlivych radkach jsou definovany externi programy jez maji byt spusteny v pripade ze se na takovyto definovany port(socket) nekdo pripoji. Jiste znate sluzbu telnet a ftp. Vezte ze pokud jsou tyto sluzby definovany v inetd.conf tak program zodpovedny za predani pozadavku volani na ne je tedy inetd . Druhou moznosti je mit jednotlive procesy pro vsechny sluzby porad bezici, tedy uzirajici misto v pameti. Proto se pouziva kombinace - malo casto vyuzivane sluzby z inetd a casto volane (treba web server) jako standalone procesy(demony).

"Vsechny cesty vedou do Linuxu"


Abych dale rozsiril koncept virtualnich terminalu a dokazal ze cesty do systemu nemusi byt pouze pres lokalni klavesnici, ukazeme si priklad programu telnet. Na pocitac se nemusite zalogovat pouze lokalne ale jak jiste mnozi vedi, i pres sit. Vubec nezalezi odkud prichazite - vsechny cesty nevedou do Rima ale do Linuxoveho pocitace. Stejne jako v pripade procesu getty, ktere byly odpovedne za to ze zadate heslo a pak spusti vase procesy, je v pripade sitoveho spojeni za toto odpovedny program in.telnetd, volany demonem inetd. Zkuste se natelnetit na svuj pocitac (telnet localhost) a pak se kouknout do seznamu procesu ze tam skutecne pribyl proces s nazvem in.telnetd . Bude tam opruzovat do te doby nez se odhlasite z tohoto sitoveho spojeni. V ramci sitoveho spojeni muzete spoustet programy "jako by jste u toho sedeli". Az na to ze sedite nekde uplne jinde a ovladate pocitac vzdaleny treba i pres pul zemekoule. Lepsi je byt od toho dal kdyz to bouchne.....

Sitovani Linuxu a obecne vzato tcp/ip je tak mocne proto, ze neni zavisle na jedinem hardwarovem zarizeni. Tok dat protokolu tcp/ip muze jit treba pres seriovou linku nez se dostane na lokalni ethernet, z kterehoz pujde atm paterni siti az k cilovemu pocitaci, ktery muze byt pripojen treba do amaterske radiove site. Linux ma podporu pro vsechna tyto fyzicka zarizeni, vcetne ISDN, AX.25, Frame Relay, FDDI, Fast Ethernet, WaveLan, zapouzdrovaci protokoly pres seriovou linku (CSLIP, PPP, TERM), paralelni spojeni,.....

"Shelly - interpretry prikazu"


Aby uzivatel se systemem mohl nejak rozumne komunikovat a vyzadovat jeho sluzby a mohl v ramci sezeni interaktivne spoustet programy, k tomu jsou tu shelly. Shell je interpretr prikazu. Podle shellu (hodne zkripleneho neschopnosti) udelal Bill jeho command.com . Shellu existuje nekolik, lisicich se rozsahem svych moznosti. Nektere shelly jsou male co do velikosti a nektere jsou vysperkovane hodne vymozenostmi. Nejznamejsimi jsou bash (Bourne Again Shell) a tcsh (Toronto C Shell). Bash je take defaultnim shellem v systemu. Kouknete se na /etc/shells. Kazdemu uzivateli je v /etc/passwd prirazen shell, ktery mu po zalogovani nabehne. Shelly nejen ze s vami komunikuji a vykonavaji vase programy, jsou navic chytre a umi nastavit promenne prostredi (set, setenv) a vykonavat skripty - tedy davkove soubory. Shelly znaji prikazy pro vetveni skriptu, umi presmerovavat vystup programu (o tom pozdeji), umi posilat bezici procesy do pozadi (CTRL-Z) a zase je rozbihat (CTRL-Q, jobs, fg, bg) a ty lepsi shelly umi i interaktivne doplnovat jmena souboru psanych na klavesnici. Ostatne zkuste se zalogovat a napsat v shellu bash (ten vam defaultne nabehne) prikaz help - je to interni prikaz a vypise vam prehled internich prikazu shellu bash.

V systemu tedy existuji krome normalnich exacu (v Linuxu se jim rika binarni soubory nebo binarky) i davkove soubory (v unixove terminologii skripty a toho se budu drzet). Oproti dosu nejsou skripty pouhym seznamem prikazu jez se maji vykonat, jsou to vlastne programy stejne jako cecko nebo basic, ale v syntaxi prislusneho shellu jez je spousti a interpretuje. Pokud nekde v hlavicce souboru jez je spustitelny uvidite napr. #!/bin/csh tak vezte ze to je jmeno souboru na disku jez interpretuje tento skript - v tomto pripade c-shell (c-shell je take uveden v /etc/shells , ale obecne interpretr skriptu nemusi byt v shells uveden). K cemu je to dobre? Unix nepouziva pripony k rozliseni typu souboru - k zjisteni zda jde o spustitelny soubor pouzije system executable flag souboru (spustitelnost). Ovsem executable flag u souboru nerika nic o tom, jakeho typu je prislusny soubor - tedy jestli se jedna o binarni format (strojovy kod - odtud pojem binarky) nebo o skript. Informace #!/bin/csh tedy rika systemu pri spousteni skriptu jakym zpusobem se ma zavest program. V Linuxu existuje vice formatu binarnich souboru. Jsou to a.out, elf a coff. Zde se budu zabyvat pouze elfem, protoze je to standard a je flexibilni. Tyto formaty se mezi sebou lisi obdobne jako treba *.com a *.exe soubory v dosu, ale ne tak stupidne. Elf binarku poznate podle toho, ze v prvnich 4 bytech je "ELF".

Shelly jsou mocnym nastrojem. Mozna vam to prijde divne, co je na tom ze muzete napsat seznam prikazu jez se maji vykonat do jedineho skriptu - jenze skriptove jazyky nabizeji mocne konstrukce pro realizaci podminek vetveni, testu atributu souboru a spolu s programy na zpracovani textu a kolonami vytvari jednoduche reseni jinak slozitych uloh. V unixu se pracuje hodne s texty - ve formatu ascii, hodne programu ma take textove konfiguracni soubory. Nemusite se toho bat - vzdyt i takzvane plug and pray windows si udrzuji konfiguracni soubory v textovem formatu, i kdyz se navenek tvari jinak. Tady mate navic moznost si vsechno prohlednout a protoze nejste vazani na podpurne konfiguracni programy dodane vyrobcem programu muzete pouzit ten nejobycejnejsi textovy editor k konfiguraci. V Linuxu se setkate v naproste vetsine s programy, napsanymi nekolika nadsenci, kteri obetovali svuj volny cas vyvoji programu. Ne vsechny programy jsou take graficke, Linux nemusi nutne bezet v grafice aby na nem mohly bezet sofistikovane programy - a potom ocenite ze k konfiguraci potrebujete "jen" textovy editor. Vetsinu programu tvori programy ktere jsou zadarmo - a kdo by take ocekaval nejakou superpritulnost od programu za ktery nic nedal....toto vsak mozna v mnoha lidech vytvari dojem, ze je unix slozity a ruce od nej pryc...ano, neco spravne nakonfigurovat zabere dost casu. Od toho jsou ale kolegove na Internetu kteri vam poradi. Cele to trochu zavani socialismem - programy jsou zadarmo, podpora zadarmo, to asi moc neodpovida tolik prosazovanemu trznimu prostredi....Marx by z toho byl v sedmem nebi ;-)

"Kolony - producent a konzument"


Zkouseli jste nekdy v dosu takovou parodii Unixoveho rourovani , prikaz type *cokoli* | more ? Principem zde je, ze to co prikaz vypise tak mate moznost rolovat po strankach. Jenze to je tak jedine co tenhle "postfix prikazu", tedy |more v dosu umi. Unixove rourovani (rika se tomu kolony, ale ja radsi pouzivam roury a pipy) funguje na podobnem principu jako spojovani trubek a kohoutku do vodovodniho potrubi - odtud ten nazev. Co se spojuje do rour? Predstavte si ze to co program cte na svem vstupu, tedy obycejne klavesnice je pro nej pritok - pritok dat, ale to v analogii nevadi. To co program vypisuje, obycejne na obrazovku (lepe terminal) je jeho vystup - vytok dat ven. No a nedalo by se spojit vystup jednoho programu se vstupem dalsiho ? Dalo ! Prvni program by pak nevedel ze nevypisuje na terminal a druhy by nevedel ze cte z prvniho programu. Avsak i takoveto potrubi musi mit nejaky zacatek a nejaky konec. Na techto koncich muze a nemusi byt terminal, vstup muze byt bran misto z klavesnice z nejakeho souboru, treba ucetni data. Programy v rourach budou tyto data zpracovavat a treba pocitat nejaky soucet. Na vystupu tohoto monstra pak bude vypocitana ucetni uzaverka s bilanci - a tento vystup se take zapise do souboru. Pokud by bylo potreba udelat nekde v rourach odbocku, take to jde. Co se tyce terminologie, vstup a vystup programu se nazyva standardni vstup a standardni vystup. Krome toho ma program jeste tzv. chybovy vystup - to kdyz se objevi v prubehu jeho prace nejaka chyba a program neni s to spravne dokoncit zpracovani dat. Tento chybovy vystup je oddelen od standardniho vystupu proto, ze by jiste nikdo nebyl nadseny kdyby se mu v ucetni uzaverce objevila hlaska "Cannot divide by zero" nebo neco podobneho - vymluvu ze finance vam sezral program by asi panove z financniho uradu nezbastili. Chybovy vystup programu se normalne nerouruje - vypisuje se mimo zpracovavana data.

V ramci rouroveho zpracovani dat se nemusi jen scitat - unix disponuje hodne standardizovanymi prikazy ktere maji za ukol tridit, radit, scitat, vyrezavat sloupce z tabulek, vyhledavat retezce a vubec delat vsechno co s textem delat jde, vse vetsinou zalozeno na zakladni jednotce zpracovani textu - radku. Zarourovani se hojne pouziva ve skriptech - kdyz si clovek muze zautomatizovat nejakou praci, proc by to neudelal.

"Pristupova prava"


Kdyz jsem psal o tom, ze v unixove masine muze byt zaroven vice lidi a presto si nemohou nicit a krast data, musi existovat nejaky mechanismus ktery uzivatele oddeluje. Tim jsou pristupova prava distingovana podle uzivatelu a skupin. Uzivatel patri do jiste skupiny uzivatelu, kterych muze byt v systemu vice. Pristupova prava se v unixu aplikuji na vsechny sdilene komponenty - tedy disky, partisny, soubory obecne, sdilenou pamet...... Co se tyce granularity, vuci vlastnikovi souboru muze byt uzivatel pristupujici k souboru vlastnik (tedy on sam), uzivatel z jeho skupiny a nebo cizak (nekdo z jine skupiny). Jsou tedy vlastne tri oblasti, ktere by mely byt popsane pristupovymi pravy. No a jake prava nabizi unix v souvislosti se soubory? Jsou to flagy Read, Write a eXec. Jsou tedy take tri. No a 3*3 je 9 - tedy 9 flagu pro kazdy soubor. Takze ke kazdemu souboru Unix prirazuje 9 pismenek - tri skupiny po trech pismenech (rwx). Kompozitni pristupove pravo tedy ma tvar rwxrwxrwx. Prvni trojice je pro vlastnika, druha pro skupinu vlastnika a treti pro cizaky. Kdyz nektere pismenko chybi, znamena to ze prislusny flag (pravo) neni nastaveno. Takze treba rwxr-x--x znamena rwx pro vlastnika, rx pro lidi z jeho skupiny a x pro ostatni.

Jedinou vyjimkou z tohoto schematu je uzivatel root. Root ma pravo cist a zapisovat do jakychkoli souboru, nicmene flag executable (x) na nej plati jako pro ostatni. Root je v systemu jakymsi bohem. Kdyz nekdo dostane pristup k uctu roota tak to muze byt pekna pohroma.... rootem clovek musi byt aby mohl pristupovat na porty pocitace a cist a zapisovat do pameti - treba ovladac videokarty pro grafiku musi bezet jako root. Uzivatele i skupiny jsou cislovani a root ma cislo uzivatele UID (User ID) i skupiny GID (Group ID) nula. Kouknete se do /etc/passwd, tam je to definovane.

I kdyz to ted nebudu rozvadet - krome pristupovych prav muze mit binarni soubor (exac) nastaveny bit suid nebo sgid. Znamena to ze kdyz tento program spustite, tak tento proces se provede pod UID ci GID jeho vlastnika - takto tedy lze propujcit svoje prava nekomu jinemu prostrednictvim programu urceneho k urcite cinnosti. Ostatne tak pracuji vsechny programy ktere dovoluji ordinernim uzivatelum operovat se systemovymi komponenty jinak pristupnymi jenom rootovi.

"Specialni zarizeni - virtualizace hardwaru"


Unix oddeluje uzivatele od hardwaru. Aby se to ale dalo realizovat, musi byt nejake dobre popsane rozhrani. Prikladem spatneho rozhrani budiz dos - kdyz chcete cist z prvniho disku, tak zavolate bios s parametry DISK=1,CYL=565,TRACK=7,SECT=39 . Jenomze tohle je nizkourovnove volani - ctou se jim primo sektory z disku. Na vyssi urovni v dosu jsou sluzby dosu (nikoli biosu) - zde se pracuje na urovni opismenkovanych disku. Unix ma mnohem obecnejsi koncept pristupu k takovymto specialnim zarizenim.

Unixovym mechanismem, stale stejnym pro ruzny hardware se da pristupovat k datum na disku, cdrome, floppy, datum v jednotlivych partisnach ale take k zarizenim ktere maji "streamovy" charakter - ctou se a posilaji se do nich data sekvencne - seriove porty, terminaly, streamery. Aby se daly tyto zarizeni rozlisit, jsou cislovana tzv. major a minor cisly. Major cislo zarizeni znamena de facto rodinu zarizeni - treba ide, scsi, seriovy port, paralelni port, terminal, zvukarna. Minor cislo zarizeni rozlisuje jednotlive disky a partisny (v pripade disku) v ramci rodiny. Obe dve cisla jsou osmibitova. Tyto dve cisla se ale nepredavaji primo jadru pri pozadavku na operaci s zarizenim. Misto toho existuji na filesystemu v adresari /dev/ specialni soubory, ktere prekladaji lepe zapamatovatelna jmena zarizeni na jejich skutecna major a minor cisla. Takze z hlediska programu to vypada tak, ze zapisuje do souboru /dev/hda2, ale kernel vi, ze hda2 je symbolicky nazev pro druhou partisnu (2) prvniho ide disku (hda). Zjisti to tak, ze pri pozadavku na otevreni tohoto souboru najde specialni soubor zarizeni pojmenovany hda2, ktery ma ve svych atributech i major a minor cisla. Takovyto soubor se tvari jako by byl dlouhy 0 bytu kdyz si date ls -l /dev/hda* , ale ve skutecnosti se za nim skryva cele zarizeni.

Specialni soubory zarizeni (adr. /dev/ ) jsou velmi chytrou fintou jak zjednodusit a unifikovat rozhrani pristupu k souborum a fyz. zarizenim zaroven. Z hlediska programu totiz existuje pouze jedine jmeno souboru - program nemusi vedet, co se za nim skryva, tedy regularni soubor ci zaznamove nebo prenosove zarizeni. Jak jsem napsal, jsou dva druhy zarizeni: blokove - ty ktere mohou pristupovat nahodne k libovolne casti dat na nich ulozenych (disky, floppy) a ty, ktere to neumi - umi jenom cist a/nebo zapisovat po pismenkach, resp. po bytech. To jsou charakterove (znakove) zarizeni. Znakove zarizeni neumi tedy seek - zpusobem jak obejit toto omezeni v pripade napr. streameru je volani ioctl ktere se pouziva napr. i k nastaveni parametru zvukove karty.

"Logovani udalosti"


Protoze se toho v bezicim unixovem pocitaci deje hodne zaroven a neni v lidskych silach a ani to neni ucelne sledovat beh programu, je obvykle ze programy i jadro maji moznost vypisovat udalosti popisujici jejich beh ci chyby do systemovych logsouboru. Podobne jako kdyz nabiha jadro a vypisuje seznam nalezenych zarizeni, mohou i jednotlive programy vypisovat hlasky o svem behu. Typicky tuto moznost vyuzijete kdyz vam nebude chtit chodit nejaky program. Navic se muze stat, ze tento program bude demon, bezici na pozadi, tedy nevypisujici hlasky na standartni vystup.

Udalosti se zapisuji ve forme radku - kazda jeden radek uvozeny datem, jmenem pocitace a programem a retezcem popisujicim udalost. Tyto soubory naleznete v adresari /var/adm/ a v nem soubory s rozdelenymi hlaskami podle dulezitosti ci zdroje hlasky {jadro, program} . Muzete se podivat na soubor /var/adm/kernel, kde jadro vypisuje hlasky vcetne tech po startu pocitace a detekce zarizeni. Tyto soubory se daji analyzovat a udalosti tridit - vyhodne kdyz vam na Internetu treba nekdo napadne pocitac a zacne delat bordel, nebo kdyz nejaky program ma malo mista na disku pro svoji praci a vy nemuzete prijit na to, proc to dnes nefunguje a vcera ano. Prohlednout si poslednich 20 hlasek muzete napr. prikazem tail -n 20 /var/adm/messages .

Nekdy se muze stat, ze priorita hlasky je tak vyznamna ze se nevypise do logsouboru, ale primo na aktualni textovy terminal. Prikladem budiz kernel panic - fatalni chyba jadra (typickym zdrojem teto chyby je prehrivani procesoru).



Tak toto by byl tak strucny uvod do filosofie unixu a tedy i Linuxu. Jednotlive kapitoly bych rad rozvedl dale spolu s hojnymi priklady a ukazkami konfigurace. Protoze je unix velice komplexni i kdyz mechanismy v nem fungujici jsou jednoduche, napsal jsem tento uvod (druhy po pruvodci instalaci). Myslim ze je dulezite vyvolat v novaccich alespon pocit, ze vidi do toho co to umi drive, nez se budou zabyvat atomickymi znalostmi. Berte Unix/Linux jako zpusob zivota, zpusob nahledu na reseni problemu. Filosofii otevreneho systemu, dobre dokumentovaneho a rozsiritelneho.

V dalsi kapitole bych chtel uvest nektere navyky ktere se mi zdaji uzitecne a zefektivni vasi praci poznavani systemu. Hlavni je si zvolit nejaky poradek, abyste v tom nemeli jako ja po dvou letech neupgradovatelny bordel....