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.
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.
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).
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 ;-)
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.
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.
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.
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).
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,.....
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 ;-)
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.
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.
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.
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....