Harczos Tamás
-1-
Linux-os ábrák és fontos ismeretek:
o
o
o o
o
Kitüntetett felhasználó: root,
UID= 0,
minden felhasználó adat-hozzáférési jogosultságával rendelkezik,
user-ek jelszavait ő sem tudja olvasni, legfeljebb törölni
Segítségkérés egyes programokról: help és man,
pl. ls –help vagy man ls,
legalább az egyik minden programra létezik!
A Linux fájlrendszere: o
o
A múlt órán megismert parancsok áttekintése:
ls [list], cd [change directory], pwd [print working dir.], mkdir [make dir.], rmdir [remove dir.],
touch [create file], cat [concatenate, list or edit files], rm [remove], cp [copy], mv [move].
A mai órán – a fájlrendszerrel kapcsolatosan – megismerendő parancsok:
Harczos Tamás
-2-
o
ln [link], chmod [change permissions], chown [change owner], chgrp [change group].
A láncolás:
ln: A UNIX fájlrendszerének egyik jellemző sajátossága a láncolás (linkelés) fogalma, ami a DOS és más egyfelhasználós operációs rendszerek alatt nem található meg. E mechanizmus arra szolgál, hogy egy adott állományt több néven is el lehessen érni az állományrendszerben. Ha például van egy állományunk „text” néven, akkor a linkelés segítségével elérhetjük, hogy mondjuk „szoveg” néven is hivatkozhassunk rá. •
Ha „ls –la” paranccsal kilistázzuk a könyvtárunkat, láthatjuk a második oszlopban a link count (láncolási szám) oszlopot. Ez mutatja, hogy egy fizikai állományra hány néven hivatkozunk a fájlrendszerben. Ez a fajta láncolás egyrészt helyet takarít meg, másrészt a (gyakorlatlan) felhasználó számára teljesen láthatatlan. Ezen láncolás az ún. „hard link”, mert közvetlenül az adott fájl inode-tábla bejegyzésére mutat a fájlrendszerben. (Minden egyes fájlhoz ill. könyvtárhoz tartozik egy egyedi számazonosító, ez az inode [index node, listázása: ls –i]. A partíció elején található az ún. inode-tábla, ami megmondja, hogy hányas inode-ú fájl a merevlemezen fizikailag hol található, illetve, hogy milyen jogok és egyéb attribútumok érvényesek rá.) A „hard link” csak egy fájlrendszeren belül működik; nem linkelhetünk be például floppy-ról egy fájlt.
Létezik még a „soft link”, avagy a szimbolikus láncolás is. Lényege, hogy a szimbolikus link nem a fájl inode-tábla bejegyzésére mutat, hanem egy olyan különleges fájlra, ami a láncolt fájl nevét tartalmazza. Szimbolikus linket szintén az ln paranccsal hozunk létre, de a -s opciót is meg kell adni: •
o
Pl. cd ; cat >text ; ln text szoveg ; ls –la
Pl. cd ; ln –s /etc/hosts ; ls –la
A láncszám ebben az esetben nem változott (az csak a hard link esetén nő), a fájltípusnál egy 'l' betű szerepel, jelezvén, hogy szimbolikus linkről van szó, s a fájlnévnél a '->' karakterek jelzik, hogy melyik fájlhoz van láncolva az állomány. Mire jó a szimbolikus link? Legfontosabb előnye az, hogy lehetővé teszi különböző fájlrendszerek közti láncolást. Ennek megértéséhez néhány szóval meg kell említeni a UNIX fájlrendszer egy érdekes tulajdonságát, mégpedig a mountolhatóság fogalmát. A UNIX fájlrendszere, ahogy azt a felhasználó szerves egésznek látja, nem feltétlenül egységes fizikai szinten is. Ha például több merevlemez van a gépben, ezeken külön-külön UNIX fájlrendszerek vannak installálva, hasonlóképpen, egy CD-n, vagy egy floppy diszken is. Mountolásnak hívják azt a tevékenységet, amikor egy ilyen különálló fájlrendszert becsatolunk egy már meglévőhöz. Azonban minden egyes önállóan becsatolható fájlrendszerben független a számozás (az inode-ok mindenhol 2-től kezdődnek [/]). Tehát az inode érték önmagában nem nyújt elégséges információt arra nézve, hogy a keresett fájl a teljes állományrendszerben hol található. Ezért ha fájlrendszerek közti láncolást próbáltunk meg, az alábbi, vagy hasonló értelmű hibaüzenetet kapunk: ln: different file system. A fenti problémát kikerülhetjük a szimbolikus láncolással, mert a szimbolikus linkben szereplő név akárhova, más állományrendszerbe, nem létező, vagy pillanatnyilag el nem érhető helyre is mutathat. A Windows-ban egyébként csak ilyen fajta (soft link-hez hasonló) láncolás létezik (pl. a parancsikonok az asztalon).
Hozzáférési jogok: Láttuk már, hogy a UNIX a belépő felhasználókat a bejelentkezési név alapján ismeri fel. Ezen kívül még két azonosítót is rendel a UNIX az egyes felhasználókhoz, a felhasználói azonosítót (user id, uid) és a csoportazonosítót (group id, gid). Mindkét azonosító egy egész szám. Amikor valamilyen módon hozzá szeretnénk férni egy fájlhoz vagy könyvtárhoz, a rendszer aszerint sorol be minket, hogy milyen tulajdonosi viszonyban vagyunk az adott fájllal: lehetünk tulajdonosa (azonos uid), lehetünk csoporttagok (azonos gid), vagy "egyéb". A fájllal kapcsolatos tevékenységek szempontjából három fő csoport van: az állomány olvasása, írása, illetve végrehajtása (könyvtár esetében keresése). A fájlművelet előtt a UNIX megnézi, hogy melyik tulajdonosi kategóriába esünk, s utána azt, hogy ebben a kategóriában engedélyezett-e vagy sem a végrehajtani kívánt művelet. A hozzáférési jogosultságokat legkönnyebben így vizsgálhatjuk meg:
cd ; ls –la
Harczos Tamás
-3-
o
A megjelenített lista baloldali oszlopa tartalmazza a hozzáférési jogosultságokat. Az oszlop legszélső mezője a fájltípust kódolja, az alábbiak szerint: [-] közönséges fájl, [d] könyvtár, [p] speciális cső (pipe), [l] szimbolikus link [c] karakteres készülékmeghajtó (device driver), [b] blokkos meghajtó. A következő kilenc karakter tartalmazza, háromszor hármas bontásban, a hozzáférési jogosultságokat. Ha egy művelet engedélyezett, a neki megfelelő betű látszik a listán, ha nem, a '-' karakter jelzi a tiltást. Az 'r' az olvasás (read), a 'w' az írás (write), az 'x' pedig a végrehajtás (execute) jele. Az első hármas csoport a tulajdonos, a második a csoport, végül a harmadik a többiek jogosultságait mutatja. Könyvtáraknál az olvasás azt jelenti, hogy láthatjuk a benne lévő bejegyzéseket; az írási jog jelentése, hogy bejegyzéseket tudunk létrehozni, módosítani, vagy törölni a könyvtárban, illetve törölhetjük/létrehozhatjuk magát a könyvtárat; és a végrehajtást pedig ez esetben keresésnek kell értelmezni - egy könyvtár kereshető, ha a shell egy végrehajtható fájlt megkereshet és elindíthat az adott könyvtár.
o
A hozzáférési jogosultságok a chmod paranccsal állíthatóak. E parancsnak két használati módja van, az új jogosultságokat mind oktálisan, mind szimbolikus módon be lehet állítani. Mi most az oktális megadást fogjuk megvizsgálni. A beállítandó jogokat oktális szám formájában kell megadni, az alábbiak szerint: az olvasás értéke 4, az írásé 2, a végrehajtásé 1, ezeket az értékeket össze kell adni, és így tulajdonosi kategóriánként képződik három oktális számjegy, ezeket kell beírni. Ha például azt akarjuk, hogy a file1 fájlunkat a tulajdonos tudja olvasni, írni, végrehajtani, a csoporttagok végrehajtani és olvasni, a többiek pedig csak olvasni, akkor a jogosultságok kódolása 4+2+1, 4+1, 4, azaz 754 lesz.
o
Pl. cd ; touch file1 ; chmod 754 file1 ; ls –la
Tulajdonos- és csoportváltás: lehetőségünk van arra, hogy az általunk birtokolt állomány tulajdonosát és csoportját megváltoztassuk. Ez a chown, illetve a chgrp paranccsal történik. E két parancs használatakor egyet ne felejtsünk: ha egy állomány tulajdonosi jogait átadtuk, akkor a továbbiakban azt mi nem vehetjük vissza, csak az új tulajdonos dönthet így!
Reguláris kifejezések (Regular expressions - regexp): A Linux szép számú adatmanipulációs eszközt nyújt a felhasználónak az editorokon kívül is. Az eszközök közül nagyon sok használ mintaillesztést. Vannak olyan parancsok, ahol a felhasználó adja meg a keresendő mintát, ilyen a grep parancs, másokban rejtve dolgozik a mintakereső algoritmus. Reguláris kifejezések használatakor egy mintát adunk meg (ez a reguláris kifejezés), s azt vizsgáljuk, hogy a feldolgozandó adatok (az esetek túlnyomó részében szöveges fájlok, tehát karakterláncok) melyik része illeszkedik a megadott mintára. A reguláris kifejezések karakterekből állnak, ezek közül néhány speciális jelentést hordoz, ezeket metakaraktereknek hívjuk. o
A legismertebb metakarakter a csillag [*], jelentése: bármely karakterből bármennyi (0 is),
o
fontos még a kérdőjel [?], melynek jelentése: bármely karakter (tehát „semmit” nem jelent!)
o
a metakarakterek és működésük szemléltetésére legjobb eszköz az echo és az ls parancs, pl.:
o
cd /etc ; echo *
[a /etc/ összes fájljának listázása]
cd /etc ; echo [abc]*
[a,b vagy c-vel kezdődő nevű fájlok listázása]
cd /etc ; echo [ab]??
[a vagy b-vel kezdődő, 3 betű hosszú nevű fájlok listázása]
cd /etc ; echo [a-fk-z]?m
[a,b,c,d,e,f,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y vagy z-vel kezdődő, 3 betű hosszú, m betűre végződő nevű fájlok listázása]
cd /etc ; echo [a-cu-z]*m
[a,b,c,u,v,w,x,y vagy z-vel kezdődő, m betűre végződő nevű fájlok listázása]
cd /etc ; echo [t-c]*
[HELYTELEN! Alfabetikus sorrendben kell lenniük!]
cd /etc ; echo [!ab]*
[nem a-val és nem b-vel kezdődő nevű fájlok listázása]
cd /etc ; echo *[!a-u]
[olyan fájlok, melyek nem [a-u]-ra végződnek]
Perl-ben használatos teljes regexp tárház: http://peter.verhas.com/perlh/rege.html
Harczos Tamás
-4-
Átirányítások és csővezetékek: Láttuk, hogy a programok túlnyomó többsége a billentyűzetről várja a bemeneti adatokat (input), és a képernyőre küldi az eredményeket (outputot). E két perifériát, azaz a billentyűzetet és a képernyőt a UNIX standard be- és kimeneti csatornának nevezi. Pontosabban fogalmazva, a UNIX három standard be- és kimeneti csatornát definiál, a standard bemenetet (stdin, 0); a standard kimenetet (stdout, 1) és a standard hibacsatornát (stderr, 2). A standard bemenet alapértelmezés szerint a billentyűzet, a kimenet és a hibacsatorna pedig a képernyő. Az utóbbi kettő szétválasztásának alapesetben nincs értelme, hiszen mind a futó programok eredményét, mind az esetleges hibaüzeneteket látni szeretnénk. Nyilvánvaló, hogy nem sokra megyünk olyan programokkal, amelyek csak a billentyűzetről tudnak adatokat fogadni, és csak a képernyőre tudnak kiírni; e gondon segít az: o
o
átirányítás (redirection). Ennek lényege az, hogy tetszőleges programot utasíthatunk arra, hogy bemenetét ne a billentyűzetről várja, illetve eredményeit ne a képernyőre írja. E mechanizmusnak a UNIX alatt kitüntetett jelentősége van: gyakorlatilag minden, a standard outputra író program kimenete átirányítható egy tetszőleges állományba, s hasonlóképp, bármelyik program, amelyik a standard inputról olvas, tetszőleges állományból veheti inputját. A bemenet átirányításának jele a '<' karakter, a kimeneté a '>' karakter. Például az alábbi parancs a könyvtár tartalmát nem a képernyőre listázza ki, hanem a „file” nevű állományba teszi:
ls –la >file ;cat file
[könyvtárlista a „file” nevű fájlba + megjelenítés]
who >temp ; cat temp
[ki van bejelentkezve bekerül a „temp” fájlba]
rm temp ; who >temp ; sort
tempabc ; cat tempabc
csővezeték (pipeline). A fenti utolsó példában az egyik program kimenetét használta fel program bemenetként, egy ideiglenes állomány közbeiktatásával. Ennek és az ehhez feladatoknak a megoldására szolgál a csővezeték (pipe), amely annakidején a UNIX egyik újítása volt. A pipe, melynek jele a '|' karakter, az egyik program kimenetét a másik bemenetével köti össze. Az előző példaprogram tehát így írható rövidebben:
who | sort
[ki van bejelentkezve? Alfabetikus listában.]
who | grep root | wc –l
[hányszor van bejelentkezve a root?]
a másik hasonló alapvető program
Folyamatok (előtér- és háttérfolyamatok, démonok és jobok): o
Programok és folyamatok: A UNIX, mint multitasking rendszer, képes arra, hogy egyszerre több feladat futhasson a gépen. Ennek kapcsán két igen fontos fogalom merül fel, amelyek szorosan összefüggenek ugyan, de egymással nem helyettesíthetőek be: a program és a folyamat (process). A program egy futtatható (akár gépi kódot tartalmazó bináris, akár a shell által értelmezhető parancsokból álló) fájl; valahányszor egy programot elindítunk, egy új folyamat jön létre. Némileg leegyszerűsítve, a folyamat egy programnak egy futó példánya, a saját külön adatterületével. Lehetséges tehát, hogy ugyanazt a programot egyszerre többen is futtassák a rendszerben - ilyenkor ugyanabból az egy programfájlból annyi darab önálló, egymástól teljesen független folyamat jön létre, ahányan elindították a programot.
o
Háttérfolyamatok és démonok: A parancsok (pontosabban a parancsok elindításával életre keltett folyamatok) végrehajtása szekvenciálisan történik; ez annyit jelent, hogy ha a felhasználó elindít egy parancsot, addig nem kapja vissza a parancs promptot, s nem indíthat el újabb parancsot, amíg az éppen futó be nem fejeződött. Ha azonban a felhasználó egy háttérfolyamatot (background process) indít el (&), rögtön visszakapja a parancspromptot, s lehetősége van újabb parancs végrehajtására.
Pl. grep valami ~/* >~/eredmeny &
A fenti parancs végignézi a home-unk összes fájlját „valami” után kutatva; az eredményt az „eredmeny” nevű fájlba teszi. A programot a shell a „&” jel miatt háttérfolyamatként
Harczos Tamás
-5-
(background process) indítja. A felhasználó számára ez abban jelentkezik, hogy rögtön
visszakapja a promptot, s a rendszer kiír egy számot. Ez a szám az adott processz folyamatazonosítója, az úgynevezett process-id (PID). Ezt az azonosítót a későbbiekben az adott processzre való hivatkozásokban használhatjuk. o
E mechanizmus használata kiváltképp olyankor előnyös, ha egy hosszan futó folyamat futtatása mellett más tevékenységgel is szeretnénk foglalkozni. A háttérfolyamatoknak egy speciális válfaja a démon (daemon) folyamat. Ez egy olyan folyamat, amit rendszerint automatikusan indít el a rendszer, s valamilyen felügyeleti szerepet ellátva állandóan fut a háttérben. Démon folyamatok gondoskodnak például a nyomtatási kérelmek besorolásáról és végrehajtásáról, a terminálvonalak figyeléséről, hogy van-e újonnan belépő felhasználó, de démonok felügyelik a memóriahasználatot éppúgy, mint a lokális hálózaton történő belépéseket. A rendszer "üresjáratában", amikor éppen nincs bejelentkezett felhasználó, általában több tucat ilyen démonfolyamat fut, biztosítva a rendszer folyamatos működését. A démonoknak végrehajtásra átadott nyomtatást és egyéb kérelmeket job-oknak (feladatoknak) nevezik, ezeket a démon sürgősségi és egyéb szempontok alapján sorba rendezi (queue), és egyenként hajtja végre őket.
o
Folyamatok lelövése: a kill parancs. A process-id leggyakoribb alkalmazása az, amikor egy túl sokáig futó, netán hibás, vagy nem az általunk várt eredményt adó háttérprocesszt le akarunk állítani.
Nem háttérben futó programot a CTRL-C billentyűvel lehet lelőni!
„Lelőhetetlen” programok futását a CTRL-Z-vel bármikor félbeszakíthatjuk. Ilyenkor a program nem kerül ki a memóriából, csupán a futása függesztődik fel! Erre figyelni kell! •
Pl. man who ; CTRL+Z
[ezzel lett egy leállított, ps-sel listázható folyamatunk]
o
A nemkívánatos folyamatok leállítására szolgál a kill parancs. Paraméterként a "lelövendő" folyamat PIDjét kell megadni. Már ha tudjuk. Szükségtelen mondani, hogy a felhasználó - hacsak nem rendelkezik superuser jogosítványokkal - csakis a saját maga által elindított folyamatokat lőheti le.
o
Folyamatok (és PID-jeik) kilistázása: a ps parancs. A ps alapértelmezés szerint az érdeklődő felhasználó futó folyamatainak legfontosabb adatait listázza ki, köztük a folyamatazonosítót is; ennek birtokában már célzottan hívható meg a kill. •
Pl. ps
•
(vagy ps | grep man), aztán
[keressük meg a man-hoz tartozó PID-et]
•
kill -9 _kill_PIDje_
[-9 = KILL szignál, alapból TERM szignált küld]
•
ki lehet lőni a saját bash-unkat is
Æ
csúnya kilépés